zabi-components 7.0.2 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +46 -3
  2. package/THEMING.md +255 -15
  3. package/dist/atoms/ActionPanel.svelte +12 -7
  4. package/dist/atoms/ActionPanel.svelte.d.ts +2 -0
  5. package/dist/atoms/Badge.svelte +93 -56
  6. package/dist/atoms/Badge.svelte.d.ts +15 -3
  7. package/dist/atoms/Button.svelte +49 -49
  8. package/dist/atoms/Button.svelte.d.ts +3 -0
  9. package/dist/atoms/Card.svelte +31 -28
  10. package/dist/atoms/Card.svelte.d.ts +5 -2
  11. package/dist/atoms/CardContent.svelte +10 -2
  12. package/dist/atoms/CardContent.svelte.d.ts +2 -0
  13. package/dist/atoms/CardFooter.svelte +10 -2
  14. package/dist/atoms/CardFooter.svelte.d.ts +2 -0
  15. package/dist/atoms/CardHeader.svelte +10 -2
  16. package/dist/atoms/CardHeader.svelte.d.ts +2 -0
  17. package/dist/atoms/Checkbox.svelte +4 -0
  18. package/dist/atoms/Checkbox.svelte.d.ts +2 -0
  19. package/dist/atoms/CodeBlock.svelte +15 -7
  20. package/dist/atoms/CodeBlock.svelte.d.ts +9 -3
  21. package/dist/atoms/ColorPicker.svelte +19 -9
  22. package/dist/atoms/ColorPicker.svelte.d.ts +3 -1
  23. package/dist/atoms/Container.svelte +2 -3
  24. package/dist/atoms/Divider.svelte +4 -4
  25. package/dist/atoms/FeatureCard.svelte +4 -3
  26. package/dist/atoms/Heading.svelte +56 -27
  27. package/dist/atoms/Heading.svelte.d.ts +17 -4
  28. package/dist/atoms/IconButton.svelte +30 -37
  29. package/dist/atoms/Input.svelte +26 -34
  30. package/dist/atoms/List.svelte +10 -2
  31. package/dist/atoms/List.svelte.d.ts +2 -0
  32. package/dist/atoms/ListItem.svelte +2 -2
  33. package/dist/atoms/ListItemLeading.svelte +4 -2
  34. package/dist/atoms/ListItemLeading.svelte.d.ts +1 -1
  35. package/dist/atoms/OptimizedImage.svelte +11 -2
  36. package/dist/atoms/OptimizedImage.svelte.d.ts +2 -0
  37. package/dist/atoms/Progress.svelte +4 -1
  38. package/dist/atoms/Progress.svelte.d.ts +2 -0
  39. package/dist/atoms/Radio.svelte +4 -0
  40. package/dist/atoms/Radio.svelte.d.ts +2 -0
  41. package/dist/atoms/Select.svelte +65 -67
  42. package/dist/atoms/Select.svelte.d.ts +4 -0
  43. package/dist/atoms/SelectionControl.svelte +5 -1
  44. package/dist/atoms/SelectionControl.svelte.d.ts +2 -0
  45. package/dist/atoms/Skeleton.svelte +5 -3
  46. package/dist/atoms/Table.svelte +2 -1
  47. package/dist/atoms/Text.svelte +34 -5
  48. package/dist/atoms/Text.svelte.d.ts +7 -1
  49. package/dist/atoms/Textarea.svelte +7 -6
  50. package/dist/atoms/ThemeToggle.svelte +17 -14
  51. package/dist/atoms/ThemeToggle.svelte.d.ts +2 -0
  52. package/dist/atoms/Toast.svelte +10 -8
  53. package/dist/atoms/Toggle.svelte +21 -13
  54. package/dist/atoms/Toggle.svelte.d.ts +7 -0
  55. package/dist/atoms/Tooltip.svelte +80 -22
  56. package/dist/atoms/Tooltip.svelte.d.ts +15 -0
  57. package/dist/components/index.d.ts +3 -1
  58. package/dist/components/index.d.ts.map +1 -1
  59. package/dist/components/organisms/index.d.ts +1 -0
  60. package/dist/components/organisms/index.d.ts.map +1 -1
  61. package/dist/components/util/cn.d.ts +8 -0
  62. package/dist/components/util/cn.d.ts.map +1 -0
  63. package/dist/components/util/ssr-safe.d.ts +4 -4
  64. package/dist/components/util/ssr-safe.d.ts.map +1 -1
  65. package/dist/index.d.ts +3 -1
  66. package/dist/index.js +3 -6
  67. package/dist/molecules/Alert.svelte +43 -64
  68. package/dist/molecules/Alert.svelte.d.ts +7 -1
  69. package/dist/molecules/ComponentDemo.svelte +10 -2
  70. package/dist/molecules/ComponentDemo.svelte.d.ts +2 -0
  71. package/dist/molecules/ContactForm.svelte +12 -2
  72. package/dist/molecules/ContactForm.svelte.d.ts +2 -0
  73. package/dist/molecules/Dropdown.svelte +40 -11
  74. package/dist/molecules/Dropdown.svelte.d.ts +4 -0
  75. package/dist/molecules/EmptyState.svelte +2 -1
  76. package/dist/molecules/Form.svelte +25 -14
  77. package/dist/molecules/Form.svelte.d.ts +13 -5
  78. package/dist/molecules/FormField.svelte +2 -1
  79. package/dist/molecules/Header.svelte +13 -3
  80. package/dist/molecules/Header.svelte.d.ts +2 -0
  81. package/dist/molecules/ImageUpload.svelte +54 -15
  82. package/dist/molecules/ImageUpload.svelte.d.ts +16 -5
  83. package/dist/molecules/Modal.svelte +110 -31
  84. package/dist/molecules/Modal.svelte.d.ts +9 -6
  85. package/dist/molecules/NavigationMenu.svelte +15 -3
  86. package/dist/molecules/NavigationMenu.svelte.d.ts +4 -0
  87. package/dist/molecules/NavigationMenuContent.svelte +36 -38
  88. package/dist/molecules/NavigationMenuContent.svelte.d.ts +2 -0
  89. package/dist/molecules/NavigationMenuItem.svelte +10 -2
  90. package/dist/molecules/NavigationMenuItem.svelte.d.ts +2 -0
  91. package/dist/molecules/NavigationMenuLink.svelte +10 -2
  92. package/dist/molecules/NavigationMenuLink.svelte.d.ts +2 -0
  93. package/dist/molecules/NavigationMenuList.svelte +10 -2
  94. package/dist/molecules/NavigationMenuList.svelte.d.ts +2 -0
  95. package/dist/molecules/NavigationMenuTrigger.svelte +16 -3
  96. package/dist/molecules/NavigationMenuTrigger.svelte.d.ts +2 -0
  97. package/dist/molecules/Page.svelte +8 -2
  98. package/dist/molecules/Page.svelte.d.ts +2 -0
  99. package/dist/molecules/PropsTable.svelte +6 -3
  100. package/dist/molecules/PropsTable.svelte.d.ts +2 -0
  101. package/dist/molecules/RadioGroup.svelte +5 -1
  102. package/dist/molecules/RadioGroup.svelte.d.ts +2 -0
  103. package/dist/molecules/Section.svelte +12 -4
  104. package/dist/molecules/Section.svelte.d.ts +3 -1
  105. package/dist/molecules/SidebarBrandHeader.svelte +13 -4
  106. package/dist/molecules/SidebarBrandHeader.svelte.d.ts +2 -0
  107. package/dist/molecules/SidebarFooter.svelte +12 -4
  108. package/dist/molecules/SidebarFooter.svelte.d.ts +2 -0
  109. package/dist/molecules/SidebarNavSection.svelte +12 -4
  110. package/dist/molecules/SidebarNavSection.svelte.d.ts +2 -0
  111. package/dist/molecules/SlideUp.svelte +85 -21
  112. package/dist/molecules/SlideUp.svelte.d.ts +5 -4
  113. package/dist/molecules/Tabs.svelte +25 -19
  114. package/dist/molecules/Tabs.svelte.d.ts +8 -4
  115. package/dist/molecules/Toaster.svelte +3 -2
  116. package/dist/molecules/ToasterToast.svelte +41 -10
  117. package/dist/molecules/ToasterToast.svelte.d.ts +2 -0
  118. package/dist/organisms/SidebarAccountPanel.svelte +4 -0
  119. package/dist/organisms/SidebarAccountPanel.svelte.d.ts +2 -0
  120. package/dist/organisms/SidebarNavigation.svelte +102 -59
  121. package/dist/organisms/SidebarNavigation.svelte.d.ts +2 -0
  122. package/dist/organisms/SidebarPanel.svelte +19 -11
  123. package/dist/organisms/SidebarPanel.svelte.d.ts +2 -0
  124. package/dist/organisms/SidebarShell.svelte +112 -0
  125. package/dist/organisms/SidebarShell.svelte.d.ts +52 -0
  126. package/dist/organisms/TopNavbar.svelte +88 -17
  127. package/dist/organisms/TopNavbar.svelte.d.ts +2 -0
  128. package/dist/organisms/index.d.ts +1 -0
  129. package/dist/organisms/index.js +1 -0
  130. package/dist/routes/lib/variant-utils.d.ts +26 -0
  131. package/dist/routes/lib/{variant-utils.ts → variant-utils.js} +15 -46
  132. package/dist/types/events.js +1 -0
  133. package/dist/types/index.js +3 -0
  134. package/dist/util/cn.d.ts +7 -0
  135. package/dist/util/cn.js +48 -0
  136. package/dist/util/ssr-safe.d.ts +4 -4
  137. package/dist/zabi-components-colors.css +2 -2
  138. package/dist/zabi-components-theme-dark-only.css +139 -92
  139. package/dist/zabi-components-theme-dark.css +139 -92
  140. package/dist/zabi-components-theme-only.css +268 -122
  141. package/dist/zabi-components-theme.css +268 -122
  142. package/dist/zabi-components.css +831 -883
  143. package/docs/lucide-icons.md +3 -1
  144. package/package.json +19 -24
  145. package/dist/lib/layout-width-tokens.d.ts +0 -17
  146. package/dist/lib/layout-width-tokens.d.ts.map +0 -1
  147. package/dist/lib/showcase/component-docs/Button.d.ts +0 -3
  148. package/dist/lib/showcase/component-docs/Button.d.ts.map +0 -1
  149. package/dist/lib/showcase/component-docs/Input.d.ts +0 -3
  150. package/dist/lib/showcase/component-docs/Input.d.ts.map +0 -1
  151. package/dist/lib/showcase/component-docs/List.d.ts +0 -3
  152. package/dist/lib/showcase/component-docs/List.d.ts.map +0 -1
  153. package/dist/lib/showcase/component-docs/Modal.d.ts +0 -3
  154. package/dist/lib/showcase/component-docs/Modal.d.ts.map +0 -1
  155. package/dist/lib/showcase/component-docs/Radio.d.ts +0 -3
  156. package/dist/lib/showcase/component-docs/Radio.d.ts.map +0 -1
  157. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts +0 -3
  158. package/dist/lib/showcase/component-docs/SidebarNavigation.d.ts.map +0 -1
  159. package/dist/lib/showcase/component-docs/Skeleton.d.ts +0 -3
  160. package/dist/lib/showcase/component-docs/Skeleton.d.ts.map +0 -1
  161. package/dist/lib/showcase/component-docs/_shared.d.ts +0 -12
  162. package/dist/lib/showcase/component-docs/_shared.d.ts.map +0 -1
  163. package/dist/lib/showcase/component-docs/index.d.ts +0 -4
  164. package/dist/lib/showcase/component-docs/index.d.ts.map +0 -1
  165. package/dist/lib/showcase/components-catalog.d.ts +0 -3
  166. package/dist/lib/showcase/components-catalog.d.ts.map +0 -1
  167. package/dist/lib/showcase/components-showcase-constants.d.ts +0 -89
  168. package/dist/lib/showcase/components-showcase-constants.d.ts.map +0 -1
  169. package/dist/lib/showcase/docs-sidebar-helpers.d.ts +0 -15
  170. package/dist/lib/showcase/docs-sidebar-helpers.d.ts.map +0 -1
  171. package/dist/routes/lib/focus-utils.d.ts +0 -12
  172. package/dist/routes/lib/focus-utils.ts +0 -110
  173. package/dist/routes/lib/ssr-safe.ts +0 -58
  174. package/scripts/fix-lucide-svelte-icon-dts.js +0 -35
