zabi-components 7.0.2 → 8.0.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 (174) hide show
  1. package/README.md +46 -3
  2. package/THEMING.md +255 -15
  3. package/dist/atoms/ActionPanel.svelte +12 -7
  4. package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
  5. package/dist/atoms/Badge.svelte +93 -56
  6. package/dist/atoms/Badge.svelte.d.ts +15 -3
  7. package/dist/atoms/Button.svelte +49 -49
  8. package/dist/atoms/Button.svelte.d.ts +3 -0
  9. package/dist/atoms/Card.svelte +31 -28
  10. package/dist/atoms/Card.svelte.d.ts +5 -2
  11. package/dist/atoms/CardContent.svelte +10 -2
  12. package/dist/atoms/CardContent.svelte.d.ts +2 -0
  13. package/dist/atoms/CardFooter.svelte +10 -2
  14. package/dist/atoms/CardFooter.svelte.d.ts +2 -0
  15. package/dist/atoms/CardHeader.svelte +10 -2
  16. package/dist/atoms/CardHeader.svelte.d.ts +2 -0
  17. package/dist/atoms/Checkbox.svelte +4 -0
  18. package/dist/atoms/Checkbox.svelte.d.ts +2 -0
  19. package/dist/atoms/CodeBlock.svelte +15 -7
  20. package/dist/atoms/CodeBlock.svelte.d.ts +9 -3
  21. package/dist/atoms/ColorPicker.svelte +19 -9
  22. package/dist/atoms/ColorPicker.svelte.d.ts +3 -1
  23. package/dist/atoms/Container.svelte +2 -3
  24. package/dist/atoms/Divider.svelte +4 -4
  25. package/dist/atoms/FeatureCard.svelte +4 -3
  26. package/dist/atoms/Heading.svelte +56 -27
  27. package/dist/atoms/Heading.svelte.d.ts +17 -4
  28. package/dist/atoms/IconButton.svelte +30 -37
  29. package/dist/atoms/Input.svelte +26 -34
  30. package/dist/atoms/List.svelte +10 -2
  31. package/dist/atoms/List.svelte.d.ts +2 -0
  32. package/dist/atoms/ListItem.svelte +2 -2
  33. package/dist/atoms/ListItemLeading.svelte +4 -2
  34. package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
  35. package/dist/atoms/OptimizedImage.svelte +11 -2
  36. package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
  37. package/dist/atoms/Progress.svelte +4 -1
  38. package/dist/atoms/Progress.svelte.d.ts +2 -0
  39. package/dist/atoms/Radio.svelte +4 -0
  40. package/dist/atoms/Radio.svelte.d.ts +2 -0
  41. package/dist/atoms/Select.svelte +65 -67
  42. package/dist/atoms/Select.svelte.d.ts +4 -0
  43. package/dist/atoms/SelectionControl.svelte +5 -1
  44. package/dist/atoms/SelectionControl.svelte.d.ts +2 -0
  45. package/dist/atoms/Skeleton.svelte +5 -3
  46. package/dist/atoms/Table.svelte +2 -1
  47. package/dist/atoms/Text.svelte +34 -5
  48. package/dist/atoms/Text.svelte.d.ts +7 -1
  49. package/dist/atoms/Textarea.svelte +7 -6
  50. package/dist/atoms/ThemeToggle.svelte +17 -14
  51. package/dist/atoms/ThemeToggle.svelte.d.ts +2 -0
  52. package/dist/atoms/Toast.svelte +10 -8
  53. package/dist/atoms/Toggle.svelte +21 -13
  54. package/dist/atoms/Toggle.svelte.d.ts +7 -0
  55. package/dist/atoms/Tooltip.svelte +80 -22
  56. package/dist/atoms/Tooltip.svelte.d.ts +15 -0
  57. package/dist/components/index.d.ts +3 -1
  58. package/dist/components/index.d.ts.map +1 -1
  59. package/dist/components/organisms/index.d.ts +1 -0
  60. package/dist/components/organisms/index.d.ts.map +1 -1
  61. package/dist/components/util/cn.d.ts +8 -0
  62. package/dist/components/util/cn.d.ts.map +1 -0
  63. package/dist/components/util/ssr-safe.d.ts +4 -4
  64. package/dist/components/util/ssr-safe.d.ts.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.js +3 -6
  67. package/dist/molecules/Alert.svelte +43 -64
  68. package/dist/molecules/Alert.svelte.d.ts +7 -1
  69. package/dist/molecules/ComponentDemo.svelte +10 -2
  70. package/dist/molecules/ComponentDemo.svelte.d.ts +2 -0
  71. package/dist/molecules/ContactForm.svelte +12 -2
  72. package/dist/molecules/ContactForm.svelte.d.ts +2 -0
  73. package/dist/molecules/Dropdown.svelte +40 -11
  74. package/dist/molecules/Dropdown.svelte.d.ts +4 -0
  75. package/dist/molecules/EmptyState.svelte +2 -1
  76. package/dist/molecules/Form.svelte +25 -14
  77. package/dist/molecules/Form.svelte.d.ts +13 -5
  78. package/dist/molecules/FormField.svelte +2 -1
  79. package/dist/molecules/Header.svelte +13 -3
  80. package/dist/molecules/Header.svelte.d.ts +2 -0
  81. package/dist/molecules/ImageUpload.svelte +54 -15
  82. package/dist/molecules/ImageUpload.svelte.d.ts +16 -5
  83. package/dist/molecules/Modal.svelte +110 -31
  84. package/dist/molecules/Modal.svelte.d.ts +9 -6
  85. package/dist/molecules/NavigationMenu.svelte +15 -3
  86. package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
  87. package/dist/molecules/NavigationMenuContent.svelte +36 -38
  88. package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
  89. package/dist/molecules/NavigationMenuItem.svelte +10 -2
  90. package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
  91. package/dist/molecules/NavigationMenuLink.svelte +10 -2
  92. package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
  93. package/dist/molecules/NavigationMenuList.svelte +10 -2
  94. package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
  95. package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
  96. package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
  97. package/dist/molecules/Page.svelte +8 -2
  98. package/dist/molecules/Page.svelte.d.ts +2 -0
  99. package/dist/molecules/PropsTable.svelte +6 -3
  100. package/dist/molecules/PropsTable.svelte.d.ts +2 -0
  101. package/dist/molecules/RadioGroup.svelte +5 -1
  102. package/dist/molecules/RadioGroup.svelte.d.ts +2 -0
  103. package/dist/molecules/Section.svelte +12 -4
  104. package/dist/molecules/Section.svelte.d.ts +3 -1
  105. package/dist/molecules/SidebarBrandHeader.svelte +13 -4
  106. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +2 -0
  107. package/dist/molecules/SidebarFooter.svelte +12 -4
  108. package/dist/molecules/SidebarFooter.svelte.d.ts +2 -0
  109. package/dist/molecules/SidebarNavSection.svelte +12 -4
  110. package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
  111. package/dist/molecules/SlideUp.svelte +85 -21
  112. package/dist/molecules/SlideUp.svelte.d.ts +5 -4
  113. package/dist/molecules/Tabs.svelte +25 -19
  114. package/dist/molecules/Tabs.svelte.d.ts +8 -4
  115. package/dist/molecules/Toaster.svelte +3 -2
  116. package/dist/molecules/ToasterToast.svelte +41 -10
  117. package/dist/molecules/ToasterToast.svelte.d.ts +2 -0
  118. package/dist/organisms/SidebarAccountPanel.svelte +4 -0
  119. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +2 -0
  120. package/dist/organisms/SidebarNavigation.svelte +102 -59
  121. package/dist/organisms/SidebarNavigation.svelte.d.ts +2 -0
  122. package/dist/organisms/SidebarPanel.svelte +19 -11
  123. package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
  124. package/dist/organisms/SidebarShell.svelte +112 -0
  125. package/dist/organisms/SidebarShell.svelte.d.ts +52 -0
  126. package/dist/organisms/TopNavbar.svelte +88 -17
  127. package/dist/organisms/TopNavbar.svelte.d.ts +2 -0
  128. package/dist/organisms/index.d.ts +1 -0
  129. package/dist/organisms/index.js +1 -0
  130. package/dist/routes/lib/variant-utils.d.ts +26 -0
  131. package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
  132. package/dist/types/events.js +1 -0
  133. package/dist/types/index.js +3 -0
  134. package/dist/util/cn.d.ts +7 -0
  135. package/dist/util/cn.js +48 -0
  136. package/dist/util/ssr-safe.d.ts +4 -4
  137. package/dist/zabi-components-colors.css +2 -2
  138. package/dist/zabi-components-theme-dark-only.css +139 -92
  139. package/dist/zabi-components-theme-dark.css +139 -92
  140. package/dist/zabi-components-theme-only.css +268 -122
  141. package/dist/zabi-components-theme.css +268 -122
  142. package/dist/zabi-components.css +831 -883
  143. package/docs/lucide-icons.md +3 -1
  144. package/package.json +19 -24
  145. package/dist/lib/layout-width-tokens.d.ts +0 -17
  146. package/dist/lib/layout-width-tokens.d.ts.map +0 -1
  147. package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
  148. package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
  149. package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
  150. package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
  151. package/dist/lib/showcase/component-docs/List.d.ts +0 -3
  152. package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
  153. package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
  154. package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
  155. package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
  156. package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
  157. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
  158. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
  159. package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
  160. package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
  161. package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
  162. package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
  163. package/dist/lib/showcase/component-docs/index.d.ts +0 -4
  164. package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
  165. package/dist/lib/showcase/components-catalog.d.ts +0 -3
  166. package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
  167. package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
  168. package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
  169. package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
  170. package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
  171. package/dist/routes/lib/focus-utils.d.ts +0 -12
  172. package/dist/routes/lib/focus-utils.ts +0 -110
  173. package/dist/routes/lib/ssr-safe.ts +0 -58
  174. package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
