zabi-components 7.0.1 → 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 +89 -57
  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 +3 -437
  138. package/dist/zabi-components-theme-dark-only.css +223 -103
  139. package/dist/zabi-components-theme-dark.css +223 -103
  140. package/dist/zabi-components-theme-only.css +347 -107
  141. package/dist/zabi-components-theme.css +347 -107
  142. package/dist/zabi-components.css +953 -843
  143. package/docs/lucide-icons.md +3 -1
  144. package/package.json +20 -25
  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
@@ -28,54 +28,144 @@
28
28
  --zabi-base-950: #09090b
29
29
  /* Typography - Nunito Sans font family */
30
30
  --font-family-sans: 'Nunito Sans', ui-sans-serif, system-ui, sans-serif
31
- /* Brand Color Scale */
32
- --color-brand-50: #f7faff
33
- --color-brand-100: #edf2fb
34
- --color-brand-200: #dfe7fb
35
- --color-brand-300: #ccdbfd
36
- --color-brand-400: #abc4ff
37
- --color-brand-500: #8fa8ff
38
- --color-brand-600: #6e84fa
39
- --color-brand-700: #5366e2
40
- --color-brand-800: #3f4fc0
41
- --color-brand-900: #2f3c99
42
- --color-brand-950: #1f2866
43
- /* Citron Color Scale */
44
- --color-citron-50: #f9faeb
45
- --color-citron-100: #f1f5cf
46
- --color-citron-200: #e4ecaa
47
- --color-citron-300: #d5e184
48
- --color-citron-400: #c7d460
49
- --color-citron-500: #bbbe64
50
- --color-citron-600: #a3a852
51
- --color-citron-700: #848a43
52
- --color-citron-800: #666c35
53
- --color-citron-900: #4d5229
54
- --color-citron-950: #323518
55
- /* Pine Color Scale */
56
- --color-pine-50: #e9f6f2
57
- --color-pine-100: #d2ece4
58
- --color-pine-200: #a7d9c9
59
- --color-pine-300: #78c4ad
60
- --color-pine-400: #49ad91
61
- --color-pine-500: #0C5D43
62
- --color-pine-600: #0a513a
63
- --color-pine-700: #084532
64
- --color-pine-800: #063a2a
65
- --color-pine-900: #04231a
66
- --color-pine-950: #02160f
67
- /* Iris Color Scale */
68
- --color-iris-50: #f4f4fa
69
- --color-iris-100: #e9e9f7
70
- --color-iris-200: #d6d6f0
71
- --color-iris-300: #bdbde6
72
- --color-iris-400: #a3a3d8
73
- --color-iris-500: #6969B3
74
- --color-iris-600: #58589e
75
- --color-iris-700: #474788
76
- --color-iris-800: #38386f
77
- --color-iris-900: #2a2a56
78
- --color-iris-950: #1b1b37
31
+ /* Brand Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
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
+ --color-brand-50: var(--zabi-brand-50)
44
+ --color-brand-100: var(--zabi-brand-100)
45
+ --color-brand-200: var(--zabi-brand-200)
46
+ --color-brand-300: var(--zabi-brand-300)
47
+ --color-brand-400: var(--zabi-brand-400)
48
+ --color-brand-500: var(--zabi-brand-500)
49
+ --color-brand-600: var(--zabi-brand-600)
50
+ --color-brand-700: var(--zabi-brand-700)
51
+ --color-brand-800: var(--zabi-brand-800)
52
+ --color-brand-900: var(--zabi-brand-900)
53
+ --color-brand-950: var(--zabi-brand-950)
54
+ /* Citron Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
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
+ --color-citron-50: var(--zabi-citron-50)
67
+ --color-citron-100: var(--zabi-citron-100)
68
+ --color-citron-200: var(--zabi-citron-200)
69
+ --color-citron-300: var(--zabi-citron-300)
70
+ --color-citron-400: var(--zabi-citron-400)
71
+ --color-citron-500: var(--zabi-citron-500)
72
+ --color-citron-600: var(--zabi-citron-600)
73
+ --color-citron-700: var(--zabi-citron-700)
74
+ --color-citron-800: var(--zabi-citron-800)
75
+ --color-citron-900: var(--zabi-citron-900)
76
+ --color-citron-950: var(--zabi-citron-950)
77
+ /* Pine Color Scale — physical ramp + semantic aliases (mirror pattern matches --zabi-base-* / --color-base-*) */
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
+ --color-pine-50: var(--zabi-pine-50)
90
+ --color-pine-100: var(--zabi-pine-100)
91
+ --color-pine-200: var(--zabi-pine-200)
92
+ --color-pine-300: var(--zabi-pine-300)
93
+ --color-pine-400: var(--zabi-pine-400)
94
+ --color-pine-500: var(--zabi-pine-500)
95
+ --color-pine-600: var(--zabi-pine-600)
96
+ --color-pine-700: var(--zabi-pine-700)
97
+ --color-pine-800: var(--zabi-pine-800)
98
+ --color-pine-900: var(--zabi-pine-900)
99
+ --color-pine-950: var(--zabi-pine-950)
100
+ /* Iris Color Scale — physical ramp + semantic aliases (same mirror pattern as pine / base) */
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
+ --color-iris-50: var(--zabi-iris-50)
113
+ --color-iris-100: var(--zabi-iris-100)
114
+ --color-iris-200: var(--zabi-iris-200)
115
+ --color-iris-300: var(--zabi-iris-300)
116
+ --color-iris-400: var(--zabi-iris-400)
117
+ --color-iris-500: var(--zabi-iris-500)
118
+ --color-iris-600: var(--zabi-iris-600)
119
+ --color-iris-700: var(--zabi-iris-700)
120
+ --color-iris-800: var(--zabi-iris-800)
121
+ --color-iris-900: var(--zabi-iris-900)
122
+ --color-iris-950: var(--zabi-iris-950)
123
+ /* Warning Color Scale — physical ramp + semantic aliases (Tailwind amber) */
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
+ --color-warning-50: var(--zabi-warning-50)
136
+ --color-warning-100: var(--zabi-warning-100)
137
+ --color-warning-200: var(--zabi-warning-200)
138
+ --color-warning-300: var(--zabi-warning-300)
139
+ --color-warning-400: var(--zabi-warning-400)
140
+ --color-warning-500: var(--zabi-warning-500)
141
+ --color-warning-600: var(--zabi-warning-600)
142
+ --color-warning-700: var(--zabi-warning-700)
143
+ --color-warning-800: var(--zabi-warning-800)
144
+ --color-warning-900: var(--zabi-warning-900)
145
+ --color-warning-950: var(--zabi-warning-950)
146
+ /* Error Color Scale — physical ramp + semantic aliases (Tailwind red) */
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
+ --color-error-50: var(--zabi-error-50)
159
+ --color-error-100: var(--zabi-error-100)
160
+ --color-error-200: var(--zabi-error-200)
161
+ --color-error-300: var(--zabi-error-300)
162
+ --color-error-400: var(--zabi-error-400)
163
+ --color-error-500: var(--zabi-error-500)
164
+ --color-error-600: var(--zabi-error-600)
165
+ --color-error-700: var(--zabi-error-700)
166
+ --color-error-800: var(--zabi-error-800)
167
+ --color-error-900: var(--zabi-error-900)
168
+ --color-error-950: var(--zabi-error-950)
79
169
  /* Base Color Scale — semantic tokens alias the physical ramp (light: 1:1) */
