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
@@ -25,54 +25,150 @@
25
25
  --zabi-base-900: #18181b
26
26
  --zabi-base-925: #101013
27
27
  --zabi-base-950: #09090b
28
- /* Brand Color Scale - Dark mode variants (mirrored from light physical hex; no theme() forward refs) */
29
- --color-brand-50: #1f2866
30
- --color-brand-100: #2f3c99
31
- --color-brand-200: #3f4fc0
32
- --color-brand-300: #5366e2
33
- --color-brand-400: #6e84fa
34
- --color-brand-500: #8fa8ff
35
- --color-brand-600: #abc4ff
36
- --color-brand-700: #ccdbfd
37
- --color-brand-800: #dfe7fb
38
- --color-brand-900: #edf2fb
39
- --color-brand-950: #f7faff
40
- /* Citron Color Scale - Dark mode variants */
41
- --color-citron-50: #323518
42
- --color-citron-100: #4d5229
43
- --color-citron-200: #666c35
44
- --color-citron-300: #848a43
45
- --color-citron-400: #a3a852
46
- --color-citron-500: #bbbe64
47
- --color-citron-600: #c7d460
48
- --color-citron-700: #d5e184
49
- --color-citron-800: #e4ecaa
50
- --color-citron-900: #f1f5cf
51
- --color-citron-950: #f9faeb
52
- /* Pine Color Scale - Dark mode variants */
53
- --color-pine-50: #02160f
54
- --color-pine-100: #04231a
55
- --color-pine-200: #063a2a
56
- --color-pine-300: #084532
57
- --color-pine-400: #0a513a
58
- --color-pine-500: #0c5d43
59
- --color-pine-600: #49ad91
60
- --color-pine-700: #78c4ad
61
- --color-pine-800: #a7d9c9
62
- --color-pine-900: #d2ece4
63
- --color-pine-950: #e9f6f2
64
- /* Iris Color Scale - Dark mode variants */
65
- --color-iris-50: #1b1b37
66
- --color-iris-100: #2a2a56
67
- --color-iris-200: #38386f
68
- --color-iris-300: #474788
69
- --color-iris-400: #58589e
70
- --color-iris-500: #6969b3
71
- --color-iris-600: #a3a3d8
72
- --color-iris-700: #bdbde6
73
- --color-iris-800: #d6d6f0
74
- --color-iris-900: #e9e9f7
75
- --color-iris-950: #f4f4fa
28
+ /* Mirror @theme --zabi-brand-* ramp (same physical hex; required for standalone dark import) */
29
+ --zabi-brand-50: #f4f6ff
30
+ --zabi-brand-100: #e9eeff
31
+ --zabi-brand-200: #d3dcff
32
+ --zabi-brand-300: #b5c6ff
33
+ --zabi-brand-400: #92a9ff
34
+ --zabi-brand-500: #6d87f1
35
+ --zabi-brand-600: #4f68da
36
+ --zabi-brand-700: #3c52ba
37
+ --zabi-brand-800: #2b3e95
38
+ --zabi-brand-900: #1c2c6d
39
+ --zabi-brand-950: #111d49
40
+ /* Brand Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
41
+ --color-brand-50: var(--zabi-brand-950)
42
+ --color-brand-100: var(--zabi-brand-900)
43
+ --color-brand-200: var(--zabi-brand-800)
44
+ --color-brand-300: var(--zabi-brand-700)
45
+ --color-brand-400: var(--zabi-brand-600)
46
+ --color-brand-500: var(--zabi-brand-500)
47
+ --color-brand-600: var(--zabi-brand-400)
48
+ --color-brand-700: var(--zabi-brand-300)
49
+ --color-brand-800: var(--zabi-brand-200)
50
+ --color-brand-900: var(--zabi-brand-100)
51
+ --color-brand-950: var(--zabi-brand-50)
52
+ /* Mirror @theme --zabi-citron-* ramp (same physical hex; required for standalone dark import) */
53
+ --zabi-citron-50: #f6f7ef
54
+ --zabi-citron-100: #edefdf
55
+ --zabi-citron-200: #dcdfbf
56
+ --zabi-citron-300: #c5ca95
57
+ --zabi-citron-400: #aab063
58
+ --zabi-citron-500: #8c9027
59
+ --zabi-citron-600: #707400
60
+ --zabi-citron-700: #5a5d00
61
+ --zabi-citron-800: #454700
62
+ --zabi-citron-900: #313200
63
+ --zabi-citron-950: #202100
64
+ /* Citron Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
65
+ --color-citron-50: var(--zabi-citron-950)
66
+ --color-citron-100: var(--zabi-citron-900)
67
+ --color-citron-200: var(--zabi-citron-800)
68
+ --color-citron-300: var(--zabi-citron-700)
69
+ --color-citron-400: var(--zabi-citron-600)
70
+ --color-citron-500: var(--zabi-citron-500)
71
+ --color-citron-600: var(--zabi-citron-400)
72
+ --color-citron-700: var(--zabi-citron-300)
73
+ --color-citron-800: var(--zabi-citron-200)
74
+ --color-citron-900: var(--zabi-citron-100)
75
+ --color-citron-950: var(--zabi-citron-50)
76
+ /* Mirror @theme --zabi-pine-* ramp (same physical hex; required for standalone dark import) */
77
+ --zabi-pine-50: #f0f8f5
78
+ --zabi-pine-100: #e2f1eb
79
+ --zabi-pine-200: #c5e4d7
80
+ --zabi-pine-300: #9fd1bd
81
+ --zabi-pine-400: #70ba9e
82
+ --zabi-pine-500: #399c7a
83
+ --zabi-pine-600: #00805e
84
+ --zabi-pine-700: #00674a
85
+ --zabi-pine-800: #004f37
86
+ --zabi-pine-900: #003826
87
+ --zabi-pine-950: #002518
88
+ /* Pine Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
89
+ --color-pine-50: var(--zabi-pine-950)
90
+ --color-pine-100: var(--zabi-pine-900)
91
+ --color-pine-200: var(--zabi-pine-800)
92
+ --color-pine-300: var(--zabi-pine-700)
93
+ --color-pine-400: var(--zabi-pine-600)
94
+ --color-pine-500: var(--zabi-pine-500)
95
+ --color-pine-600: var(--zabi-pine-400)
96
+ --color-pine-700: var(--zabi-pine-300)
97
+ --color-pine-800: var(--zabi-pine-200)
98
+ --color-pine-900: var(--zabi-pine-100)
99
+ --color-pine-950: var(--zabi-pine-50)
100
+ /* Mirror @theme --zabi-iris-* ramp (same physical hex; required for standalone dark import) */
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
+ /* Iris Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
113
+ --color-iris-50: var(--zabi-iris-950)
114
+ --color-iris-100: var(--zabi-iris-900)
115
+ --color-iris-200: var(--zabi-iris-800)
116
+ --color-iris-300: var(--zabi-iris-700)
117
+ --color-iris-400: var(--zabi-iris-600)
118
+ --color-iris-500: var(--zabi-iris-500)
119
+ --color-iris-600: var(--zabi-iris-400)
120
+ --color-iris-700: var(--zabi-iris-300)
121
+ --color-iris-800: var(--zabi-iris-200)
122
+ --color-iris-900: var(--zabi-iris-100)
123
+ --color-iris-950: var(--zabi-iris-50)
124
+ /* Mirror @theme --zabi-warning-* ramp (same physical hex; required for standalone dark import) */
125
+ --zabi-warning-50: #fbf6ed
126
+ --zabi-warning-100: #f7ecda
127
+ --zabi-warning-200: #f1d9b6
128
+ --zabi-warning-300: #e8bf87
129
+ --zabi-warning-400: #db9e4c
130
+ --zabi-warning-500: #c17b00
131
+ --zabi-warning-600: #9e6000
132
+ --zabi-warning-700: #824c00
133
+ --zabi-warning-800: #663800
134
+ --zabi-warning-900: #4b2600
135
+ --zabi-warning-950: #341800
136
+ /* Warning Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
137
+ --color-warning-50: var(--zabi-warning-950)
138
+ --color-warning-100: var(--zabi-warning-900)
139
+ --color-warning-200: var(--zabi-warning-800)
140
+ --color-warning-300: var(--zabi-warning-700)
141
+ --color-warning-400: var(--zabi-warning-600)
142
+ --color-warning-500: var(--zabi-warning-500)
143
+ --color-warning-600: var(--zabi-warning-400)
144
+ --color-warning-700: var(--zabi-warning-300)
145
+ --color-warning-800: var(--zabi-warning-200)
146
+ --color-warning-900: var(--zabi-warning-100)
147
+ --color-warning-950: var(--zabi-warning-50)
148
+ /* Mirror @theme --zabi-error-* ramp (same physical hex; required for standalone dark import) */
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
+ /* Error Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
161
+ --color-error-50: var(--zabi-error-950)
162
+ --color-error-100: var(--zabi-error-900)
163
+ --color-error-200: var(--zabi-error-800)
164
+ --color-error-300: var(--zabi-error-700)
165
+ --color-error-400: var(--zabi-error-600)
166
+ --color-error-500: var(--zabi-error-500)
167
+ --color-error-600: var(--zabi-error-400)
168
+ --color-error-700: var(--zabi-error-300)
169
+ --color-error-800: var(--zabi-error-200)
170
+ --color-error-900: var(--zabi-error-100)
171
+ --color-error-950: var(--zabi-error-50)
76
172
  /* Base Color Scale — semantic → physical mirror (1000 − step); 500 is fixed point */
