v0.9.287-beta
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-beta0.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.
- Rebuilt on a calm monochrome base: a graduated dark palette where depth comes
- 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.
- New: a resource bar — a thin strip at the bottom of each frame. The look
- 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.
- New: accept group invites automatically from friends and guild members. Only
- Under the hood
- Smaller download: the bundled font is subset to Western Latin (1.6 MB → 189 KB)
and 19 unused textures are gone.
- Smaller download: the bundled font is subset to Western Latin (1.6 MB → 189 KB)
- 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
- Dropped the five power-API upvalue aliases. A local alias only pays off over
- 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
- Jumps landed on the wrong card. An entry's key was Module/Tab/Label,
- 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
- Result rows were cramped: taller row, the label moves to the listLabel
- 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
- CRASH (Wrong object type): result rows were created with the CARD as
- 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
- the search field was clamped between wordmark and MODULES while every
- 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
- The current tab's content (e.g. the Global UI-scale sliders, which read
- 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
- PILL_MARGIN to the live keys. 19 files removed; Textures/ is 93 -> 74.
- 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
existingparent == blizzParentcheck 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
- their OFL licences (only Inter is loaded now). Dead texture assets are
- shell: accent-derive active indicators + fix flat hovers
- 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). - 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
- The tab glow, tab pill and segment pill were hardcoded translucent
- 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
hugmode 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
- Controls taller (controlH 45->51) and rounder (control radius md 8->14;
- 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

