@motion-proto/live-tokens 0.61.0 → 0.63.0

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.
Files changed (83) hide show
  1. package/.claude/skills/live-tokens-adjust-geometry/SKILL.md +4 -4
  2. package/.claude/skills/live-tokens-build-page/SKILL.md +21 -3
  3. package/.claude/skills/live-tokens-create-component/SKILL.md +16 -48
  4. package/.claude/skills/live-tokens-create-component/references/fixed-overlays.md +10 -1
  5. package/.claude/skills/live-tokens-create-component/references/intrinsics.md +7 -5
  6. package/.claude/skills/live-tokens-create-component/references/sketch-mode.md +1 -1
  7. package/.claude/skills/live-tokens-create-component/references/token-naming.md +50 -0
  8. package/.claude/skills/live-tokens-generate-theme/SKILL.md +16 -9
  9. package/.claude/skills/live-tokens-pair-fonts/SKILL.md +8 -6
  10. package/.claude/skills/live-tokens-pick-component/SKILL.md +19 -5
  11. package/CHANGELOG.md +114 -0
  12. package/bin/migrate.mjs +6 -2
  13. package/dist-plugin/adjust/index.cjs +1 -1
  14. package/dist-plugin/adjust/index.d.cts +1 -1
  15. package/dist-plugin/adjust/index.d.ts +1 -1
  16. package/dist-plugin/adjust/index.js +1 -1
  17. package/dist-plugin/{chunk-232GZGQU.js → chunk-NDJJORKJ.js} +342 -5
  18. package/dist-plugin/{chunk-Y5CNFSSV.js → chunk-RVE3MNKM.js} +1 -1
  19. package/dist-plugin/{chunk-OIOXU7FR.js → chunk-ZHPX7ZYQ.js} +83 -25
  20. package/dist-plugin/{dataPaths-CRfD1LdA.d.ts → dataPaths-DZUzVv8H.d.cts} +3 -3
  21. package/dist-plugin/{dataPaths-CRfD1LdA.d.cts → dataPaths-DZUzVv8H.d.ts} +3 -3
  22. package/dist-plugin/fontPairing/index.cjs +1 -1
  23. package/dist-plugin/fontPairing/index.d.cts +1 -1
  24. package/dist-plugin/fontPairing/index.d.ts +1 -1
  25. package/dist-plugin/fontPairing/index.js +1 -1
  26. package/dist-plugin/generateColorsAndType/index.cjs +1 -1
  27. package/dist-plugin/generateColorsAndType/index.d.cts +1 -1
  28. package/dist-plugin/generateColorsAndType/index.d.ts +1 -1
  29. package/dist-plugin/generateColorsAndType/index.js +1 -1
  30. package/dist-plugin/index.cjs +461 -58
  31. package/dist-plugin/index.d.cts +1 -1
  32. package/dist-plugin/index.d.ts +1 -1
  33. package/dist-plugin/index.js +31 -23
  34. package/dist-plugin/migrateData/index.cjs +350 -9
  35. package/dist-plugin/migrateData/index.d.cts +1 -1
  36. package/dist-plugin/migrateData/index.d.ts +1 -1
  37. package/dist-plugin/migrateData/index.js +9 -5
  38. package/dist-plugin/tokensCssMigrations/index.cjs +83 -25
  39. package/dist-plugin/tokensCssMigrations/index.d.cts +1 -1
  40. package/dist-plugin/tokensCssMigrations/index.d.ts +1 -1
  41. package/dist-plugin/tokensCssMigrations/index.js +2 -2
  42. package/package.json +4 -2
  43. package/src/app/site.css +32 -0
  44. package/src/editor/component-editor/CardEditor.svelte +7 -1
  45. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +25 -2
  46. package/src/editor/core/preview/lookPreview.ts +46 -5
  47. package/src/editor/core/productionPulse.ts +6 -2
  48. package/src/editor/core/sketch/maskField.ts +75 -39
  49. package/src/editor/core/sketch/sketchLayer.ts +32 -11
  50. package/src/editor/core/sketch/sketchStore.ts +311 -86
  51. package/src/editor/core/sketch/{sketchPresetService.ts → sketchStyleService.ts} +14 -14
  52. package/src/editor/core/sketch/{sketchPresets.ts → sketchStyles.ts} +27 -28
  53. package/src/editor/core/themes/themeDocumentSync.ts +2 -0
  54. package/src/editor/core/themes/themeInit.ts +19 -1
  55. package/src/editor/core/themes/themeService.ts +7 -2
  56. package/src/editor/core/themes/themeTypes.ts +5 -0
  57. package/src/editor/docs/content/editing-tokens.md +1 -1
  58. package/src/editor/docs/content/sketch-mode.md +34 -18
  59. package/src/editor/docs/content/themes-workflow.md +30 -21
  60. package/src/editor/docs/content/where-themes-live.md +9 -5
  61. package/src/editor/docs/content.generated.ts +4 -4
  62. package/src/editor/overlay/LiveTokensRouter.svelte +8 -0
  63. package/src/editor/ui/EditorViewSwitcher.svelte +3 -3
  64. package/src/editor/ui/ThemePanel.svelte +47 -1
  65. package/src/editor/ui/sections/textStyles.ts +29 -1
  66. package/src/editor/ui/sketch/SketchPreview.svelte +3 -3
  67. package/src/editor/ui/sketch/SketchTab.svelte +120 -134
  68. package/src/live-tokens/data/colors-and-type/midnight-study.json +40 -30
  69. package/src/live-tokens/data/themes/autumn.json +3 -3
  70. package/src/live-tokens/data/themes/halloween.json +3 -3
  71. package/src/live-tokens/data/themes/midnight-study.json +61 -49
  72. package/src/live-tokens/data/themes/ocean.json +3 -3
  73. package/src/live-tokens/data/themes/royal-velvet.json +3 -3
  74. package/src/live-tokens/data/themes/sketchy.json +3 -3
  75. package/src/live-tokens/data/themes/spring-meadow.json +3 -3
  76. package/src/live-tokens/data/themes/sunset.json +3 -3
  77. package/src/system/components/Card.svelte +27 -9
  78. package/src/system/components/FloatingTokenTags.css +10 -8
  79. package/src/system/components/ImageLightbox.svelte +5 -2
  80. package/src/system/components/SectionDivider.svelte +3 -3
  81. package/src/system/components/SegmentedControl.svelte +11 -9
  82. package/src/system/styles/tokens.css +28 -5
  83. package/template/src/pages/Home.svelte +1 -11
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "Midnight Study",
3
3
  "createdAt": "2026-08-13T10:21:46.867Z",