80
170
  --color-base-50: var(--zabi-base-50)
81
171
  --color-base-75: var(--zabi-base-75)
@@ -99,52 +189,87 @@
99
189
  --color-base-925: var(--zabi-base-925)
100
190
  --color-base-950: var(--zabi-base-950)
101
191
  /* Background Colors */
102
- --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)
103
207
  --color-background-secondary: var(--color-base-50)
104
208
  --color-background-tertiary: var(--color-base-100)
105
209
  /* Page Colors */
106
210
  --color-page: var(--color-base-100)
107
211
  --color-page-secondary: var(--color-base-200)
108
- /* Card Colors */
109
- --color-card: #ffffff
212
+ /* Card Colors — aliases of the surface levels (kept for compatibility) */
213
+ --color-card: var(--color-surface-raised)
110
214
  --color-card-hover: var(--color-base-100)
111
215
  --color-card-active: var(--color-base-100)
112
- --color-card-elevated: #ffffff
113
- /* Surfaces — layered UI (ascending number = higher layer / more contrast against page) */
114
- --color-surface-1: #ffffff
115
- --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)
116
220
  --color-surface-3: var(--color-base-75)
117
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)
118
235
  /* Overlay Colors */
119
236
  --color-overlay: rgba(0, 0, 0, 0.5)