@@ -26,17 +26,17 @@
26
26
  --zabi-base-925: #101013
27
27
  --zabi-base-950: #09090b
28
28
  /* Mirror @theme --zabi-brand-* ramp (same physical hex; required for standalone dark import) */
29
- --zabi-brand-50: #f7faff
30
- --zabi-brand-100: #edf2fb
31
- --zabi-brand-200: #dfe7fb
32
- --zabi-brand-300: #ccdbfd
33
- --zabi-brand-400: #abc4ff
34
- --zabi-brand-500: #8fa8ff
35
- --zabi-brand-600: #6e84fa
36
- --zabi-brand-700: #5366e2
37
- --zabi-brand-800: #3f4fc0
38
- --zabi-brand-900: #2f3c99
39
- --zabi-brand-950: #1f2866
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
40
  /* Brand Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
41
41
  --color-brand-50: var(--zabi-brand-950)
42
42
  --color-brand-100: var(--zabi-brand-900)
@@ -50,17 +50,17 @@
50
50
  --color-brand-900: var(--zabi-brand-100)
51
51
  --color-brand-950: var(--zabi-brand-50)
52
52
  /* Mirror @theme --zabi-citron-* ramp (same physical hex; required for standalone dark import) */
53
- --zabi-citron-50: #f9faeb
54
- --zabi-citron-100: #f1f5cf
55
- --zabi-citron-200: #e4ecaa
56
- --zabi-citron-300: #d5e184
57
- --zabi-citron-400: #c7d460
58
- --zabi-citron-500: #bbbe64
59
- --zabi-citron-600: #a3a852
60
- --zabi-citron-700: #848a43
61
- --zabi-citron-800: #666c35
62
- --zabi-citron-900: #4d5229
63
- --zabi-citron-950: #323518
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
64
  /* Citron Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
65
65
  --color-citron-50: var(--zabi-citron-950)
66
66
  --color-citron-100: var(--zabi-citron-900)
@@ -74,17 +74,17 @@
74
74
  --color-citron-900: var(--zabi-citron-100)
75
75
  --color-citron-950: var(--zabi-citron-50)
76
76
  /* Mirror @theme --zabi-pine-* ramp (same physical hex; required for standalone dark import) */
