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