@jacshuo/onyx 0.1.9 → 1.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 (218) hide show
  1. package/README.md +191 -30
  2. package/README.zh-CN.md +745 -0
  3. package/dist/Accordion.cjs +1 -1
  4. package/dist/Accordion.d.cts +3 -1
  5. package/dist/Accordion.d.ts +3 -1
  6. package/dist/Accordion.js +1 -1
  7. package/dist/Alert.cjs +1 -1
  8. package/dist/Alert.d.cts +3 -1
  9. package/dist/Alert.d.ts +3 -1
  10. package/dist/Alert.js +1 -1
  11. package/dist/Badge.cjs +1 -1
  12. package/dist/Badge.d.cts +1 -1
  13. package/dist/Badge.d.ts +1 -1
  14. package/dist/Badge.js +1 -1
  15. package/dist/Button.cjs +1 -1
  16. package/dist/Button.js +1 -1
  17. package/dist/Card.cjs +1 -1
  18. package/dist/Card.d.cts +3 -1
  19. package/dist/Card.d.ts +3 -1
  20. package/dist/Card.js +1 -1
  21. package/dist/Checkbox.cjs +1 -0
  22. package/dist/Checkbox.d.cts +21 -0
  23. package/dist/Checkbox.d.ts +21 -0
  24. package/dist/Checkbox.js +1 -0
  25. package/dist/CodeBlock.cjs +1 -0
  26. package/dist/CodeBlock.d.cts +22 -0
  27. package/dist/CodeBlock.d.ts +22 -0
  28. package/dist/CodeBlock.js +1 -0
  29. package/dist/Dialog.cjs +1 -1
  30. package/dist/Dialog.d.cts +5 -2
  31. package/dist/Dialog.d.ts +5 -2
  32. package/dist/Dialog.js +1 -1
  33. package/dist/Dropdown.cjs +1 -1
  34. package/dist/Dropdown.d.cts +12 -0
  35. package/dist/Dropdown.d.ts +12 -0
  36. package/dist/Dropdown.js +1 -1
  37. package/dist/DropdownButton.cjs +1 -1
  38. package/dist/DropdownButton.d.cts +3 -1
  39. package/dist/DropdownButton.d.ts +3 -1
  40. package/dist/DropdownButton.js +1 -1
  41. package/dist/FileExplorer.cjs +1 -1
  42. package/dist/FileExplorer.js +1 -1
  43. package/dist/Form.cjs +1 -0
  44. package/dist/Form.d.cts +101 -0
  45. package/dist/Form.d.ts +101 -0
  46. package/dist/Form.js +1 -0
  47. package/dist/Header.cjs +1 -1
  48. package/dist/Header.d.cts +7 -1
  49. package/dist/Header.d.ts +7 -1
  50. package/dist/Header.js +1 -1
  51. package/dist/Indicator.cjs +1 -0
  52. package/dist/Indicator.d.cts +19 -0
  53. package/dist/Indicator.d.ts +19 -0
  54. package/dist/Indicator.js +1 -0
  55. package/dist/Input.cjs +1 -1
  56. package/dist/Input.js +1 -1
  57. package/dist/Label.cjs +1 -1
  58. package/dist/Label.js +1 -1
  59. package/dist/List.cjs +1 -1
  60. package/dist/List.d.cts +11 -4
  61. package/dist/List.d.ts +11 -4
  62. package/dist/List.js +1 -1
  63. package/dist/Masonry.cjs +1 -0
  64. package/dist/Masonry.d.cts +41 -0
  65. package/dist/Masonry.d.ts +41 -0
  66. package/dist/Masonry.js +1 -0
  67. package/dist/NavLink.cjs +1 -0
  68. package/dist/NavLink.d.cts +13 -0
  69. package/dist/NavLink.d.ts +13 -0
  70. package/dist/NavLink.js +1 -0
  71. package/dist/Panel.cjs +1 -1
  72. package/dist/Panel.js +1 -1
  73. package/dist/ProgressBar.cjs +1 -0
  74. package/dist/ProgressBar.d.cts +21 -0
  75. package/dist/ProgressBar.d.ts +21 -0
  76. package/dist/ProgressBar.js +1 -0
  77. package/dist/Radio.cjs +1 -0
  78. package/dist/Radio.d.cts +35 -0
  79. package/dist/Radio.d.ts +35 -0
  80. package/dist/Radio.js +1 -0
  81. package/dist/SideNav.cjs +1 -1
  82. package/dist/SideNav.d.cts +14 -1
  83. package/dist/SideNav.d.ts +14 -1
  84. package/dist/SideNav.js +1 -1
  85. package/dist/Spin.cjs +1 -0
  86. package/dist/Spin.d.cts +26 -0
  87. package/dist/Spin.d.ts +26 -0
  88. package/dist/Spin.js +1 -0
  89. package/dist/Switch.cjs +1 -0
  90. package/dist/Switch.d.cts +23 -0
  91. package/dist/Switch.d.ts +23 -0
  92. package/dist/Switch.js +1 -0
  93. package/dist/Table.cjs +1 -1
  94. package/dist/Table.d.cts +24 -4
  95. package/dist/Table.d.ts +24 -4
  96. package/dist/Table.js +1 -1
  97. package/dist/Tabs.cjs +1 -1
  98. package/dist/Tabs.d.cts +3 -1
  99. package/dist/Tabs.d.ts +3 -1
  100. package/dist/Tabs.js +1 -1
  101. package/dist/TextBox.cjs +1 -0
  102. package/dist/TextBox.d.cts +16 -0
  103. package/dist/TextBox.d.ts +16 -0
  104. package/dist/TextBox.js +1 -0
  105. package/dist/Tooltip.cjs +1 -1
  106. package/dist/Tooltip.d.cts +3 -1
  107. package/dist/Tooltip.d.ts +3 -1
  108. package/dist/Tooltip.js +1 -1
  109. package/dist/Tree.cjs +1 -1
  110. package/dist/Tree.d.cts +6 -2
  111. package/dist/Tree.d.ts +6 -2
  112. package/dist/Tree.js +1 -1
  113. package/dist/chunks/chunk-2JLNRAXS.cjs +1 -0
  114. package/dist/chunks/{chunk-BQLPFPCA.cjs → chunk-2KVAFCQI.cjs} +1 -1
  115. package/dist/chunks/chunk-3I7Y6FUJ.js +1 -0
  116. package/dist/chunks/chunk-47UMFXDG.js +1 -0
  117. package/dist/chunks/{chunk-MXDZHU6E.cjs → chunk-4D3XBPZX.cjs} +2 -2
  118. package/dist/chunks/{chunk-VDC7N5TC.js → chunk-4VFV5U3S.js} +1 -1
  119. package/dist/chunks/{chunk-N36YROV3.js → chunk-5FUEJFGY.js} +1 -1
  120. package/dist/chunks/chunk-5XT6TJGF.js +1 -0
  121. package/dist/chunks/{chunk-XCP37UUA.cjs → chunk-6BI4QL37.cjs} +1 -1
  122. package/dist/chunks/chunk-6E5ARQBB.cjs +1 -0
  123. package/dist/chunks/chunk-7CEOIZXK.js +1 -0
  124. package/dist/chunks/chunk-7XPIY2SQ.cjs +1 -0
  125. package/dist/chunks/chunk-A6HIQADJ.cjs +1 -0
  126. package/dist/chunks/{chunk-66LIYNLT.cjs → chunk-AEBULFON.cjs} +1 -1
  127. package/dist/chunks/chunk-AK5IK7ZD.js +1 -0
  128. package/dist/chunks/chunk-AN2R5URJ.js +1 -0
  129. package/dist/chunks/chunk-BTR2N5MO.cjs +2 -0
  130. package/dist/chunks/chunk-BUNOVZ23.cjs +2 -0
  131. package/dist/chunks/chunk-CEEQE7SY.js +1 -0
  132. package/dist/chunks/chunk-CMHBPMXE.js +1 -0
  133. package/dist/chunks/chunk-DWYAPPDB.cjs +1 -0
  134. package/dist/chunks/chunk-E3DST3QD.cjs +1 -0
  135. package/dist/chunks/chunk-E4EMAZ6V.js +2 -0
  136. package/dist/chunks/chunk-E5UKEXJE.js +1 -0
  137. package/dist/chunks/{chunk-HA5QPLJP.cjs → chunk-FDTREGBQ.cjs} +1 -1
  138. package/dist/chunks/chunk-FGUFBTKI.cjs +1 -0
  139. package/dist/chunks/chunk-FQZX67Z7.js +1 -0
  140. package/dist/chunks/chunk-FROZM2O6.js +1 -0
  141. package/dist/chunks/chunk-G2VO67XY.js +1 -0
  142. package/dist/chunks/{chunk-NG7F3GCN.js → chunk-GYFFUCBT.js} +1 -1
  143. package/dist/chunks/chunk-I425OSJL.js +1 -0
  144. package/dist/chunks/chunk-ICDAUJ2G.cjs +1 -0
  145. package/dist/chunks/chunk-IFRKP7M2.js +1 -0
  146. package/dist/chunks/chunk-IHBP6FI4.js +1 -0
  147. package/dist/chunks/chunk-IL5XDMUA.cjs +1 -0
  148. package/dist/chunks/chunk-IRSGPS7D.cjs +1 -0
  149. package/dist/chunks/chunk-ITWFMFVO.js +1 -0
  150. package/dist/chunks/chunk-JJP23IOG.cjs +1 -0
  151. package/dist/chunks/chunk-JRYYWYGV.cjs +1 -0
  152. package/dist/chunks/chunk-KCIICUZN.cjs +1 -0
  153. package/dist/chunks/chunk-KFQVZ2HC.cjs +1 -0
  154. package/dist/chunks/chunk-KGRBVUVK.cjs +1 -0
  155. package/dist/chunks/chunk-KY4NDB23.cjs +1 -0
  156. package/dist/chunks/chunk-KZBYFKOH.js +1 -0
  157. package/dist/chunks/chunk-LFJEIO3X.cjs +1 -0
  158. package/dist/chunks/chunk-NY27TTWN.js +1 -0
  159. package/dist/chunks/chunk-OEXZGLB4.js +1 -0
  160. package/dist/chunks/chunk-QC67HOC2.cjs +1 -0
  161. package/dist/chunks/chunk-QLFCH4TD.js +1 -0
  162. package/dist/chunks/chunk-RPBESM5F.cjs +1 -0
  163. package/dist/chunks/chunk-SC4PNYQT.js +2 -0
  164. package/dist/chunks/chunk-SLHD7PST.cjs +1 -0
  165. package/dist/chunks/chunk-UEGTVAFV.cjs +1 -0
  166. package/dist/chunks/chunk-V34PT6H4.cjs +1 -0
  167. package/dist/chunks/chunk-VUWT3NFR.js +1 -0
  168. package/dist/chunks/chunk-W5UXZVLS.cjs +1 -0
  169. package/dist/chunks/chunk-WQOSJM7L.js +2 -0
  170. package/dist/chunks/chunk-WRPPKNRG.js +1 -0
  171. package/dist/chunks/chunk-XAOBJSFW.js +1 -0
  172. package/dist/chunks/chunk-XK7SMEDO.cjs +2 -0
  173. package/dist/chunks/chunk-XO6CNALX.js +1 -0
  174. package/dist/chunks/chunk-ZY7GZOBS.js +1 -0
  175. package/dist/index.cjs +1 -1
  176. package/dist/index.d.cts +15 -4
  177. package/dist/index.d.ts +15 -4
  178. package/dist/index.js +1 -1
  179. package/dist/styles/base.css +1239 -6
  180. package/dist/styles/tokens.css +230 -0
  181. package/dist/styles.css +1333 -6
  182. package/dist/theme.cjs +1 -1
  183. package/dist/theme.d.cts +63 -1
  184. package/dist/theme.d.ts +63 -1
  185. package/dist/theme.js +1 -1
  186. package/package.json +2 -1
  187. package/dist/chunks/chunk-2DFUB3KN.js +0 -1
  188. package/dist/chunks/chunk-4BKLB4KV.cjs +0 -1
  189. package/dist/chunks/chunk-5PFWPAB6.js +0 -1
  190. package/dist/chunks/chunk-5XPTHIGM.cjs +0 -1
  191. package/dist/chunks/chunk-63LKYF4D.cjs +0 -1
  192. package/dist/chunks/chunk-6HZRNHE6.js +0 -1
  193. package/dist/chunks/chunk-6OLB4BUJ.js +0 -1
  194. package/dist/chunks/chunk-7NYDMXZT.cjs +0 -1
  195. package/dist/chunks/chunk-AAFG7R4U.cjs +0 -1
  196. package/dist/chunks/chunk-ACQOSYBI.js +0 -1
  197. package/dist/chunks/chunk-BW6NCATH.js +0 -1
  198. package/dist/chunks/chunk-DWTXICFN.js +0 -1
  199. package/dist/chunks/chunk-DXXCR4ON.js +0 -1
  200. package/dist/chunks/chunk-EK4BC3WT.cjs +0 -1
  201. package/dist/chunks/chunk-ENRXEISR.js +0 -1
  202. package/dist/chunks/chunk-ER2MYWQO.cjs +0 -1
  203. package/dist/chunks/chunk-GAK5OQW4.cjs +0 -1
  204. package/dist/chunks/chunk-JAKATE3I.js +0 -1
  205. package/dist/chunks/chunk-KVV5ZEYV.cjs +0 -1
  206. package/dist/chunks/chunk-NBLJWONR.cjs +0 -1
  207. package/dist/chunks/chunk-NCJ5A6VE.js +0 -1
  208. package/dist/chunks/chunk-ORNYPP3O.cjs +0 -1
  209. package/dist/chunks/chunk-P652JDOU.cjs +0 -1
  210. package/dist/chunks/chunk-PODSD5UT.js +0 -1
  211. package/dist/chunks/chunk-PSMWVB3O.js +0 -1
  212. package/dist/chunks/chunk-QLKUAE3R.cjs +0 -1
  213. package/dist/chunks/chunk-R2K6KI4L.js +0 -1
  214. package/dist/chunks/chunk-SCSMM2J4.js +0 -1
  215. package/dist/chunks/chunk-SMZQSZH2.js +0 -1
  216. package/dist/chunks/chunk-TDI2N27U.cjs +0 -1
  217. package/dist/chunks/chunk-U2ZQHP4I.cjs +0 -1
  218. package/dist/chunks/chunk-XOO3AGIT.js +0 -1