@@ -29,17 +29,17 @@
29
29
  /* Typography - Nunito Sans font family */
30
30
  --font-family-sans: 'Nunito Sans', ui-sans-serif, system-ui, sans-serif
31
31
  /* Brand Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
32
- --zabi-brand-50: #f7faff
33
- --zabi-brand-100: #edf2fb
34
- --zabi-brand-200: #dfe7fb
35
- --zabi-brand-300: #ccdbfd
36
- --zabi-brand-400: #abc4ff
37
- --zabi-brand-500: #8fa8ff
38
- --zabi-brand-600: #6e84fa
39
- --zabi-brand-700: #5366e2
40
- --zabi-brand-800: #3f4fc0
41
- --zabi-brand-900: #2f3c99
42
- --zabi-brand-950: #1f2866
32
+ --zabi-brand-50: #f4f6ff
33
+ --zabi-brand-100: #e9eeff
34
+ --zabi-brand-200: #d3dcff
35
+ --zabi-brand-300: #b5c6ff
36
+ --zabi-brand-400: #92a9ff
37
+ --zabi-brand-500: #6d87f1
38
+ --zabi-brand-600: #4f68da
39
+ --zabi-brand-700: #3c52ba
40
+ --zabi-brand-800: #2b3e95
41
+ --zabi-brand-900: #1c2c6d
42
+ --zabi-brand-950: #111d49
43
43
  --color-brand-50: var(--zabi-brand-50)
44
44
  --color-brand-100: var(--zabi-brand-100)
45
45
  --color-brand-200: var(--zabi-brand-200)
@@ -52,17 +52,17 @@
52
52
  --color-brand-900: var(--zabi-brand-900)
53
53
  --color-brand-950: var(--zabi-brand-950)
54
54
  /* Citron Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
55
- --zabi-citron-50: #f9faeb
56
- --zabi-citron-100: #f1f5cf
57
- --zabi-citron-200: #e4ecaa
58
- --zabi-citron-300: #d5e184
59
- --zabi-citron-400: #c7d460
60
- --zabi-citron-500: #bbbe64
61
- --zabi-citron-600: #a3a852
62
- --zabi-citron-700: #848a43
63
- --zabi-citron-800: #666c35
64
- --zabi-citron-900: #4d5229
65
- --zabi-citron-950: #323518
55
+ --zabi-citron-50: #f6f7ef
56
+ --zabi-citron-100: #edefdf
57
+ --zabi-citron-200: #dcdfbf
58
+ --zabi-citron-300: #c5ca95
59
+ --zabi-citron-400: #aab063
60
+ --zabi-citron-500: #8c9027
61
+ --zabi-citron-600: #707400
62
+ --zabi-citron-700: #5a5d00
63
+ --zabi-citron-800: #454700
64
+ --zabi-citron-900: #313200
65
+ --zabi-citron-950: #202100
66
66
  --color-citron-50: var(--zabi-citron-50)
67
67
  --color-citron-100: var(--zabi-citron-100)
68
68
  --color-citron-200: var(--zabi-citron-200)
@@ -75,17 +75,17 @@
75
75
  --color-citron-900: var(--zabi-citron-900)
76
76
  --color-citron-950: var(--zabi-citron-950)
77
77
  /* Pine Color Scale — physical ramp + semantic aliases (mirror pattern matches --zabi-base-* / --color-base-*) */