4
- "updatedAt": "2026-08-19T22:39:32.785Z",
4
+ "updatedAt": "2026-08-27T17:03:51.623Z",
5
5
  "schemaVersion": 4,
6
6
  "colorsAndType": {
7
7
  "name": "Midnight Study",
8
- "createdAt": "2026-08-12T20:13:46.264Z",
9
- "updatedAt": "2026-08-13T14:14:20.015Z",
8
+ "createdAt": "2026-08-27T17:01:37.984Z",
9
+ "updatedAt": "2026-08-27T17:01:37.984Z",
10
10
  "editorConfigs": {
11
11
  "Brand": {
12
12
  "baseColor": {
@@ -2267,10 +2267,6 @@
2267
2267
  }
2268
2268
  },
2269
2269
  "cssVariables": {
2270
- "--gradient-1": "linear-gradient(90deg, var(--color-brand-400) 0%, var(--color-brand-700) 100%)",
2271
- "--gradient-2": "linear-gradient(135deg, var(--color-special-500) 0%, var(--color-brand-500) 100%)",
2272
- "--gradient-3": "linear-gradient(90deg, var(--color-brand-500) 0%, var(--color-accent-500) 100%)",
2273
- "--gradient-4": "linear-gradient(180deg, var(--color-canvas-600) 0%, var(--color-canvas-900) 100%)",
2274
2270
  "--badge-trait-surface": "var(--surface-brand)",
2275
2271
  "--badge-trait-text": "var(--text-brand)",
2276
2272
  "--badge-trait-text-font-family": "var(--font-sans)",
@@ -2321,7 +2317,15 @@
2321
2317
  "--shadow-md": "3px 3px 6px hsla(237, 18%, 3%, 0.9)",
2322
2318
  "--shadow-lg": "5px 5px 9px hsla(237, 18%, 3%, 0.9)",
2323
2319
  "--shadow-xl": "6px 7px 13px hsla(237, 18%, 3%, 0.9)",
2324
- "--shadow-2xl": "8px 9px 16px hsla(237, 18%, 3%, 0.9)"
2320
+ "--shadow-2xl": "8px 9px 16px hsla(237, 18%, 3%, 0.9)",
2321
+ "--gradient-1": "linear-gradient(90deg, var(--color-brand-400) 0%, var(--color-brand-700) 100%)",
2322
+ "--gradient-1-stops": "var(--color-brand-400) 0%, var(--color-brand-700) 100%",
2323
+ "--gradient-2": "linear-gradient(135deg, var(--color-special-500) 0%, var(--color-brand-500) 100%)",
2324
+ "--gradient-2-stops": "var(--color-special-500) 0%, var(--color-brand-500) 100%",
2325
+ "--gradient-3": "linear-gradient(90deg, var(--color-brand-500) 0%, var(--color-accent-500) 100%)",
2326
+ "--gradient-3-stops": "var(--color-brand-500) 0%, var(--color-accent-500) 100%",
2327
+ "--gradient-4": "linear-gradient(180deg, color-mix(in srgb, var(--color-canvas-600) 49%, transparent) 0%, var(--color-canvas-850) 14.2%, var(--color-canvas-900) 83.8%)",
2328
+ "--gradient-4-stops": "color-mix(in srgb, var(--color-canvas-600) 49%, transparent) 0%, var(--color-canvas-850) 14.2%, var(--color-canvas-900) 83.8%"
2325
2329
  },
2326
2330
  "fontSources": [
2327
2331
  {
@@ -2474,25 +2478,6 @@
2474
2478
  ]
2475
2479
  }
2476
2480
  ],
2477
- "harmonyAxes": [
2478
- {
2479
- "hue": 300,
2480
- "family": "Brand"
2481
- },
2482
- {
2483
- "hue": 340,
2484
- "family": "Accent"
2485
- },
2486
- {
2487
- "hue": 268,
2488
- "family": "Canvas"
2489
- },
2490
- {
2491
- "hue": 210,
2492
- "family": null
2493
- }
2494
- ],
2495
- "schemaVersion": 3,
2496
2481
  "gradients": [
2497
2482
  {
2498
2483
  "variable": "--gradient-1",
@@ -2546,15 +2531,40 @@
2546
2531
  "stops": [
2547
2532
  {
2548
2533
  "position": 0,
2549
- "color": "--color-canvas-600"
2534
+ "color": "--color-canvas-600",
2535
+ "opacity": 49
2550
2536
  },
2551
2537
  {
2552
- "position": 100,
2538
+ "position": 14.2,
2539
+ "color": "--color-canvas-850",
2540
+ "opacity": 100
2541
+ },
2542
+ {
2543
+ "position": 83.8,
2553
2544
  "color": "--color-canvas-900"
2554
2545
  }
2555
2546
  ]
2556
2547
  }
2557
- ]
2548
+ ],
2549
+ "harmonyAxes": [
2550
+ {
2551
+ "hue": 300,
2552
+ "family": "Brand"
2553
+ },
2554
+ {
2555
+ "hue": 340,
2556
+ "family": "Accent"
2557
+ },
2558
+ {
2559
+ "hue": 268,
2560
+ "family": "Canvas"
2561
+ },
2562
+ {
2563
+ "hue": 210,
2564
+ "family": null
2565
+ }
2566
+ ],
2567
+ "schemaVersion": 5
2558
2568
  },