120
- /* Input Colors */
121
- --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)
122
241
  --color-input-border: var(--color-base-350)
123
- --color-input-hover: var(--color-base-300)
124
- --color-input-focus: var(--color-base-300)
242
+ --color-input-hover: var(--color-base-150)
243
+ --color-input-focus: var(--color-surface-raised)
125
244
  --color-input-disabled: var(--color-base-100)
126
245
  /* Text Colors */
127
246
  --color-headline: var(--color-base-900)
128
247
  --color-body: var(--color-base-800)
129
248
  --color-description: var(--color-base-600)
130
- --color-caption: var(--color-base-500)
131
- --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)
132
252
  --color-label: var(--color-base-700)
133
- --color-link: var(--color-brand-600)
134
- --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)
135
257
  /* Navigation menu item — menubar triggers, menu links, inline/sidebar nav rows */
136
258
  --color-nav-menu-item: var(--color-body)
137
259
  --color-nav-menu-item-hover: var(--color-headline)
138
260
  --color-nav-menu-item-active: var(--color-link)
139
- --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)
140
264
  --color-nav-menu-active: var(--color-action-primary-subtle)
265
+ --color-nav-menu-active-hover: var(--color-action-primary-subtle-hover)
141
266
  --color-nav-menu-focus: var(--color-brand-500)
142
- --color-success-text: var(--color-success)
143
- --color-warning-text: #b45309
267
+ --color-success-text: var(--color-pine-700)
268
+ --color-warning-text: var(--color-warning-700)
144
269
  --color-neutral-text: var(--color-base-700)
145
270
  --color-energetic-text: var(--color-citron-700)
146
- --color-error-text: #b91c1c
147
- --color-inverse: #ffffff
271
+ --color-error-text: var(--color-error-700)
272
+ --color-inverse: var(--color-base-100)
148
273
  --color-disabled: var(--color-base-400)
149
274
  /* Border Colors */
150
275
  --color-border: var(--color-base-300)
@@ -169,64 +294,125 @@
169
294
  --color-secondary-weak: var(--color-base-700)
170
295
  --color-secondary-medium: var(--color-base-800)
171
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
+ * ---------------------------------------------------------------- */
172
316
  /* Success Colors */
173
317
  --color-success: var(--color-pine-600)
174
318
  --color-success-weak: var(--color-pine-700)
175
319
  --color-success-medium: var(--color-pine-800)
176
320
  --color-success-strong: var(--color-pine-900)
321
+ --color-success-subtle: var(--color-pine-100)
322
+ --color-success-border: var(--color-pine-200)
177
323
  /* Warning Colors */
178
- --color-warning: #f59e0b
179
- --color-warning-weak: #d97706
180
- --color-warning-medium: #fbbf24
181
- --color-warning-strong: #fcd34d
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)
182
330
  /* Error Colors */
