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