2559
2569
  "componentConfigs": {
2560
2570
  "badge": {
@@ -2886,10 +2896,10 @@
2886
2896
  "card": {
2887
2897
  "name": "midnight-study",
2888
2898
  "component": "card",
2889
- "createdAt": "2026-05-10T19:26:31.704Z",
2890
- "updatedAt": "2026-08-19T22:39:32.785Z",
2899
+ "createdAt": "2026-08-27T17:02:30.403Z",
2900
+ "updatedAt": "2026-08-27T17:02:30.403Z",
2891
2901
  "aliases": {
2892
- "--card-default-surface": "color-mix(in srgb, var(--surface-neutral-lower) 70%, transparent)",
2902
+ "--card-default-surface": "--gradient-4",
2893
2903
  "--card-default-border": "--border-neutral",
2894
2904
  "--card-default-border-width": "--border-width-1",
2895
2905
  "--card-default-radius": "--radius-sm",
@@ -2899,14 +2909,14 @@
2899
2909
  "--card-default-header-padding-bottom": "--space-8",
2900
2910
  "--card-default-header-padding-left": "--space-12",
2901
2911
  "--card-default-header-gap": "--space-6",
2902
- "--card-default-body-padding": "--space-10",
2903
- "--card-default-body-padding-top": "--space-10",
2904
- "--card-default-body-padding-right": "--space-12",
2905
- "--card-default-body-padding-bottom": "--space-10",
2906
- "--card-default-body-padding-left": "--space-12",
2912
+ "--card-default-body-padding": "--space-16",
2913
+ "--card-default-body-padding-top": "--space-16",
2914
+ "--card-default-body-padding-right": "--space-20",
2915
+ "--card-default-body-padding-bottom": "--space-48",
2916
+ "--card-default-body-padding-left": "--space-20",
2907
2917
  "--card-default-shadow": "--shadow-sm",
2908
2918
  "--card-default-blur": "--blur-none",
2909
- "--card-default-header-surface": "color-mix(in srgb, var(--surface-neutral-lowest) 80%, transparent)",
2919
+ "--card-default-header-surface": "color-mix(in srgb, var(--color-brand-700) 60%, transparent)",
2910
2920
  "--card-default-title": "--text-primary",
2911
2921
  "--card-default-title-font-family": "--font-sans",
2912
2922
  "--card-default-title-font-size": "--font-size-2xl",
@@ -2922,7 +2932,8 @@
2922
2932
  "--card-hover-shadow": "--shadow-md",
2923
2933
  "--card-hover-border-active": "--card-default-border",
2924
2934
  "--card-hover-shadow-active": "--card-default-shadow"
2925
- }
2935
+ },
2936
+ "config": {}
2926
2937
  },
2927
2938
  "codesnippet": {
2928
2939
  "name": "midnight-study",
@@ -3453,8 +3464,8 @@
3453
3464
  "panel": {
3454
3465
  "name": "midnight-study",
3455
3466
  "component": "panel",
3456
- "createdAt": "2026-06-01T09:34:52.417Z",
3457
- "updatedAt": "2026-08-19T22:39:32.785Z",
3467
+ "createdAt": "2026-08-27T17:03:50.744Z",
3468
+ "updatedAt": "2026-08-27T17:03:50.744Z",
3458
3469
  "aliases": {
3459
3470
  "--panel-frame-border": "--border-neutral",
3460
3471
  "--panel-frame-border-width": "--border-width-1",
@@ -3478,10 +3489,11 @@
3478
3489
  ]
3479
3490
  }
3480
3491
  },
3481
- "--panel-stage-padding": "--space-10",
3482
- "--panel-stage-inline-padding": "--space-10",
3483
- "--panel-stage-gap": "--space-12"
3484
- }
3492
+ "--panel-stage-padding": "--space-16",
3493
+ "--panel-stage-inline-padding": "--space-24",
3494
+ "--panel-stage-gap": "--space-16"
3495
+ },
3496
+ "config": {}
3485
3497
  },
