Files
solvecraft/docs/theme-colour-audit.md
T
Nathan Dane fb374b543b UI: integrate theme radii, borders, palettes and viewport refresh (#5045) (#5046)
* claim: #4922

* UI: let themes own corner radii

* UI: use four-point panel and window radii in SolidCraft 95

* UI: align the 95 radius assertion with four-point panels

* claim: #4953

* UI: let themes own structural and control borders

* UI: single Blueprint outlines and dotted secondary rules

* UI: separate container outlines and add theme-owned 95 bevels

* claim: #5007

* UI: apply theme palettes to icons, workspace tabs and Gruvbox settings

* claim: #5045

* Viewport: invalidate cached geometry colours when the theme palette changes

* UI: preserve legacy theme logo colours with the borderless mark
2026-10-23 23:57:34 +00:00

4.1 KiB

Theme colour audit (#5007)

The audit covers all 20 shipped theme files and the shared SVG icon/tab rendering paths. This work stacks on the theme radii and border changes (#4923, #4954).

Findings and decisions

  • Command SVGs previously read only the compiled light/dark palette. The existing colors.icon and colors.icons.* settings colour other markers/controls, not SVG active faces, passive faces or contours. Optional icon_palette overrides now supply those roles without editing accepted artwork or semantic aliases.
  • Texture identity previously contained light/dark mode, semantic accent, size and finish, but no theme palette. It now includes the resolved palette; switching palettes frees the previous theme's cached textures. Forced-dark app-bar icons coexist with themed icons without repeatedly clearing the cache.
  • Eleven files repeated one fill across Surface, Mesh, Form, Sheet Metal and Render. Six Gruvbox files inherited those workspace settings from the default UI palette. All files now define the seven workspace colours, paired ink and soft surfaces.
  • The six Gruvbox variants omitted form/dialog tokens, leaving Preferences and other form surfaces in the default light/dark palette. They now explicitly colour dialog bodies, footers, rules, controls, text, selection and status states.
  • Text on soft Model selections incorrectly reused solid-selection ink even when its contrast was insufficient (notably 95). The tab chooses a readable theme ink. Selected preview metadata now uses selected text ink instead of dim body text.
Family Colour treatment
Gruvbox dark/light, normal/hard/soft Blue, orange, yellow, purple, aqua, red and green from the family palette; shared accent geometry across contrast variants
Nord, Tokyo Night, Catppuccin Mocha, Nosferatu Distinct workspace hues within each palette's muted or pastel character
Cupertino, One Dark Retain their semantic workspace families, with matching shaded SVG ramps
Blueprint Chalk-like faces, blue passive geometry and restrained workspace hues
Graphite, Platinum 9 Muted, distinct workspace colours over neutral chrome
Solarized Light Solarized workspace hues and warm neutral icon faces
High Contrast Strong outlines and readable saturated workspace colours
SolidCraft 95 Classic grey icon geometry; navy, brown, olive, purple, teal, burgundy and green workspace accents
Amber/Green Phosphor Deliberately single-hue palettes, with different intensities for workspace groups

Shared utility tabs (Assemble, Insert, Inspect, Manage, View) retain the Model family. The seven workspace groups are Model, Surface, Mesh, Form, Sheet Metal, Render and Sketch. Their labels remain the primary identifier; colour supplements them.

Theme file contract

solidcraft-theme/1 accepts an optional icon_palette object. Single opaque hex colours override ink, line, guide, passive-1/2/3 and active-1/2/3. Three-colour arrays, ordered pale face / medium face / strong stroke, override solid, surface, mesh, form, sketch, constraint and construction ramps. A missing role/ramp retains the compiled palette. A base Solid override never recolours an omitted semantic ramp. Unknown names, incorrect array lengths, translucency and overrides of the transparent GAP eraser are rejected.

Import/export and direct preference updates use the same validation. Invalid hand-edited saved palettes fall back safely. The default Light/Dark palettes stay unchanged. SVG outlines, guides, passive face ordering, masks, knockouts and alpha remain intact. Explicit monochrome controls keep their surface-specific ink; colour-vision variants take precedence over conflicting theme ramp entries.

Most custom ramps match the base ramp's OKLab lightness per face, with chroma reduced to stay in sRGB. Phosphor intensities and 95's classic palette are deliberate exceptions. Workspace ink/soft and solid-tab pairs are checked for 4.5:1 text contrast.

Separate work

Home/File colour inheritance is owned by #4868 / #4924 and is not duplicated here. Radii, borders, bevels and SVG artwork/assignments remain owned by their existing changes.