78
- --zabi-pine-50: #e9f6f2
79
- --zabi-pine-100: #d2ece4
80
- --zabi-pine-200: #a7d9c9
81
- --zabi-pine-300: #78c4ad
82
- --zabi-pine-400: #49ad91
83
- --zabi-pine-500: #0c5d43
84
- --zabi-pine-600: #0a513a
85
- --zabi-pine-700: #084532
86
- --zabi-pine-800: #063a2a
87
- --zabi-pine-900: #04231a
88
- --zabi-pine-950: #02160f
78
+ --zabi-pine-50: #f0f8f5
79
+ --zabi-pine-100: #e2f1eb
80
+ --zabi-pine-200: #c5e4d7
81
+ --zabi-pine-300: #9fd1bd
82
+ --zabi-pine-400: #70ba9e
83
+ --zabi-pine-500: #399c7a
84
+ --zabi-pine-600: #00805e
85
+ --zabi-pine-700: #00674a
86
+ --zabi-pine-800: #004f37
87
+ --zabi-pine-900: #003826
88
+ --zabi-pine-950: #002518
89
89
  --color-pine-50: var(--zabi-pine-50)
90
90
  --color-pine-100: var(--zabi-pine-100)
91
91
  --color-pine-200: var(--zabi-pine-200)
