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