Files
LlamaCasty/Themes/index.md
T
gramps 6208cb9409 feat(ui): route locked tiers through About
Keep non-owner resolution choices visible but muted. Selecting one preserves the free tier and opens About; external navigation is only the explicit llamacasty.com link. Ref: https://streamlabs.com/desktop
2026-11-02 09:41:38 -08:00

2.8 KiB

Themes — index

The single source of the dark UI theme. See schema.md for the memory-map conventions.

File Purpose
Controls.xaml All custom control styles/templates: YtButton, YtButtonSecondary, IconButton, YtTextBox, YtTextBoxCompact (the dense variant the properties panel uses), YtComboBox/YtComboBoxItem and YtQualityComboBoxItem (paid tiers dim but remain clickable), YtCheckBox, scrollbar/slider/tooltip/context-menu/menu-item/separator/list-item (implicit where app-wide), YtListBoxItem, YtLabel, SectionHeader

How it's wired:

  • Merged once in App.xaml — app-wide. New windows get the theme automatically; do not re-merge per-window.
  • Palette: window #1a1a2e, fields #0f3460, borders #2a3a5e, popups #16213e, accent #e94560, hover #26ffffff, text #e0e0e0.

Gotchas learned the hard way:

  • MenuItemRole has no Separator value — separators are standalone Separator controls with their own implicit style.
  • A custom ComboBox template must put the ContentPresenter (SelectionBoxItem) inside the ComboBox template, not the ToggleButton template — the latter resolves against the wrong TemplatedParent and renders nothing.
  • A control with no style renders with the LIGHT WPF system template — a hand-painted Background/Foreground colours the box but leaves the system border, the system arrow and the white popup list. That is why the Stream Alerts "Display" drop-down looked like it belonged to another app (TASK 58, 2026-10-21). Rule: every control carries a theme style — YtComboBox, YtCheckBox, YtTextBox/YtTextBoxCompact — and paints no colour of its own. ytLive.Tests/PropertiesStyleTests.cs fails if that drifts back. ⚠️ But that guard sees only those control TYPES — a picker built as a Button + a code-built ContextMenu is invisible to it (the border-colour picker was exactly that, TASK 63). A picker that LOOKS like a drop-down must BE the app's drop-down.
  • The YtComboBox popup sizes to its CONTENT, not to the ComboBox (measured 2026-10-21: the border-colour popup came out 142.7px wide against a 100px ComboBox) — a long row is never clipped, and the popup may be wider than the closed box. Measure, don't guess.
  • The closed box and the rows of a ComboBox can only differ through an ItemTemplateSelector — WPF copies ItemTemplate into the read-only SelectionBoxItemTemplate, so one template renders in both places. The selector is told them apart by the ContentPresenter's templated parent (ComboBox = closed box, ComboBoxItem = a row) — see Helpers/ClosedBoxTemplateSelector.cs.

Related: Helpers/index.md (custom controls the theme styles), the XAML files at repo root that consume these styles.