@@ -98,17 +98,17 @@
98
98
  --color-pine-900: var(--zabi-pine-900)
99
99
  --color-pine-950: var(--zabi-pine-950)
100
100
  /* Iris Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
101
- --zabi-iris-50: #f4f4fa
102
- --zabi-iris-100: #e9e9f7
103
- --zabi-iris-200: #d6d6f0
104
- --zabi-iris-300: #bdbde6
105
- --zabi-iris-400: #a3a3d8
106
- --zabi-iris-500: #6969b3
107
- --zabi-iris-600: #58589e
108
- --zabi-iris-700: #474788
109
- --zabi-iris-800: #38386f
110
- --zabi-iris-900: #2a2a56
111
- --zabi-iris-950: #1b1b37
101
+ --zabi-iris-50: #f6f6fd
102
+ --zabi-iris-100: #ecedfb
103
+ --zabi-iris-200: #dadbf6
104
+ --zabi-iris-300: #c1c4ef
105
+ --zabi-iris-400: #a5a7e2
106
+ --zabi-iris-500: #8486cd
107
+ --zabi-iris-600: #6969b4
108
+ --zabi-iris-700: #535397
109
+ --zabi-iris-800: #3f3f78
110
+ --zabi-iris-900: #2c2c58
111
+ --zabi-iris-950: #1d1d3a
112
112
  --color-iris-50: var(--zabi-iris-50)
113
113
  --color-iris-100: var(--zabi-iris-100)
114
114
  --color-iris-200: var(--zabi-iris-200)
@@ -121,17 +121,17 @@
121
121
  --color-iris-900: var(--zabi-iris-900)
122
122
  --color-iris-950: var(--zabi-iris-950)
123
123
  /* Warning Color Scale — physical ramp + semantic aliases (Tailwind amber) */
124
- --zabi-warning-50: #fffbeb
125
- --zabi-warning-100: #fef3c7
126
- --zabi-warning-200: #fde68a
127
- --zabi-warning-300: #fcd34d
128
- --zabi-warning-400: #fbbf24
129
- --zabi-warning-500: #f59e0b
130
- --zabi-warning-600: #d97706
131
- --zabi-warning-700: #b45309
132
- --zabi-warning-800: #92400e
133
- --zabi-warning-900: #78350f
134
- --zabi-warning-950: #451a03
124
+ --zabi-warning-50: #fbf6ed
125
+ --zabi-warning-100: #f7ecda
126
+ --zabi-warning-200: #f1d9b6
127
+ --zabi-warning-300: #e8bf87
128
+ --zabi-warning-400: #db9e4c
129
+ --zabi-warning-500: #c17b00
130
+ --zabi-warning-600: #9e6000
131
+ --zabi-warning-700: #824c00
132
+ --zabi-warning-800: #663800
133
+ --zabi-warning-900: #4b2600
134
+ --zabi-warning-950: #341800
135
135
  --color-warning-50: var(--zabi-warning-50)
136
136
  --color-warning-100: var(--zabi-warning-100)
137
137
  --color-warning-200: var(--zabi-warning-200)
@@ -144,17 +144,17 @@
144
144
  --color-warning-900: var(--zabi-warning-900)
145
145
  --color-warning-950: var(--zabi-warning-950)
146
146
  /* Error Color Scale — physical ramp + semantic aliases (Tailwind red) */
147
- --zabi-error-50: #fef2f2
148
- --zabi-error-100: #fee2e2
149
- --zabi-error-200: #fecaca
150
- --zabi-error-300: #fca5a5
151
- --zabi-error-400: #f87171
152
- --zabi-error-500: #ef4444
153
- --zabi-error-600: #dc2626
154
- --zabi-error-700: #b91c1c
155
- --zabi-error-800: #991b1b
156
- --zabi-error-900: #7f1d1d
157
- --zabi-error-950: #450a0a
147
+ --zabi-error-50: #fff4f3
148
+ --zabi-error-100: #ffe9e6
149
+ --zabi-error-200: #ffd2cd
150
+ --zabi-error-300: #ffb2ab
151
+ --zabi-error-400: #ff877d
152
+ --zabi-error-500: #ed564e
153
+ --zabi-error-600: #d22828
154
+ --zabi-error-700: #b20912
155
+ --zabi-error-800: #8c0006
156
+ --zabi-error-900: #660002
157
+ --zabi-error-950: #460202
158
158
  --color-error-50: var(--zabi-error-50)
159
159
  --color-error-100: var(--zabi-error-100)
160
160
  --color-error-200: var(--zabi-error-200)
@@ -189,47 +189,82 @@
189
189
  --color-base-925: var(--zabi-base-925)
190
190
  --color-base-950: var(--zabi-base-950)
