@motion-proto/live-tokens 0.97.0 → 0.98.2

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 (184) hide show
  1. package/.claude/skills/live-tokens-check-compliance/SKILL.md +5 -0
  2. package/.claude/skills/live-tokens-create-component/SKILL.md +4 -3
  3. package/.claude/skills/live-tokens-create-component/references/contract-tests.md +71 -11
  4. package/CHANGELOG.md +272 -0
  5. package/README.md +2 -2
  6. package/bin/check-component.mjs +8 -0
  7. package/bin/check-page.mjs +6 -0
  8. package/bin/cli.mjs +36 -6
  9. package/bin/contractRunner.mjs +142 -17
  10. package/bin/lib/findings.mjs +20 -4
  11. package/bin/rules/a11y.mjs +53 -0
  12. package/dist-plugin/{chunk-A4TBP4MM.js → chunk-SLICH4IH.js} +2 -2
  13. package/dist-plugin/index.cjs +148 -3
  14. package/dist-plugin/index.js +250 -105
  15. package/dist-plugin/setColors/index.js +1 -1
  16. package/package.json +47 -2
  17. package/src/demo/LabeledSelect.svelte +1 -1
  18. package/src/editor/bootstrap.ts +3 -1
  19. package/src/editor/component-editor/BadgeEditor.svelte +13 -0
  20. package/src/editor/component-editor/ButtonEditor.svelte +33 -2
  21. package/src/editor/component-editor/CalloutEditor.svelte +13 -0
  22. package/src/editor/component-editor/CardEditor.svelte +12 -2
  23. package/src/editor/component-editor/CodeSnippetEditor.svelte +11 -1
  24. package/src/editor/component-editor/CollapsibleSectionEditor.svelte +18 -1
  25. package/src/editor/component-editor/CornerBadgeEditor.svelte +13 -0
  26. package/src/editor/component-editor/DialogEditor.svelte +15 -0
  27. package/src/editor/component-editor/IconButtonEditor.svelte +29 -1
  28. package/src/editor/component-editor/ImageEditor.svelte +20 -9
  29. package/src/editor/component-editor/ImageLightboxEditor.svelte +44 -0
  30. package/src/editor/component-editor/InlineEditActionsEditor.svelte +13 -1
  31. package/src/editor/component-editor/InputEditor.svelte +23 -0
  32. package/src/editor/component-editor/MenuSelectEditor.svelte +27 -1
  33. package/src/editor/component-editor/NotificationEditor.svelte +15 -0
  34. package/src/editor/component-editor/PanelEditor.svelte +1 -1
  35. package/src/editor/component-editor/ProgressBarEditor.svelte +13 -0
  36. package/src/editor/component-editor/RadioButtonEditor.svelte +20 -1
  37. package/src/editor/component-editor/SectionDividerEditor.svelte +41 -13
  38. package/src/editor/component-editor/SegmentedControlEditor.svelte +29 -1
  39. package/src/editor/component-editor/SideNavigationEditor.svelte +40 -1
  40. package/src/editor/component-editor/SlidePagerEditor.svelte +20 -0
  41. package/src/editor/component-editor/SliderEditor.svelte +33 -0
  42. package/src/editor/component-editor/TabBarEditor.svelte +23 -2
  43. package/src/editor/component-editor/TableEditor.svelte +14 -0
  44. package/src/editor/component-editor/ToggleEditor.svelte +17 -0
  45. package/src/editor/component-editor/TooltipEditor.svelte +11 -2
  46. package/src/editor/component-editor/VideoFrameEditor.svelte +8 -0
  47. package/src/editor/component-editor/VideoLightboxEditor.svelte +10 -0
  48. package/src/editor/component-editor/registration.ts +2 -1
  49. package/src/editor/component-editor/registry.ts +69 -27
  50. package/src/editor/component-editor/scaffolding/DemoHeader.svelte +2 -0
  51. package/src/editor/component-editor/scaffolding/StateBlock.svelte +19 -8
  52. package/src/editor/component-editor/scaffolding/TokenLayout.svelte +3 -0
  53. package/src/editor/component-editor/scaffolding/VariantGroup.svelte +70 -3
  54. package/src/editor/component-editor/scaffolding/editorContext.ts +7 -0
  55. package/src/editor/core/a11y/a11yReport.ts +101 -0
  56. package/src/editor/core/a11y/a11yReportTypes.ts +69 -0
  57. package/src/editor/core/a11y/contrastFailures.ts +22 -0
  58. package/src/editor/core/components/contrastPairRegistry.ts +18 -0
  59. package/src/editor/core/palettes/contrast.ts +44 -0
  60. package/src/editor/core/palettes/contrastPairs.ts +79 -0
  61. package/src/editor/core/palettes/resolveColor.ts +77 -0
  62. package/src/editor/core/store/editorStore.ts +4 -0
  63. package/src/editor/core/store/editorViewStore.ts +2 -2
  64. package/src/editor/core/store/unsavedEdits.ts +10 -0
  65. package/src/editor/core/themes/liveStateStream.ts +7 -1
  66. package/src/editor/core/themes/parsers/gradient.ts +5 -2
  67. package/src/editor/docs/chapters.ts +1 -0
  68. package/src/editor/docs/content/accessibility.md +362 -0
  69. package/src/editor/docs/content/editing-tokens.md +28 -1
  70. package/src/editor/docs/content.generated.ts +2 -1
  71. package/src/editor/pages/ComponentEditorPage.svelte +10 -1
  72. package/src/editor/pages/EditorShell.svelte +96 -10
  73. package/src/editor/skill-atlas/skillSources.generated.ts +3 -3
  74. package/src/editor/skill-atlas/trees/check-compliance.ts +3 -3
  75. package/src/editor/skill-atlas/trees/create-component.ts +12 -12
  76. package/src/editor/ui/EditorViewSwitcher.svelte +15 -2
  77. package/src/editor/ui/GradientEditor.svelte +9 -1
  78. package/src/editor/ui/ThemePanel.svelte +4 -4
  79. package/src/editor/ui/UIContrastReadout.svelte +186 -0
  80. package/src/editor/ui/UIInfoPopover.svelte +16 -2
  81. package/src/editor/ui/UIPaletteSelector.svelte +9 -0
  82. package/src/editor/ui/UITokenSelector.svelte +26 -2
  83. package/src/editor/ui/a11y/A11yComponentIssues.svelte +103 -0
  84. package/src/editor/ui/a11y/A11yFindingRow.svelte +57 -0
  85. package/src/editor/ui/a11y/A11yIssueRow.svelte +121 -0
  86. package/src/editor/ui/a11y/A11yOverview.svelte +242 -0
  87. package/src/editor/ui/a11y/A11yPanel.svelte +128 -0
  88. package/src/editor/ui/a11y/A11yPropertyMark.svelte +84 -0
  89. package/src/editor/ui/a11y/A11yRailMark.svelte +34 -0
  90. package/src/editor/ui/a11y/AccessibilityTab.svelte +334 -0
  91. package/src/editor/ui/a11y/a11yView.ts +218 -0
  92. package/src/editor/ui/contrastReadout.ts +45 -0
  93. package/src/live-tokens/data/themes/autumn.json +20 -20
  94. package/src/live-tokens/data/themes/halloween.json +20 -20
  95. package/src/live-tokens/data/themes/midnight-study.json +20 -20
  96. package/src/live-tokens/data/themes/ocean.json +20 -20
  97. package/src/live-tokens/data/themes/royal-velvet.json +20 -20
  98. package/src/live-tokens/data/themes/sketchy.json +20 -20
  99. package/src/live-tokens/data/themes/spring-meadow.json +20 -20
  100. package/src/live-tokens/data/themes/sunset.json +20 -20
  101. package/src/system/components/Badge.svelte +3 -3
  102. package/src/system/components/Button.svelte +9 -3
  103. package/src/system/components/CodeSnippet.svelte +8 -1
  104. package/src/system/components/CornerBadge.svelte +3 -3
  105. package/src/system/components/Dialog.svelte +43 -14
  106. package/src/system/components/IconButton.svelte +1 -1
  107. package/src/system/components/Image.svelte +7 -0
  108. package/src/system/components/ImageLightbox.svelte +18 -25
  109. package/src/system/components/Input.svelte +8 -1
  110. package/src/system/components/MenuSelect.svelte +30 -2
  111. package/src/system/components/Notification.svelte +1 -1
  112. package/src/system/components/ProgressBar.svelte +6 -0
  113. package/src/system/components/RadioButton.svelte +36 -3
  114. package/src/system/components/SegmentedControl.svelte +36 -2
  115. package/src/system/components/SlidePager.svelte +2 -2
  116. package/src/system/components/Slider.svelte +13 -9
  117. package/src/system/components/TabBar.svelte +33 -3
  118. package/src/system/components/Toggle.svelte +2 -2
  119. package/src/system/components/VideoFrame.svelte +1 -1
  120. package/src/system/components/VideoLightbox.svelte +2 -2
  121. package/src/system/internal/focusTrap.ts +35 -0
  122. package/src/testing-js/__aria__/badge.yml +40 -0
  123. package/src/testing-js/__aria__/button.yml +88 -0
  124. package/src/testing-js/__aria__/callout.yml +12 -0
  125. package/src/testing-js/__aria__/card.yml +8 -0
  126. package/src/testing-js/__aria__/codesnippet.yml +21 -0
  127. package/src/testing-js/__aria__/collapsiblesection.yml +23 -0
  128. package/src/testing-js/__aria__/cornerbadge.yml +24 -0
  129. package/src/testing-js/__aria__/dialog.yml +42 -0
  130. package/src/testing-js/__aria__/iconbutton.yml +57 -0
  131. package/src/testing-js/__aria__/image.yml +10 -0
  132. package/src/testing-js/__aria__/imagelightbox.yml +50 -0
  133. package/src/testing-js/__aria__/inlineeditactions.yml +16 -0
  134. package/src/testing-js/__aria__/input.yml +61 -0
  135. package/src/testing-js/__aria__/menuselect.yml +30 -0
  136. package/src/testing-js/__aria__/notification.yml +30 -0
  137. package/src/testing-js/__aria__/panel.yml +2 -0
  138. package/src/testing-js/__aria__/progressbar.yml +2 -0
  139. package/src/testing-js/__aria__/radiobutton.yml +20 -0
  140. package/src/testing-js/__aria__/sectiondivider.yml +9 -0
  141. package/src/testing-js/__aria__/segmentedcontrol.yml +35 -0
  142. package/src/testing-js/__aria__/sidenavigation.yml +304 -0
  143. package/src/testing-js/__aria__/slidepager.yml +72 -0
  144. package/src/testing-js/__aria__/slider.yml +28 -0
  145. package/src/testing-js/__aria__/tabbar.yml +35 -0
  146. package/src/testing-js/__aria__/table.yml +144 -0
  147. package/src/testing-js/__aria__/toggle.yml +12 -0
  148. package/src/testing-js/__aria__/tooltip.yml +2 -0
  149. package/src/testing-js/__aria__/videoframe.yml +6 -0
  150. package/src/testing-js/__aria__/videolightbox.yml +12 -0
  151. package/src/testing-js/{chunk-WIZ6W7UT.js → chunk-3WCLMOM7.js} +2 -2
  152. package/src/testing-js/{chunk-SHBYZUPD.js → chunk-5HNZHIHG.js} +211 -14
  153. package/src/testing-js/chunk-5HNZHIHG.js.map +1 -0
  154. package/src/testing-js/{chunk-NB3NZRBM.js → chunk-7CM5D7PF.js} +5 -1
  155. package/src/testing-js/chunk-7CM5D7PF.js.map +1 -0
  156. package/src/testing-js/chunk-EWSGE27V.js +168 -0
  157. package/src/testing-js/chunk-EWSGE27V.js.map +1 -0
  158. package/src/testing-js/{chunk-GKO27NGN.js → chunk-R54I7YL6.js} +2 -2
  159. package/src/testing-js/{chunk-X6KHEVIG.js → chunk-RWH46IU5.js} +97 -29
  160. package/src/testing-js/chunk-RWH46IU5.js.map +1 -0
  161. package/src/testing-js/chunk-SHLPDNAQ.js +658 -0
  162. package/src/testing-js/chunk-SHLPDNAQ.js.map +1 -0
  163. package/src/testing-js/{chunk-3UKGXCDL.js → chunk-YVVR3GJZ.js} +1 -1
  164. package/src/testing-js/chunk-YVVR3GJZ.js.map +1 -0
  165. package/src/testing-js/component-a11y.contract.js +283 -0
  166. package/src/testing-js/component-a11y.contract.js.map +1 -0
  167. package/src/testing-js/component-alias.contract.js +2 -2
  168. package/src/testing-js/component-behavior.contract.js +2 -2
  169. package/src/testing-js/component-editor.contract.js +6 -5
  170. package/src/testing-js/component-editor.contract.js.map +1 -1
  171. package/src/testing-js/component-render.contract.js +10 -6
  172. package/src/testing-js/component-render.contract.js.map +1 -1
  173. package/src/testing-js/index.d.ts +44 -16
  174. package/src/testing-js/index.js +9 -9
  175. package/src/testing-js/page-compliance.contract.js +132 -13
  176. package/src/testing-js/page-compliance.contract.js.map +1 -1
  177. package/src/testing-js/vitest.js +3 -3
  178. package/template/package.json +9 -0
  179. package/src/testing-js/chunk-3UKGXCDL.js.map +0 -1
  180. package/src/testing-js/chunk-NB3NZRBM.js.map +0 -1
  181. package/src/testing-js/chunk-SHBYZUPD.js.map +0 -1
  182. package/src/testing-js/chunk-X6KHEVIG.js.map +0 -1
  183. /package/src/testing-js/{chunk-WIZ6W7UT.js.map → chunk-3WCLMOM7.js.map} +0 -0
  184. /package/src/testing-js/{chunk-GKO27NGN.js.map → chunk-R54I7YL6.js.map} +0 -0