3486
3498
  "progressbar": {
3487
3499
  "name": "midnight-study",
@@ -3576,7 +3588,7 @@
3576
3588
  "--sectiondivider-lg-description": "--text-alternate",
3577
3589
  "--sectiondivider-lg-eyebrow": "--text-brand",
3578
3590
  "--sectiondivider-lg-border": "--color-transparent",
3579
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3591
+ "--sectiondivider-lg-title-outline-color": "transparent",
3580
3592
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3581
3593
  "--sectiondivider-md-title-font-family": "--font-display",
3582
3594
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3605,7 +3617,7 @@
3605
3617
  "--sectiondivider-md-description": "--text-secondary",
3606
3618
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3607
3619
  "--sectiondivider-md-border": "--color-transparent",
3608
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3620
+ "--sectiondivider-md-title-outline-color": "transparent",
3609
3621
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3610
3622
  "--sectiondivider-sm-title-font-family": "--font-display",
3611
3623
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3634,7 +3646,7 @@
3634
3646
  "--sectiondivider-sm-description": "--text-secondary",
3635
3647
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3636
3648
  "--sectiondivider-sm-border": "--color-transparent",
3637
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3649
+ "--sectiondivider-sm-title-outline-color": "transparent",
3638
3650
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3639
3651
  }
3640
3652
  },
@@ -3529,7 +3529,7 @@
3529
3529
  "--sectiondivider-lg-description": "--text-alternate",
3530
3530
  "--sectiondivider-lg-eyebrow": "--text-brand",
3531
3531
  "--sectiondivider-lg-border": "--color-transparent",
3532
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3532
+ "--sectiondivider-lg-title-outline-color": "transparent",
3533
3533
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3534
3534
  "--sectiondivider-md-title-font-family": "--font-display",
3535
3535
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3558,7 +3558,7 @@
3558
3558
  "--sectiondivider-md-description": "--text-secondary",
3559
3559
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3560
3560
  "--sectiondivider-md-border": "--color-transparent",
3561
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3561
+ "--sectiondivider-md-title-outline-color": "transparent",
3562
3562
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3563
3563
  "--sectiondivider-sm-title-font-family": "--font-display",
3564
3564
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3587,7 +3587,7 @@
3587
3587
  "--sectiondivider-sm-description": "--text-secondary",
3588
3588
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3589
3589
  "--sectiondivider-sm-border": "--color-transparent",
3590
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3590
+ "--sectiondivider-sm-title-outline-color": "transparent",
3591
3591
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3592
3592
  }
3593
3593
  },
@@ -3560,7 +3560,7 @@
3560
3560
  "--sectiondivider-lg-description": "--text-alternate",
3561
3561
  "--sectiondivider-lg-eyebrow": "--text-brand",
3562
3562
  "--sectiondivider-lg-border": "--color-transparent",
3563
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3563
+ "--sectiondivider-lg-title-outline-color": "transparent",
3564
3564
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3565
3565
  "--sectiondivider-md-title-font-family": "--font-display",
3566
3566
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3589,7 +3589,7 @@
3589
3589
  "--sectiondivider-md-description": "--text-secondary",
3590
3590
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3591
3591
  "--sectiondivider-md-border": "--color-transparent",
3592
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3592
+ "--sectiondivider-md-title-outline-color": "transparent",
3593
3593
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3594
3594
  "--sectiondivider-sm-title-font-family": "--font-display",
3595
3595
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3618,7 +3618,7 @@
3618
3618
  "--sectiondivider-sm-description": "--text-secondary",
3619
3619
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3620
3620
  "--sectiondivider-sm-border": "--color-transparent",
3621
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3621
+ "--sectiondivider-sm-title-outline-color": "transparent",
3622
3622
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3623
3623
  }
3624
3624
  },
@@ -3543,7 +3543,7 @@
3543
3543
  "--sectiondivider-lg-description": "--text-alternate",
3544
3544
  "--sectiondivider-lg-eyebrow": "--text-brand",
3545
3545
  "--sectiondivider-lg-border": "--color-transparent",
3546
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3546
+ "--sectiondivider-lg-title-outline-color": "transparent",
3547
3547
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3548
3548
  "--sectiondivider-md-title-font-family": "--font-display",
3549
3549
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3572,7 +3572,7 @@
3572
3572
  "--sectiondivider-md-description": "--text-secondary",
3573
3573
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3574
3574
  "--sectiondivider-md-border": "--color-transparent",
