* 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
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.iconandcolors.icons.*settings colour other markers/controls, not SVG active faces, passive faces or contours. Optionalicon_paletteoverrides 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.