@@ -62,10 +62,51 @@
62
62
 
63
63
  --animate-fade-in: fade-in 150ms ease-out;
64
64
  --animate-scale-in: scale-in 200ms ease-out;
65
+ --animate-dropdown-item-in: dropdown-item-in 200ms ease-out both;
66
+ --animate-dropdown-item-out: dropdown-item-out 150ms ease-in both;
67
+ --animate-dropdown-container-in: dropdown-container-in 150ms ease-out both;
68
+ --animate-dropdown-container-out: dropdown-container-out 120ms ease-in both;
65
69
  --animate-slide-in-right: slide-in-right 300ms ease-out;
66
70
  --animate-slide-in-left: slide-in-left 300ms ease-out;
67
71
  --animate-slide-in-top: slide-in-top 300ms ease-out;
68
72
  --animate-slide-in-bottom: slide-in-bottom 300ms ease-out;
73
+ --animate-progress-indeterminate: progress-indeterminate 1.5s ease-in-out infinite;
74
+ --animate-progress-shine: progress-shine 2s ease-in-out infinite;
75
+ --animate-spin-rotate: spin-rotate 1.4s linear infinite;
76
+ --animate-spin-dash: spin-dash 1.4s ease-in-out infinite;
77
+ --animate-masonry-ripple: masonry-ripple 0.6s ease-out forwards;
78
+
79
+ /* ── Syntax highlighting (semantic) ─────────────────── */
80
+ --color-syntax-keyword: var(--color-primary-600);
81
+ --color-syntax-string: var(--color-success-600);
82
+ --color-syntax-comment: var(--color-secondary-400);
83
+ --color-syntax-function: var(--color-warning-600);
84
+ --color-syntax-variable: var(--color-danger-600);
85
+ --color-syntax-number: var(--color-warning-500);
86
+ --color-syntax-operator: var(--color-secondary-600);
87
+ --color-syntax-tag: var(--color-danger-500);
88
+ --color-syntax-attr: var(--color-warning-600);
89
+ --color-syntax-punctuation: var(--color-secondary-500);
90
+ --color-syntax-type: var(--color-success-700);
91
+ --color-syntax-plain: var(--color-primary-800);
92
+ --color-syntax-bg: var(--color-primary-50);
93
+ }
94
+
95
+ /* ── Syntax tokens: dark overrides ─────────────────── */
96
+ .dark {
97
+ --color-syntax-keyword: var(--color-primary-400);
98
+ --color-syntax-string: var(--color-success-400);
99
+ --color-syntax-comment: var(--color-secondary-500);
100
+ --color-syntax-function: var(--color-warning-400);
101
+ --color-syntax-variable: var(--color-danger-400);
102
+ --color-syntax-number: var(--color-warning-300);
103
+ --color-syntax-operator: var(--color-secondary-400);
104
+ --color-syntax-tag: var(--color-danger-400);
105
+ --color-syntax-attr: var(--color-warning-300);
106
+ --color-syntax-punctuation: var(--color-secondary-400);
107
+ --color-syntax-type: var(--color-success-300);
108
+ --color-syntax-plain: var(--color-primary-200);
109
+ --color-syntax-bg: var(--color-primary-900);
69
110
  }