191
191
  /* Background Colors */
192
- --color-background: var(--color-base-100)
192
+ /* Surface elevation — four semantic levels, lowest → highest.
193
+ * base: page/app shell Ā· raised: cards, panels, sidebars Ā· elevated: nested cards, hover/active fills
194
+ * overlay: modals, sheets, menus, popovers, toasts. Light mode keeps white surfaces + shadows;
195
+ * dark mode (see .dark) steps each level up in OKLCH lightness because shadows don't read on dark.
196
+ * Keep this block BELOW the "Background Colors" marker: scripts/sync-theme-tokens.js regenerates
197
+ * everything between the base-scale aliases and that marker. */
198
+ --color-surface-base: var(--color-base-100)
199
+ --color-surface-raised: #ffffff
200
+ --color-surface-elevated: var(--color-base-50)
201
+ --color-surface-overlay: #ffffff
202
+ /* Hover/active fill for rows and icon buttons inside an overlay (must read above the overlay) */
203
+ --color-surface-overlay-hover: var(--color-base-100)
204
+ /* 1px edge for overlays: invisible in light (shadow carries elevation), visible in dark */
205
+ --color-border-overlay: transparent
206
+ --color-background: var(--color-surface-base)
193
207
  --color-background-secondary: var(--color-base-50)
194
208
  --color-background-tertiary: var(--color-base-100)
195
209
  /* Page Colors */
196
210
  --color-page: var(--color-base-100)
197
211
  --color-page-secondary: var(--color-base-200)
198
- /* Card Colors */
199
- --color-card: #ffffff
212
+ /* Card Colors — aliases of the surface levels (kept for compatibility) */
213
+ --color-card: var(--color-surface-raised)
200
214
  --color-card-hover: var(--color-base-100)
201
215
  --color-card-active: var(--color-base-100)
202
- --color-card-elevated: #ffffff
203
- /* Surfaces — layered UI (ascending number = higher layer / more contrast against page) */
204
- --color-surface-1: #ffffff
205
- --color-surface-2: var(--color-base-50)
216
+ --color-card-elevated: var(--color-surface-overlay)
217
+ /* Surfaces — numbered aliases (kept for compatibility; prefer surface-base/raised/elevated/overlay) */
218
+ --color-surface-1: var(--color-surface-raised)
219
+ --color-surface-2: var(--color-surface-elevated)
206
220
  --color-surface-3: var(--color-base-75)
207
221
  --color-surface-4: var(--color-base-100)
222
+ /* Control track — the unselected rail of a Toggle or switch. A real token
223
+ * rather than a raw ramp step, so the hover/active direction is defined once
224
+ * and inverts correctly with the theme. */
225
+ --color-control-track: var(--color-base-400)
226
+ --color-control-track-hover: var(--color-base-450)
227
+ --color-control-track-active: var(--color-base-500)
228
+ /* Interaction fills — surface-relative on purpose.
229
+ * A hard-coded ramp step (e.g. base-100) can coincide exactly with the
230
+ * surface it sits on, which is how ghost hover became invisible: in dark
231
+ * mode --color-base-100 IS --color-surface-base. An alpha tint is always
232
+ * one step away from whatever is underneath it. */
233
+ --color-surface-hover: rgba(9, 9, 11, 0.06)
234
+ --color-surface-active: rgba(9, 9, 11, 0.11)
208
235
  /* Overlay Colors */
209
236
  --color-overlay: rgba(0, 0, 0, 0.5)
210
- /* Input Colors */
211
- --color-input: var(--color-base-250)
237
+ /* Input Colors
238
+ * The field is a RAISED surface, not a grey well — a grey fill on a grey
239
+ * page reads as disabled. The disabled state is the only grey field. */
240
+ --color-input: var(--color-surface-raised)
212
241
  --color-input-border: var(--color-base-350)
213
- --color-input-hover: var(--color-base-300)
214
- --color-input-focus: var(--color-base-300)
242
+ --color-input-hover: var(--color-base-150)
243
+ --color-input-focus: var(--color-surface-raised)
215
244
  --color-input-disabled: var(--color-base-100)
216
245
  /* Text Colors */
217
246
  --color-headline: var(--color-base-900)
218
247
  --color-body: var(--color-base-800)
219
248
  --color-description: var(--color-base-600)
220
- --color-caption: var(--color-base-500)
221
- --color-input-placeholder: var(--color-base-400)
249
+ --color-caption: var(--color-base-550)
250
+ /* ≄ 4.5:1 on every surface level (base-500 was 4.40 on surface-base) */
251
+ --color-input-placeholder: var(--color-base-500)
222
252
  --color-label: var(--color-base-700)