183
- --color-error: #ef4444
184
- --color-error-weak: #dc2626
185
- --color-error-medium: #f87171
186
- --color-error-strong: #fca5a5
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)
187
337
  /* Energetic Colors (Citron) */
188
- --color-energetic: var(--color-citron-500)
189
- --color-energetic-weak: var(--color-citron-600)
190
- --color-energetic-medium: var(--color-citron-400)
191
- --color-energetic-strong: var(--color-citron-300)
192
- /* Neutral Colors */
193
- --color-neutral: var(--color-base-600)
194
- --color-neutral-weak: var(--color-base-700)
195
- --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)
196
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)
197
358
  /* Info Colors */
198
359
  --color-info: var(--color-iris-600)
199
360
  --color-info-weak: var(--color-iris-700)
200
361
  --color-info-medium: var(--color-iris-800)
201
362
  --color-info-strong: var(--color-iris-900)
363
+ --color-info-active: var(--color-iris-400)
364
+ --color-info-subtle: var(--color-iris-100)
365
+ --color-info-border: var(--color-iris-200)
202
366
  /* Text alias */
203
- --color-info-text: var(--color-info)
367
+ --color-info-text: var(--color-iris-700)
204
368
  /* ========================================
205
369
  ACTION COLORS - For interactive elements (buttons, links, etc.)
206
370
  ======================================== */
207
- /* Primary Actions - Used by bg-action-primary utility class */
208
- /* šŸŽÆ TO CHANGE bg-action-primary COLOR: Edit the values below */
209
- --color-action-primary: var(--color-brand-950)
210
- --color-action-primary-hover: var(--color-brand-900)
211
- --color-action-primary-active: var(--color-brand-400)
212
- --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)
213
383
  --color-action-primary-subtle: var(--color-brand-100)
214
384
  --color-action-primary-subtle-hover: var(--color-brand-200)
215
- --color-action-primary-text: var(--color-brand-50)
216
- /* Secondary Actions - Used by bg-action-secondary utility class */
217
- --color-action-secondary: color-mix(in srgb, var(--color-brand-800) 10%, transparent)
218
- --color-action-secondary-hover: color-mix(in srgb, var(--color-brand-800) 20%, transparent)
219
- --color-action-secondary-active: var(--color-brand-400)
220
- --color-action-secondary-disabled: var(--color-brand-500)
221
- --color-action-secondary-subtle: var(--color-brand-600)
222
- --color-action-secondary-subtle-hover: var(--color-brand-700)
223
- /* Danger Actions - Used by bg-action-danger utility class */
224
- --color-action-danger: #dc2626
225
- --color-action-danger-hover: #b91c1c
226
- --color-action-danger-active: #991b1b
227
- --color-action-danger-disabled: #fca5a5
228
- --color-action-danger-subtle: #fef2f2
229
- --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)
230
416
  /* Shadow Colors */
231
417
  --shadow-color: 0 0 0
232
418
  --shadow-opacity: 0.1
@@ -241,11 +427,62 @@
241
427
  --spacing-lg: 1.5rem
242
428
  --spacing-xl: 2rem
243
429
  --spacing-2xl: 3rem
244
- /* 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. */
245
470
  --radius-sm: 0.25rem
246
471
  --radius-md: 0.375rem
247
472
  --radius-lg: 0.5rem
248
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 */
249
486
  /* Z-index */
250
487
  --z-dropdown: 1000
251
488
  --z-sticky: 1020
@@ -255,4 +492,7 @@
255
492
  --z-popover: 1060
256
493
  --z-tooltip: 1070
257
494
  --z-toast: 1080
495
+ /* Tooltip — elevated hint surface (Tooltip.svelte); arrow uses --color-tooltip-bg */
496
+ --color-tooltip-bg: var(--color-base-800)
497
+ --color-tooltip-fg: var(--color-base-50)
258
498
  }