77
173
  --color-base-50: #09090b
78
174
  --color-base-75: #101013
@@ -97,73 +193,97 @@
97
193
  --color-base-950: #fafafa
98
194
  /* Background Colors - No dark mode overrides needed, base colors are already inverted */
99
195
  /* Page Colors - No dark mode overrides needed, base colors are already inverted */
100
- /* Card Colors */
101
- --color-card: var(--color-base-200)
102
- --color-card-hover: var(--color-base-300)
103
- --color-card-active: var(--color-base-400)
104
- --color-card-elevated: var(--color-base-200)
105
- /* Surfaces — layered UI (each step is lighter than the previous to read as "elevated") */
106
- --color-surface-1: var(--color-base-250)
107
- --color-surface-2: var(--color-base-300)
108
- --color-surface-3: var(--color-base-350)
196
+ /* Surface elevation — shadows don't read on dark, so each level steps up +6 OKLCH lightness
197
+ * from the page background (L 21 → 27 → 33 → 39).
198
+ *
199
+ * GENERATED by scripts/generate-surfaces.js from tokens/surface-ladder.js — do not hand-edit.
200
+ * Each level is #fafafa (the same light as the dark hover tint) washed over the page at
201
+ * 6.4% / 13.1% / 19.7%, so every level is the one below it with more light on it. Baked to
202
+ * opaque hex so the static checks can still resolve them and a modal stays opaque.
203
+ * Enforced by scripts/check-surface-elevation.js (strictly increasing, 5–8 points). */
204
+ --color-surface-base: #18181b
205
+ --color-surface-raised: #262629
206
+ --color-surface-elevated: #363638
207
+ --color-surface-overlay: #454547
208
+ --color-surface-overlay-hover: #52525b
209
+ /* Distinct from base, raised AND elevated — a neutral chip has no hue to
210
+ * separate it, so it has to separate on lightness wherever it lands. */
211
+ --color-neutral-subtle: var(--color-base-300)
212
+ --color-border-overlay: var(--color-base-450)
213
+ /* Background Colors */
214
+ --color-background: var(--color-surface-base)
215
+ /* Card Colors — aliases of the surface levels */
216
+ --color-card: var(--color-surface-raised)
217
+ --color-card-hover: var(--color-surface-elevated)
218
+ --color-card-active: var(--color-surface-overlay)
219
+ --color-card-elevated: var(--color-surface-elevated)
220
+ /* Surfaces — numbered aliases of the surface levels */
221
+ --color-surface-1: var(--color-surface-raised)
222
+ --color-surface-2: var(--color-surface-elevated)
223
+ --color-surface-3: var(--color-surface-overlay)
109
224
  --color-surface-4: var(--color-base-400)