77
- --zabi-pine-50: #e9f6f2
78
- --zabi-pine-100: #d2ece4
79
- --zabi-pine-200: #a7d9c9
80
- --zabi-pine-300: #78c4ad
81
- --zabi-pine-400: #49ad91
82
- --zabi-pine-500: #0c5d43
83
- --zabi-pine-600: #0a513a
84
- --zabi-pine-700: #084532
85
- --zabi-pine-800: #063a2a
86
- --zabi-pine-900: #04231a
87
- --zabi-pine-950: #02160f
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
88
  /* Pine Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
89
89
  --color-pine-50: var(--zabi-pine-950)
90
90
  --color-pine-100: var(--zabi-pine-900)
@@ -98,17 +98,17 @@
98
98
  --color-pine-900: var(--zabi-pine-100)
99
99
  --color-pine-950: var(--zabi-pine-50)
100
100
  /* Mirror @theme --zabi-iris-* ramp (same physical hex; required for standalone dark import) */
101
- --zabi-iris-50: #f4f4fa
102
- --zabi-iris-100: #e9e9f7
103
- --zabi-iris-200: #d6d6f0
104
- --zabi-iris-300: #bdbde6
105
- --zabi-iris-400: #a3a3d8
106
- --zabi-iris-500: #6969b3
107
- --zabi-iris-600: #58589e
108
- --zabi-iris-700: #474788
109
- --zabi-iris-800: #38386f
110
- --zabi-iris-900: #2a2a56
111
- --zabi-iris-950: #1b1b37
101
+ --zabi-iris-50: #f6f6fd
102
+ --zabi-iris-100: #ecedfb
103
+ --zabi-iris-200: #dadbf6
104
+ --zabi-iris-300: #c1c4ef
105
+ --zabi-iris-400: #a5a7e2
106
+ --zabi-iris-500: #8486cd
107
+ --zabi-iris-600: #6969b4
108
+ --zabi-iris-700: #535397
109
+ --zabi-iris-800: #3f3f78
110
+ --zabi-iris-900: #2c2c58
111
+ --zabi-iris-950: #1d1d3a
112
112
  /* Iris Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
113
113
  --color-iris-50: var(--zabi-iris-950)
114
114
  --color-iris-100: var(--zabi-iris-900)
@@ -122,17 +122,17 @@
122
122
  --color-iris-900: var(--zabi-iris-100)
123
123
  --color-iris-950: var(--zabi-iris-50)
124
124
  /* Mirror @theme --zabi-warning-* ramp (same physical hex; required for standalone dark import) */
