promotional bannermobile promotional banner

LumenUI

A focused WoW UI suite with flawless defaults and zero bloat.
Back to Files
File nameLumenUI-v0.9.287-beta.zip
Uploaded
Jul 26, 2026
Downloads
7
Size
556.1 KB
Flavors
Retail
File ID
8513972
Type
B
Beta
Supported game versions
  • 12.0.7

What's new

LumenUI

v0.9.287-beta (2026-07-26)

Full Changelog Previous Releases

  • Merge pull request #24 from NennMichSchinken/dev
    Release 0.9.287-beta

    0.9.287-beta

  • Settings window
    • Rebuilt on a calm monochrome base: a graduated dark palette where depth comes
      from the layer step instead of tinted colour, generous radii, and Inter as the
      single typeface.
    • New: an accent colour of your choice — 7 presets or a free colour picker. It
      recolours the whole window live and is saved account-wide, so it survives a
      profile switch.
    • New: a search field above the module list. It searches across every module
      down to the individual option, groups the hits by module and tab, and jumps
      straight to the setting when you click one. The term stays in the field so you
      can work through several hits.
    • Quieter text: card titles stay bright, row labels and field labels step back —
      less white in more places.
    • Bigger, rounder controls; the switch is a pill with a circular knob, dropdown
      menus and the colour picker follow the same language.
    • Texture dropdowns now need Shift or Ctrl before the mouse wheel previews a
      texture, so scrolling the page no longer changes your setting by accident.
  • Raidframes
    • New: a resource bar — a thin strip at the bottom of each frame. The look
      (texture, resource colour or class colour) is shared under Base; the height
      and which roles get one are set per context, so a 5-man can show everyone
      while a raid shows only the healers' mana. Default: healers only in raid, all
      roles in a group.
    • New: "Smooth bars" under Base → Health bar (on by default) — health and
      resource bars glide to their new value instead of jumping. If bars ever look
      wrong in combat, this is the switch to turn off.
    • New: Augmentation Evoker aura defaults (Prescience, Ebon Might, Shifting Sands
      and the rest of the kit).
    • Fixed: the role icon stayed hidden whenever no group role was assigned — solo,
      or in a group that never went through a role check.
    • Name and HP text now have separate preview eyes instead of one shared toggle.
  • Quality of Life
    • New: accept group invites automatically from friends and guild members. Only
      while you are alone and outside an instance; otherwise the normal dialog
      appears.
  • Under the hood
    • Smaller download: the bundled font is subset to Western Latin (1.6 MB → 189 KB)
      and 19 unused textures are gone.
  • Merge pull request #23 from NennMichSchinken/feature/shell-redesign-v3
    Shell redesign v3, global settings search and the resource bar
  • release: bump to 0.9.287 for the v3 beta
    Folds the two finished side branches into this release: the Augmentation
    Evoker aura defaults and the auto-accept-invites QoL option.
    Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • qol: auto-accept group invites from friends and guild members
    New opt-in QoL option: group invites from Battle.net/character friends
    and guild members are accepted without the popup.
    The guards are hard rules rather than options, because each one would
    cost the player something: never while already in a group (accepting
    drops the current one), never inside an instance (joining removes you
    from it), never during a quest session, and never when accepting would
    drop LFG queues. Role-picker invites are accepted with the current
    spec's role only when the inviter offered it and the game allows it --
    otherwise the dialog is left to the player.
    Relationship checks mirror Blizzard's SocialQueueUtil_GetRelationshipInfo
    (GetAccountInfoByGUID / IsFriend behind the legacy-system check /
    IsGuildMember). Every automatic accept is announced in chat.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • raidframes: add Augmentation Evoker aura defaults
    HoT track gets Prescience, Shifting Sands, Blistering Scales, Infernos
    Blessing, Symbiotic Bloom, Ebon Might and Source of Magic; the defensive
    track gets Sense Power (signature-learned, secret).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • Merge dev into feature/shell-redesign-v3
    Picks up the GitHub Pages showcase (docs/) and the .pkgmeta rule that keeps it
    out of the packaged addon zip.
  • raidframes: show the role icon when no group role is assigned
    UnitGroupRolesAssigned returns "NONE" whenever a group never went through a
    role check -- and always when solo. ROLE_ATLAS has no "NONE" entry, so the
    role icon silently stayed hidden on the live frames while the option said it
    was on. The preview never showed this: its fake roster carries hard-coded
    roles.
    Reuse the resource bar's role resolver (renamed _powerRole -> _unitRole, it
    now serves both) so the PLAYER falls back to their spec role -- the same
    fallback unitIsTank already applies for the aggro exemption. Other units keep
    whatever the group assigned; they have no readable spec role, and a real
    dungeon group assigns roles anyway.
    Without this the two halves of the same feature disagreed: solo, a Resto
    Druid got a mana bar (spec fallback) but no healer icon.
    Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • shell: pair the Base cards by height, not by topic
    The short Resource bar card (texture + fill colour + hint) next to the tall
    Health bar card left the top band visibly half empty. Swapped it with Text
    style: Health bar + Text style now lead the tab at a matching height, and
    Resource bar pairs with the equally short Absorbs card below.
    Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • raidframes: keep the chunk under Lua's 200-local ceiling
    Adding the resource bar pushed the file past Lua 5.1's per-chunk limit of 200
    locals ("main function has more than 200 local variables" at load).
    Two changes, neither of which touches the hot path:
    • Dropped the five power-API upvalue aliases. A local alias only pays off over
      a global when it saves repeated lookups; UnitPowerType & co. are read once
      per power event, and a global read is the same cost class as the table read
      an alias would replace it with.
    • Moved the COLD power helpers onto the module table (_powerRole, _powerRGB,
      _powerRoleShown, _setPowerShown, _setBarHeight, _renderPowerFake,
      _POWER_TOKEN) — the pattern the rest of this file and EllesmereUI's ns.RF_*
      helpers already use. Reading a table field is one hash lookup; the perf rule
      bans ALLOCATING tables in hot paths, which this does not.
      The health-segment path keeps its plain locals (setBarValue, segWrite, the
      interpolation enum and the fallback latch).
      ~15 local slots free again; documented at the block with the reason.
      Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • raidframes: add a resource bar at the frame bottom
    A thin resource strip at the bottom of each frame (Blizzard standard, not
    placeable). Secret-safe by construction: UnitPower/UnitPowerMax are secret
    numbers in group context, so the bar runs on UnitPowerPercent against the
    ScaleTo100 curve (resolved C-side, clean 0-100) and needs none of the health
    bar's clip apparatus. maxPower is never compared -- only a CLEAN zero max
    counts as "no resource".
    The pass owns the health-bar height: showing the strip takes its height from
    the health bar, hiding it gives the height back, so no gap is left under the
    bar. Texts anchor to the health bar now, which keeps them centred in the
    health area (identical when no strip shows).
    Shared style in Base (master switch, texture, fill colour = resource type or
    class); height + the Healer/Tank/DPS role filter live PER CONTEXT, so a 5-man
    can show everyone while a raid restricts itself to the healers. Own preview
    eye + click-to-configure hotspot; renders in the dock and Edit-Mode previews.
    Also adds "Smooth bars": native 12.0 StatusBar interpolation for the health
    segments and the resource bar, with a latch that falls back to the plain call
    once should any client reject the interpolation argument for raw values.
    Co-Authored-By: Claude Opus 5 noreply@anthropic.com
  • raidframes: separate preview eyes for name and HP text
    Both text cards shared one "text" preview layer, so hiding either eye
    blanked both texts (Florian 2026-07-26). They are their own layers now
    (nameText / healthText), nested under Text in the dock popover. The old
    shared key is still honoured so existing profiles keep working.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: lift result rows to the hover layer for weaker panels
    Card -> Input is four lightness steps: visible on Florian's OLED, likely
    invisible on an average panel, and he was right to doubt it. The row face
    moves up to Surface.Hover, and interaction switches from "another grey"
    to an accent wash (hover) and selection tint (keyboard), which read on
    any display.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: give each search result its own face
    Loose rows on one large card had nothing to sit on (Florian 2026-07-26).
    Every result now carries a face one lightness step above the card
    (Card -> Input, hover -> Hover), with a real gap between rows -- depth
    from the step between layers, as the design bible puts it.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: group search results by module and tab
    Pushing more context into each title was a losing game: with the card in
    front you still could not tell Raid from Group, and prefixing the tab too
    ("Raid · HoTs · Wachstumsrichtung") only makes every row longer.
    Written ONCE as a group header instead, the rows drop their path line and
    shrink to a single line -- the list gets shorter and clearer at the same
    time. The card keeps leading the title, since within a group that is what
    tells two identical option names apart.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: lead search results with their card name
    Searching "richtung" produced ten rows all titled "Wachstumsrichtung",
    with the only distinguishing information in the small path underneath
    (Florian 2026-07-26). The card now leads the title --
    "HoTs · Wachstumsrichtung" -- so the rows are told apart at a glance, and
    the path below drops the card it no longer needs to carry.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: unique search keys, and collapse card-name matches
    Two findings from Florian's "hots" round:
    • Jumps landed on the wrong card. An entry's key was Module/Tab/Label,
      but "Max. Icons" exists on all four aura cards of one tab, so the keys
      collided: the name came from the first card built, the row map from the
      last (Debuffs). Keys now disambiguate by occurrence count -- builders
      are deterministic, so a rebuild produces the same keys.
    • Searching a card name listed every option on it (6 rows for "hots").
      Jumping to the card shows all of them anyway, so a card-name match now
      collapses into ONE card-level result per context. Options matched by
      their own label stay individual.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: index options inside collapsed sections
    "hots" returned nothing (Florian 2026-07-26): collapsed sections don't
    just hide their rows, they never build them, so every option inside the
    aura and icon disclosures was missing from the index entirely.
    ns.ShellIndexing makes every collapsible count as open while the index is
    built. Jumping to such an option also opens the sections and drops the
    screen cache first, otherwise the target row would not exist on the
    rebuilt screen.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: keep the search term when leaving the results
    Florian's call, and the better one: every way out of the result view now
    behaves identically -- result jump and nav click both keep the term, and
    the X is the one way to throw it away. Two rules for "leaving the search"
    were harder to remember than the stale-looking field they avoided, and
    losing a term costs typing while keeping one costs a click.
    Focusing the field preselects the term so typing replaces it, which was
    the only real friction in keeping it.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: roomier search rows, nav click ends the search
    • Result rows were cramped: taller row, the label moves to the listLabel
      role (the one meant for list rows) and the breadcrumb to label, with
      real air between the two lines so the path stops sticking to the name.
    • Clicking a module in the nav now ends the search instead of leaving the
      results up with a tab bar drawn behind them. The field is cleared too --
      leaving it filled would re-open the list on the next focus, which is
      what we want after a result jump but not here.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: search results name their card, and the card is searchable
    "Klassenfarbe" under "QoL > Base" told you nothing about which class
    colour it was (Florian 2026-07-26) -- the card is the level that makes a
    result unambiguous. The breadcrumb now reads
    "QoL > Base > Cursor", and the card name joins the haystack, so
    searching "cursor" finds every option on that card even when no label
    mentions it.
    A row only learns its card when it is placed (rows are built with the
    screen as parent and reparented by place), so the entry keeps a link
    back and the card fills it in there. Field controls sit nested in a
    FieldRow cell, so the tagging walks a few levels down.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: tint search glyphs with SetVertexColor, not UI.SetColor
    Root cause of the blank icon boxes: UI.SetColor only vertex-tints
    textures flagged _round (the rounded fill/border/pill assets) and calls
    SetColorTexture on everything else -- which replaces the image with a
    flat fill. Both glyphs were being painted over one line after
    SetTexture, which looks exactly like a missing file.
    The file, the path, the client restart and the EditBox parenting were
    all red herrings. makeCloseButton had it right all along: glyphs take
    SetVertexColor directly.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: search field as a framed face, flush with the nav items
    Icons stayed blank boxes even after a client restart, and the TGAs are
    byte-identical in format to working ones -- the difference was that they
    were parented straight to the EditBox. Every glyph that works in the
    Shell sits on a plain frame, so the field is now a Frame carrying the
    face (fill, border, magnifier, clear button) with the EditBox as just the
    text line inside it. The whole face takes the click.
    Also per Florian: height and edges now match the nav pills so the field
    reads as one of the list, and the placeholder is just "Suche" instead of
    the wordier "Einstellungen suchen ...".
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: fix search result crash, widen field, quieter border
    • CRASH (Wrong object type): result rows were created with the CARD as
      parent, but a card is a table wrapper ({_panel}), not a frame. Rows are
      parented to the screen and reparented by card:place(), like every row
      in Screens.lua.
    • The field was inset 50 left / 30 right, narrower than the nav pills and
      asymmetric; it now spans the nav PILL edges so it sits in that column.
    • No accent outline while typing (read too heavy) — the border stays a
      quiet hairline, the magnifier carries the state instead.
    • Icon glyphs at a fixed size centred in their hit area (the
      makeCloseButton pattern) instead of stretching across the button.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: search polish — air, magnifier, results on a card
    Florian's visual pass on the first build:
    • the search field was clamped between wordmark and MODULES while every
      nav item breathes; both gaps go to the top of the spacing scale
    • magnifier glyph (Lucide "search", rendered at 32px like every other
      icon) names the field and brightens with its state
    • results moved onto ONE full-width card instead of sitting loose on the
      panel background, with hairline separators in the stacked-row language.
      Documented exception to the max-6-track rule: these rows carry no
      control, so the width costs nothing.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: global settings search across all modules
    A search field above the module list that searches INTO the settings of
    every module, not just module names. Results are a list with a breadcrumb
    (Raidframes > Raid) and a type badge, so duplicate labels stay
    distinguishable -- "HP display" in Raid vs Group was the case that drove
    the feature. Clicking a result opens its tab, scrolls to the row and
    flashes it; the term stays in the field so several hits can be worked
    through in a row.
    The index is NOT hand-kept -- W.OptionRow, W.Slider and W.Select register
    their label while a screen builds, so every option added later is
    searchable for free. Screens are lazy, so the first search warms the
    index by building the not-yet-visited ones once into a hidden holder
    (guarded: dock and badge hooks no-op during that pass, builders run in
    pcall, a failure only costs that screen's entries).
    Two details found while prototyping the mockup: matching needs a stem
    fallback (plain substring failed "hots" -> "HoT-Symbolgröße"), and
    tooltips belong in the haystack (searching "instanz" should find options
    whose label lacks the word).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • Merge design-system showcase into main (GitHub Pages, docs/)
  • build: exclude docs/ from the packaged addon zip
    The GitHub Pages showcase (docs/index.html + bundled Inter) must not
    ship inside users' AddOns folder. Add docs to the .pkgmeta ignore list.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • docs: add public design-system showcase (GitHub Pages)
    A self-contained page presenting LumenUI's monochrome-calm design
    system — surface ramp, semantic tokens, typography, radii, spacing and
    a component gallery — with a live accent-preset switcher that mirrors
    the token engine. Self-hosts the bundled Inter (SIL OFL) from /docs;
    .nojekyll serves the static files as-is.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • editmode+buttons: accent the Edit Mode chrome, keep functional signals neutral
    Edit Mode's cached toolbar + selection panel now rebuild with the new accent on
    the next open (EditMode:OnAccentChanged, called from Shell:RefreshAccent when no
    session is live). Functional in-world signals (guides/selection/walls, the
    GOLD/GOLDINT/MUTED literals) and the white world-dim overlay stay neutral by
    design.
    Also fixes a latent accent-staleness: BTN_VARIANTS and UI.Border.active captured
    the accent BY VALUE at file load, so a rebuilt PRIMARY button (e.g. Edit Mode's
    "Done") kept the old accent. SetAccent now re-points UI.Border.active and, via
    W.RefreshButtonVariants, the primary button variant at the live accent before
    any rebuild. Secondary/danger variants deliberately stay neutral (frozen mono) —
    only the primary action carries the accent (Florian).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • gamemenu: accent the ESC-menu button's "UI" suffix
    The LumenUI button in the ESC menu now mirrors the shell wordmark — "Lumen"
    in the brand colour, "UI" in the live accent — rebuilt on every menu open, so
    it picks up the user's chosen accent (the menu is never open while the accent
    changes, so no live re-tint is needed).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: restyle the colour picker to the HeroUI layout (accent map step 6b-2)
    Rebuilds buildColorPicker top-to-bottom: a quick-pick preset strip (9 chips),
    the SV area, a HORIZONTAL hue slider with a randomize (reroll) button, and a
    rounded swatch + hex row, over Apply/Cancel. The hue marker + drag are now
    X-based; the swatch is a tinted rounded fill. Two equal-width buttons fill the
    footer (German labels overflowed auto-size) and the strong accent border is
    softened to a neutral hairline (Florian). Every colour swatch in the suite
    (incl. the Raidframe fill/bg swatches) shares this picker, so all are modern
    now. New tokens cpPresetGap/cpHueH/cpShuffle; deDE 'Random color' added.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: fix current-tab + scrollbar accent staleness on recolour
    Two accent widgets weren't updating on a live accent change:
    • The current tab's content (e.g. the Global UI-scale sliders, which read
      Accent.color) only refreshed on the next tab visit. RefreshAccent now
      rebuilds the CURRENT tab on a committed change (preset click, picker
      apply/cancel); a live picker drag stays chrome-only (a rebuild would orphan
      the picker's anchor) and settles on commit. Chrome re-tints in place, so no
      full-shell flicker — the content repaint matches a tab switch.
    • The scrollbar thumb (persistent chrome, reads Accent.color) kept the old
      colour; RefreshAccent now re-paints it. The picker gained an onApply commit
      callback so the custom flow can do the full refresh on close.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: custom accent via the colour picker (accent map step 6b-1)
    The accent preset row gains a "+" custom tile: it opens the existing HSV
    picker with a live preview (onChange stores the hex + Shell:RefreshAccent
    each drag frame), Cancel reverts to the colour on open. When a custom hue is
    active (no preset matches) the tile fills with it and takes the ring; a preset
    being active shows a neutral +. deDE string added. Picker restyle (HeroUI
    layout) is the next step.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: accent preset picker + live recolour (accent map step 6a)
    Curated accent presets (Pure Light/Gold/Amber/Sage/Azure/Violet/Rose) in a
    new Global-tab card (W.AccentPresets). The choice persists account-wide in
    db.global.accent and is applied at init via UI.SetAccent before the shell
    builds. Shell:RefreshAccent recolours live on a swatch click: event-driven,
    no loop/OnUpdate — re-tints the persistent chrome (aurora/lit-dots/nav-edge,
    wordmark UI, tab glow+fill) through stored refs, and InvalidateScreenCache
    rebuilds other tabs' content fresh on their next visit, so no full-shell
    flicker. Slider fill/thumb already read Accent.color, so they follow the
    accent too (confirmed wanted). deDE strings added.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: accent semantic wiring (accent map steps 4+5)
    Step 4 — wordmark: only the "UI" suffix takes the accent (colour-escaped
    tail, LUMEN stays Text.Primary); invisible in mono (accent == off-white),
    recomputed by a future SetAccent via self._applyWordmarkAccent.
    Step 5 — SetAccent now sets switch/primary-button ON fill to the colour when
    a colour accent is picked (a colour won't bloom); only the pure-light mono
    default keeps the softened anti-bloom light. Checkbox, dropdown check, button,
    focus border, tabs/nav and active borders already read Accent.* tokens, so a
    colour theme flows through with no further edits. Dormant until the picker.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: nav-edge glow (accent map step 3)
    A crisp 2px accent line over the nav/content divider, its vertical alpha
    profile baked into nav-edge.tga (top .62 -> gap 42-74% -> bottom .21) so it
    lights the edge only where the aurora sits on the left side (strong top,
    faint bottom, quiet middle). Sits over the faint structural divider, tinted
    by the accent, width pixel-snapped to a whole 2px (no blur).
    NAV_EDGE_INTENSITY tunes it.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: aurora-lit dots (accent map step 2)
    A second dot layer tinted by the accent, masked to the aurora footprint
    (aurora-mask.tga, the normalized-to-1.0 aurora shape) so only the dots under
    the aurora take colour; every other dot stays neutral grey. Two masks
    multiply on the lit layer: the rounded-corner mask and the aurora-shape mask.
    The glow layer moves to sublevel 4 so it still sits over the dots (dots peek
    through, tinted). DOT_LIT_ALPHA tunes lit-dot strength independently of the
    glow. Subtle in the mono default, the payoff in a colour theme.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: add accent-tinted aurora ambient (accent map step 1)
    Soft accent glow in the content area: a top-right-dominant band tapering to
    a smaller top-left lobe hugging the content edge, plus a faint bottom-left
    counter-glow (the quiet diagonal). Baked white (aurora.tga) and tinted at
    runtime via Accent.color, so it is near-white in the mono default and takes
    the user's hue once a colour accent is picked. Drawn over the dot field
    (dots peek through), under cards/nav, sharing the panel corner mask.
    AURORA_INTENSITY is the live-tune knob.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • fonts: subset Inter to Western Latin (1.6MB -> 189KB)
    Subset the 4 Inter TTFs via pyftsubset to Basic Latin + Latin-1 +
    Latin Extended-A + punctuation/currency, dropping hinting and all
    OpenType layout features except kerning (WoW's FontString renderer
    applies none of them). Keeps accented glyphs so dynamic spell names
    render fully. In-game confirmed: no missing glyphs, text stays crisp.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • textures: drop dead assets superseded by the v3 radii
    Remove the round-fill/edge r8/r10/r16 assets (radius scale bumped to
    14/18/22 in v3; only 4/6/12/14/18/22 are ever built) and the unused pill
    heights h18/h22/h36 (built heights = 4/28/32/38/48/52). Trim ROUND_MARGIN
    • PILL_MARGIN to the live keys. 19 files removed; Textures/ is 93 -> 74.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • textures: restructure Textures/ into category subfolders
    Split the flat 93-file Textures/ into round/ pill/ icons/ bars/ cursor/
    shell/ (Logo + LICENSE stay at root). Each file's base-path constant now
    points at its subfolder; Tokens.lua splits ROUND_TEX into ROUND_TEX
    (round/) + PILL_TEX (pill/), and Shell.lua adds TEX_ROUND/TEX_SHELL for
    its mixed refs. Every built path was grep-verified to resolve. Pure
    reorg — no texture content or code behaviour changes.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • raidframes: guard the Blizzard-suppress SetParent hook against re-entrancy
    Re-enabling raidframes while a SECOND addon also hooks the Blizzard
    container's SetParent (e.g. another raid-frame suite) ping-ponged the
    parent between the two hidden parents forever -> C stack overflow. The
    existing parent == blizzParent check only stops our own recursion; add
    a blizzReparenting flag so we yank the parent back at most once per
    event. Both parents are hidden, so the container stays hidden either way.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: remove dead code + unused fonts (B)
    Delete the unused UI.RoundKnob helper and the retired Cinzel/Hanken TTFs
    • their OFL licences (only Inter is loaded now). Dead texture assets are
      handled in the upcoming Textures/ restructure.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: accent-derive active indicators + fix flat hovers
    1. The tab glow, tab pill and segment pill were hardcoded translucent
      white — now read Accent.glow / Accent.wash, so they tint automatically
      once a colour accent is set (mono = identical white today).
    2. Two hover states had collapsed onto their base surface (the old
      ink520/ink600 shared one value): the QoL action button and the dropdown
      menu items now lift to Surface.Hover on hover instead of staying flat.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: fix UI.Border name collision (table vs draw fn)
    UI.Border was both the new border-COLOUR token table and the existing
    hairline-border DRAWING function — the function definition (later in the
    file) clobbered the table, so Border.default/.hover indexed a function
    and crashed at load (QoL:333, Widgets:2385). Rename the drawing
    primitive to UI.Stroke (the hairline counterpart to UI.Fill); UI.Border
    stays the colour table. All 8 call sites updated.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: delete legacy UI.C / UI.line / font aliases
    Final cleanup phase — remove the UI.C alias table (gold500, ink*,
    text*, danger*), the UI.line border table, the goldA helper and the
    cinzel/hanken font aliases now that every call site reads the semantic
    tokens. UI.ROLE points at the weight names; UI.dangerA reads the palette
    directly. gold500 and friends no longer exist anywhere in the addon.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: migrate Shell chrome to semantic tokens
    Drop the C/L/P locals (UI.C/UI.line/UI.P) for UI.Surface/Text/Border/
    Accent across the shell chrome. No visual change.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: migrate Widgets to semantic tokens
    The big one — drop the C/L/P locals (UI.C/UI.line/UI.P) for
    UI.Surface/Text/Border/Accent/Status across the whole widget toolkit,
    and the cinzel/hanken font aliases for the semantic weight names. Tidy
    the stale token names left in explanatory comments. No visual change.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: migrate EditMode to semantic tokens
    Migrate the runtime UI.P.* refs to UI.Surface/Text/Accent. The literal
    GOLD_R/GOLDINT/MUTED fallback constants stay (EditMode loads before
    Tokens, so ns.UI is nil at file scope — a documented load-order
    exception), but their values are re-synced to the current palette
    (#ECEDEF->#F4F4F4, #8A8A90->#9A9FA5) so the in-world edit accents no
    longer drift from the tokens.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: migrate Screens to semantic tokens
    Drop the UI.C alias (C.ink*/C.text*/C.danger*) and the local UI.P color
    refs for UI.Surface/UI.Text/UI.Status. L stays = UI.LAYOUT (unrelated to
    the retired UI.line). No visual change.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: migrate GameMenu + QoL to semantic tokens
    Replace legacy C.ink*/C.text*/UI.line.* + the hardcoded ESC-button hex
    with UI.Surface/Text/Border. The ESC-menu button no longer carries a
    literal #E9BB69 gold — it derives from the brand token (off-white in the
    mono chrome, matching the wordmark), so it's consistent with the retired
    chrome gold. Font alias cinzelSemi -> semibold. No other visual change.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: complete semantic token tables (prep for legacy removal)
    Additive only — extend UI.Surface (Scrim), UI.Text (Value/OnAccent),
    UI.Accent (wash/washSoft/switchOn + UI.accentA), full UI.Border tiers,
    new UI.Status, and semantic FONT weight aliases. Legacy UI.C/UI.line and
    the cinzel/hanken font aliases stay until call sites migrate, so nothing
    breaks and the page renders identically.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: neutral #0C0C0C base + accent engine + 4-tier text
    Replace the v3a mono palette with a pure-neutral graduated ramp anchored
    at panel #0C0C0C (page #070707 / sidebar #111111 / card #151515 / input
    #191919 / hover #222222) — depth from the lightness step between layers,
    no hue, so a future user-chosen accent (warm or cool) sits cleanly on it.
    Add the accent engine (UI.BuildAccent/UI.Accent/UI.SetAccent deriving
    color/hover/pressed/selection/focus/glow from one base) and the semantic
    token tables (UI.Surface/UI.Text/UI.Border) as the forward API; legacy
    UI.C.* aliases keep existing call sites working.
    Split text into 4 tiers (F4F4F4 heading / D7D7D7 body / 9A9FA5 desc /
    666A70 disabled): row & checkbox labels drop to the new Body tier so card
    titles anchor the hierarchy. Soften border alphas since layers now carry
    separation.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: dropdown menu redesign + preview eye improvements
    Open dropdown menus adopt the sidebar-nav language: rounded inset hover
    pill, plain text when idle, a right-aligned Lucide check (new icon-check
    asset) marks the selection, subtle border (was a hard white ring), and
    roomier rows / taller search / max 6 visible. The checkboxes use the same
    icon-check glyph instead of Blizzard's texture.
    Preview eyes: the eye popover border softened to match; the eye lives on
    the Role icon / Leader icon CARDS (not the section header), and the two are
    now SEPARATE preview layers (roleIcon/leaderIcon) grouped under "Role &
    leader icons" like the aura categories. New "Background" eye hides the
    preview stage backdrop — both the stage AND dock fill (both P.panel), so
    the shell's dotted content shows through and the frames float.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: keep the keybind field border subtle on hover
    The bound keybind field softened to L.mid, but its hover handlers still
    brightened to gold400/gold500 (and L.strong when unbound) — so hovering a
    bound field left a thick white ring stuck until /reload (OnLeave reset it
    to bright, overriding setBorder). Hover now stays subtle: bound holds
    L.mid, unbound gets a faint L.soft->L.mid step and back.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: segments adopt the tab-bar style + control polish
    Segments become a mini tab bar: a fully-round capsule strip with a sliding
    translucent pill (the shared UI.slideTo tween, hoisted from Shell to UI so
    tabs/nav/segments animate identically) instead of a solid white active cell
    — takes white out of the picture, same switch-between-options logic. Sized
    1:1 with the tab bar (tabH, pill-h38); no glow (too heavy inline). New opt-in
    hug mode sizes the strip to its content (like the tabs) so few short options
    don't stretch; the Text-style outline segments use it.
    Also: Health bar / Text style band is now 6+6 (the 8+4 wasted width — field
    cells are constant width, so Health bar's sliders fit a 6-card). ClickCast
    enable switches use the small size (matched the raidframe rows); the skill-icon
    and bound-keybind borders are eased off bright white to a subtle edge.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: bigger rounder pill controls + divider de-dup (mockup pass)
    Match the mockup's control language and clean up the separators:
    • Controls taller (controlH 45->51) and rounder (control radius md 8->14;
      new r14 fill/left/right/edge 9-slice assets baked). Buttons become
      shorter, fully-round PILLs (buttonH 48, pill-*-h48 assets) — selects
      taller than buttons, as in the mockup.
    • Primary button fill softened to switchOn (a pure-white fill bloomed and
      read taller/fatter than the same-height outlined dropdown). Input border
      eased L.mid->L.soft; open dropdown no longer flips its edge to the heavy
      L.strong white (the list is the open indicator).
    • Export card mirrors Import (textarea on top, button below-right) so both
      textareas line up.
    • Card divider de-dup: the inner stacker tracks whether a boundary already
      carries a hairline (header divider or a preceding OptionRow bottom line)
      and hides a following subHeadRow/Disclosure top line, so they no longer
      read as a double divider; a line after a lineless field row still shows.
      Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: gate texture wheel-preview behind Shift/Ctrl
    Plain scrolling over a texture dropdown kept silently changing the texture
    while paging past it. Only cycle+preview when Shift or Ctrl is held; a plain
    wheel now forwards to the Shell scroll frame so the page scrolls as usual.
    Shorten the hint to one line and mention the modifier (EN + deDE).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: align a lone span-6 card with the paired-6 grid
    A band with a single span-6 card computed its width off n-1=0 gutters, so
    the card was cardGap/2 wider than a span-6 card in a 6+6 band and its edges
    didn't line up with the cards above/below (the Status card stuck out past
    Dispel). Reserve a phantom gutter for the empty remainder when a band's
    spans sum below the full grid; full bands (6+6, 8+4) are unchanged.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: move OptionRow separator to the bottom edge
    The row hairline sat on top, so the first row in a card doubled up with
    the header divider right above it, and the last row never closed. Own the
    separator on the bottom instead: the first row has no line under the
    header, the last row closes the group, and flush-stacked rows keep every
    in-between separator at the same boundary.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: calm slider value + fix dependent-slider label recolor
    Two related slider fixes. (1) The compact slider value readout was the
    pure-light accent (near-white); a card of 4 sliders put a row of white
    values that read overloaded — tone it to a calm light (sliderValue token)
    that still leads over the muted label and brightens on focus. (2) The
    slider's enable/disable recolor re-brightened the caption to white and the
    value to the accent on SetWidgetEnabled(true) — so dependent sliders
    (Name/HP text cards, driven by refreshName/HP) diverged from untoggled
    ones (Size & arrangement). Match the enabled compact colours to the
    creation-time muted label + calm value.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: mute field labels (calmer, less overloaded)
    Field-cell labels (above sliders/selects/segments) were bright off-white
    on every control, making the settings screens read as overloaded. Colour
    them muted (C.textMuted) to match the mockup's .flabel — the bright value
    readout beside them now leads, the label recedes. Card titles and toggle-
    row labels stay bright (they carry the hierarchy).
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: round switch — pill track, circular knob, light off-knob
    Reinstates the fully-round switch (v3): pill-<h> track + circle knob,
    replacing the squared rectangle/rounded-square. Knob inverts with state
    so it stays visible either way (light off-knob on the dark track, dark
    knob on the light track). ON track uses a softened light (not pure white)
    to avoid the irradiation bloom against the dark off state, and the fill
    is inset 1px so its rounding lands on the edge ring — both states now
    share the exact same rounded outline.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: rim dot-field background + typography/spacing/slider polish
    Dot-field background (baked TGA tile + rim vignette, 9-slice masked,
    nav column excluded) plus a polish pass against the v3 mockup: Inter
    weight/role fixes, unified card rhythm and padding, un-boxed sliders
    with visible track and pixel-snapped bars.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: sliding nav + tab-bar indicators, v3 chrome
    Redo the nav rail and tab strip as the mockup's sliding-indicator
    components. ONE pill per level tweens to the active item via a short
    self-terminating ease-out (§9-safe): the nav pill slides vertically,
    the tab pill slides + resizes and carries a baked soft underglow (WoW
    has no live blur). Tabs sit on a fully-round capsule strip; the nav is
    text-only with a subtle right divider (pixel-snapped). Seamless sidebar
    (no own fill) so the panel border wraps consistently; wordmark on the
    tab-row height; wider shell (+40) for navbar breathing room. New pill/
    glow/r12 assets. luacheck 0/0.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • editmode: monochrome in-world accents
    Retint the in-world Edit Mode accents (guide lines, selection
    highlight, soft walls, chain-link couple states) from warm gold to
    the mono palette — off-white for guides/selection, pure light for the
    coupled/active state, muted grey for idle. Matches the v3 monochrome
    Shell; the config windows already went mono via UI.P.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com
  • shell: monochrome v3 — mono palette, generous radii, Inter font
    Retire gold from the Shell chrome (including the wordmark) for the
    agreed monochrome-calm redesign: off-white on near-black, pure-light
    accent, subtle white hairlines. Bump the headline radii — cards
    lg 10->18, chrome xl 16->22 — with newly generated 9-slice assets.
    Switch the UI font to Inter (SIL OFL) for one clean sans everywhere
    (SF Pro is Apple-proprietary and cannot be bundled); heading case
    becomes sentence case. Legacy font/colour aliases keep every call
    site resolving with no other edits.
    Co-Authored-By: Claude Opus 4.8 noreply@anthropic.com

This mod has no additional files