@@ -2466,7 +2466,7 @@
2466
2466
  "createdAt": "2026-05-01T08:28:00.345Z",
2467
2467
  "updatedAt": "2026-08-19T22:39:32.785Z",
2468
2468
  "aliases": {
2469
- "--badge-brand-surface": "--surface-brand",
2469
+ "--badge-brand-surface": "--surface-brand-low",
2470
2470
  "--badge-brand-text": "--text-brand",
2471
2471
  "--badge-brand-border": "--border-brand",
2472
2472
  "--badge-brand-text-font-family": "--font-sans",
@@ -2519,7 +2519,7 @@
2519
2519
  "--badge-alternate-blur": "--blur-none",
2520
2520
  "--badge-alternate-icon-size": "--icon-size-sm",
2521
2521
  "--badge-canvas-surface": "--surface-canvas",
2522
- "--badge-canvas-text": "--text-canvas",
2522
+ "--badge-canvas-text": "--text-secondary",
2523
2523
  "--badge-canvas-border": "--border-canvas",
2524
2524
  "--badge-canvas-text-font-family": "--font-sans",
2525
2525
  "--badge-canvas-text-font-size": "--font-size-md",
@@ -2570,7 +2570,7 @@
2570
2570
  "--badge-warning-shadow": "--shadow-none",
2571
2571
  "--badge-warning-blur": "--blur-none",
2572
2572
  "--badge-warning-icon-size": "--icon-size-sm",
2573
- "--badge-danger-surface": "--surface-danger",
2573
+ "--badge-danger-surface": "--surface-danger-low",
2574
2574
  "--badge-danger-text": "--text-danger",
2575
2575
  "--badge-danger-border": "--border-danger",
2576
2576
  "--badge-danger-text-font-family": "--font-sans",
@@ -2943,7 +2943,7 @@
2943
2943
  "--cornerbadge-text-font-size": "--font-size-sm",
2944
2944
  "--cornerbadge-text-font-weight": "--font-weight-medium",
2945
2945
  "--cornerbadge-text-line-height": "--line-height-none",
2946
- "--cornerbadge-brand-surface": "--surface-brand",
2946
+ "--cornerbadge-brand-surface": "--surface-brand-low",
2947
2947
  "--cornerbadge-brand-border": "--border-brand",
2948
2948
  "--cornerbadge-brand-text": "--text-brand",
2949
2949
  "--cornerbadge-accent-surface": "--surface-accent",
@@ -2957,7 +2957,7 @@
2957
2957
  "--cornerbadge-alternate-text": "--text-alternate",
2958
2958
  "--cornerbadge-canvas-surface": "--surface-canvas",
2959
2959
  "--cornerbadge-canvas-border": "--border-canvas",
2960
- "--cornerbadge-canvas-text": "--text-canvas",
2960
+ "--cornerbadge-canvas-text": "--text-secondary",
2961
2961
  "--cornerbadge-special-surface": "--surface-special",
2962
2962
  "--cornerbadge-special-border": "--border-special",
2963
2963
  "--cornerbadge-special-text": "--text-special",
@@ -2967,7 +2967,7 @@
2967
2967
  "--cornerbadge-warning-surface": "--surface-warning",
2968
2968
  "--cornerbadge-warning-border": "--border-warning",
2969
2969
  "--cornerbadge-warning-text": "--text-warning",
2970
- "--cornerbadge-danger-surface": "--surface-danger",
2970
+ "--cornerbadge-danger-surface": "--surface-danger-low",
2971
2971
  "--cornerbadge-danger-border": "--border-danger",
2972
2972
  "--cornerbadge-danger-text": "--text-danger",
2973
2973
  "--cornerbadge-info-surface": "--surface-info",
@@ -3185,7 +3185,7 @@
3185
3185
  "--input-border-width": "--border-width-1",
3186
3186
  "--input-gap": "--space-10",
3187
3187
  "--input-default-surface": "--surface-neutral-lower",
3188
- "--input-default-border": "--border-neutral",
3188
+ "--input-default-border": "--border-neutral-medium",
3189
3189
  "--input-default-text": "--text-primary",
3190
3190
  "--input-default-text-font-family": "--font-sans",
3191
3191
  "--input-default-text-font-size": "--font-size-sm",
@@ -3344,7 +3344,7 @@
3344
3344
  "--notification-warning-text-font-size": "--font-size-md",
3345
3345
  "--notification-warning-text-font-weight": "--font-weight-normal",
3346
3346
  "--notification-warning-text-line-height": "--line-height-normal",
3347
- "--notification-danger-surface": "--surface-danger",
3347
+ "--notification-danger-surface": "--surface-danger-low",
3348
3348
  "--notification-danger-action-surface": "--surface-neutral-lowest",
3349
3349
  "--notification-danger-border": "--border-danger",
3350
3350
  "--notification-danger-border-width": "--border-width-1",
@@ -3428,7 +3428,7 @@
3428
3428
  "createdAt": "2026-05-10T20:44:44.372Z",
3429
3429
  "updatedAt": "2026-08-19T22:39:32.785Z",
3430
3430
  "aliases": {
3431
- "--radiobutton-default-dot-border-color": "--border-neutral",
3431
+ "--radiobutton-default-dot-border-color": "--border-neutral-medium",
3432
3432
  "--radiobutton-default-dot-border-width": "--border-width-2",
3433
3433
  "--radiobutton-default-dot-fill": "--text-secondary",
3434
3434
  "--radiobutton-default-dot-size": "--dot-size-0",
@@ -3437,7 +3437,7 @@
3437
3437
  "--radiobutton-default-label-font-size": "--font-size-md",
3438
3438
  "--radiobutton-default-label-font-weight": "--font-weight-semibold",
3439
3439
  "--radiobutton-default-label-line-height": "--line-height-none",
3440
- "--radiobutton-hover-dot-border-color": "--border-neutral",
3440
+ "--radiobutton-hover-dot-border-color": "--border-neutral-medium",
3441
3441
  "--radiobutton-hover-dot-border-width": "--border-width-2",
3442
3442
  "--radiobutton-hover-dot-fill": "--text-secondary",
3443
3443
  "--radiobutton-hover-dot-size": "--dot-size-50",
@@ -3446,7 +3446,7 @@
3446
3446
  "--radiobutton-hover-label-font-size": "--font-size-md",
3447
3447
  "--radiobutton-hover-label-font-weight": "--font-weight-semibold",
3448
3448
  "--radiobutton-hover-label-line-height": "--line-height-none",
3449
- "--radiobutton-selected-dot-border-color": "--border-neutral",
3449
+ "--radiobutton-selected-dot-border-color": "--border-neutral-medium",
3450
3450
  "--radiobutton-selected-dot-border-width": "--border-width-2",
3451
3451
  "--radiobutton-selected-dot-fill": "--text-secondary",
3452
3452
  "--radiobutton-selected-dot-size": "--dot-size-50",
@@ -3555,7 +3555,7 @@
3555
3555
  "--segmentedcontrol-hover-tint": "--tint",
3556
3556
  "--segmentedcontrol-hover-tint-enabled": "--color-transparent",
3557
3557
  "--segmentedcontrol-bar-surface": "color-mix(in srgb, var(--surface-neutral-lowest) 75%, transparent)",
3558
- "--segmentedcontrol-bar-border": "--border-neutral",
3558
+ "--segmentedcontrol-bar-border": "--border-neutral-medium",
3559
3559
  "--segmentedcontrol-bar-border-width": "--border-width-1",
3560
3560
  "--segmentedcontrol-bar-radius": "--radius-xl",
3561
3561
  "--segmentedcontrol-bar-padding": "--space-8",
@@ -3586,7 +3586,7 @@
3586
3586
  "--segmentedcontrol-selected-text-font-weight": "--font-weight-normal",
3587
3587
  "--segmentedcontrol-selected-text-line-height": "--line-height-normal",
3588
3588
  "--segmentedcontrol-selected-icon": "--text-secondary",
3589
- "--segmentedcontrol-selected-border": "--border-brand",
3589
+ "--segmentedcontrol-selected-border": "--border-brand-medium",
3590
3590
  "--segmentedcontrol-selected-border-width": "--border-width-1",
3591
3591
  "--segmentedcontrol-selected-radius": "--radius-lg",
3592
3592
  "--segmentedcontrol-disabled-surface": "--color-transparent",
@@ -3813,7 +3813,7 @@
3813
3813
  "--tabbar-hover-tab-bottom-radius": "--radius-sm",
3814
3814
  "--tabbar-hover-indicator-width": "--border-width-2",
3815
3815
  "--tabbar-selected-text": "--text-primary",
3816
- "--tabbar-selected-border": "--color-brand-500",
3816
+ "--tabbar-selected-border": "--border-brand-medium",
3817
3817
  "--tabbar-selected-surface": "--tint-low",
3818
3818
  "--tabbar-selected-text-font-family": "--font-sans",
3819
3819
  "--tabbar-selected-text-font-size": "--font-size-md",
@@ -3883,7 +3883,7 @@
3883
3883
  "updatedAt": "2026-08-19T22:39:32.785Z",
3884
3884
  "aliases": {
3885
3885
  "--toggle-track-surface": "--surface-neutral",
3886
- "--toggle-track-border": "--border-neutral",
3886
+ "--toggle-track-border": "--border-neutral-medium",
3887
3887
  "--toggle-track-border-width": "--border-width-1",
3888
3888
  "--toggle-track-radius": "--radius-full",
3889
3889
  "--toggle-track-padding": "--space-6",
@@ -3898,7 +3898,7 @@
3898
3898
  "--toggle-hover-track-surface": "--surface-neutral-high",
3899
3899
  "--toggle-hover-thumb-surface": "--text-primary",
3900
3900
  "--toggle-on-track-surface": "--surface-brand-high",
3901
- "--toggle-on-track-border": "--border-brand",
3901
+ "--toggle-on-track-border": "--border-brand-medium",
3902
3902
  "--toggle-on-thumb-surface": "--text-primary",
3903
3903
  "--toggle-on-thumb-border": "--border-brand-strong",
3904
3904
  "--toggle-on-hover-track-surface": "--surface-brand-higher",
@@ -3934,13 +3934,13 @@
3934
3934
  "updatedAt": "2026-09-02T10:55:50.831Z",
3935
3935
  "aliases": {
3936
3936
  "--slider-single-track-surface": "--surface-neutral-lowest",
3937
- "--slider-single-track-border": "--border-neutral-subtle",
3937
+ "--slider-single-track-border": "--border-neutral-medium",
3938
3938
  "--slider-single-track-border-width": "--border-width-1",
3939
3939
  "--slider-single-track-height": "--space-8",
3940
3940
  "--slider-single-track-radius": "--radius-full",
3941
3941
  "--slider-single-fill": "--surface-brand-high",
3942
3942
  "--slider-single-thumb-surface": "--surface-neutral-highest",
3943
- "--slider-single-thumb-border": "--border-brand",
3943
+ "--slider-single-thumb-border": "--border-brand-medium",
3944
3944
  "--slider-single-thumb-border-width": "--border-width-2",
3945
3945
  "--slider-single-thumb-size": "--font-size-lg",
3946
3946
  "--slider-single-thumb-radius": "--radius-full",
@@ -3952,13 +3952,13 @@
3952
3952
  "--slider-single-disabled-thumb-surface": "--surface-neutral-lower",
3953
3953
  "--slider-single-disabled-thumb-border": "--border-neutral",
3954
3954
  "--slider-range-track-surface": "--surface-neutral-lowest",
3955
- "--slider-range-track-border": "--border-neutral-subtle",
3955
+ "--slider-range-track-border": "--border-neutral-medium",
3956
3956
  "--slider-range-track-border-width": "--border-width-1",
3957
3957
  "--slider-range-track-height": "--space-8",
3958
3958
  "--slider-range-track-radius": "--radius-full",
3959
3959
  "--slider-range-fill": "--surface-brand-high",
3960
3960
  "--slider-range-thumb-surface": "--surface-neutral-highest",
3961
- "--slider-range-thumb-border": "--border-brand",
3961
+ "--slider-range-thumb-border": "--border-brand-medium",
3962
3962
  "--slider-range-thumb-border-width": "--border-width-2",
3963
3963
  "--slider-range-thumb-size": "--font-size-lg",
3964
3964
  "--slider-range-thumb-radius": "--radius-full",
@@ -2518,7 +2518,7 @@
2518
2518
  "createdAt": "2026-05-01T08:28:00.345Z",
2519
2519
  "updatedAt": "2026-08-19T22:39:32.785Z",
2520
2520
  "aliases": {
2521
- "--badge-brand-surface": "--surface-brand",
2521
+ "--badge-brand-surface": "--surface-brand-low",
2522
2522
  "--badge-brand-text": "--text-brand",
2523
2523
  "--badge-brand-border": "--border-brand",
2524
2524
  "--badge-brand-text-font-family": "--font-sans",
@@ -2571,7 +2571,7 @@
2571
2571
  "--badge-alternate-blur": "--blur-none",
2572
2572
  "--badge-alternate-icon-size": "--icon-size-sm",
2573
2573
  "--badge-canvas-surface": "--surface-canvas",
2574
- "--badge-canvas-text": "--text-canvas",
2574
+ "--badge-canvas-text": "--text-secondary",
2575
2575
  "--badge-canvas-border": "--border-canvas",
2576
2576
  "--badge-canvas-text-font-family": "--font-sans",
2577
2577
  "--badge-canvas-text-font-size": "--font-size-md",
@@ -2622,7 +2622,7 @@
2622
2622
  "--badge-warning-shadow": "--shadow-none",
2623
2623
  "--badge-warning-blur": "--blur-none",
2624
2624
  "--badge-warning-icon-size": "--icon-size-sm",
2625
- "--badge-danger-surface": "--surface-danger",
2625
+ "--badge-danger-surface": "--surface-danger-low",
2626
2626
  "--badge-danger-text": "--text-danger",
2627
2627
  "--badge-danger-border": "--border-danger",
2628
2628
  "--badge-danger-text-font-family": "--font-sans",
@@ -2995,7 +2995,7 @@
2995
2995
  "--cornerbadge-text-font-size": "--font-size-sm",
2996
2996
  "--cornerbadge-text-font-weight": "--font-weight-medium",
2997
2997
  "--cornerbadge-text-line-height": "--line-height-none",
2998
- "--cornerbadge-brand-surface": "--surface-brand",
2998
+ "--cornerbadge-brand-surface": "--surface-brand-low",
2999
2999
  "--cornerbadge-brand-border": "--border-brand",
3000
3000
  "--cornerbadge-brand-text": "--text-brand",
3001
3001
  "--cornerbadge-accent-surface": "--surface-accent",
@@ -3009,7 +3009,7 @@
3009
3009
  "--cornerbadge-alternate-text": "--text-alternate",
3010
3010
  "--cornerbadge-canvas-surface": "--surface-canvas",
3011
3011
  "--cornerbadge-canvas-border": "--border-canvas",
3012
- "--cornerbadge-canvas-text": "--text-canvas",
3012
+ "--cornerbadge-canvas-text": "--text-secondary",
3013
3013
  "--cornerbadge-special-surface": "--surface-special",
3014
3014
  "--cornerbadge-special-border": "--border-special",
3015
3015
  "--cornerbadge-special-text": "--text-special",
@@ -3019,7 +3019,7 @@
3019
3019
  "--cornerbadge-warning-surface": "--surface-warning",
3020
3020
  "--cornerbadge-warning-border": "--border-warning",
3021
3021
  "--cornerbadge-warning-text": "--text-warning",
3022
- "--cornerbadge-danger-surface": "--surface-danger",
3022
+ "--cornerbadge-danger-surface": "--surface-danger-low",
3023
3023
  "--cornerbadge-danger-border": "--border-danger",
3024
3024
  "--cornerbadge-danger-text": "--text-danger",
3025
3025
  "--cornerbadge-info-surface": "--surface-info",
@@ -3237,7 +3237,7 @@
3237
3237
  "--input-border-width": "--border-width-1",
3238
3238
  "--input-gap": "--space-6",
3239
3239
  "--input-default-surface": "--surface-neutral-lower",
3240
- "--input-default-border": "--border-neutral",
3240
+ "--input-default-border": "--border-neutral-medium",
3241
3241
  "--input-default-text": "--text-primary",
3242
3242
  "--input-default-text-font-family": "--font-sans",
3243
3243
  "--input-default-text-font-size": "--font-size-sm",
@@ -3396,7 +3396,7 @@
3396
3396
  "--notification-warning-text-font-size": "--font-size-md",
3397
3397
  "--notification-warning-text-font-weight": "--font-weight-normal",
3398
3398
  "--notification-warning-text-line-height": "--line-height-normal",
3399
- "--notification-danger-surface": "--surface-danger",
3399
+ "--notification-danger-surface": "--surface-danger-low",
3400
3400
  "--notification-danger-action-surface": "--surface-neutral-lowest",
3401
3401
  "--notification-danger-border": "--border-danger",
3402
3402
  "--notification-danger-border-width": "--border-width-1",
@@ -3480,7 +3480,7 @@
3480
3480
  "createdAt": "2026-05-10T20:44:44.372Z",
3481
3481
  "updatedAt": "2026-08-19T22:39:32.785Z",
3482
3482
  "aliases": {
3483
- "--radiobutton-default-dot-border-color": "--border-neutral",
3483
+ "--radiobutton-default-dot-border-color": "--border-neutral-medium",
3484
3484
  "--radiobutton-default-dot-border-width": "--border-width-2",
3485
3485
  "--radiobutton-default-dot-fill": "--text-secondary",
3486
3486
  "--radiobutton-default-dot-size": "--dot-size-0",
@@ -3489,7 +3489,7 @@
3489
3489
  "--radiobutton-default-label-font-size": "--font-size-md",
3490
3490
  "--radiobutton-default-label-font-weight": "--font-weight-semibold",
3491
3491
  "--radiobutton-default-label-line-height": "--line-height-none",
3492
- "--radiobutton-hover-dot-border-color": "--border-neutral",
3492
+ "--radiobutton-hover-dot-border-color": "--border-neutral-medium",
3493
3493
  "--radiobutton-hover-dot-border-width": "--border-width-2",
3494
3494
  "--radiobutton-hover-dot-fill": "--text-secondary",
3495
3495
  "--radiobutton-hover-dot-size": "--dot-size-50",
@@ -3498,7 +3498,7 @@
3498
3498
  "--radiobutton-hover-label-font-size": "--font-size-md",
3499
3499
  "--radiobutton-hover-label-font-weight": "--font-weight-semibold",
3500
3500
  "--radiobutton-hover-label-line-height": "--line-height-none",
3501
- "--radiobutton-selected-dot-border-color": "--border-neutral",
3501
+ "--radiobutton-selected-dot-border-color": "--border-neutral-medium",
3502
3502
  "--radiobutton-selected-dot-border-width": "--border-width-2",
3503
3503
  "--radiobutton-selected-dot-fill": "--text-secondary",
3504
3504
  "--radiobutton-selected-dot-size": "--dot-size-50",
@@ -3607,7 +3607,7 @@
3607
3607
  "--segmentedcontrol-hover-tint": "--tint",
3608
3608
  "--segmentedcontrol-hover-tint-enabled": "--color-transparent",
3609
3609
  "--segmentedcontrol-bar-surface": "color-mix(in srgb, var(--surface-neutral-lowest) 75%, transparent)",
3610
- "--segmentedcontrol-bar-border": "--border-neutral",
3610
+ "--segmentedcontrol-bar-border": "--border-neutral-medium",
3611
3611
  "--segmentedcontrol-bar-border-width": "--border-width-1",
3612
3612
  "--segmentedcontrol-bar-radius": "--radius-xl",
3613
3613
  "--segmentedcontrol-bar-padding": "--space-6",
@@ -3638,7 +3638,7 @@
3638
3638
  "--segmentedcontrol-selected-text-font-weight": "--font-weight-normal",
3639
3639
  "--segmentedcontrol-selected-text-line-height": "--line-height-normal",
3640
3640
  "--segmentedcontrol-selected-icon": "--text-secondary",
3641
- "--segmentedcontrol-selected-border": "--border-brand",
3641
+ "--segmentedcontrol-selected-border": "--border-brand-medium",
3642
3642
  "--segmentedcontrol-selected-border-width": "--border-width-1",
3643
3643
  "--segmentedcontrol-selected-radius": "--radius-lg",
3644
3644
  "--segmentedcontrol-disabled-surface": "--color-transparent",
@@ -3865,7 +3865,7 @@
3865
3865
  "--tabbar-hover-tab-bottom-radius": "--radius-sm",
3866
3866
  "--tabbar-hover-indicator-width": "--border-width-2",
3867
3867
  "--tabbar-selected-text": "--text-primary",
3868
- "--tabbar-selected-border": "--color-brand-500",
3868
+ "--tabbar-selected-border": "--border-brand-medium",
3869
3869
  "--tabbar-selected-surface": "--tint-low",
3870
3870
  "--tabbar-selected-text-font-family": "--font-sans",
3871
3871
  "--tabbar-selected-text-font-size": "--font-size-md",
@@ -3935,7 +3935,7 @@
3935
3935
  "updatedAt": "2026-08-19T22:39:32.785Z",
3936
3936
  "aliases": {
3937
3937
  "--toggle-track-surface": "--surface-neutral",
3938
- "--toggle-track-border": "--border-neutral",
3938
+ "--toggle-track-border": "--border-neutral-medium",
3939
3939
  "--toggle-track-border-width": "--border-width-1",
3940
3940
  "--toggle-track-radius": "--radius-full",
3941
3941
  "--toggle-track-padding": "--space-4",
@@ -3950,7 +3950,7 @@
3950
3950
  "--toggle-hover-track-surface": "--surface-neutral-high",
3951
3951
  "--toggle-hover-thumb-surface": "--text-primary",
3952
3952
  "--toggle-on-track-surface": "--surface-brand-high",
3953
- "--toggle-on-track-border": "--border-brand",
3953
+ "--toggle-on-track-border": "--border-brand-medium",
3954
3954
  "--toggle-on-thumb-surface": "--text-primary",
3955
3955
  "--toggle-on-thumb-border": "--border-brand-strong",
3956
3956
  "--toggle-on-hover-track-surface": "--surface-brand-higher",
@@ -3986,13 +3986,13 @@
3986
3986
  "updatedAt": "2026-09-02T10:55:50.831Z",
3987
3987
  "aliases": {
3988
3988
  "--slider-single-track-surface": "--surface-neutral-lowest",
3989
- "--slider-single-track-border": "--border-neutral-subtle",
3989
+ "--slider-single-track-border": "--border-neutral-medium",
3990
3990
  "--slider-single-track-border-width": "--border-width-1",
3991
3991
  "--slider-single-track-height": "--space-8",
3992
3992
  "--slider-single-track-radius": "--radius-full",
3993
3993
  "--slider-single-fill": "--surface-brand-high",
3994
3994
  "--slider-single-thumb-surface": "--surface-neutral-highest",
3995
- "--slider-single-thumb-border": "--border-brand",
3995
+ "--slider-single-thumb-border": "--border-brand-medium",
3996
3996
  "--slider-single-thumb-border-width": "--border-width-2",
3997
3997
  "--slider-single-thumb-size": "--font-size-lg",
3998
3998
  "--slider-single-thumb-radius": "--radius-full",
@@ -4004,13 +4004,13 @@
4004
4004
  "--slider-single-disabled-thumb-surface": "--surface-neutral-lower",
4005
4005
  "--slider-single-disabled-thumb-border": "--border-neutral",
4006
4006
  "--slider-range-track-surface": "--surface-neutral-lowest",
4007
- "--slider-range-track-border": "--border-neutral-subtle",
4007
+ "--slider-range-track-border": "--border-neutral-medium",
4008
4008
  "--slider-range-track-border-width": "--border-width-1",
4009
4009
  "--slider-range-track-height": "--space-8",
4010
4010
  "--slider-range-track-radius": "--radius-full",
4011
4011
  "--slider-range-fill": "--surface-brand-high",
4012
4012
  "--slider-range-thumb-surface": "--surface-neutral-highest",
4013
- "--slider-range-thumb-border": "--border-brand",
4013
+ "--slider-range-thumb-border": "--border-brand-medium",
4014
4014
  "--slider-range-thumb-border-width": "--border-width-2",
4015
4015
  "--slider-range-thumb-size": "--font-size-lg",
4016
4016
  "--slider-range-thumb-radius": "--radius-full",
@@ -75,7 +75,7 @@
75
75
  // -secondary/-tertiary scale); `--text-brand` is the brand-family text.
76
76
  :global(:root) {
77
77
  /* Brand */
78
- --badge-brand-surface: var(--surface-brand);
78
+ --badge-brand-surface: var(--surface-brand-low);
79
79
  --badge-brand-text: var(--text-brand);
80
80
  --badge-brand-border: var(--border-brand);
81
81
  --badge-brand-text-font-family: var(--font-sans);
@@ -136,7 +136,7 @@
136
136
 
137
137
  /* Canvas */
138
138
  --badge-canvas-surface: var(--surface-canvas);
139
- --badge-canvas-text: var(--text-canvas);
139
+ --badge-canvas-text: var(--text-secondary);
140
140
  --badge-canvas-border: var(--border-canvas);
141
141
  --badge-canvas-text-font-family: var(--font-sans);
142
142
  --badge-canvas-text-font-size: var(--font-size-md);
@@ -195,7 +195,7 @@
195
195
  --badge-warning-icon-size: var(--icon-size-sm);
196
196
 
197
197
  /* Danger */
198
- --badge-danger-surface: var(--surface-danger);
198
+ --badge-danger-surface: var(--surface-danger-low);
199
199
  --badge-danger-text: var(--text-danger);
200
200
  --badge-danger-border: var(--border-danger);
201
201
  --badge-danger-text-font-family: var(--font-sans);
@@ -2,8 +2,8 @@
2
2
  import type { CatalogueEntry } from '../../editor/component-editor/scaffolding/types';
3
3
 
4
4
  export const catalogue = {
5
- description: 'A labelled action.',
6
- whenToUse: 'an action that needs a word to be unambiguous.',
5
+ description: 'A labelled trigger.',
6
+ whenToUse: 'a trigger that needs a word to be unambiguous. It runs an action or opens another page, such as View details or Create project.',
7
7
  whenNotToUse: [
8
8
  { when: 'the glyph alone is plain, and space is short.', use: 'iconbutton' },
9
9
  { when: 'the actions confirm or cancel an inline edit.', use: 'inlineeditactions' },
@@ -11,7 +11,7 @@
11
11
  constraints: [
12
12
  'One primary Button per page.',
13
13
  'A danger Button opens a Dialog to confirm before it runs.',
14
- 'A link to another page is an anchor.',
14
+ 'A link inside running text is an anchor.',
15
15
  ],
16
16
  props: {
17
17
  variant: 'one primary per page; secondary for the rest; outline for a tertiary action; danger for a destructive one.',
@@ -542,4 +542,10 @@
542
542
  margin-left: var(--space-4);
543
543
  }
544
544
  }
545
+
546
+ @media (prefers-reduced-motion: reduce) {
547
+ .button::before {
548
+ display: none;
549
+ }
550
+ }
545
551
  </style>
@@ -46,7 +46,9 @@
46
46
  </script>
47
47
 
48
48
  <div class="codesnippet {className}">
49
- <code class="code">{code}</code>
49
+ <!-- A long snippet scrolls sideways, so the keyboard needs a stop on it. -->
50
+ <!-- svelte-ignore a11y_no_noninteractive_tabindex -->
51
+ <code class="code" tabindex="0">{code}</code>
50
52
  <Tooltip text={copied ? 'Copied' : ''} open={copied} position="top">
51
53
  <button
52
54
  type="button"
@@ -118,6 +120,11 @@
118
120
  scrollbar-color: var(--codesnippet-scrollbar-thumb) transparent;
119
121
  }
120
122
 
123
+ .code:focus-visible {
124
+ outline: none;
125
+ box-shadow: 0 0 0 var(--border-width-2) var(--border-neutral-strong);
126
+ }
127
+
121
128
  .code::-webkit-scrollbar {
122
129
  height: var(--codesnippet-scrollbar-border-width);
123
130
  }
@@ -73,7 +73,7 @@
73
73
  /* Per-variant color overrides. Default = inherit the same family/level the
74
74
  inner Badge uses; author can swap to a different level (e.g. -low) to
75
75
  reduce contrast against the host surface. */
76
- --cornerbadge-brand-surface: var(--surface-brand);
76
+ --cornerbadge-brand-surface: var(--surface-brand-low);
77
77
  --cornerbadge-brand-border: var(--border-brand);
78
78
  --cornerbadge-brand-text: var(--text-brand);
79
79
  --cornerbadge-accent-surface: var(--surface-accent);
@@ -87,7 +87,7 @@
87
87
  --cornerbadge-alternate-text: var(--text-alternate);
88
88
  --cornerbadge-canvas-surface: var(--surface-canvas);
89
89
  --cornerbadge-canvas-border: var(--border-canvas);
90
- --cornerbadge-canvas-text: var(--text-canvas);
90
+ --cornerbadge-canvas-text: var(--text-secondary);
91
91
  --cornerbadge-special-surface: var(--surface-special);
92
92
  --cornerbadge-special-border: var(--border-special);
93
93
  --cornerbadge-special-text: var(--text-special);
@@ -97,7 +97,7 @@
97
97
  --cornerbadge-warning-surface: var(--surface-warning);
98
98
  --cornerbadge-warning-border: var(--border-warning);
99
99
  --cornerbadge-warning-text: var(--text-warning);
100
- --cornerbadge-danger-surface: var(--surface-danger);
100
+ --cornerbadge-danger-surface: var(--surface-danger-low);
101
101
  --cornerbadge-danger-border: var(--border-danger);
102
102
  --cornerbadge-danger-text: var(--text-danger);
103
103
  --cornerbadge-info-surface: var(--surface-info);
@@ -15,6 +15,7 @@
15
15
  import { createEventDispatcher, tick } from 'svelte';
16
16
  import type { Snippet } from 'svelte';
17
17
  import { portal } from '../internal/portal';
18
+ import { tabbables, trapTab } from '../internal/focusTrap';
18
19
  import Button from './Button.svelte';
19
20
  import type { ButtonVariant, DialogButtonSpec } from './types';
20
21
 
@@ -64,6 +65,8 @@
64
65
  children,
65
66
  }: Props = $props();
66
67
 
68
+ const titleId = $props.id();
69
+
67
70
  let effectiveConfirmVariant = $derived(confirm?.variant ?? asVariant(confirmVarValue, 'primary'));
68
71
  let effectiveCancelVariant = $derived(cancel?.variant ?? asVariant(cancelVarValue, 'outline'));
69
72
 
@@ -75,6 +78,7 @@
75
78
  let confirmButtonRef: HTMLButtonElement = $state()!;
76
79
  let cancelButtonRef: HTMLButtonElement = $state()!;
77
80
  let closeButtonRef: HTMLButtonElement = $state()!;
81
+ let dialogEl: HTMLDivElement | undefined = $state();
78
82
 
79
83
  $effect(() => {
80
84
  if (typeof document === 'undefined') return;
@@ -86,21 +90,29 @@
86
90
  return () => obs.disconnect();
87
91
  });
88
92
 
89
- // Focus the primary button when dialog opens (skip in inline mode so the editor doesn't steal focus).
93
+ // The inline preview stays out of the trap, so the editor keeps its focus.
90
94
  $effect(() => {
91
- if (open && !inline) {
92
- tick().then(() => {
93
- if (confirm && confirmButtonRef && !confirm.disabled) {
94
- confirmButtonRef.focus();
95
- } else if (cancel && cancelButtonRef) {
96
- cancelButtonRef.focus();
97
- } else if (closeButtonRef) {
98
- closeButtonRef.focus();
99
- }
100
- });
101
- }
95
+ if (!open || inline) return;
96
+ const returnTo = document.activeElement as HTMLElement | null;
97
+ tick().then(() => {
98
+ const target =
99
+ (confirm && !confirm.disabled && confirmButtonRef) ||
100
+ (cancel && cancelButtonRef) ||
101
+ closeButtonRef ||
102
+ (dialogEl && tabbables(dialogEl)[0]) ||
103
+ dialogEl;
104
+ target?.focus();
105
+ });
106
+ return () => returnTo?.focus();
102
107
  });
103
108
 
109
+ function holdTab(event: KeyboardEvent) {
110
+ if (event.key !== 'Tab' || !open || inline || !dialogEl) return;
111
+ if (trapTab(dialogEl, event)) return;
112
+ event.preventDefault();
113
+ dialogEl.focus();
114
+ }
115
+
104
116
  function handleConfirm() {
105
117
  if (confirm && !confirm.disabled) {
106
118
  confirm.onClick();
@@ -116,17 +128,34 @@
116
128
  open = false;
117
129
  }
118
130
  }
131
+
132
+ function closeOnEscape(event: KeyboardEvent) {
133
+ if (event.key !== 'Escape') return;
134
+ event.preventDefault();
135
+ handleCancel();
136
+ }
119
137
  </script>
120
138
 
139
+ <svelte:document onkeydown={holdTab} />
140
+
121
141
  {#if open}
122
142
  <!-- The fixed backdrop portals to <body> to escape transformed/isolated
123
143
  ancestors; the inline preview variant stays in flow. -->
124
144
  <div class="dialog-backdrop" class:inline use:portal={!inline}>
125
- <div class="dialog" style="width: {width}; max-width: {width};">
145
+ <div
146
+ bind:this={dialogEl}
147
+ class="dialog"
148
+ role="dialog"
149
+ aria-modal={inline ? undefined : true}
150
+ aria-labelledby={title ? titleId : undefined}
151
+ tabindex="-1"
152
+ style="width: {width}; max-width: {width};"
153
+ onkeydown={closeOnEscape}
154
+ >
126
155
  <div class="dialog-content">
127
156
  {#if title}
128
157
  <div class="dialog-header">
129
- <h3 class="dialog-title">{title}</h3>
158
+ <h3 class="dialog-title" id={titleId}>{title}</h3>
130
159
  <button
131
160
  bind:this={closeButtonRef}
132
161
  class="dialog-close"
@@ -5,7 +5,7 @@
5
5
  description: 'An action that an icon alone carries.',
6
6
  whenToUse: 'an action whose meaning is plain from the glyph, such as close, edit, or delete.',
7
7
  whenNotToUse: [
8
- { when: 'the action needs a word to be unambiguous.', use: 'button' },
8
+ { when: 'the trigger needs a word to be unambiguous.', use: 'button' },
9
9
  { when: 'the pair confirms or cancels an inline edit.', use: 'inlineeditactions' },
10
10
  ],
11
11
  props: {
@@ -144,4 +144,11 @@
144
144
  .image.force-hover img {
145
145
  transform: var(--image-zoom-enabled);
146
146
  }
147
+
148
+ @media (prefers-reduced-motion: reduce) {
149
+ .image,
150
+ img {
151
+ transition: none;
152
+ }
153
+ }
147
154
  </style>