225
+ /*
226
+ * Secondary text keeps ≥ 4.5:1 on every surface level, including overlays (L39).
227
+ * Only base-650 and lighter pass on the overlay, so caption takes base-650 and description
228
+ * moves one step up to base-700 to stay visibly stronger than caption.
229
+ */
230
+ --color-description: var(--color-base-700)
231
+ --color-caption: var(--color-base-650)
232
+ /* Interaction fills — light tint on dark, mirroring the light-mode rule.
233
+ * Alpha keeps these one step away from every surface level, which a fixed
234
+ * ramp step cannot guarantee (base-100 in dark IS the page background). */
235
+ --color-surface-hover: rgba(250, 250, 250, 0.08)
236
+ --color-surface-active: rgba(250, 250, 250, 0.14)
110
237
  /* Overlay Colors */
111
238
  --color-overlay: rgba(0, 0, 0, 0.7)
112
- /* Input Colors */
113
- --color-input: var(--color-base-250)
114
- --color-input-border: var(--color-base-350)
115
- --color-input-hover: var(--color-base-300)
116
- --color-input-focus: var(--color-base-300)
117
- --color-input-disabled: var(--color-base-300)
239
+ /* Input Colors
240
+ * Dark fields are INSET: one step below the raised surface they sit on,
241
+ * which is the dark-mode equivalent of a white field on a grey page. */
242
+ --color-input: var(--color-base-150)
243
+ --color-input-border: var(--color-base-300)
244
+ --color-input-hover: var(--color-base-200)
245
+ --color-input-focus: var(--color-base-150)
246
+ --color-input-disabled: var(--color-base-100)
247
+ --color-input-placeholder: var(--color-base-500)
118
248
  /* Text Colors - No dark mode overrides needed, base colors are already inverted */
