T-2VG3-design-language-product-hue
Status: open/ready · Impact: medium · Complexity: medium
A focused vault tints shell chrome through --d-vault-hue /
--d-vault-color. Products deserve the same identity channel: a product
declares a hue and its chrome takes the tint, the way a focused vault does
today. This is the D-DLNG-design-language Phase 2 “theming descent”
item.
| Location | Role today |
|---|---|
packages/ts/ui/app/assets/css/tokens.css | Defines the vault-hue family: --d-vault-hue seeds --d-vault-color / --d-vault-fg / --d-vault-offline via hsl + color-mix. Vault-specific by name only — the mechanism is general. |
solutions/determined/packages/shell/app/components/ShellVaultScopePane.vue | Paints scope-pane identity from --d-vault-color. |
solutions/determined/packages/shell/app/components/ShellVaultWindowIdentity.vue | Window identity chip from the vault hue. |
solutions/determined/packages/shell/app/components/VaultTreePane.vue | Tree accents from the vault hue. |
Proposed
Section titled “Proposed”A product-level hue declaration (layer app config or appearance seam) seeds a generalized identity-hue token family. Vault-hue becomes a scoped override of that family, not a separate mechanism. The spec documents the family and the declaration path.
Approach
Section titled “Approach”- Inventory every
--d-vault-*consumer; confirm the derivation chain intokens.css. - Name the general family (e.g.
--d-hue/--d-hue-color/--d-hue-fg) and define it intokens.css; keep--d-vault-*as aliases scoped to vault subtrees so vault behavior is unchanged. - Wire the product declaration: a product sets its hue once (app config or
useAppearanceregistration) and the layer stamps it at the root. - Document in
design-system.md(token vocabulary + a short “product identity” section). - Before/after light+dark screenshots per the repo screenshot rule.
Files to touch
Section titled “Files to touch”| Location | Kind | Change |
|---|---|---|
packages/ts/ui/app/assets/css/tokens.css | modify | general hue family; vault tokens become scoped aliases |
packages/ts/ui/app/composables/useAppearance.ts | modify | product-hue declaration seam (if config-side proves wrong) |
packages/ts/ui/docs/design-system.md | modify | token rows + product-identity section |
solutions/determined/packages/shell/app/components/ShellVaultScopePane.vue | modify | consume the general family through the vault alias |
solutions/determined/packages/shell/app/components/ShellVaultWindowIdentity.vue | modify | same |
solutions/determined/packages/shell/app/components/VaultTreePane.vue | modify | same |
Acceptance criteria
Section titled “Acceptance criteria”- AC-1: A product with a declared hue shows tinted chrome in light and dark; a product without one renders exactly as today.
- AC-2: Vault-focus tinting is pixel-unchanged (existing shell screenshot pairs regenerate clean).
- AC-3:
design-system.mddocuments the family;moon run ui:checkandmoon run app-frame:testpass.
Out of scope
Section titled “Out of scope”- Choosing hues for individual products (each product opts in later).
Dependencies
Section titled “Dependencies”- none
Discovery context
Section titled “Discovery context”docs/planning/design-language/PLAN.mdPhase 2; D-DLNG-design-language.