70
111
 
71
112
  @keyframes fade-in {
@@ -78,6 +119,28 @@
78
119
  to { opacity: 1; transform: scale(1); }
79
120
  }
80
121
 
122
+ /* Dropdown item domino: flip from top edge (rotateX) + fade */
123
+ @keyframes dropdown-item-in {
124
+ from { opacity: 0; transform: perspective(400px) rotateX(-50deg); transform-origin: top center; }
125
+ to { opacity: 1; transform: perspective(400px) rotateX(0deg); transform-origin: top center; }
126
+ }
127
+
128
+ @keyframes dropdown-item-out {
129
+ from { opacity: 1; transform: perspective(400px) rotateX(0deg); transform-origin: top center; }
130
+ to { opacity: 0; transform: perspective(400px) rotateX(-50deg); transform-origin: top center; }
131
+ }
132
+
133
+ /* Dropdown container fade+scale */
134
+ @keyframes dropdown-container-in {
135
+ from { opacity: 0; transform: scaleY(0.96); transform-origin: top center; }
136
+ to { opacity: 1; transform: scaleY(1); transform-origin: top center; }
137
+ }
138
+
139
+ @keyframes dropdown-container-out {
140
+ from { opacity: 1; transform: scaleY(1); transform-origin: top center; }
141
+ to { opacity: 0; transform: scaleY(0.96); transform-origin: top center; }
142
+ }
143
+
81
144
  @keyframes slide-in-right {
82
145
  from { opacity: 0; transform: translateX(100%); }
83
146
  to { opacity: 1; transform: translateX(0); }
@@ -114,3 +177,170 @@
114
177
  );