223
- --color-link: var(--color-brand-600)
224
- --color-link-hover: var(--color-brand-700)
253
+ /* brand-600 clears 4.5:1 on a card but only 4.42:1 on the page surface, so
254
+ * links sit one step darker. */
255
+ --color-link: var(--color-brand-700)
256
+ --color-link-hover: var(--color-brand-800)
225
257
  /* Navigation menu item — menubar triggers, menu links, inline/sidebar nav rows */
226
258
  --color-nav-menu-item: var(--color-body)
227
259
  --color-nav-menu-item-hover: var(--color-headline)
228
260
  --color-nav-menu-item-active: var(--color-link)
229
- --color-nav-menu-hover: var(--color-base-100)
261
+ /* Surface-relative on purpose: base-100 IS surface-base in both themes,
262
+ * so the old value made sidebar row hover do nothing at all. */
263
+ --color-nav-menu-hover: var(--color-surface-hover)
230
264
  --color-nav-menu-active: var(--color-action-primary-subtle)
265
+ --color-nav-menu-active-hover: var(--color-action-primary-subtle-hover)
231
266
  --color-nav-menu-focus: var(--color-brand-500)
232
- --color-success-text: var(--color-success)
267
+ --color-success-text: var(--color-pine-700)
233
268
  --color-warning-text: var(--color-warning-700)
234
269
  --color-neutral-text: var(--color-base-700)
235
270
  --color-energetic-text: var(--color-citron-700)
@@ -259,65 +294,125 @@
259
294
  --color-secondary-weak: var(--color-base-700)
260
295
  --color-secondary-medium: var(--color-base-800)
261
296
  --color-secondary-strong: var(--color-base-900)
297
+ /* ----------------------------------------------------------------
298
+ * SEMANTIC FAMILIES
299
+ * Every family resolves to the SAME step on the shared lightness curve, so
300
+ * success / warning / error / info / energetic / neutral read as one family.
301
+ * See tokens/chromatic-scales.js; enforced by check-ramp-lightness.js.
302
+ *
303
+ * <family> step 600 solid fill (>= 4.5:1 with white)
304
+ * <family>-weak step 700 pressed / emphasis
305
+ * <family>-medium step 800 strongest fill
306
+ * <family>-strong step 900 darkest
307
+ * <family>-subtle step 100 tinted fill (badges, alerts)
308
+ * <family>-border step 200 tinted edge
309
+ * <family>-text step 700 text on a subtle fill or a page surface
310
+ *
311
+ * Warning, error and energetic previously sat at step 500 — the mirror's
312
+ * fixed point — so they did not invert between themes at all, while success
313
+ * and info did. That is why a solid warning badge was 2.15:1 in light mode
314
+ * and fine in dark.
315
+ * ---------------------------------------------------------------- */
262
316
  /* Success Colors */
263
317
  --color-success: var(--color-pine-600)
264
318
  --color-success-weak: var(--color-pine-700)
265
319
  --color-success-medium: var(--color-pine-800)
266
320
  --color-success-strong: var(--color-pine-900)
321
+ --color-success-subtle: var(--color-pine-100)
322
+ --color-success-border: var(--color-pine-200)
267
323
  /* Warning Colors */
268
- --color-warning: var(--color-warning-500)
269
- --color-warning-weak: var(--color-warning-600)
270
- --color-warning-medium: var(--color-warning-400)
271
- --color-warning-strong: var(--color-warning-300)
324
+ --color-warning: var(--color-warning-600)
325
+ --color-warning-weak: var(--color-warning-700)
326
+ --color-warning-medium: var(--color-warning-800)
327
+ --color-warning-strong: var(--color-warning-900)
328
+ --color-warning-subtle: var(--color-warning-100)
329
+ --color-warning-border: var(--color-warning-200)
272
330
  /* Error Colors */
273
- --color-error: var(--color-error-500)
274
- --color-error-weak: var(--color-error-600)
275
- --color-error-medium: var(--color-error-400)
276
- --color-error-strong: var(--color-error-300)
331
+ --color-error: var(--color-error-600)
332
+ --color-error-weak: var(--color-error-700)
333
+ --color-error-medium: var(--color-error-800)
334
+ --color-error-strong: var(--color-error-900)
335
+ --color-error-subtle: var(--color-error-100)
336
+ --color-error-border: var(--color-error-200)
277
337
  /* Energetic Colors (Citron) */
