@syncedco/flow 0.1.2 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -491,6 +491,10 @@ ${includeDefaults ? '@import "@syncedco/flow/defaults.css";\n' : ''}@import "./$
491
491
  )
492
492
  }
493
493
 
494
+ if (preset === 'wordpress') {
495
+ writeProjectFile(resolve(targetCwd, 'theme.json'), buildWordPressThemeJson(), force)
496
+ }
497
+
494
498
  if (!noScripts) addPackageScripts(targetCwd)
495
499
  if (agentsTarget !== undefined || args.includes('--agents')) {
496
500
  await installAgentGuidance({
@@ -2426,6 +2430,45 @@ function formatStringArray(values) {
2426
2430
  return `[${values.map((value) => `'${value}'`).join(', ')}]`
2427
2431
  }
2428
2432
 
2433
+ function buildWordPressThemeJson() {
2434
+ return `${JSON.stringify({
2435
+ $schema: 'https://schemas.wp.org/trunk/theme.json',
2436
+ version: 3,
2437
+ settings: {
2438
+ appearanceTools: true,
2439
+ color: {
2440
+ palette: [
2441
+ { slug: 'base', name: 'Base', color: 'var(--sf-colour-background)' },
2442
+ { slug: 'foreground', name: 'Foreground', color: 'var(--sf-colour-foreground)' },
2443
+ { slug: 'muted', name: 'Muted', color: 'var(--sf-colour-muted)' },
2444
+ { slug: 'surface', name: 'Surface', color: 'var(--sf-colour-surface)' },
2445
+ { slug: 'surface-alt', name: 'Surface Alt', color: 'var(--sf-colour-surface-alt)' },
2446
+ { slug: 'surface-elevated', name: 'Surface Elevated', color: 'var(--sf-colour-surface-elevated, var(--sf-colour-surface-raised))' },
2447
+ { slug: 'border', name: 'Border', color: 'var(--sf-colour-border)' },
2448
+ { slug: 'primary', name: 'Primary', color: 'var(--sf-colour-primary)' },
2449
+ { slug: 'primary-foreground', name: 'Primary Foreground', color: 'var(--sf-colour-primary-foreground)' },
2450
+ ],
2451
+ },
2452
+ layout: {
2453
+ contentSize: '72rem',
2454
+ wideSize: '90rem',
2455
+ },
2456
+ },
2457
+ styles: {
2458
+ color: {
2459
+ background: 'var(--sf-colour-background)',
2460
+ text: 'var(--sf-colour-foreground)',
2461
+ },
2462
+ spacing: {
2463
+ blockGap: 'var(--space-s-l)',
2464
+ },
2465
+ typography: {
2466
+ fontFamily: 'var(--sf-font-sans)',
2467
+ },
2468
+ },
2469
+ }, null, 2)}\n`
2470
+ }
2471
+
2429
2472
  function projectContains(targetCwd, needle) {
2430
2473
  return allProjectFiles(targetCwd).some((file) => readFileSync(file, 'utf8').includes(needle))
2431
2474
  }
@@ -3569,7 +3612,7 @@ function buildThemeCss(theme) {
3569
3612
  sections.push(` :root {\n${root.join('\n')}\n }`)
3570
3613
  }
3571
3614
  if (dark.length) {
3572
- sections.push(` :where(.sf-theme-dark, [data-sf-theme="dark"]) {\n${dark.join('\n')}\n }`)
3615
+ sections.push(` .sf-theme-dark, [data-sf-theme="dark"] {\n${dark.join('\n')}\n }`)
3573
3616
  }
3574
3617
 
3575
3618
  return sections.join('\n\n')
@@ -3651,74 +3694,74 @@ ${pairs.join('\n')}
3651
3694
  --color-white: ${colours.white};
3652
3695
  --color-black: ${colours.black};
3653
3696
 
3654
- --color-background: ${colours.ink950};
3655
- --color-foreground: oklch(96% 0.01 92);
3656
- --color-card: ${colours.ink900};
3657
- --color-card-foreground: oklch(96% 0.01 92);
3658
- --color-popover: ${colours.ink900};
3659
- --color-popover-foreground: oklch(96% 0.01 92);
3660
- --color-primary: ${colours.orange600};
3661
- --color-primary-hover: oklch(64% 0.18 44);
3662
- --color-primary-label: oklch(55% 0.18 44);
3663
- --color-primary-border: oklch(66% 0.17 43);
3664
- --color-primary-foreground: oklch(98% 0.01 95);
3665
- --color-secondary: oklch(24% 0.018 22);
3666
- --color-secondary-foreground: oklch(96% 0.01 92);
3667
- --color-muted: oklch(26% 0.012 24);
3668
- --color-muted-foreground: oklch(76% 0.01 92);
3669
- --color-accent: oklch(24% 0.018 22);
3670
- --color-accent-foreground: oklch(96% 0.01 92);
3671
- --color-destructive: ${colours.red600};
3672
- --color-destructive-foreground: oklch(98% 0.01 95);
3673
- --color-border: oklch(100% 0 0 / 0.12);
3674
- --color-input: oklch(100% 0 0 / 0.12);
3675
- --color-ring: ${colours.orange600};
3676
- --color-heading: oklch(20% 0.02 18);
3677
- --color-page-text: oklch(23% 0.02 18);
3678
- --color-body: oklch(45% 0.02 28);
3679
- --color-body-dark: oklch(40% 0.02 28);
3680
- --color-subdued: oklch(42% 0.02 20);
3681
- --color-surface: ${colours.surfaceAlt};
3682
- --color-surface-alt: ${colours.paperAlt};
3697
+ --color-background: var(--sf-colour-background, ${colours.ink950});
3698
+ --color-foreground: var(--sf-colour-foreground, oklch(96% 0.01 92));
3699
+ --color-card: var(--sf-colour-card, ${colours.ink900});
3700
+ --color-card-foreground: var(--sf-colour-card-foreground, oklch(96% 0.01 92));
3701
+ --color-popover: var(--sf-colour-popover, ${colours.ink900});
3702
+ --color-popover-foreground: var(--sf-colour-popover-foreground, oklch(96% 0.01 92));
3703
+ --color-primary: var(--sf-colour-primary, ${colours.orange600});
3704
+ --color-primary-hover: var(--sf-colour-primary-hover, oklch(64% 0.18 44));
3705
+ --color-primary-label: var(--sf-colour-primary-label, oklch(55% 0.18 44));
3706
+ --color-primary-border: var(--sf-colour-primary-border, oklch(66% 0.17 43));
3707
+ --color-primary-foreground: var(--sf-colour-primary-foreground, oklch(98% 0.01 95));
3708
+ --color-secondary: var(--sf-colour-secondary, oklch(24% 0.018 22));
3709
+ --color-secondary-foreground: var(--sf-colour-secondary-foreground, oklch(96% 0.01 92));
3710
+ --color-muted: var(--sf-colour-muted, oklch(26% 0.012 24));
3711
+ --color-muted-foreground: var(--sf-colour-muted-foreground, oklch(76% 0.01 92));
3712
+ --color-accent: var(--sf-colour-accent, oklch(24% 0.018 22));
3713
+ --color-accent-foreground: var(--sf-colour-accent-foreground, oklch(96% 0.01 92));
3714
+ --color-destructive: var(--sf-colour-destructive, ${colours.red600});
3715
+ --color-destructive-foreground: var(--sf-colour-destructive-foreground, oklch(98% 0.01 95));
3716
+ --color-border: var(--sf-colour-border, oklch(100% 0 0 / 0.12));
3717
+ --color-input: var(--sf-colour-input, oklch(100% 0 0 / 0.12));
3718
+ --color-ring: var(--sf-colour-ring, ${colours.orange600});
3719
+ --color-heading: var(--sf-colour-heading, oklch(20% 0.02 18));
3720
+ --color-page-text: var(--sf-colour-page-text, oklch(23% 0.02 18));
3721
+ --color-body: var(--sf-colour-body, oklch(45% 0.02 28));
3722
+ --color-body-dark: var(--sf-colour-body-dark, oklch(40% 0.02 28));
3723
+ --color-subdued: var(--sf-colour-subdued, oklch(42% 0.02 20));
3724
+ --color-surface: var(--sf-colour-surface, ${colours.surfaceAlt});
3725
+ --color-surface-alt: var(--sf-colour-surface-alt, ${colours.paperAlt});
3683
3726
  --color-hero-bg: oklch(8% 0.02 260);
3684
- --color-green: ${colours.green600};
3685
- --color-green-dark: ${colours.green700};
3686
- --color-green-muted: oklch(40% 0.12 148);
3687
- --color-green-light: ${colours.green100};
3688
- --color-green-lighter: oklch(92% 0.04 148);
3689
- --color-green-bg: oklch(88% 0.07 148);
3690
- --color-green-bg-alt: oklch(82% 0.1 148);
3691
- --color-green-vivid: oklch(78% 0.08 148);
3692
- --color-green-mid: oklch(75% 0.12 148);
3693
- --color-green-deep: oklch(70% 0.14 150);
3694
- --color-green-deepest: oklch(60% 0.14 150);
3695
- --color-green-wash: oklch(93% 0.06 148);
3696
- --color-green-wash-alt: oklch(88% 0.08 148);
3697
- --color-green-gradient-from: oklch(82% 0.1 148);
3698
- --color-green-gradient-to: oklch(86% 0.06 148);
3699
- --color-deco-lime: oklch(80% 0.18 130);
3700
- --color-deco-blue: oklch(60% 0.12 240);
3701
- --color-deco-warm: oklch(80% 0.06 60);
3702
- --color-deco-warm-light: oklch(92% 0.02 80);
3703
- --color-deco-warm-mid: oklch(80% 0.15 60);
3704
- --color-purple-light: oklch(95% 0.05 280);
3705
- --color-purple-mid: oklch(92% 0.05 280);
3706
- --color-purple-dark: oklch(90% 0.06 280);
3707
- --color-purple-darker: oklch(87% 0.07 280);
3708
- --color-purple-icon: ${colours.purple600};
3709
- --color-warm-light: oklch(95.6% 0.05 22);
3710
- --color-warm-mid: oklch(95% 0.04 40);
3711
- --color-warm-grad-to: oklch(90% 0.08 30);
3712
- --color-warm-grad-to-alt: oklch(90% 0.06 30);
3713
- --color-warm-icon: oklch(60% 0.17 44);
3714
- --color-cool-light: oklch(92% 0.04 200);
3715
- --color-cool-dark: oklch(87% 0.06 200);
3716
- --color-primary-glow: oklch(80% 0.12 44);
3717
- --color-primary-soft: oklch(69% 0.18 44 / 0.10);
3718
- --color-primary-soft-border: oklch(69% 0.18 44 / 0.30);
3719
- --color-primary-soft-border-light: oklch(69% 0.18 44 / 0.25);
3720
- --color-primary-soft-text: oklch(85% 0.08 44);
3721
- --color-primary-highlight: oklch(75% 0.14 44);
3727
+ --color-green: var(--sf-colour-green, ${colours.green600});
3728
+ --color-green-dark: var(--sf-colour-green-dark, ${colours.green700});
3729
+ --color-green-muted: var(--sf-colour-green-muted, oklch(40% 0.12 148));
3730
+ --color-green-light: var(--sf-colour-green-light, ${colours.green100});
3731
+ --color-green-lighter: var(--sf-colour-green-lighter, oklch(92% 0.04 148));
3732
+ --color-green-bg: var(--sf-colour-green-bg, oklch(88% 0.07 148));
3733
+ --color-green-bg-alt: var(--sf-colour-green-bg-alt, oklch(82% 0.1 148));
3734
+ --color-green-vivid: var(--sf-colour-green-vivid, oklch(78% 0.08 148));
3735
+ --color-green-mid: var(--sf-colour-green-mid, oklch(75% 0.12 148));
3736
+ --color-green-deep: var(--sf-colour-green-deep, oklch(70% 0.14 150));
3737
+ --color-green-deepest: var(--sf-colour-green-deepest, oklch(60% 0.14 150));
3738
+ --color-green-wash: var(--sf-colour-green-wash, oklch(93% 0.06 148));
3739
+ --color-green-wash-alt: var(--sf-colour-green-wash-alt, oklch(88% 0.08 148));
3740
+ --color-green-gradient-from: var(--sf-colour-green-gradient-from, oklch(82% 0.1 148));
3741
+ --color-green-gradient-to: var(--sf-colour-green-gradient-to, oklch(86% 0.06 148));
3742
+ --color-deco-lime: var(--sf-colour-deco-lime, oklch(80% 0.18 130));
3743
+ --color-deco-blue: var(--sf-colour-deco-blue, oklch(60% 0.12 240));
3744
+ --color-deco-warm: var(--sf-colour-deco-warm, oklch(80% 0.06 60));
3745
+ --color-deco-warm-light: var(--sf-colour-deco-warm-light, oklch(92% 0.02 80));
3746
+ --color-deco-warm-mid: var(--sf-colour-deco-warm-mid, oklch(80% 0.15 60));
3747
+ --color-purple-light: var(--sf-colour-purple-light, oklch(95% 0.05 280));
3748
+ --color-purple-mid: var(--sf-colour-purple-mid, oklch(92% 0.05 280));
3749
+ --color-purple-dark: var(--sf-colour-purple-dark, oklch(90% 0.06 280));
3750
+ --color-purple-darker: var(--sf-colour-purple-darker, oklch(87% 0.07 280));
3751
+ --color-purple-icon: var(--sf-colour-purple-icon, ${colours.purple600});
3752
+ --color-warm-light: var(--sf-colour-warm-light, oklch(95.6% 0.05 22));
3753
+ --color-warm-mid: var(--sf-colour-warm-mid, oklch(95% 0.04 40));
3754
+ --color-warm-grad-to: var(--sf-colour-warm-grad-to, oklch(90% 0.08 30));
3755
+ --color-warm-grad-to-alt: var(--sf-colour-warm-grad-to-alt, oklch(90% 0.06 30));
3756
+ --color-warm-icon: var(--sf-colour-warm-icon, oklch(60% 0.17 44));
3757
+ --color-cool-light: var(--sf-colour-cool-light, oklch(92% 0.04 200));
3758
+ --color-cool-dark: var(--sf-colour-cool-dark, oklch(87% 0.06 200));
3759
+ --color-primary-glow: var(--sf-colour-primary-glow, oklch(80% 0.12 44));
3760
+ --color-primary-soft: var(--sf-colour-primary-soft, oklch(69% 0.18 44 / 0.10));
3761
+ --color-primary-soft-border: var(--sf-colour-primary-soft-border, oklch(69% 0.18 44 / 0.30));
3762
+ --color-primary-soft-border-light: var(--sf-colour-primary-soft-border-light, oklch(69% 0.18 44 / 0.25));
3763
+ --color-primary-soft-text: var(--sf-colour-primary-soft-text, oklch(85% 0.08 44));
3764
+ --color-primary-highlight: var(--sf-colour-primary-highlight, oklch(75% 0.14 44));
3722
3765
 
3723
3766
  --shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.06);
3724
3767
  --shadow-md: 0 0.5rem 1.5rem oklch(0% 0 0 / 0.08);
@@ -53,6 +53,10 @@ layers for reset, base, layout, components, and utilities, but foundational
53
53
  theme variables need the normal cascade so values from `synced-flow.config.mjs`
54
54
  are not weaker than unlayered project CSS.
55
55
 
56
+ Theme selectors such as `.sf-theme-dark` and `[data-sf-theme="dark"]` are
57
+ emitted with normal class/attribute specificity, not inside `:where()`, so they
58
+ can override the default `:root` token values.
59
+
56
60
  Put reusable brand decisions in `theme.colours`, `theme.darkColours`,
57
61
  `theme.radii`, `theme.layout`, and `theme.components`. Theme switcher CSS should
58
62
  only style the toggle/control UI; it should not redefine `--sf-*` colour tokens.
@@ -28,6 +28,11 @@ Options:
28
28
  | `--no-scripts` | Do not update `package.json`. |
29
29
  | `--force` | Overwrite init-managed files. |
30
30
 
31
+ The WordPress preset also writes a `theme.json` colour palette that maps
32
+ WordPress editor presets such as `base`, `surface`, `surface-elevated`, and
33
+ `primary` to Synced Flow semantic tokens. Use those presets on blocks instead of
34
+ overriding WordPress `.has-*` preset classes in CSS.
35
+
31
36
  ## agents
32
37
 
33
38
  Install or inspect project-level AI guidance.
package/docs/tokens.md CHANGED
@@ -33,6 +33,10 @@ source of truth for brand colours, radius, layout, and component decisions.
33
33
  Use `theme.darkColours` for dark-mode values instead of maintaining a separate
34
34
  CSS file that redefines `--sf-*` variables.
35
35
 
36
+ Theme overrides use `.sf-theme-dark`, `[data-sf-theme="dark"]`,
37
+ `.sf-theme-light`, and `[data-sf-theme="light"]` selectors directly so they have
38
+ enough specificity to override default `:root` values.
39
+
36
40
  Use semantic utilities in projects:
37
41
 
38
42
  ```html
package/docs/wordpress.md CHANGED
@@ -18,6 +18,8 @@ The WordPress preset:
18
18
  - scans PHP, HTML, JS, TS, JSX, TSX, Twig, Vue, Svelte, Astro, and MDX files
19
19
  - enables `includeCore`
20
20
  - writes `assets/css/synced-flow.css`
21
+ - writes a `theme.json` palette that maps WordPress colour presets to Synced
22
+ Flow semantic tokens
21
23
 
22
24
  See [`examples/wordpress`](../examples/wordpress) for a lean block theme style
23
25
  template with `theme.json`, template parts, PHP patterns, enqueue code, and an
@@ -54,6 +56,37 @@ wp_enqueue_style(
54
56
  For plugins, use `plugins_url()` or `plugin_dir_url()` instead of
55
57
  `get_theme_file_uri()`.
56
58
 
59
+ ## WordPress Presets
60
+
61
+ WordPress emits editor preset classes such as `.has-base-background-color`,
62
+ `.has-primary-color`, and `.has-large-font-size` with `!important`. Treat those
63
+ classes as the editor's chosen design value.
64
+
65
+ Do not override `.has-*` preset classes in project CSS. Add or choose a better
66
+ semantic preset instead, then use that preset on the block.
67
+
68
+ The generated `theme.json` maps common WordPress colour presets to Synced Flow
69
+ tokens:
70
+
71
+ ```json
72
+ {
73
+ "slug": "surface-elevated",
74
+ "name": "Surface Elevated",
75
+ "color": "var(--sf-colour-surface-elevated, var(--sf-colour-surface-raised))"
76
+ }
77
+ ```
78
+
79
+ Use those presets for any block that needs an editor-visible design role:
80
+
81
+ - `base` for page backgrounds
82
+ - `surface` and `surface-alt` for standard panels
83
+ - `surface-elevated` for chrome, mastheads, footers, sticky bars, and raised
84
+ regions
85
+ - `primary` and `primary-foreground` for branded actions
86
+
87
+ If a new visual role appears repeatedly, add it to `synced-flow.config.mjs` and
88
+ expose it in `theme.json`; avoid adding `!important` overrides.
89
+
57
90
  ## Dynamic Classes
58
91
 
59
92
  Synced Flow generates utility CSS from complete class tokens. Keep class names
@@ -2,8 +2,7 @@
2
2
 
3
3
  @layer reset, tokens, base, app, layout, components, utilities, overrides;
4
4
 
5
- @layer tokens {
6
- :root {
5
+ :root {
7
6
  color-scheme: light;
8
7
  --font-sans: var(--sf-font-sans, ui-sans-serif, system-ui, sans-serif);
9
8
  --font-display: var(--sf-font-display, ui-serif, Georgia, serif);
@@ -69,74 +68,74 @@
69
68
  --color-white: oklch(100% 0 0);
70
69
  --color-black: oklch(0% 0 0);
71
70
 
72
- --color-background: oklch(14% 0.025 248);
73
- --color-foreground: oklch(96% 0.01 92);
74
- --color-card: oklch(18% 0.024 246);
75
- --color-card-foreground: oklch(96% 0.01 92);
76
- --color-popover: oklch(18% 0.024 246);
77
- --color-popover-foreground: oklch(96% 0.01 92);
78
- --color-primary: oklch(69% 0.18 44);
79
- --color-primary-hover: oklch(64% 0.18 44);
80
- --color-primary-label: oklch(55% 0.18 44);
81
- --color-primary-border: oklch(66% 0.17 43);
82
- --color-primary-foreground: oklch(98% 0.01 95);
83
- --color-secondary: oklch(24% 0.018 22);
84
- --color-secondary-foreground: oklch(96% 0.01 92);
85
- --color-muted: oklch(26% 0.012 24);
86
- --color-muted-foreground: oklch(76% 0.01 92);
87
- --color-accent: oklch(24% 0.018 22);
88
- --color-accent-foreground: oklch(96% 0.01 92);
89
- --color-destructive: oklch(55% 0.2 28);
90
- --color-destructive-foreground: oklch(98% 0.01 95);
91
- --color-border: oklch(100% 0 0 / 0.12);
92
- --color-input: oklch(100% 0 0 / 0.12);
93
- --color-ring: oklch(69% 0.18 44);
94
- --color-heading: oklch(20% 0.02 18);
95
- --color-page-text: oklch(23% 0.02 18);
96
- --color-body: oklch(45% 0.02 28);
97
- --color-body-dark: oklch(40% 0.02 28);
98
- --color-subdued: oklch(42% 0.02 20);
99
- --color-surface: oklch(96% 0.015 80);
100
- --color-surface-alt: oklch(96.6% 0.018 82);
71
+ --color-background: var(--sf-colour-background, oklch(14% 0.025 248));
72
+ --color-foreground: var(--sf-colour-foreground, oklch(96% 0.01 92));
73
+ --color-card: var(--sf-colour-card, oklch(18% 0.024 246));
74
+ --color-card-foreground: var(--sf-colour-card-foreground, oklch(96% 0.01 92));
75
+ --color-popover: var(--sf-colour-popover, oklch(18% 0.024 246));
76
+ --color-popover-foreground: var(--sf-colour-popover-foreground, oklch(96% 0.01 92));
77
+ --color-primary: var(--sf-colour-primary, oklch(69% 0.18 44));
78
+ --color-primary-hover: var(--sf-colour-primary-hover, oklch(64% 0.18 44));
79
+ --color-primary-label: var(--sf-colour-primary-label, oklch(55% 0.18 44));
80
+ --color-primary-border: var(--sf-colour-primary-border, oklch(66% 0.17 43));
81
+ --color-primary-foreground: var(--sf-colour-primary-foreground, oklch(98% 0.01 95));
82
+ --color-secondary: var(--sf-colour-secondary, oklch(24% 0.018 22));
83
+ --color-secondary-foreground: var(--sf-colour-secondary-foreground, oklch(96% 0.01 92));
84
+ --color-muted: var(--sf-colour-muted, oklch(26% 0.012 24));
85
+ --color-muted-foreground: var(--sf-colour-muted-foreground, oklch(76% 0.01 92));
86
+ --color-accent: var(--sf-colour-accent, oklch(24% 0.018 22));
87
+ --color-accent-foreground: var(--sf-colour-accent-foreground, oklch(96% 0.01 92));
88
+ --color-destructive: var(--sf-colour-destructive, oklch(55% 0.2 28));
89
+ --color-destructive-foreground: var(--sf-colour-destructive-foreground, oklch(98% 0.01 95));
90
+ --color-border: var(--sf-colour-border, oklch(100% 0 0 / 0.12));
91
+ --color-input: var(--sf-colour-input, oklch(100% 0 0 / 0.12));
92
+ --color-ring: var(--sf-colour-ring, oklch(69% 0.18 44));
93
+ --color-heading: var(--sf-colour-heading, oklch(20% 0.02 18));
94
+ --color-page-text: var(--sf-colour-page-text, oklch(23% 0.02 18));
95
+ --color-body: var(--sf-colour-body, oklch(45% 0.02 28));
96
+ --color-body-dark: var(--sf-colour-body-dark, oklch(40% 0.02 28));
97
+ --color-subdued: var(--sf-colour-subdued, oklch(42% 0.02 20));
98
+ --color-surface: var(--sf-colour-surface, oklch(96% 0.015 80));
99
+ --color-surface-alt: var(--sf-colour-surface-alt, oklch(96.6% 0.018 82));
101
100
  --color-hero-bg: oklch(8% 0.02 260);
102
- --color-green: oklch(55% 0.12 148);
103
- --color-green-dark: oklch(45% 0.12 148);
104
- --color-green-muted: oklch(40% 0.12 148);
105
- --color-green-light: oklch(90% 0.06 148);
106
- --color-green-lighter: oklch(92% 0.04 148);
107
- --color-green-bg: oklch(88% 0.07 148);
108
- --color-green-bg-alt: oklch(82% 0.1 148);
109
- --color-green-vivid: oklch(78% 0.08 148);
110
- --color-green-mid: oklch(75% 0.12 148);
111
- --color-green-deep: oklch(70% 0.14 150);
112
- --color-green-deepest: oklch(60% 0.14 150);
113
- --color-green-wash: oklch(93% 0.06 148);
114
- --color-green-wash-alt: oklch(88% 0.08 148);
115
- --color-green-gradient-from: oklch(82% 0.1 148);
116
- --color-green-gradient-to: oklch(86% 0.06 148);
117
- --color-deco-lime: oklch(80% 0.18 130);
118
- --color-deco-blue: oklch(60% 0.12 240);
119
- --color-deco-warm: oklch(80% 0.06 60);
120
- --color-deco-warm-light: oklch(92% 0.02 80);
121
- --color-deco-warm-mid: oklch(80% 0.15 60);
122
- --color-purple-light: oklch(95% 0.05 280);
123
- --color-purple-mid: oklch(92% 0.05 280);
124
- --color-purple-dark: oklch(90% 0.06 280);
125
- --color-purple-darker: oklch(87% 0.07 280);
126
- --color-purple-icon: oklch(55% 0.2 280);
127
- --color-warm-light: oklch(95.6% 0.05 22);
128
- --color-warm-mid: oklch(95% 0.04 40);
129
- --color-warm-grad-to: oklch(90% 0.08 30);
130
- --color-warm-grad-to-alt: oklch(90% 0.06 30);
131
- --color-warm-icon: oklch(60% 0.17 44);
132
- --color-cool-light: oklch(92% 0.04 200);
133
- --color-cool-dark: oklch(87% 0.06 200);
134
- --color-primary-glow: oklch(80% 0.12 44);
135
- --color-primary-soft: oklch(69% 0.18 44 / 0.10);
136
- --color-primary-soft-border: oklch(69% 0.18 44 / 0.30);
137
- --color-primary-soft-border-light: oklch(69% 0.18 44 / 0.25);
138
- --color-primary-soft-text: oklch(85% 0.08 44);
139
- --color-primary-highlight: oklch(75% 0.14 44);
101
+ --color-green: var(--sf-colour-green, oklch(55% 0.12 148));
102
+ --color-green-dark: var(--sf-colour-green-dark, oklch(45% 0.12 148));
103
+ --color-green-muted: var(--sf-colour-green-muted, oklch(40% 0.12 148));
104
+ --color-green-light: var(--sf-colour-green-light, oklch(90% 0.06 148));
105
+ --color-green-lighter: var(--sf-colour-green-lighter, oklch(92% 0.04 148));
106
+ --color-green-bg: var(--sf-colour-green-bg, oklch(88% 0.07 148));
107
+ --color-green-bg-alt: var(--sf-colour-green-bg-alt, oklch(82% 0.1 148));
108
+ --color-green-vivid: var(--sf-colour-green-vivid, oklch(78% 0.08 148));
109
+ --color-green-mid: var(--sf-colour-green-mid, oklch(75% 0.12 148));
110
+ --color-green-deep: var(--sf-colour-green-deep, oklch(70% 0.14 150));
111
+ --color-green-deepest: var(--sf-colour-green-deepest, oklch(60% 0.14 150));
112
+ --color-green-wash: var(--sf-colour-green-wash, oklch(93% 0.06 148));
113
+ --color-green-wash-alt: var(--sf-colour-green-wash-alt, oklch(88% 0.08 148));
114
+ --color-green-gradient-from: var(--sf-colour-green-gradient-from, oklch(82% 0.1 148));
115
+ --color-green-gradient-to: var(--sf-colour-green-gradient-to, oklch(86% 0.06 148));
116
+ --color-deco-lime: var(--sf-colour-deco-lime, oklch(80% 0.18 130));
117
+ --color-deco-blue: var(--sf-colour-deco-blue, oklch(60% 0.12 240));
118
+ --color-deco-warm: var(--sf-colour-deco-warm, oklch(80% 0.06 60));
119
+ --color-deco-warm-light: var(--sf-colour-deco-warm-light, oklch(92% 0.02 80));
120
+ --color-deco-warm-mid: var(--sf-colour-deco-warm-mid, oklch(80% 0.15 60));
121
+ --color-purple-light: var(--sf-colour-purple-light, oklch(95% 0.05 280));
122
+ --color-purple-mid: var(--sf-colour-purple-mid, oklch(92% 0.05 280));
123
+ --color-purple-dark: var(--sf-colour-purple-dark, oklch(90% 0.06 280));
124
+ --color-purple-darker: var(--sf-colour-purple-darker, oklch(87% 0.07 280));
125
+ --color-purple-icon: var(--sf-colour-purple-icon, oklch(55% 0.2 280));
126
+ --color-warm-light: var(--sf-colour-warm-light, oklch(95.6% 0.05 22));
127
+ --color-warm-mid: var(--sf-colour-warm-mid, oklch(95% 0.04 40));
128
+ --color-warm-grad-to: var(--sf-colour-warm-grad-to, oklch(90% 0.08 30));
129
+ --color-warm-grad-to-alt: var(--sf-colour-warm-grad-to-alt, oklch(90% 0.06 30));
130
+ --color-warm-icon: var(--sf-colour-warm-icon, oklch(60% 0.17 44));
131
+ --color-cool-light: var(--sf-colour-cool-light, oklch(92% 0.04 200));
132
+ --color-cool-dark: var(--sf-colour-cool-dark, oklch(87% 0.06 200));
133
+ --color-primary-glow: var(--sf-colour-primary-glow, oklch(80% 0.12 44));
134
+ --color-primary-soft: var(--sf-colour-primary-soft, oklch(69% 0.18 44 / 0.10));
135
+ --color-primary-soft-border: var(--sf-colour-primary-soft-border, oklch(69% 0.18 44 / 0.30));
136
+ --color-primary-soft-border-light: var(--sf-colour-primary-soft-border-light, oklch(69% 0.18 44 / 0.25));
137
+ --color-primary-soft-text: var(--sf-colour-primary-soft-text, oklch(85% 0.08 44));
138
+ --color-primary-highlight: var(--sf-colour-primary-highlight, oklch(75% 0.14 44));
140
139
 
141
140
  --shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.06);
142
141
  --shadow-md: 0 0.5rem 1.5rem oklch(0% 0 0 / 0.08);
@@ -150,10 +149,10 @@
150
149
  --duration-normal: 220ms;
151
150
  --duration-slow: 360ms;
152
151
  --ease-standard: cubic-bezier(.2, 0, 0, 1);
152
+ --icon-size: 1em;
153
+ --icon-stroke: 2;
153
154
  }
154
- }
155
155
 
156
- @layer tokens {
157
156
  :root {
158
157
  --sf-font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
159
158
  --font-sans: var(--sf-font-sans);
@@ -198,7 +197,6 @@
198
197
  --sf-card-padding: var(--sf-space-l);
199
198
  --sf-input-radius: 0.375rem;
200
199
  }
201
- }
202
200
 
203
201
  @layer utilities {
204
202
 
@@ -2,8 +2,7 @@
2
2
 
3
3
  @layer reset, tokens, base, app, layout, components, utilities, overrides;
4
4
 
5
- @layer tokens {
6
- :root {
5
+ :root {
7
6
  color-scheme: light;
8
7
  --font-sans: var(--sf-font-sans, ui-sans-serif, system-ui, sans-serif);
9
8
  --font-display: var(--sf-font-display, ui-serif, Georgia, serif);
@@ -69,74 +68,74 @@
69
68
  --color-white: oklch(100% 0 0);
70
69
  --color-black: oklch(0% 0 0);
71
70
 
72
- --color-background: oklch(14% 0.025 248);
73
- --color-foreground: oklch(96% 0.01 92);
74
- --color-card: oklch(18% 0.024 246);
75
- --color-card-foreground: oklch(96% 0.01 92);
76
- --color-popover: oklch(18% 0.024 246);
77
- --color-popover-foreground: oklch(96% 0.01 92);
78
- --color-primary: oklch(69% 0.18 44);
79
- --color-primary-hover: oklch(64% 0.18 44);
80
- --color-primary-label: oklch(55% 0.18 44);
81
- --color-primary-border: oklch(66% 0.17 43);
82
- --color-primary-foreground: oklch(98% 0.01 95);
83
- --color-secondary: oklch(24% 0.018 22);
84
- --color-secondary-foreground: oklch(96% 0.01 92);
85
- --color-muted: oklch(26% 0.012 24);
86
- --color-muted-foreground: oklch(76% 0.01 92);
87
- --color-accent: oklch(24% 0.018 22);
88
- --color-accent-foreground: oklch(96% 0.01 92);
89
- --color-destructive: oklch(55% 0.2 28);
90
- --color-destructive-foreground: oklch(98% 0.01 95);
91
- --color-border: oklch(100% 0 0 / 0.12);
92
- --color-input: oklch(100% 0 0 / 0.12);
93
- --color-ring: oklch(69% 0.18 44);
94
- --color-heading: oklch(20% 0.02 18);
95
- --color-page-text: oklch(23% 0.02 18);
96
- --color-body: oklch(45% 0.02 28);
97
- --color-body-dark: oklch(40% 0.02 28);
98
- --color-subdued: oklch(42% 0.02 20);
99
- --color-surface: oklch(96% 0.015 80);
100
- --color-surface-alt: oklch(96.6% 0.018 82);
71
+ --color-background: var(--sf-colour-background, oklch(14% 0.025 248));
72
+ --color-foreground: var(--sf-colour-foreground, oklch(96% 0.01 92));
73
+ --color-card: var(--sf-colour-card, oklch(18% 0.024 246));
74
+ --color-card-foreground: var(--sf-colour-card-foreground, oklch(96% 0.01 92));
75
+ --color-popover: var(--sf-colour-popover, oklch(18% 0.024 246));
76
+ --color-popover-foreground: var(--sf-colour-popover-foreground, oklch(96% 0.01 92));
77
+ --color-primary: var(--sf-colour-primary, oklch(69% 0.18 44));
78
+ --color-primary-hover: var(--sf-colour-primary-hover, oklch(64% 0.18 44));
79
+ --color-primary-label: var(--sf-colour-primary-label, oklch(55% 0.18 44));
80
+ --color-primary-border: var(--sf-colour-primary-border, oklch(66% 0.17 43));
81
+ --color-primary-foreground: var(--sf-colour-primary-foreground, oklch(98% 0.01 95));
82
+ --color-secondary: var(--sf-colour-secondary, oklch(24% 0.018 22));
83
+ --color-secondary-foreground: var(--sf-colour-secondary-foreground, oklch(96% 0.01 92));
84
+ --color-muted: var(--sf-colour-muted, oklch(26% 0.012 24));
85
+ --color-muted-foreground: var(--sf-colour-muted-foreground, oklch(76% 0.01 92));
86
+ --color-accent: var(--sf-colour-accent, oklch(24% 0.018 22));
87
+ --color-accent-foreground: var(--sf-colour-accent-foreground, oklch(96% 0.01 92));
88
+ --color-destructive: var(--sf-colour-destructive, oklch(55% 0.2 28));
89
+ --color-destructive-foreground: var(--sf-colour-destructive-foreground, oklch(98% 0.01 95));
90
+ --color-border: var(--sf-colour-border, oklch(100% 0 0 / 0.12));
91
+ --color-input: var(--sf-colour-input, oklch(100% 0 0 / 0.12));
92
+ --color-ring: var(--sf-colour-ring, oklch(69% 0.18 44));
93
+ --color-heading: var(--sf-colour-heading, oklch(20% 0.02 18));
94
+ --color-page-text: var(--sf-colour-page-text, oklch(23% 0.02 18));
95
+ --color-body: var(--sf-colour-body, oklch(45% 0.02 28));
96
+ --color-body-dark: var(--sf-colour-body-dark, oklch(40% 0.02 28));
97
+ --color-subdued: var(--sf-colour-subdued, oklch(42% 0.02 20));
98
+ --color-surface: var(--sf-colour-surface, oklch(96% 0.015 80));
99
+ --color-surface-alt: var(--sf-colour-surface-alt, oklch(96.6% 0.018 82));
101
100
  --color-hero-bg: oklch(8% 0.02 260);
102
- --color-green: oklch(55% 0.12 148);
103
- --color-green-dark: oklch(45% 0.12 148);
104
- --color-green-muted: oklch(40% 0.12 148);
105
- --color-green-light: oklch(90% 0.06 148);
106
- --color-green-lighter: oklch(92% 0.04 148);
107
- --color-green-bg: oklch(88% 0.07 148);
108
- --color-green-bg-alt: oklch(82% 0.1 148);
109
- --color-green-vivid: oklch(78% 0.08 148);
110
- --color-green-mid: oklch(75% 0.12 148);
111
- --color-green-deep: oklch(70% 0.14 150);
112
- --color-green-deepest: oklch(60% 0.14 150);
113
- --color-green-wash: oklch(93% 0.06 148);
114
- --color-green-wash-alt: oklch(88% 0.08 148);
115
- --color-green-gradient-from: oklch(82% 0.1 148);
116
- --color-green-gradient-to: oklch(86% 0.06 148);
117
- --color-deco-lime: oklch(80% 0.18 130);
118
- --color-deco-blue: oklch(60% 0.12 240);
119
- --color-deco-warm: oklch(80% 0.06 60);
120
- --color-deco-warm-light: oklch(92% 0.02 80);
121
- --color-deco-warm-mid: oklch(80% 0.15 60);
122
- --color-purple-light: oklch(95% 0.05 280);
123
- --color-purple-mid: oklch(92% 0.05 280);
124
- --color-purple-dark: oklch(90% 0.06 280);
125
- --color-purple-darker: oklch(87% 0.07 280);
126
- --color-purple-icon: oklch(55% 0.2 280);
127
- --color-warm-light: oklch(95.6% 0.05 22);
128
- --color-warm-mid: oklch(95% 0.04 40);
129
- --color-warm-grad-to: oklch(90% 0.08 30);
130
- --color-warm-grad-to-alt: oklch(90% 0.06 30);
131
- --color-warm-icon: oklch(60% 0.17 44);
132
- --color-cool-light: oklch(92% 0.04 200);
133
- --color-cool-dark: oklch(87% 0.06 200);
134
- --color-primary-glow: oklch(80% 0.12 44);
135
- --color-primary-soft: oklch(69% 0.18 44 / 0.10);
136
- --color-primary-soft-border: oklch(69% 0.18 44 / 0.30);
137
- --color-primary-soft-border-light: oklch(69% 0.18 44 / 0.25);
138
- --color-primary-soft-text: oklch(85% 0.08 44);
139
- --color-primary-highlight: oklch(75% 0.14 44);
101
+ --color-green: var(--sf-colour-green, oklch(55% 0.12 148));
102
+ --color-green-dark: var(--sf-colour-green-dark, oklch(45% 0.12 148));
103
+ --color-green-muted: var(--sf-colour-green-muted, oklch(40% 0.12 148));
104
+ --color-green-light: var(--sf-colour-green-light, oklch(90% 0.06 148));
105
+ --color-green-lighter: var(--sf-colour-green-lighter, oklch(92% 0.04 148));
106
+ --color-green-bg: var(--sf-colour-green-bg, oklch(88% 0.07 148));
107
+ --color-green-bg-alt: var(--sf-colour-green-bg-alt, oklch(82% 0.1 148));
108
+ --color-green-vivid: var(--sf-colour-green-vivid, oklch(78% 0.08 148));
109
+ --color-green-mid: var(--sf-colour-green-mid, oklch(75% 0.12 148));
110
+ --color-green-deep: var(--sf-colour-green-deep, oklch(70% 0.14 150));
111
+ --color-green-deepest: var(--sf-colour-green-deepest, oklch(60% 0.14 150));
112
+ --color-green-wash: var(--sf-colour-green-wash, oklch(93% 0.06 148));
113
+ --color-green-wash-alt: var(--sf-colour-green-wash-alt, oklch(88% 0.08 148));
114
+ --color-green-gradient-from: var(--sf-colour-green-gradient-from, oklch(82% 0.1 148));
115
+ --color-green-gradient-to: var(--sf-colour-green-gradient-to, oklch(86% 0.06 148));
116
+ --color-deco-lime: var(--sf-colour-deco-lime, oklch(80% 0.18 130));
117
+ --color-deco-blue: var(--sf-colour-deco-blue, oklch(60% 0.12 240));
118
+ --color-deco-warm: var(--sf-colour-deco-warm, oklch(80% 0.06 60));
119
+ --color-deco-warm-light: var(--sf-colour-deco-warm-light, oklch(92% 0.02 80));
120
+ --color-deco-warm-mid: var(--sf-colour-deco-warm-mid, oklch(80% 0.15 60));
121
+ --color-purple-light: var(--sf-colour-purple-light, oklch(95% 0.05 280));
122
+ --color-purple-mid: var(--sf-colour-purple-mid, oklch(92% 0.05 280));
123
+ --color-purple-dark: var(--sf-colour-purple-dark, oklch(90% 0.06 280));
124
+ --color-purple-darker: var(--sf-colour-purple-darker, oklch(87% 0.07 280));
125
+ --color-purple-icon: var(--sf-colour-purple-icon, oklch(55% 0.2 280));
126
+ --color-warm-light: var(--sf-colour-warm-light, oklch(95.6% 0.05 22));
127
+ --color-warm-mid: var(--sf-colour-warm-mid, oklch(95% 0.04 40));
128
+ --color-warm-grad-to: var(--sf-colour-warm-grad-to, oklch(90% 0.08 30));
129
+ --color-warm-grad-to-alt: var(--sf-colour-warm-grad-to-alt, oklch(90% 0.06 30));
130
+ --color-warm-icon: var(--sf-colour-warm-icon, oklch(60% 0.17 44));
131
+ --color-cool-light: var(--sf-colour-cool-light, oklch(92% 0.04 200));
132
+ --color-cool-dark: var(--sf-colour-cool-dark, oklch(87% 0.06 200));
133
+ --color-primary-glow: var(--sf-colour-primary-glow, oklch(80% 0.12 44));
134
+ --color-primary-soft: var(--sf-colour-primary-soft, oklch(69% 0.18 44 / 0.10));
135
+ --color-primary-soft-border: var(--sf-colour-primary-soft-border, oklch(69% 0.18 44 / 0.30));
136
+ --color-primary-soft-border-light: var(--sf-colour-primary-soft-border-light, oklch(69% 0.18 44 / 0.25));
137
+ --color-primary-soft-text: var(--sf-colour-primary-soft-text, oklch(85% 0.08 44));
138
+ --color-primary-highlight: var(--sf-colour-primary-highlight, oklch(75% 0.14 44));
140
139
 
141
140
  --shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.06);
142
141
  --shadow-md: 0 0.5rem 1.5rem oklch(0% 0 0 / 0.08);
@@ -150,10 +149,10 @@
150
149
  --duration-normal: 220ms;
151
150
  --duration-slow: 360ms;
152
151
  --ease-standard: cubic-bezier(.2, 0, 0, 1);
152
+ --icon-size: 1em;
153
+ --icon-stroke: 2;
153
154
  }
154
- }
155
155
 
156
- @layer tokens {
157
156
  :root {
158
157
  --sf-font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
159
158
  --font-sans: var(--sf-font-sans);
@@ -197,7 +196,6 @@
197
196
  --sf-input-radius: 0.5rem;
198
197
  --sf-input-block-size: 2.75rem;
199
198
  }
200
- }
201
199
 
202
200
  @layer utilities {
203
201