125
- --zabi-warning-50: #fffbeb
126
- --zabi-warning-100: #fef3c7
127
- --zabi-warning-200: #fde68a
128
- --zabi-warning-300: #fcd34d
129
- --zabi-warning-400: #fbbf24
130
- --zabi-warning-500: #f59e0b
131
- --zabi-warning-600: #d97706
132
- --zabi-warning-700: #b45309
133
- --zabi-warning-800: #92400e
134
- --zabi-warning-900: #78350f
135
- --zabi-warning-950: #451a03
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
136
  /* Warning Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
137
137
  --color-warning-50: var(--zabi-warning-950)
138
138
  --color-warning-100: var(--zabi-warning-900)
@@ -146,17 +146,17 @@
146
146
  --color-warning-900: var(--zabi-warning-100)
147
147
  --color-warning-950: var(--zabi-warning-50)
148
148
  /* Mirror @theme --zabi-error-* ramp (same physical hex; required for standalone dark import) */
149
- --zabi-error-50: #fef2f2
150
- --zabi-error-100: #fee2e2
151
- --zabi-error-200: #fecaca
152
- --zabi-error-300: #fca5a5
153
- --zabi-error-400: #f87171
154
- --zabi-error-500: #ef4444
155
- --zabi-error-600: #dc2626
156
- --zabi-error-700: #b91c1c
157
- --zabi-error-800: #991b1b
158
- --zabi-error-900: #7f1d1d
159
- --zabi-error-950: #450a0a
149
+ --zabi-error-50: #fff4f3
150
+ --zabi-error-100: #ffe9e6
151
+ --zabi-error-200: #ffd2cd
152
+ --zabi-error-300: #ffb2ab
153
+ --zabi-error-400: #ff877d
154
+ --zabi-error-500: #ed564e
155
+ --zabi-error-600: #d22828
156
+ --zabi-error-700: #b20912
157
+ --zabi-error-800: #8c0006
158
+ --zabi-error-900: #660002
159
+ --zabi-error-950: #460202
160
160
  /* Error Color Scale — semantic → physical mirror (1000 − step); 500 fixed point */