278
- --color-energetic: var(--color-citron-500)
279
- --color-energetic-weak: var(--color-citron-600)
280
- --color-energetic-medium: var(--color-citron-400)
281
- --color-energetic-strong: var(--color-citron-300)
282
- /* Neutral Colors */
283
- --color-neutral: var(--color-base-600)
284
- --color-neutral-weak: var(--color-base-700)
285
- --color-neutral-medium: var(--color-base-800)
338
+ --color-energetic: var(--color-citron-600)
339
+ --color-energetic-weak: var(--color-citron-700)
340
+ --color-energetic-medium: var(--color-citron-800)
341
+ --color-energetic-strong: var(--color-citron-900)
342
+ --color-energetic-subtle: var(--color-citron-100)
343
+ --color-energetic-border: var(--color-citron-200)
344
+ /* Neutral Colors
345
+ * The base ramp is wider than the chromatic ones on purpose (it also drives
346
+ * text, borders and surfaces), so neutral cannot sit on exactly the same
347
+ * step. base-550 is the closest match to the chromatic 600s that still
348
+ * clears AA; .dark pins base-600, because base-500 is the mirror's fixed
349
+ * point and would not invert at all. */
350
+ --color-neutral: var(--color-base-550)
351
+ --color-neutral-weak: var(--color-base-600)
352
+ --color-neutral-medium: var(--color-base-700)
286
353
  --color-neutral-strong: var(--color-base-900)
354
+ /* base-200, not base-100: base-100 IS surface-base, which made a neutral
355
+ * badge measure 1.00:1 against the page and read as bare text. */
356
+ --color-neutral-subtle: var(--color-base-200)
357
+ --color-neutral-border: var(--color-base-200)
287
358
  /* Info Colors */
288
359
  --color-info: var(--color-iris-600)
289
360
  --color-info-weak: var(--color-iris-700)
290
361
  --color-info-medium: var(--color-iris-800)
291
362
  --color-info-strong: var(--color-iris-900)
292
363
  --color-info-active: var(--color-iris-400)
364
+ --color-info-subtle: var(--color-iris-100)
365
+ --color-info-border: var(--color-iris-200)
293
366
  /* Text alias */
294
- --color-info-text: var(--color-info)
367
+ --color-info-text: var(--color-iris-700)
295
368
  /* ========================================
296
369
  ACTION COLORS - For interactive elements (buttons, links, etc.)
297
370
  ======================================== */
298
- /* Primary Actions - Used by bg-action-primary utility class */
299
- /* šŸŽÆ TO CHANGE bg-action-primary COLOR: Edit the values below */
300
- --color-action-primary: var(--color-brand-950)
301
- --color-action-primary-hover: var(--color-brand-900)
302
- --color-action-primary-active: var(--color-brand-400)
303
- --color-action-primary-disabled: var(--color-brand-500)
371
+ /* Primary Actions - Used by bg-action-primary utility class
372
+ * šŸŽÆ TO CHANGE bg-action-primary COLOR: edit --color-action-primary below.
373
+ *
374
+ * Primary is brand-600 — the product actually looks like its brand. Hover
375
+ * and active go one and two steps DARKER in light mode; the .dark mirror
376
+ * flips that to lighter automatically, so "more pressed" always means "more
377
+ * contrast against the page" in both themes. Never point active at a step on
378
+ * the far side of the ramp: active used to be brand-400 against a brand-50
379
+ * label, which is 1.66:1 — the label vanished while the button was held. */
380
+ --color-action-primary: var(--color-brand-600)
381
+ --color-action-primary-hover: var(--color-brand-700)
382
+ --color-action-primary-active: var(--color-brand-800)
304
383
  --color-action-primary-subtle: var(--color-brand-100)
305
384
  --color-action-primary-subtle-hover: var(--color-brand-200)
306
- --color-action-primary-text: var(--color-brand-50)
307
- /* Secondary Actions - Used by bg-action-secondary utility class */
308
- --color-action-secondary: color-mix(in srgb, var(--color-brand-800) 10%, transparent)
309
- --color-action-secondary-hover: color-mix(in srgb, var(--color-brand-800) 20%, transparent)
310
- --color-action-secondary-active: var(--color-brand-400)
311
- --color-action-secondary-disabled: var(--color-brand-500)
312
- --color-action-secondary-subtle: var(--color-brand-600)
313
- --color-action-secondary-subtle-hover: var(--color-brand-700)
314
- /* Danger Actions - Used by bg-action-danger utility class */
315
- --color-action-danger: #dc2626
316
- --color-action-danger-hover: #b91c1c
317
- --color-action-danger-active: #991b1b
318
- --color-action-danger-disabled: #fca5a5
319
- --color-action-danger-subtle: #fef2f2
320
- --color-action-danger-subtle-hover: #fee2e2
385
+ /* Pinned rather than aliased to brand-50: the ramp's lightest tint lands at
386
+ * exactly 4.50:1 on brand-600 — passing, but with no margin. Pure white
387
+ * gives 4.86:1. The .dark block pins the inverse. */
388
+ --color-action-primary-text: #ffffff
389
+ /* Secondary Actions - Used by bg-action-secondary utility class
390
+ * A neutral alpha tint: reads as a real button on any surface level, and
391
+ * cannot collide with the background the way a fixed ramp step can. The old
392
+ * 10%-brand wash was so pale it barely registered as a control. */
393
+ --color-action-secondary: rgba(9, 9, 11, 0.07)
394
+ --color-action-secondary-hover: rgba(9, 9, 11, 0.12)
395
+ --color-action-secondary-active: rgba(9, 9, 11, 0.17)
396
+ --color-action-secondary-subtle: var(--color-base-100)
397
+ --color-action-secondary-subtle-hover: var(--color-base-200)
398
+ --color-action-secondary-text: var(--color-headline)
399
+ /* Disabled Actions - shared by every variant.
400
+ * Disabled must be the QUIETEST state, never a brighter colour than the
401
+ * enabled secondary. It used to be brand-500 plus opacity-50, which made a
402
+ * disabled primary lighter and more colourful than an enabled secondary. */
403
+ --color-action-disabled: var(--color-base-200)
404
+ --color-action-disabled-text: var(--color-base-500)
405
+ --color-action-disabled-border: var(--color-base-250)
406
+ /* Danger Actions - Used by bg-action-danger utility class.
407
+ * Same ramp step as every other family, so the destructive action no longer
408
+ * out-shouts the primary one. The bright red is spent on hover, where the
409
+ * user is already committing. */
410
+ --color-action-danger: var(--color-error-600)
411
+ --color-action-danger-hover: var(--color-error-700)
412
+ --color-action-danger-active: var(--color-error-800)
413
+ --color-action-danger-subtle: var(--color-error-100)
414
+ --color-action-danger-subtle-hover: var(--color-error-200)
415
+ --color-action-danger-text: var(--color-error-50)
321
416
  /* Shadow Colors */