119
249
  /* Border Colors - No dark mode overrides needed, base colors are already inverted */
120
250
  /* Focus Colors - No dark mode overrides needed, brand colors are already inverted */
121
251
  /* Primary Colors - No dark mode overrides needed, brand colors are already inverted */
122
252
  /* Secondary Colors - No dark mode overrides needed, base colors are already inverted */
123
- /* Success Colors */
124
- --color-success: var(--color-pine-400)
125
- --color-success-weak: var(--color-pine-500)
126
- --color-success-medium: var(--color-pine-300)
127
- --color-success-strong: var(--color-pine-200)
128
- /* Warning Colors */
129
- --color-warning: #f59e0b
130
- --color-warning-weak: #d97706
131
- --color-warning-medium: #fbbf24
132
- --color-warning-strong: #fcd34d
133
- /* Error Colors */
134
- --color-error: #ef4444
135
- --color-error-weak: #dc2626
136
- --color-error-medium: #f87171
137
- --color-error-strong: #fca5a5
138
- /* Energetic Colors (Citron) */
139
- --color-energetic: var(--color-citron-400)
140
- --color-energetic-weak: var(--color-citron-500)
141
- --color-energetic-medium: var(--color-citron-300)
142
- --color-energetic-strong: var(--color-citron-200)
143
- /* Neutral Colors - No dark mode overrides needed, base colors are already inverted */
144
- /* Info Colors */
145
- --color-info: var(--color-iris-500)
146
- --color-info-weak: var(--color-iris-600)
147
- --color-info-active: var(--color-iris-400)
148
- --color-info-medium: var(--color-iris-400)
149
- --color-info-strong: var(--color-iris-300)
150
- /* Text alias */
151
- --color-info-text: var(--color-info)
253
+ /* Success Colors — no overrides: @theme uses --color-pine-*; semantic pine resolves to mirrored physical ramp inside .dark */
254
+ /* Warning Colors — no overrides: @theme uses --color-warning-* scale; it mirrors in .dark via --zabi-warning-* */
255
+ /* Error Colors — no overrides: @theme uses --color-error-* scale; it mirrors in .dark via --zabi-error-* */
256
+ /* Energetic Colors — no overrides: @theme uses --color-citron-*; citron mirrors in .dark via --zabi-citron-* */
257
+ /* Neutral Colors — base-550 mirrors to L* 57, which is only 4.35:1 on a
258
+ * raised surface. One step lighter clears AA on every dark surface level. */
259
+ --color-neutral: var(--color-base-600)
260
+ /* Info Colors — no overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
152
261
  /* ========================================
153
262
  ACTION COLORS - Dark Mode Overrides
154
263
  ======================================== */
