diff --git a/configurator/src/components/inputs/ClampField.svelte b/configurator/src/components/inputs/ClampField.svelte index a1d88bd6..5a9835d5 100644 --- a/configurator/src/components/inputs/ClampField.svelte +++ b/configurator/src/components/inputs/ClampField.svelte @@ -77,17 +77,17 @@ ); -
{knob.help}
+{knob.help}
{/if}default: {rawDefault}
+default: {rawDefault}
{/if} {/if} {#if help} -{help}
+{help}
{/if}+
Drives --sf-color-border--strong, --subtle, --translucent automatically.
{/if} - ++
Live preview — every semantic role on its on-color text, shown in light and dark. Resolved from the canvas, updates as you edit.
+
OKLCH source values — all 200+ derived color steps are computed automatically. Tints (50–400) mix toward Base (the "Surface" color) and shades (600–950) mix toward Text (driven by Neutral) — so editing Base or Neutral below will shift every family's tints/shades too. That's expected, not a bug. @@ -526,8 +526,8 @@ onclick={() => toggleDarkMode(light.colorKey, dark, light.name)} class={`text-[8px] px-1.5 py-0.5 rounded border transition-all cursor-pointer ${ isAutoMode - ? "border-indigo-500/40 bg-indigo-500/15 text-indigo-300" - : "border-white/10 text-slate-500 hover:text-slate-300" + ? "border-indigo-500/40 bg-indigo-500/15 text-indigo-700 dark:text-indigo-300" + : "border-black/10 dark:border-white/10 text-slate-500 hover:text-slate-700 dark:hover:text-slate-300" }`} >{isAutoMode ? "Auto dark" : "Manual dark"} {/if} @@ -552,12 +552,12 @@ {@const dText = getDarkText()}
+
Absolute lightness ramp — each step pins L and inherits chroma + hue from the source. Not the brand mix curve. Light and dark use the same L per step, so at the default near-zero chroma the two rows look almost identical — add chroma above to see them diverge by hue. @@ -597,9 +597,9 @@ /> {:else if dark && isAutoMode} {@const derivedDark = deriveDarkFromLight(sourceValue(light), light.colorKey)} -
+
Pins brand colors (primary, secondary, tertiary, action) to a fixed OKLCH lightness — useful for always-stable sections. Enable on canvas to preview.
@@ -638,8 +638,8 @@ /> -+
Dark mode is auto-derived from each light source by default. Switch to Manual dark to set a bespoke dark value.
@@ -699,8 +699,8 @@ onclick={() => toggleDarkMode(light.colorKey, dark, light.name)} class={`text-[8px] px-1.5 py-0.5 rounded border transition-all cursor-pointer ${ isAutoMode - ? "border-indigo-500/40 bg-indigo-500/15 text-indigo-300" - : "border-white/10 text-slate-500 hover:text-slate-300" + ? "border-indigo-500/40 bg-indigo-500/15 text-indigo-700 dark:text-indigo-300" + : "border-black/10 dark:border-white/10 text-slate-500 hover:text-slate-700 dark:hover:text-slate-300" }`} >{isAutoMode ? "Auto dark" : "Manual dark"} {/if} @@ -724,9 +724,9 @@ /> {:else if dark && isAutoMode} {@const derivedDark = deriveDarkFromLight(sourceValue(light), light.colorKey)} -+
Status colors don't ride the brand mix curve — only the resolved color plus subtle/muted alpha washes and a strong shade are derived. There's no -50…-950 ramp for success/warning/info/danger.
@@ -770,7 +770,7 @@ {/if} - ++
Controls whether text on brand-coloured surfaces is light or dark.
{#each contrastKnobs as k (k.name)} @@ -795,18 +795,18 @@ {/each} -+
Controls how much color is mixed into each palette step. Step 500 is always the source color.
@@ -864,8 +864,8 @@ onclick={() => onBulkChange(p.patch as RecordBar height = mix amount · fill = the resolved primary palette swatch at each step
+Bar height = mix amount · fill = the resolved primary palette swatch at each step
+
Auto-derived from your brand colors. Use the angle/direction and stop controls, or edit the raw value for full control.
@@ -1006,13 +1006,13 @@ {#each GRADIENT_TOKENS.filter((g) => g.group === grp) as g (g.name)} {@const expr = `var(${g.name})`} {@const e = gradEdit(g)} -- --sf-color-scheme — sets the CSS color-scheme property on the root, controlling browser UI (scrollbars, inputs) and default background. +
+ --sf-color-scheme — sets the CSS color-scheme property on the root, controlling browser UI (scrollbars, inputs) and default background.
+
Direct color overrides for tokens the framework auto-derives. Use for edge cases.
- All tokens tab — override individual color steps (50–950), semantic aliases, or surface tokens directly. + All tokens tab — override individual color steps (50–950), semantic aliases, or surface tokens directly.
- Gradient overlay for hero images and media content. Used by the .sf-scrim macro.
+
+ Gradient overlay for hero images and media content. Used by the .sf-scrim macro.
- Controls text legibility over images. Applied via text-shadow: var(--sf-text-shadow-m).
- Edit each token directly — use none to disable.
+
+ Controls text legibility over images. Applied via text-shadow: var(--sf-text-shadow-m).
+ Edit each token directly — use none to disable.
+
{count > 0
? `${count} override${count !== 1 ? "s" : ""} ready to export.`
: "No overrides yet. Customise tokens, then export."}
@@ -83,11 +83,11 @@
No tokens found No tokens found
+
{filtered().length - 60} more — refine your search
+
Configure every SLASHED design token visually. Changes appear live in the preview.
{#if overridesCount > 0}
- You have {overridesCount} active override{overridesCount !== 1 ? "s" : ""}.
+ You have {overridesCount} active override{overridesCount !== 1 ? "s" : ""}.
{:else}
Pick any domain below to get started.
{/if}
@@ -82,7 +82,7 @@
{#if overridesCount > 0}
No saved themes yet. Configure tokens, then save. No saved themes yet. Configure tokens, then save.{css || "/* No overrides */"}
+ {css || "/* No overrides */"}
{`@import 'slashed/slashed.full.css';
diff --git a/configurator/src/components/panels/GenericTokenPanel.svelte b/configurator/src/components/panels/GenericTokenPanel.svelte
index 40d72fbc..317c56ab 100644
--- a/configurator/src/components/panels/GenericTokenPanel.svelte
+++ b/configurator/src/components/panels/GenericTokenPanel.svelte
@@ -33,7 +33,7 @@