322
417
  --shadow-color: 0 0 0
323
418
  --shadow-opacity: 0.1
@@ -332,11 +427,62 @@
332
427
  --spacing-lg: 1.5rem
333
428
  --spacing-xl: 2rem
334
429
  --spacing-2xl: 3rem
335
- /* Border Radius */
430
+ /*
431
+ * Sizing names for w-* / min-w-* / max-w-*.
432
+ * Tailwind v4 resolves these utilities as --max-width-* (or --width-* / --min-width-*) → --spacing-* → --container-*.
433
+ * Because the named --spacing-xs…2xl tokens above exist, `max-w-lg` would otherwise resolve to 1.5rem
434
+ * instead of Tailwind's 32rem container size. These keys are checked before --spacing-*, so they restore
435
+ * the standard container scale while `p-lg`, `gap-md`, etc. keep using the spacing tokens.
436
+ */
437
+ --max-width-xs: 20rem
438
+ --max-width-sm: 24rem
439
+ --max-width-md: 28rem
440
+ --max-width-lg: 32rem
441
+ --max-width-xl: 36rem
442
+ --max-width-2xl: 42rem
443
+ --width-xs: 20rem
444
+ --width-sm: 24rem
445
+ --width-md: 28rem
446
+ --width-lg: 32rem
447
+ --width-xl: 36rem
448
+ --width-2xl: 42rem
449
+ --min-width-xs: 20rem
450
+ --min-width-sm: 24rem
451
+ --min-width-md: 28rem
452
+ --min-width-lg: 32rem
453
+ --min-width-xl: 36rem
454
+ --min-width-2xl: 42rem
455
+ /* ----------------------------------------------------------------
456
+ * BORDER RADIUS — four values, chosen by ROLE, never by size.
457
+ * A large button is a bigger box with the same corner as a small one.
458
+ * Enforced by scripts/check-control-geometry.js.
459
+ * ---------------------------------------------------------------- */
460
+ --radius-control: 0.5rem
461
+ /* 8px — buttons, inputs, selects, toggles */
462
+ --radius-container: 0.75rem
463
+ /* 12px — cards, alerts, panels, list items */
464
+ --radius-overlay: 1rem
465
+ /* 16px — modals, sheets, menus, popovers */
466
+ --radius-pill: 9999px
467
+ /* badges, avatars, status dots */
468
+ /* Legacy t-shirt radii. Kept so existing consumer overrides keep working;
469
+ * components must not use them. */
336
470
  --radius-sm: 0.25rem
337
471
  --radius-md: 0.375rem
338
472
  --radius-lg: 0.5rem
339
473
  --radius-xl: 0.75rem
474
+ /* ----------------------------------------------------------------
475
+ * CONTROL GEOMETRY — one height scale shared by every form control, so a
476
+ * Button, Input, Select and IconButton of the same size are the same height
477
+ * and line up in a row. They previously rendered at 40/48/64, 38/46/50 and
478
+ * 32/40/48 respectively. Grid-aligned (8px).
479
+ * ---------------------------------------------------------------- */
480
+ --control-height-sm: 2rem
481
+ /* 32px */
482
+ --control-height-md: 2.5rem
483
+ /* 40px */
484
+ --control-height-lg: 3rem
485
+ /* 48px */
340
486
  /* Z-index */
341
487
  --z-dropdown: 1000
342
488
  --z-sticky: 1020