Repository navigation
Dark mode on core colour tokens, plus backend and bundled-plugin dark-mode fixes - #58
Merged
Merged
Conversation
Backend dark-mode audit of the TailwindUI skin across installed plugins + core. findings.md is authoritative (G1–G26, root-cause clusters, fix-ownership map: core → this skin's darkmode.css; plugin chrome → each plugin). Includes the scaffolder-driven capture reports. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- btn-default/secondary used dark:bg-gray-400 + dark:text-black — a light-grey flash-bang on every toolbar. Change the dark variant to a proper dark button (dark:bg-gray-700 + dark:text-gray-100 + hover:bg-gray-600); also darken the btn-group divider border and the open dropdown-toggle state. - The core Fieldset widget kept its light #f5f5f5 panel in dark mode; add a .fieldset dark override (inset bg + dark border) in darkmode.css. Both verified in dark mode. Refs darkmode-audit/findings.md (G6, G21). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Four verified dark-mode fixes down the audit FIX LOG: - G3: core table.css paints readonly Table-widget cells white (#f7f7f7); add a matching-specificity dark override so e.g. Translate's source-string column reads legibly (var(--drk-bg-color-inset)). - G14: list totals header/footer (tr.table-totals) rendered as light #f2f2f2 bands; darken to var(--drk-bg-color-b). - G1: the active primary-tab used --drk-bg-color-a:#555, a washed grey "broken lozenge"; swap for the palette raised surface #21262d. Also darken the light gray-200 border-top the tab-content inherits from core. This is the global .control-tabs.primary-tabs rule, replacing the old .master-area-only scope, so it covers all primary tabs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
G2: core's eventlogs _field_details.php partial ships a hardcoded light theme (white panel, #efefef trace frames, #f5f5f5 code snippets, dark syntax-highlight colours) via an inline <style>. Add a dark override block in darkmode.css — .dark #winter-log-viewer... outranks core's id-only inline rules — covering the panel, detail table, trace frames, code snippets, the highlight line and all 8 syntax-highlight classes (recoloured for a dark background). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- G11: the media-manager preview placeholder's dark-mode rule was still painting the light checkerboard (#efefef/#d2d2d2) and a white "Nothing is selected" band — never actually darkened. Swap to dark squares (#0d1117 on --drk-bg-color-c) and a --drk-bg-color-b message band. - form-preview: readonly record previews (e.g. SSO logs preview) used off-palette flat greys (#343434/#626262); move onto --drk-bg-color-b / --drk-border-color so they match the rest of the theme. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both editor bodies were already dark but their toolbars stayed light #f2f2f2 with dark (invisible) buttons. Darken .control-toolbar.editor- toolbar (markdown) and .fr-toolbar (Froala) to --drk-bg-color-c with dark borders, recolour toolbar buttons/icons (text + svg fill) light with dark hover/active states, and darken the Froala separators. Verified markdown toolbar on blog/posts/create and the Froala toolbar on a Winter.Pages static page. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…(G9) - The "Create a new blank theme" / "Find more themes" buttons were a neon #263baf indigo flash-bang; retone to the btn-default palette (--drk-bg-color-btn with a border, --drk-bg-color-c hover). - The no-preview theme thumbnail is the light-grey default-theme- preview.png asset; invert(0.9) it (scoped by src) so the placeholder reads dark while real theme screenshots stay untouched. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The active/hover filter-scope colour was a jarring lime #cddc39 (plus a #ffeb3b popover-hover) that clashed with the theme. Retone to the gold #ffd700 already used for active tabs, so an applied filter reads as a consistent "active" highlight. (The truncated responsive scope dropdown is core filter layout, not a dark-mode issue — left as-is.) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Core trio: - G16: darken/desaturate the fancy-layout header's bright brand-teal band (form-tabless-fields + fancy nav-tabs -> #1a4653, breadcrumb -> #153a45, current segment -> #1e515f) so it reads as an accent header instead of glowing. Scoped to .fancy-layout so non-fancy pages are untouched. - G5: relation-manager embeds (.relation-behavior) framed their list with a light #eee box; darken the .control-list border. - G13: markdown/rich preview tables kept light gray-200 cell borders even under prose-invert; add explicit dark cell borders. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
G23 (Builder migration column-type selector) turned out to be core table.css, not Builder CSS: the cell dropdown (.table-control-dropdown- list) is painted white with #555 text on non-focused items, and an active dropdown cell's .content-container goes white while editing. Darken both in the darkmode.css control-table section. The Builder Database/table editor is now fully dark via core fixes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
After G1 darkened the active .master-area tab title to #21262d, its skewed wings (span.title::before/::after in fancy-layout.css) stayed hardcoded white #fafafa, so the active CMS/Builder tab read as a dark pill flanked by two white slivers. Add a dark override alongside the source (unlayered, so Tailwind won't purge it). Verified on the CMS 404-page editor. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The Components sidebar (.control-filelist.component-list) divided its group rows with a light #e6ebed top border. Darken it to the theme border colour. Verified on backend/cms Components. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…finding Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ings Root-cause fix for the tab-wing "whack-a-mole": the bright runtime --secondary teal leaked onto every tab bar/title/wing the skin didn't explicitly override, and the muted-teal values were scattered literals. - Declare a --drk-accent-* family in :root (bar/raised/active/recessed) plus --drk-bg-color-raised/hover/recessed, --drk-border-color-strong, --drk-color-muted/faint — the one place to retune the dark palette. - Convert the fancy header, breadcrumb, master-tabs and secondary- content-tabs teal literals to the accent vars. - Add the MISSING wing rules (master-tabs inactive ::before/::after and secondary-content-tabs active ::before/::after) so every wing tracks its title — no more bright-teal slivers. Verified across tab types: zero teal leaks remain. Adds darkmode-audit/color-centralization-audit.md documenting all 134 hardcoded colors + the full value->variable mapping for the remaining consolidation passes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Phase 1 of the brand-driven color-variable architecture (see
darkmode-audit/brand-color-variable-architecture.md). Instead of the
--drk-accent-* muted-teal literals (whack-a-mole), redefine them under
.dark via color-mix() against the live --brand-secondary (emitted as a
CSS var by core BrandSetting/custom.less), mixed toward the dark base.
- Change secondary_color in the branding settings -> the entire dark
fancy header / tab bars+wings / breadcrumb retint automatically.
- A custom dark palette can override via --brand-secondary-dark
(var(--brand-secondary-dark, var(--brand-secondary)) fallback chain).
- Percentages tuned to match the approved muted teal (verified: header
rgb(24,69,85), bar rgb(21,56,69) == prior #1a4653/#153a45).
Requires the companion core change (modules/backend/models/brandsetting/
custom.less emits :root{--brand-primary/secondary/accent}) — pending as
an upstream Winter core PR (Phase 2 migrates the rest of core LESS).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This comment was marked as resolved.
This comment was marked as resolved.
Work-in-progress artifacts for the light-mode colour centralization effort (Task #14 / brand-architecture P2-P4), split onto their own branch so PR #58 stays a clean dark-mode-fixes diff. - HANDOFF.md: pick-up doc — branch/PR state, artifacts, locked design decisions, and the ordered next actions (A brand-var Tier-1 swap, B approve the --wn-* token set, C mechanical replace, D dark = token redefinition). - color-consolidation.html: interactive report clustering 152 core hardcoded hexes (428 uses / 105 LESS files) into 21 proposed --wn-* tokens; clickable swatches toggle each candidate live on the real UI elements it's used on. - palette-ui-kit-fable.html (+ palette-mock/palette-ui-kit): the design mock prototyping the future skin direction (reviewed A-/shippable-direction). - color-misuse-audit.md: ~34 off-palette accents in the dark skin (audited). - Design System PDFs: official brand colour + logo references. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Documents the six pushed scaffold:{author}.{plugin} demo-data commands
(branch/SHA/test/seed-counts per plugin), the shared conventions, the
test-harness gotchas discovered while building them, the HTTPS push
workaround, and the remaining first-party plugins to cover — so another
machine/agent can finish the scaffolding effort.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
v1.0.2 was tagged and released in May 2026 but never got a version.yaml entry, so Winter's VersionManager had no record of it and the update log skipped straight from 1.0.1 to 1.1.0. Reconstructed the notes from the tag's own diff, since the release body carried only the auto-generated changelog link: - the asset_url link tag added to both layouts, without which Snowboard falls back to guessing the asset base from window.location and breaks on subdirectory or separate-asset-domain installs - the dead backend.css reference dropped from the auth layout, which had been 404ing on every login page Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…lwindui-plugin into wip/colour-architecture
The first version of these lived only in a session scratchpad and was lost
when it was cleared, taking the ability to revert or re-run the change with
it. They are in git now for that reason.
- apply.php / unapply.php replay and exactly reverse the token rewrites
- build.sh compiles BOTH asset pipelines (winter:util for
winter.css, mix for storm.css) with plugins
disabled, then restores their state
- verify.php collapses the tokens back out of the compiled CSS
and proves no selector paints a different colour set
- contrast.php WCAG 2.1 before/after, only for token pairs that
actually co-occur on an element
- extract-map.php re-captures token-map.json from the applied tree
- lab.php CIELAB / deltaE / chroma / WCAG helpers
token-map.json was captured from the applied tree rather than by re-running
the original role-inference heuristics: those were tuned interactively and
are not reproducible, whereas reading the tree back cannot drift from what
was built and reviewed.
Changing a colour is: edit tokens-values.json, apply.php, build.sh.
tokens.less in core is generated and must not be hand-edited.
verify.php's baselines are generated (--capture) and go stale as soon as core
moves, so they are gitignored rather than committed.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
HANDOFF.md still said the light-mode colour cleanup was unstarted ("Nothing
here is applied to core yet — it's the plan + approval gate"). It is now open
as wintercms/winter#1541.
HANDOFF-token-experiment.md is rewritten from a mid-experiment parking doc
into a record of what shipped, where the tooling is, and what is still open:
the 56 literals LESS colour functions keep locked, 11 pre-existing contrast
failures that are now one-line fixes, and the absence of any test guarding
that every var(--wn-*) resolves.
It also keeps the traps that cost real time, notably: there are two asset
pipelines and tokens only ship in one of them; a var() fallback does NOT
rescue a defined-but-invalid value, so a token needing a feature guard must
be declared inside @supports; verify.php validates the plumbing, not the
palette, so it cannot catch a bad colour; and `overflow: hidden` is still a
scroll container, which is what made the tab strip jump on focus.
color-consolidation.html and color-token-map.html are marked superseded --
their groupings predate the fit guard that shipped.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Adds a sticky bar with a progress meter, per-group approve/override chips with a note field, and a Copy-decisions button that emits both a readable summary and a JSON block. State persists to localStorage; the clipboard write falls back to a hidden textarea + execCommand, which is what works when the report is opened over file://. Kept for reference: the groupings in this report predate the fit guard that shipped in wintercms/winter#1541, so they no longer match the applied token set. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
wintercms/winter#1541 shipped with review changes the tooling never saw: the rgba scrim tokens and several misrouted identity tokens were reverted, and five tokens were added in the final round (--wn-list-selection-bg/-border, --wn-framework-flash-warning-bg, --wn-flashmessage-flash-warning-bg, --wn-fancylayout-bg-hover). tokens-values.json now matches core exactly: apply.php run against develop regenerates tokens.less byte-for-byte and rewrites nothing. token-map.json was recaptured from the merged tree with extract-map.php (661 rewrites, 83 files, 169 tokens).
The brand-variable architecture doc proposed emitting unset dark overrides as empty custom properties. An empty value is a valid value rather than the guaranteed-invalid one, so var() would substitute it instead of falling back and every derived colour would be dropped. Unset overrides are now documented as omitted, the comment-only purpose-variable values are real color-mix() expressions, and each expression carries the literal fallback darkmode.css uses. The first-pass capture files (_summary.md, core.md, redirect.md) are labelled as historical snapshots pointing at the findings.md fix log, and findings.md no longer lists resolved surfaces as uncaptured or leaves G22/G23 ownership conditional: both were confirmed during the fix pass. Markdown lint: fenced code blocks have languages, tables have surrounding blank lines and consistent column counts, and headings/lists/fences have surrounding blank lines.
The brand asset refresh in wintercms/winter#1541 removed winter-logo-white.svg. The auth layouts and Plugin.php were updated for it, but the side-menu partial still requested the old file, so the backend showed a broken image wherever no custom logo is set. logo-light.svg is the variant with white lettering for dark backgrounds.
Core now paints through --wn-* tokens (wintercms/winter#1541), so dark mode can redefine those instead of overriding each rule that uses them. The .dark block now maps the neutral tokens onto the existing --drk-* palette by role (text, surfaces, borders, inputs, hover, selection), plus the few identity tokens this file already repainted consistently. That makes 86 declarations here redundant; they are removed, and 48 rules left empty with them. Each removal was verified rather than assumed: on 25 backend pages in dark mode, every element's and pseudo-element's colours, borders, outlines and shadows were captured, the token block applied, and a declaration removed only if doing so changed nothing on any page where it matched. Declarations that matched nothing on those pages are kept, since their redundancy could not be shown. The token block also darkens elements this file never covered, which were rendering their light-mode colours in dark mode: dark slate text and icons on dark surfaces (pagination, record navigation, file upload names, component list), light #d1dbe0 borders and placeholders, the recordfinder and datepicker panels, sweet-alert text and scoreboard values. The switch knob is pinned light: core paints it with --wn-surface-hover, which is now dark. Light mode is untouched: every change is scoped under .dark, and the same 25 pages capture identically in light mode before and after.
Gaps the token block does not reach: - Plain secondary tabs (fancy-layout.css paints the bar bg-secondary and the active tab bg-white) glowed bright brand teal, with the active tab white behind light text (~1.5:1). The bar now uses --drk-accent-bar and the active tab takes the page background, joining the content below as it does in light mode. - Core's logos (.wn-logo, e.g. the dashboard welcome widget, and the empty-editor watermark) draw logo-dark.svg, whose lettering vanished on dark surfaces. They swap to logo-light.svg, and the watermark overlay dims it so it stays a watermark. - Input-group addons (email/URL field icons) kept core's literal #eee. Palette, per darkmode-audit/color-misuse-audit.md: this file used 8+ colours for "active", a traffic-light rainbow on media titles, four colours on one sort control, salmon/coral/gold/yellow headings, neon named colours on the user statistics widget and five unrelated link blues. They now resolve to roles: - --drk-color-accent: the brand secondary lifted toward white, derived with color-mix like the other accent vars so custom branding follows; used for links, active indicators and focus rings. - --drk-bg-color-selection for every selected/active background (menus, balloon selector, sorted column). - --drk-color-success / --drk-color-warning beside the existing --drk-color-danger, which now also covers the stray reds. - Headings and titles use --drk-color; descriptions, placeholders and empty states use --drk-color-muted. The syntax-highlighting and git-diff palettes are left alone: they are self-contained and correct.
Dark mode now depends on core's --wn-* tokens (wintercms/winter#1541), which ship in Winter 1.2.15; on an older core the tokens are absent and the surfaces they cover would stay light. The constraint follows the other first-party plugins in also allowing dev-develop.
… handoff tools/dark-tokens/ is the browser harness that proved which darkmode.css declarations became redundant once dark mode redefined core's --wn-* tokens, and that light mode is unchanged. Committed for the same reason as the colour-token tooling beside it: the next person changing dark mode should be able to measure the change rather than eyeball it. Generated data and dumps are gitignored.
Primary tabs (e.g. Settings/Meta in the Pages and CMS editors) were inverted in dark mode: darkmode.css forced every title to the page colour with !important and faked a raised active tab by redefining --drk-bg-color-a to #21262d, so the inactive tab was darker than the active one and neither joined the panel below. Those overrides are gone: core's tokens now give the active tab the canvas colour (the panel it opens) and inactive tabs --wn-surface-overlay, the same structure as light mode. The master-area wing override follows the active title. Secondary content tabs (Content/Sidebar/Preview): the active link kept fancy-layout.css's bg-white, which showed as white edges round the tab, core drew the inactive wings in literal white, and the editor toolbar's white top border ran a bright line under the tabs. The active tab now takes the toolbar surface it sits on. Selected rows in the tree, file list and asset list were a grey #777 block: core paints them with --wn-text-faint, a text colour in dark mode. They now use --drk-bg-color-selection, with --drk-bg-color-hover for hover (replacing a stray #9a9a9a). The fancy delete button always added its title label and margin, leaving dead space in the icon-only CMS/Pages toolbar buttons; it now only labels itself when it has a title, as core does. The empty-editor watermark swap also covers the legacy oc-logo-transparent class Winter.Pages uses.
Core draws inactive primary tabs as a flat box in the overlay colour. On the light-mode bar that reads as a pale lozenge, but on the dark teal bar it was a dark rectangle stamped onto the header next to the winged active tab (Settings/Meta in the Pages and CMS editors). Inactive tabs now get the same winged silhouette as the active one, filled with --drk-accent-recessed and stacked beneath it, and lose the CMS tab-label cap line that only belongs on the active tab.
- Icon picker: its modal ships its own light palette (white panels and tiles) but inherits dark-mode text, so every label was light grey on white. The modal, tiles, search box, sidebar and footer now use the dark palette, with selection and hover states. Its styles are Vue-scoped, so each rule carries an extra .aim-modal. - Date picker: today was brand navy on a dark cell and the selected date white on brand green (~2:1). Selected is now dark on the accent, today is the accent in bold, and the month arrows are visible. - Time picker: the selected hour sat in a pale blue bubble behind light numerals and the active header digits were navy. The dial now uses the selection colour and accent hand, and the active digits the accent. - Nested forms in a fancy layout took the header band's accent colour, because the header rule matched any .form-tabless-fields. It is now scoped to the top-level form, the way core scopes its fancy-layout rules.
The picker's Vue-scoped rules (.aim-modal .aim-modal--content[data-v-…]) have the same specificity as the dark overrides and are injected after this stylesheet, so the modal's header, sidebar, content and footer stayed light while its tiles went dark. The rules are now anchored on the open modal (.aim-modal.aim-open), one class stronger.
Only the bar and the current segment were recoloured in dark mode, so the other segments kept the runtime brand teal (#0e7d9a) and every arrow tip and separator stayed bright (#2da7c7). Dark mode now mirrors core's light-mode structure: recessed segments with matching arrow tips, header-coloured separators, and the current segment raised.
From CodeRabbit review on #58. Each fix was exercised against the real core tree or a stub, not just read. - apply.php skipped a whole line once any token was on it, so a partially applied line could never finish. It now skips per token/literal pair, counting how many of a repeated pair (gradient stops) are already applied, and masks existing var() calls so a fallback is never wrapped twice. Unwrapping one stop of the file-upload checkerboard and re-running restores exactly that stop. - fill-partials.php iterated once per existing var() without re-masking, so each pass re-wrapped the literal the previous pass had just wrapped, nesting five var() calls on the checkerboard line. It now does one pass per distinct pair and re-masks after each, and re-captures token-map.json afterwards so the filled references stay replayable. - build.sh restores plugins from its EXIT trap (and turns INT/TERM into an exit), so an interrupted build no longer leaves them disabled, and a non-zero compiler exit fails the build even when no error pattern matches. Verified with a stub php: SIGTERM mid-compile exits 130 with both plugins re-enabled; a killed mix compile exits 1. - verify.php --capture stops at the first failing step, never writes a baseline after a failed build, and re-applies the tokens rather than leaving core half-reverted. - verify.php compared one merged colour set per selector, so swapping color and background passed. Colours are now compared per role (text, background, border/outline, shadow); shorthand repacking stays within a role, so it still compares equal. - coreRoot() honours WINTER_ROOT, erroring if it is set to something that is not a Winter root. - README: document the one-time `verify.php --capture` step and the PHP 8.1 requirement.
The plugin now requires the Winter release with colour tokens, which itself requires PHP 8.1, so the plugin's ">=7.2" was no longer true; it also covers the audit tooling's use of PHP 8 functions. Handoff steps B and C still told the next maintainer to approve the old consolidation report and replace the literals, work that has shipped in wintercms/winter#1541 in a form that report no longer matches. They now say so and point at the maintained tooling.
The audit left the active primary-tab wing target open (accent vs page background). It is now settled in the code: wings match their title, which takes the canvas colour of the panel it opens, from core's tokens, as in light mode.
8 tasks
darkmode-audit/ (audit reports, handoffs, design prototypes and the colour-token and dark-mode tooling) is working material rather than part of the plugin, so it is no longer tracked here. It stays in local checkouts via .gitignore, and is backed up on the standalone wip/darkmode-audit branch.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Rebuilds dark mode on core's new colour tokens (wintercms/winter#1541) and fixes the dark-mode problems that turned up across the backend and the bundled plugins while doing it.
Dark mode on core's colour tokens
Core now paints through
--wn-*tokens, so dark mode redefines those instead of overriding each rule that uses them. The.darkblock maps the neutral tokens onto the existing--drk-*palette by role: text, surfaces, borders, inputs, hover and selection. It also covers the few identity tokensdarkmode.cssalready repainted consistently.That made 86 declarations redundant, and they are removed along with 48 rules left empty. Each removal was measured, not eyeballed:
The token block also darkens about 650 element-properties
darkmode.cssnever covered, which were rendering their light-mode colours in dark mode. That includes dark slate text and icons on dark surfaces (pagination, record navigation, file-upload names, the component list), light borders and placeholders, and the recordfinder, datepicker and sweet-alert panels.Dark-mode fixes
Tabs
Widgets
#eeebox.Layout
btn-default, fieldsets, control-table cells, list totals, editor toolbars, media previews, the event log, the theme picker, filters, relation embeds and CMS/Builder tab wings.One dark palette
Following
darkmode-audit/color-misuse-audit.md, the one-off colours now resolve to roles. Before, there were eight different colours for "active", a traffic-light rainbow on media titles, four colours on one sort control, salmon/coral/gold/yellow headings, neon named colours on the user statistics widget and five unrelated link blues.--drk-color-accentis used for links, active indicators and focus rings. It is the brand secondary lifted toward white, derived withcolor-mix()like the fancy accent, so custom branding follows.--drk-bg-color-selectionis used for every selected or active background.--drk-color-successand--drk-color-warningsit beside--drk-color-danger.The fancy accent (header, tab bars, breadcrumb) still derives from the live
--brand-secondary, which core now emits.Audit docs and tooling
The audit that drove this work (reports, handoffs, design prototypes, the colour-token tooling used for #1541 and the
dark-tokensharness that measured the dark-mode removals) is not part of this PR. It lives on the standalonewip/darkmode-auditbranch.Verification
system.logerrors.Known limits
/modules/...URL, because Vite would otherwise try to resolve a relative path into core. On a subdirectory install those logos are simply absent.!important) rather than redefining a variable, because the colours they target never became tokens in core: the brand-derived fancy chrome, named-colour literals, the list/tree row states, the date/time pickers, the switch knob, the icon picker and the logos. Tokenise the remaining backend colours so dark mode can be a pure variable redefinition winter#1552 tracks tokenising them, after which those overrides can be deleted.Summary by CodeRabbit