155
264
  /* Primary Actions - Background adapts automatically via brand color inversion */
156
- /* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit --color-brand-800 in .dark block (line ~275) */
157
- /* Text color - Use brand-50 (which maps to brand-950/darkest in dark mode) for proper contrast */
158
- --color-action-primary-text: var(--color-brand-50)
159
- /* Secondary Actions - No dark mode overrides needed, base colors are already inverted */
160
- /* Danger Actions */
161
- --color-action-danger: #ef4444
162
- --color-action-danger-hover: #dc2626
163
- --color-action-danger-active: #b91c1c
164
- --color-action-danger-disabled: #b91c1c
165
- --color-action-danger-subtle: #450a0a
166
- --color-action-danger-subtle-hover: #7f1d1d
265
+ /* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit --zabi-brand-* physical ramp above (semantic --color-brand-* follows mirror) */
266
+ /* Text color - the physical dark end of the brand ramp, on the physical
267
+ * light end used as the dark-mode primary fill. 7.21:1. */
268
+ --color-action-primary-text: var(--zabi-brand-950)
269
+ /* Secondary Actions - light alpha tint instead of the light-mode dark tint */
270
+ --color-action-secondary: rgba(250, 250, 250, 0.09)
271
+ --color-action-secondary-hover: rgba(250, 250, 250, 0.15)
272
+ --color-action-secondary-active: rgba(250, 250, 250, 0.21)
273
+ /* Disabled Actions - base-200 in dark is #27272a, still the quietest fill */
274
+ /* Danger Actions — restated as aliases, not re-pointed.
275
+ * These resolve through the mirrored --color-error-* scale, so dark danger
276
+ * is the same step of the same ramp as light danger. They are repeated here
277
+ * only because `zabi-components/theme-dark-only` has to stand alone as a
278
+ * complete import (validate-theme.js enforces that). The raw hex this
279
+ * replaced pinned dark danger brighter than light, which is why the
280
+ * destructive action was the loudest element on a dark page. */
281
+ --color-action-danger: var(--color-error-600)
282
+ --color-action-danger-hover: var(--color-error-700)
283
+ --color-action-danger-active: var(--color-error-800)
284
+ --color-action-danger-subtle: var(--color-error-100)
285
+ --color-action-danger-subtle-hover: var(--color-error-200)
286
+ --color-action-danger-text: var(--color-error-50)
167
287
  /* Shadow Colors */
168
288
  --shadow-opacity: 0.3
169
289
  --shadow-sm: 0 1px 3px 0 rgb(var(--shadow-color) / var(--shadow-opacity)), 0 1px 2px -1px rgb(var(--shadow-color) / var(--shadow-opacity))