161
161
  --color-error-50: var(--zabi-error-950)
162
162
  --color-error-100: var(--zabi-error-900)
@@ -193,24 +193,58 @@
193
193
  --color-base-950: #fafafa
194
194
  /* Background Colors - No dark mode overrides needed, base colors are already inverted */
195
195
  /* Page Colors - No dark mode overrides needed, base colors are already inverted */
196
- /* Card Colors */
197
- --color-card: var(--color-base-200)
198
- --color-card-hover: var(--color-base-300)
199
- --color-card-active: var(--color-base-400)
200
- --color-card-elevated: var(--color-base-200)
201
- /* Surfaces — layered UI (each step is lighter than the previous to read as "elevated") */
202
- --color-surface-1: var(--color-base-250)
203
- --color-surface-2: var(--color-base-300)
204
- --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)
205
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)
206
237
  /* Overlay Colors */
207
238
  --color-overlay: rgba(0, 0, 0, 0.7)
208
- /* Input Colors */
209
- --color-input: var(--color-base-250)
210
- --color-input-border: var(--color-base-350)
211
- --color-input-hover: var(--color-base-300)
212
- --color-input-focus: var(--color-base-300)
213
- --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)
214
248
  /* Text Colors - No dark mode overrides needed, base colors are already inverted */
215
249
  /* Border Colors - No dark mode overrides needed, base colors are already inverted */
216
250
  /* Focus Colors - No dark mode overrides needed, brand colors are already inverted */
@@ -220,23 +254,36 @@
220
254
  /* Warning Colors — no overrides: @theme uses --color-warning-* scale; it mirrors in .dark via --zabi-warning-* */
221
255
  /* Error Colors — no overrides: @theme uses --color-error-* scale; it mirrors in .dark via --zabi-error-* */
222
256
  /* Energetic Colors — no overrides: @theme uses --color-citron-*; citron mirrors in .dark via --zabi-citron-* */
223
- /* Neutral Colors - No dark mode overrides needed, base colors are already inverted */
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)
224
260
  /* Info Colors — no overrides: @theme uses --color-iris-* (incl. --color-info-active); iris mirrors in .dark via --zabi-iris-* */
225
261
  /* ========================================
226
262
  ACTION COLORS - Dark Mode Overrides
227
263
  ======================================== */
228
264
  /* Primary Actions - Background adapts automatically via brand color inversion */
229
265
  /* 🎯 TO CHANGE bg-action-primary IN DARK MODE: Edit --zabi-brand-* physical ramp above (semantic --color-brand-* follows mirror) */
230
- /* Text color - Use brand-50 (semantic; maps across light/dark via --zabi-brand-*) for proper contrast */
231
- --color-action-primary-text: var(--color-brand-50)
232
- /* Secondary Actions - No dark mode overrides needed, base colors are already inverted */
233
- /* Danger Actions */
234
- --color-action-danger: #ef4444
235
- --color-action-danger-hover: #dc2626
236
- --color-action-danger-active: #b91c1c
237
- --color-action-danger-disabled: #b91c1c
238
- --color-action-danger-subtle: #450a0a
239
- --color-action-danger-subtle-hover: #7f1d1d
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)
240
287
  /* Shadow Colors */
241
288
  --shadow-opacity: 0.3
242
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))