3575
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3575
+ "--sectiondivider-md-title-outline-color": "transparent",
3576
3576
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3577
3577
  "--sectiondivider-sm-title-font-family": "--font-display",
3578
3578
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3601,7 +3601,7 @@
3601
3601
  "--sectiondivider-sm-description": "--text-secondary",
3602
3602
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3603
3603
  "--sectiondivider-sm-border": "--color-transparent",
3604
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3604
+ "--sectiondivider-sm-title-outline-color": "transparent",
3605
3605
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3606
3606
  }
3607
3607
  },
@@ -3516,7 +3516,7 @@
3516
3516
  "--sectiondivider-lg-description": "--text-alternate",
3517
3517
  "--sectiondivider-lg-eyebrow": "--text-brand",
3518
3518
  "--sectiondivider-lg-border": "--color-transparent",
3519
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3519
+ "--sectiondivider-lg-title-outline-color": "transparent",
3520
3520
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3521
3521
  "--sectiondivider-md-title-font-family": "--font-display",
3522
3522
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3545,7 +3545,7 @@
3545
3545
  "--sectiondivider-md-description": "--text-secondary",
3546
3546
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3547
3547
  "--sectiondivider-md-border": "--color-transparent",
3548
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3548
+ "--sectiondivider-md-title-outline-color": "transparent",
3549
3549
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3550
3550
  "--sectiondivider-sm-title-font-family": "--font-display",
3551
3551
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3574,7 +3574,7 @@
3574
3574
  "--sectiondivider-sm-description": "--text-secondary",
3575
3575
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3576
3576
  "--sectiondivider-sm-border": "--color-transparent",
3577
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3577
+ "--sectiondivider-sm-title-outline-color": "transparent",
3578
3578
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3579
3579
  }
3580
3580
  },
@@ -3568,7 +3568,7 @@
3568
3568
  "--sectiondivider-lg-description": "--text-alternate",
3569
3569
  "--sectiondivider-lg-eyebrow": "--text-brand",
3570
3570
  "--sectiondivider-lg-border": "--color-transparent",
3571
- "--sectiondivider-lg-title-outline-color": "--surface-canvas-lowest",
3571
+ "--sectiondivider-lg-title-outline-color": "transparent",
3572
3572
  "--sectiondivider-lg-hairline-color": "--border-brand-medium",
3573
3573
  "--sectiondivider-md-title-font-family": "--font-display",
3574
3574
  "--sectiondivider-md-title-font-weight": "--font-weight-bold",
@@ -3597,7 +3597,7 @@
3597
3597
  "--sectiondivider-md-description": "--text-secondary",
3598
3598
  "--sectiondivider-md-eyebrow": "--text-tertiary",
3599
3599
  "--sectiondivider-md-border": "--color-transparent",
3600
- "--sectiondivider-md-title-outline-color": "--surface-accent-lowest",
3600
+ "--sectiondivider-md-title-outline-color": "transparent",
3601
3601
  "--sectiondivider-md-hairline-color": "--border-brand-medium",
3602
3602
  "--sectiondivider-sm-title-font-family": "--font-display",
3603
3603
  "--sectiondivider-sm-title-font-weight": "--font-weight-medium",
@@ -3626,7 +3626,7 @@
3626
3626
  "--sectiondivider-sm-description": "--text-secondary",
3627
3627
  "--sectiondivider-sm-eyebrow": "--text-tertiary",
3628
3628
  "--sectiondivider-sm-border": "--color-transparent",
3629
- "--sectiondivider-sm-title-outline-color": "color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent)",
3629
+ "--sectiondivider-sm-title-outline-color": "transparent",
3630
3630
  "--sectiondivider-sm-hairline-color": "color-mix(in srgb, var(--border-brand-medium) 50%, transparent)"
3631
3631
  }
3632
3632
  },
@@ -3,6 +3,9 @@
3
3
  icon?: string;
4
4
  iconColor?: string;
5
5
  title?: string;
6
+ /** `bare` drops the header. The frame and body keep every token the default
7
+ variant uses, so padding, stroke and fill stay editable. */
8
+ variant?: 'default' | 'bare';
6
9
  size?: 'default' | 'compact';
7
10
  /** false → the card stops pinning body typography so the consumer fully owns slotted content's styling. */
8
11
  prose?: boolean;
@@ -20,6 +23,7 @@
20
23
  icon = '',
21
24
  iconColor = 'var(--text-secondary)',
22
25
  title = '',
26
+ variant = 'default',
23
27
  size = 'default',
24
28
  prose = true,
25
29
  flush = false,
@@ -35,16 +39,25 @@
35
39
  let hoverShadow = $derived(
36
40
  hover === undefined ? undefined : hover ? 'var(--card-hover-shadow)' : 'var(--card-default-shadow)',
37
41
  );
42
+
43
+ let showHeader = $derived(variant !== 'bare' && Boolean(icon || title));
44
+
45
+ $effect(() => {
46
+ if (import.meta.env.DEV && variant === 'default' && !icon && !title) {
47
+ console.warn('[live-tokens] <Card> has no icon or title. Use variant="bare" to declare a headerless card.');
48
+ }
49
+ });
38
50
  </script>