115
178
  animation: light-sweep 0.8s ease-in-out;
116
179
  }
180
+
181
+ /* ── Spin animations ─────────────────────────────────── */
182
+
183
+ @keyframes spin-rotate {
184
+ 100% { transform: rotate(360deg); }
185
+ }
186
+
187
+ @keyframes spin-dash {
188
+ 0% { stroke-dasharray: 1, 150; stroke-dashoffset: 0; }
189
+ 50% { stroke-dasharray: 90, 150; stroke-dashoffset: -35; }
190
+ 100% { stroke-dasharray: 90, 150; stroke-dashoffset: -124; }
191
+ }
192
+
193
+ /* ── ProgressBar animations ──────────────────────────── */
194
+
195
+ @keyframes progress-indeterminate {
196
+ 0% { left: -40%; width: 40%; }
197
+ 50% { left: 30%; width: 50%; }
198
+ 100% { left: 100%; width: 10%; }
199
+ }
200
+
201
+ @keyframes progress-shine {
202
+ 0% { background-image: none; }
203
+ 50% {
204
+ background-image: linear-gradient(
205
+ 90deg,
206
+ transparent 0%,
207
+ rgba(255, 255, 255, 0.35) 50%,
208
+ transparent 100%
209
+ );
210
+ background-size: 50% 100%;
211
+ background-position: -100% 0;
212
+ }
213
+ 100% { background-image: none; }
214
+ }
215
+
216
+ /* ── Accordion size tokens ───────────────────────────── */
217
+ :root {
218
+ --accordion-trigger-py-sm: 0.375rem;
219
+ --accordion-trigger-py-md: 0.75rem;
220
+ --accordion-trigger-py-lg: 1rem;
221
+ --accordion-content-pb-sm: 0.375rem;
222
+ --accordion-content-pb-md: 0.75rem;
223
+ --accordion-content-pb-lg: 1rem;
224
+ --accordion-trigger-text-sm: 0.75rem;
225
+ --accordion-trigger-text-md: 0.875rem;
226
+ --accordion-trigger-text-lg: 1rem;
227
+ --accordion-content-text-sm: 0.75rem;
228
+ --accordion-content-text-md: 0.875rem;
229
+ --accordion-content-text-lg: 1rem;
230
+ }
231
+
232
+ /* ── Badge size tokens ───────────────────────────────── */
233
+ :root {
234
+ --badge-px-sm: 0.375rem;
235
+ --badge-px-md: 0.625rem;
236
+ --badge-px-lg: 0.75rem;
237
+ --badge-py-sm: 0px;
238
+ --badge-py-md: 0.125rem;
239
+ --badge-py-lg: 0.25rem;
240
+ --badge-text-sm: 0.625rem;
241
+ --badge-text-md: 0.75rem;
242
+ --badge-text-lg: 0.875rem;
243
+ --badge-icon-sm: 0.625rem;
244
+ --badge-icon-md: 0.75rem;
245
+ --badge-icon-lg: 0.875rem;
246
+ }
247
+
248
+ /* ── List size tokens ────────────────────────────────── */
249
+ :root {
250
+ --list-item-py-sm: 0.25rem;
251
+ --list-item-py-md: 0.375rem;
252
+ --list-item-py-lg: 0.5rem;
253
+ --list-item-text-sm: 0.75rem;
254
+ --list-item-text-md: 0.875rem;
255
+ --list-item-text-lg: 1rem;
256
+ --list-item-icon-sm: 0.75rem;
257
+ --list-item-icon-md: 0.875rem;
258
+ --list-item-icon-lg: 1rem;
259
+ }
260
+
261
+ /* ── Tree size tokens ────────────────────────────────── */
262
+ :root {
263
+ --tree-item-py-sm: 0.125rem;
264
+ --tree-item-py-md: 0.25rem;
265
+ --tree-item-py-lg: 0.375rem;
266
+ --tree-item-text-sm: 0.75rem;
267
+ --tree-item-text-md: 0.875rem;
268
+ --tree-item-text-lg: 1rem;
269
+ --tree-item-icon-sm: 0.875rem;
270
+ --tree-item-icon-md: 1rem;
271
+ --tree-item-icon-lg: 1.125rem;
272
+ }
273
+
274
+ /* ── Header tokens ───────────────────────────────────── */
275
+ :root {
276
+ --header-mobile-bg: theme(colors.white);
277
+ --header-mobile-border: theme(colors.primary.200);
278
+ }
279
+ .dark {
280
+ --header-mobile-bg: theme(colors.primary.900);
281
+ --header-mobile-border: theme(colors.primary.700);
282
+ }
283
+
284
+ /* ── Table density tokens ────────────────────────────── */
285
+ :root {
286
+ --table-cell-px-compact: 0.5rem;
287
+ --table-cell-py-compact: 0.25rem;
288
+ --table-cell-px-default: 1rem;
289
+ --table-cell-py-default: 0.75rem;
290
+ --table-cell-px-relaxed: 1.5rem;
291
+ --table-cell-py-relaxed: 1.25rem;
292
+ }
293
+
294
+ /* ── Tooltip tokens ──────────────────────────────────── */
295
+ :root {
296
+ --tooltip-max-width: 16rem;
297
+ }
298
+
299
+ /* ── Toast tokens ────────────────────────────────────── */
300
+ :root {
301
+ --toast-width: 20rem;
302
+ }
303
+
304
+ /* ── Dialog bottom-sheet tokens ──────────────────────── */
305
+ :root {
306
+ --dialog-sheet-radius: 0.75rem;
307
+ }
308
+
309
+ /* ── Form / FormItem tokens ──────────────────────────── */
310
+ :root {
311
+ /* label column width in "inline" layout */
312
+ --form-label-w-sm: 5rem;
313
+ --form-label-w-md: 7rem;
314
+ --form-label-w-lg: 9rem;
315
+
316
+ /* row gap between label and control */
317
+ --form-item-gap-sm: 0.5rem;
318
+ --form-item-gap-md: 0.75rem;
319
+ --form-item-gap-lg: 1rem;
320
+
321
+ /* vertical gap between FormItems */
322
+ --form-row-gap-sm: 0.75rem;
323
+ --form-row-gap-md: 1.25rem;
324
+ --form-row-gap-lg: 1.75rem;
325
+
326
+ /* validation message text sizes */
327
+ --form-hint-text: 0.75rem; /* text-xs */
328
+
329
+ /* section spacing */
330
+ --form-header-mb: 1.5rem;
331
+ --form-footer-pt: 1.5rem;
332
+ --form-footer-gap: 0.5rem;
333
+
334
+ /* form border radius */
335
+ --form-radius: 0.5rem;
336
+
337
+ /* row actions — minimum tap target on touch devices */
338
+ --row-action-touch-min: 2.25rem;
339
+ }
340
+
341
+ /* ── Indicator tokens ────────────────────────────────── */
342
+ :root {
343
+ --indicator-dot-size-sm: 0.375rem; /* 6px */
344
+ --indicator-dot-size-md: 0.5rem; /* 8px */
345
+ --indicator-dot-size-lg: 0.625rem; /* 10px */
346
+ }