39
51
 
40
52
  <div
41
53
  class="card {className}"
54
+ class:bare={variant === 'bare'}
42
55
  class:compact={size === 'compact'}
43
56
  style:--card-color={iconColor}
44
57
  style:--card-hover-border-active={hoverBorder}
45
58
  style:--card-hover-shadow-active={hoverShadow}
46
59
  >
47
- {#if icon || title}
60
+ {#if showHeader}
48
61
  <div class="card-header">
49
62
  {#if icon}
50
63
  <i class="{icon} card-icon"></i>
@@ -68,17 +81,22 @@
68
81
  --card-default-border: var(--border-neutral);
69
82
  --card-default-border-width: var(--border-width-1);
70
83
  --card-default-radius: var(--radius-lg);
84
+ /* Every side tracks its base. A declared side always beats the fallback
85
+ themed-padding emits, so naming a literal step here left the base token
86
+ inert: merging split padding back to one value cleared the side aliases
87
+ and the card kept the old geometry. The asymmetry is a themed choice now,
88
+ carried by per-side aliases that override these outright. */
71
89
  --card-default-header-padding: var(--space-16);
72
- --card-default-header-padding-top: var(--space-12);
73
- --card-default-header-padding-right: var(--space-20);
74
- --card-default-header-padding-bottom: var(--space-12);
75
- --card-default-header-padding-left: var(--space-20);
90
+ --card-default-header-padding-top: var(--card-default-header-padding);
91
+ --card-default-header-padding-right: var(--card-default-header-padding);
92
+ --card-default-header-padding-bottom: var(--card-default-header-padding);
93
+ --card-default-header-padding-left: var(--card-default-header-padding);
76
94
  --card-default-header-gap: var(--space-8);
77
95
  --card-default-body-padding: var(--space-16);
78
- --card-default-body-padding-top: var(--space-16);
79
- --card-default-body-padding-right: var(--space-20);
80
- --card-default-body-padding-bottom: var(--space-16);
81
- --card-default-body-padding-left: var(--space-20);
96
+ --card-default-body-padding-top: var(--card-default-body-padding);
97
+ --card-default-body-padding-right: var(--card-default-body-padding);
98
+ --card-default-body-padding-bottom: var(--card-default-body-padding);
99
+ --card-default-body-padding-left: var(--card-default-body-padding);
82
100
  --card-default-shadow: var(--shadow-sm);
83
101
  --card-default-blur: var(--blur-none);
84
102
  --card-default-header-surface: color-mix(in srgb, var(--surface-neutral-lowest) 80%, transparent);
@@ -3,12 +3,14 @@
3
3
  * animations are hardcoded so token edits don't repaint our chrome. The
4
4
  * exceptions are intentional and ARE the demo: the central box's
5
5
  * surface/radius/border (set inline), the dropdown (rendered through
6
- * <MenuSelect>), and elevation, which reads from the --shadow-* scale.
6
+ * <MenuSelect>), elevation, which reads from the --shadow-* scale, and the
7
+ * zap colour, which tracks --text-accent so the beam stays on-theme.
7
8
  * File is global; keep selectors `ftt-` prefixed.
8
9
  */
9
10
 
10
11
  .ftt-stage {
11
12
  --ftt-contrast-color: var(--color-white);
13
+ --ftt-zap-color: var(--text-accent);
12
14
  --ftt-string-opacity: 0.5;
13
15
  position: relative;
14
16
  width: 100%;
@@ -85,7 +87,7 @@
85
87
  }
86
88
 
87
89
  .ftt-string.ftt-live {
88
- stroke: #ff8eeb;
90
+ stroke: var(--ftt-zap-color);
89
91
  opacity: 1;
90
92
  }
91
93
 
@@ -103,18 +105,18 @@
103
105
  }
104
106
 
105
107
  /* --- Energy ball ---------------------------------------------------------- */
106
- /* Colour must match `.ftt-string.ftt-live` so the beam reads as a continuous
107
- trail, not a colour-shifting projectile. */
108
+ /* Shares --ftt-zap-color with `.ftt-string.ftt-live` so the beam reads as a
109
+ continuous trail, not a colour-shifting projectile. */
108
110
  .ftt-energy-ball {
109
111
  position: absolute;
110
112
  width: 0.875rem;
111
113
  height: 0.875rem;
112
114
  translate: -50% -50%;
113
115
  border-radius: 9999px;
114
- background: #ff8eeb;
116
+ background: var(--ftt-zap-color);
115
117
  box-shadow:
116
- 0 0 8px 2px #ff8eeb,
117
- 0 0 18px 4px #ff8eeb;
118
+ 0 0 8px 2px var(--ftt-zap-color),
119
+ 0 0 18px 4px var(--ftt-zap-color);
118
120
  pointer-events: none;
119
121
  opacity: 0;
120
122
  z-index: 6;
@@ -233,7 +235,7 @@
233
235
  z-index: 30;
234
236
  }
235
237
  .ftt-tag-trigger:focus-visible {
236
- outline: 2px solid #f31fdb;
238
+ outline: 2px solid var(--ftt-zap-color);
237
239
  outline-offset: 3px;
238
240
  border-radius: 9999px;
239
241
  }
@@ -728,7 +728,8 @@
728
728
 
729
729
  <style>
730
730
  :global(:root) {
731
- /* thumbnail (closed inline) + animated modal stage */
731
+ /* thumbnail (closed inline) + animated modal stage; the fill is the
732
+ thumbnail's alone — the open stage rides the overlay */
732
733
  --imagelightbox-tile-surface: var(--color-transparent);
733
734
  --imagelightbox-tile-radius: var(--radius-2xl);
734
735
  --imagelightbox-tile-border: var(--color-transparent);
@@ -813,13 +814,15 @@
813
814
  border: 0;
814
815
  }
815
816
 
817
+ /* No tile fill here: the open stage sits on the near-opaque overlay, which
818
+ already backs transparent art. Painting the fill too would band the scrim
819
+ wherever the image's aspect leaves the stage box unfilled. */
816
820
  .image-lightbox-stage {
817
821
  position: fixed;
818
822
  z-index: var(--z-modal);
819
823
  cursor: zoom-out;
820
824
  border: var(--imagelightbox-tile-border-width) solid var(--imagelightbox-tile-border);
821
825
  border-radius: var(--imagelightbox-tile-radius);
822
- background: var(--imagelightbox-tile-surface);
823
826
  }
824
827
 
825
828
  .image-lightbox-clip {
@@ -243,7 +243,7 @@
243
243
  --sectiondivider-lg-description: var(--text-alternate);
244
244
  --sectiondivider-lg-eyebrow: var(--text-brand);
245
245
  --sectiondivider-lg-border: var(--color-transparent);
246
- --sectiondivider-lg-title-outline-color: var(--surface-canvas-lowest);
246
+ --sectiondivider-lg-title-outline-color: var(--color-transparent);
247
247
  --sectiondivider-lg-hairline-color: var(--border-brand-medium);
248
248
 
249
249
  /* Medium */
@@ -274,7 +274,7 @@
274
274
  --sectiondivider-md-description: var(--text-secondary);
275
275
  --sectiondivider-md-eyebrow: var(--text-tertiary);
276
276
  --sectiondivider-md-border: var(--color-transparent);
277
- --sectiondivider-md-title-outline-color: var(--surface-accent-lowest);
277
+ --sectiondivider-md-title-outline-color: var(--color-transparent);
278
278
  --sectiondivider-md-hairline-color: var(--border-brand-medium);
279
279
 
280
280
  /* Small */
@@ -305,7 +305,7 @@
305
305
  --sectiondivider-sm-description: var(--text-secondary);
306
306
  --sectiondivider-sm-eyebrow: var(--text-tertiary);
307
307
  --sectiondivider-sm-border: var(--color-transparent);
308
- --sectiondivider-sm-title-outline-color: color-mix(in srgb, var(--surface-neutral-lowest) 25%, transparent);
308
+ --sectiondivider-sm-title-outline-color: var(--color-transparent);
309
309
  --sectiondivider-sm-hairline-color: color-mix(in srgb, var(--border-brand-medium) 50%, transparent);
310
310
 
311
311
  /* Intrinsic defaults. These keys cascade to `:root` via the editor's
@@ -152,25 +152,27 @@
152
152
  icon size) all read through these default names, so rebinding them
153
153
  here is enough — no per-state small token explosion. Per-side padding
154
154
  overrides are rebound too so split-padding edits at small don't leak
155
- through to default size. Font-weight and color are intentionally NOT
155
+ through to default size; each carries the same fallback themed-padding
156
+ emits, so merging the small padding back to one value leaves the base
157
+ token in charge instead of binding to a name nothing sets. Font-weight and color are intentionally NOT
156
158
  rebound: weight differences are state-driven (selected = semibold),
157
159
  colors are state-driven too. */
158
160
  .segmented-control.small {
159
161
  --segmentedcontrol-bar-padding: var(--segmentedcontrol-bar-small-padding);
160
- --segmentedcontrol-bar-padding-top: var(--segmentedcontrol-bar-small-padding-top);
161
- --segmentedcontrol-bar-padding-right: var(--segmentedcontrol-bar-small-padding-right);
162
- --segmentedcontrol-bar-padding-bottom: var(--segmentedcontrol-bar-small-padding-bottom);
163
- --segmentedcontrol-bar-padding-left: var(--segmentedcontrol-bar-small-padding-left);
162
+ --segmentedcontrol-bar-padding-top: var(--segmentedcontrol-bar-small-padding-top, var(--segmentedcontrol-bar-small-padding));
163
+ --segmentedcontrol-bar-padding-right: var(--segmentedcontrol-bar-small-padding-right, var(--segmentedcontrol-bar-small-padding));
164
+ --segmentedcontrol-bar-padding-bottom: var(--segmentedcontrol-bar-small-padding-bottom, var(--segmentedcontrol-bar-small-padding));
165
+ --segmentedcontrol-bar-padding-left: var(--segmentedcontrol-bar-small-padding-left, var(--segmentedcontrol-bar-small-padding));
164
166
  --segmentedcontrol-bar-radius: var(--segmentedcontrol-bar-small-radius);
165
167
 
166
168
  --segmentedcontrol-divider-inset: var(--segmentedcontrol-small-divider-inset);
167
169
  --segmentedcontrol-divider-thickness: var(--segmentedcontrol-small-divider-thickness);
168
170
 
169
171
  --segmentedcontrol-option-padding: var(--segmentedcontrol-option-small-padding);
170
- --segmentedcontrol-option-padding-top: var(--segmentedcontrol-option-small-padding-top);
171
- --segmentedcontrol-option-padding-right: var(--segmentedcontrol-option-small-padding-right);
172
- --segmentedcontrol-option-padding-bottom: var(--segmentedcontrol-option-small-padding-bottom);
173
- --segmentedcontrol-option-padding-left: var(--segmentedcontrol-option-small-padding-left);
172
+ --segmentedcontrol-option-padding-top: var(--segmentedcontrol-option-small-padding-top, var(--segmentedcontrol-option-small-padding));
173
+ --segmentedcontrol-option-padding-right: var(--segmentedcontrol-option-small-padding-right, var(--segmentedcontrol-option-small-padding));
174
+ --segmentedcontrol-option-padding-bottom: var(--segmentedcontrol-option-small-padding-bottom, var(--segmentedcontrol-option-small-padding));
175
+ --segmentedcontrol-option-padding-left: var(--segmentedcontrol-option-small-padding-left, var(--segmentedcontrol-option-small-padding));
174
176
  --segmentedcontrol-option-gap: var(--segmentedcontrol-option-small-gap);
175
177
 
176
178
  /* Icon size has a single source-of-truth token now; text size/line-height
@@ -681,11 +681,34 @@
681
681
  --code-line-height: var(--line-height-normal);
682
682
  --code-letter-spacing: var(--letter-spacing-normal);
683
683
 
684
- --editorial-font-family: var(--font-editorial);
685
- --editorial-font-size: var(--font-size-md);
686
- --editorial-font-weight: var(--font-weight-normal);
687
- --editorial-line-height: var(--line-height-normal);
688
- --editorial-letter-spacing: var(--letter-spacing-normal);
684
+ /* Editorial — the long-reading role. `md` is the reading step and takes the
685
+ most open leading; every step away from it tightens by one, so a lede or a
686
+ pull quote is not set at reading leading. Sizes stay inside the xs–xl band
687
+ the responsive scale leaves constant, so an article does not resize itself
688
+ between breakpoints. */
689
+ --editorial-xl-font-family: var(--font-editorial);
690
+ --editorial-xl-font-size: var(--font-size-xl);
691
+ --editorial-xl-font-weight: var(--font-weight-normal);
692
+ --editorial-xl-line-height: var(--line-height-tighter);
693
+ --editorial-xl-letter-spacing: var(--letter-spacing-normal);
694
+
695
+ --editorial-lg-font-family: var(--font-editorial);
696
+ --editorial-lg-font-size: var(--font-size-lg);
697
+ --editorial-lg-font-weight: var(--font-weight-normal);
698
+ --editorial-lg-line-height: var(--line-height-tight);
699
+ --editorial-lg-letter-spacing: var(--letter-spacing-normal);
700
+
701
+ --editorial-md-font-family: var(--font-editorial);
702
+ --editorial-md-font-size: var(--font-size-md);
703
+ --editorial-md-font-weight: var(--font-weight-normal);
704
+ --editorial-md-line-height: var(--line-height-normal);
705
+ --editorial-md-letter-spacing: var(--letter-spacing-normal);
706
+
707
+ --editorial-sm-font-family: var(--font-editorial);
708
+ --editorial-sm-font-size: var(--font-size-sm);
709
+ --editorial-sm-font-weight: var(--font-weight-normal);
710
+ --editorial-sm-line-height: var(--line-height-tight);
711
+ --editorial-sm-letter-spacing: var(--letter-spacing-normal);
689
712
 
690
713
  /* Eyebrow — values track the existing .eyebrow class in src/app/Home.svelte. */
691
714
  --eyebrow-font-family: var(--font-sans);
@@ -12,8 +12,7 @@
12
12
 
13
13
  <div class="home">
14
14
  <section class="stub">
15
- <Card>
16
- <span class="eyebrow">Your app lives here</span>
15
+ <Card variant="bare">
17
16
  <h1>Home</h1>
18
17
  <p>
19
18
  Replace this with your own content. Edit <code>src/pages/Home.svelte</code>
@@ -46,15 +45,6 @@
46
45
  grid-column: 4 / span 6;
47
46
  }
48
47
 
49
- .eyebrow {
50
- display: block;
51
- font-size: var(--font-size-sm);
52
- font-weight: var(--font-weight-normal);
53
- text-transform: uppercase;
54
- color: var(--text-tertiary);
55
- margin-bottom: var(--space-8);
56
- }
57
-
58
48
  h1 {
59
49
  font-family: var(--font-display);
60
50
  font-size: var(--font-size-4xl);