@epilot/spark-ui 1.0.0-alpha.2 → 1.0.0-alpha.4

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 (561) hide show
  1. package/LICENSE +201 -0
  2. package/NOTICE +2 -0
  3. package/README.md +7 -1
  4. package/dist/chunk-aJGBMT86.cjs +29 -0
  5. package/dist/components/accordion.cjs +57 -0
  6. package/dist/components/accordion.cjs.map +1 -0
  7. package/dist/components/accordion.d.cts +45 -0
  8. package/dist/components/accordion.d.ts +45 -0
  9. package/dist/components/accordion.js +51 -0
  10. package/dist/components/accordion.js.map +1 -0
  11. package/dist/components/alert-dialog.cjs +137 -0
  12. package/dist/components/alert-dialog.cjs.map +1 -0
  13. package/dist/components/alert-dialog.d.cts +63 -0
  14. package/dist/components/alert-dialog.d.ts +63 -0
  15. package/dist/components/alert-dialog.js +123 -0
  16. package/dist/components/alert-dialog.js.map +1 -0
  17. package/dist/components/attachment.cjs +119 -0
  18. package/dist/components/attachment.cjs.map +1 -0
  19. package/dist/components/attachment.d.cts +67 -0
  20. package/dist/components/attachment.d.ts +67 -0
  21. package/dist/components/attachment.js +108 -0
  22. package/dist/components/attachment.js.map +1 -0
  23. package/dist/components/badge.cjs +20 -0
  24. package/dist/components/badge.cjs.map +1 -0
  25. package/dist/components/badge.d.cts +12 -0
  26. package/dist/components/badge.d.ts +12 -0
  27. package/dist/components/badge.js +17 -0
  28. package/dist/components/badge.js.map +1 -0
  29. package/dist/components/bar-chart.cjs +520 -0
  30. package/dist/components/bar-chart.cjs.map +1 -0
  31. package/dist/components/bar-chart.d.cts +88 -0
  32. package/dist/components/bar-chart.d.ts +88 -0
  33. package/dist/components/bar-chart.js +518 -0
  34. package/dist/components/bar-chart.js.map +1 -0
  35. package/dist/components/battery-progress-row.cjs +140 -0
  36. package/dist/components/battery-progress-row.cjs.map +1 -0
  37. package/dist/components/battery-progress-row.d.cts +78 -0
  38. package/dist/components/battery-progress-row.d.ts +78 -0
  39. package/dist/components/battery-progress-row.js +129 -0
  40. package/dist/components/battery-progress-row.js.map +1 -0
  41. package/dist/components/breadcrumbs.cjs +65 -0
  42. package/dist/components/breadcrumbs.cjs.map +1 -0
  43. package/dist/components/breadcrumbs.d.cts +44 -0
  44. package/dist/components/breadcrumbs.d.ts +44 -0
  45. package/dist/components/breadcrumbs.js +58 -0
  46. package/dist/components/breadcrumbs.js.map +1 -0
  47. package/dist/components/bubble.cjs +84 -0
  48. package/dist/components/bubble.cjs.map +1 -0
  49. package/dist/components/bubble.d.cts +41 -0
  50. package/dist/components/bubble.d.ts +41 -0
  51. package/dist/components/bubble.js +78 -0
  52. package/dist/components/bubble.js.map +1 -0
  53. package/dist/components/button.cjs +54 -0
  54. package/dist/components/button.cjs.map +1 -0
  55. package/dist/components/button.d.cts +42 -0
  56. package/dist/components/button.d.ts +42 -0
  57. package/dist/components/button.js +50 -0
  58. package/dist/components/button.js.map +1 -0
  59. package/dist/components/calendar.cjs +58 -0
  60. package/dist/components/calendar.cjs.map +1 -0
  61. package/dist/components/calendar.d.cts +17 -0
  62. package/dist/components/calendar.d.ts +17 -0
  63. package/dist/components/calendar.js +55 -0
  64. package/dist/components/calendar.js.map +1 -0
  65. package/dist/components/callout.cjs +95 -0
  66. package/dist/components/callout.cjs.map +1 -0
  67. package/dist/components/callout.d.cts +39 -0
  68. package/dist/components/callout.d.ts +39 -0
  69. package/dist/components/callout.js +88 -0
  70. package/dist/components/callout.js.map +1 -0
  71. package/dist/components/card.cjs +86 -0
  72. package/dist/components/card.cjs.map +1 -0
  73. package/dist/components/card.d.cts +28 -0
  74. package/dist/components/card.d.ts +28 -0
  75. package/dist/components/card.js +76 -0
  76. package/dist/components/card.js.map +1 -0
  77. package/dist/components/chart.cjs +93 -0
  78. package/dist/components/chart.cjs.map +1 -0
  79. package/dist/components/chart.d.cts +83 -0
  80. package/dist/components/chart.d.ts +83 -0
  81. package/dist/components/chart.js +88 -0
  82. package/dist/components/chart.js.map +1 -0
  83. package/dist/components/checkbox.cjs +37 -0
  84. package/dist/components/checkbox.cjs.map +1 -0
  85. package/dist/components/checkbox.d.cts +22 -0
  86. package/dist/components/checkbox.d.ts +22 -0
  87. package/dist/components/checkbox.js +34 -0
  88. package/dist/components/checkbox.js.map +1 -0
  89. package/dist/components/circular-gauge.cjs +74 -0
  90. package/dist/components/circular-gauge.cjs.map +1 -0
  91. package/dist/components/circular-gauge.d.cts +38 -0
  92. package/dist/components/circular-gauge.d.ts +38 -0
  93. package/dist/components/circular-gauge.js +71 -0
  94. package/dist/components/circular-gauge.js.map +1 -0
  95. package/dist/components/day-of-week-picker.cjs +123 -0
  96. package/dist/components/day-of-week-picker.cjs.map +1 -0
  97. package/dist/components/day-of-week-picker.d.cts +39 -0
  98. package/dist/components/day-of-week-picker.d.ts +39 -0
  99. package/dist/components/day-of-week-picker.js +119 -0
  100. package/dist/components/day-of-week-picker.js.map +1 -0
  101. package/dist/components/device-card.cjs +118 -0
  102. package/dist/components/device-card.cjs.map +1 -0
  103. package/dist/components/device-card.d.cts +71 -0
  104. package/dist/components/device-card.d.ts +71 -0
  105. package/dist/components/device-card.js +104 -0
  106. package/dist/components/device-card.js.map +1 -0
  107. package/dist/components/dialog.cjs +115 -0
  108. package/dist/components/dialog.cjs.map +1 -0
  109. package/dist/components/dialog.d.cts +45 -0
  110. package/dist/components/dialog.d.ts +45 -0
  111. package/dist/components/dialog.js +103 -0
  112. package/dist/components/dialog.js.map +1 -0
  113. package/dist/components/donut-chart.cjs +71 -0
  114. package/dist/components/donut-chart.cjs.map +1 -0
  115. package/dist/components/donut-chart.d.cts +22 -0
  116. package/dist/components/donut-chart.d.ts +22 -0
  117. package/dist/components/donut-chart.js +69 -0
  118. package/dist/components/donut-chart.js.map +1 -0
  119. package/dist/components/drawer.cjs +95 -0
  120. package/dist/components/drawer.cjs.map +1 -0
  121. package/dist/components/drawer.d.cts +46 -0
  122. package/dist/components/drawer.d.ts +46 -0
  123. package/dist/components/drawer.js +83 -0
  124. package/dist/components/drawer.js.map +1 -0
  125. package/dist/components/dropdown-menu.cjs +165 -0
  126. package/dist/components/dropdown-menu.cjs.map +1 -0
  127. package/dist/components/dropdown-menu.d.cts +93 -0
  128. package/dist/components/dropdown-menu.d.ts +93 -0
  129. package/dist/components/dropdown-menu.js +148 -0
  130. package/dist/components/dropdown-menu.js.map +1 -0
  131. package/dist/components/empty-state.cjs +35 -0
  132. package/dist/components/empty-state.cjs.map +1 -0
  133. package/dist/components/empty-state.d.cts +22 -0
  134. package/dist/components/empty-state.d.ts +22 -0
  135. package/dist/components/empty-state.js +33 -0
  136. package/dist/components/empty-state.js.map +1 -0
  137. package/dist/components/energy-bar-chart.cjs +24 -0
  138. package/dist/components/energy-bar-chart.cjs.map +1 -0
  139. package/dist/components/energy-bar-chart.d.cts +43 -0
  140. package/dist/components/energy-bar-chart.d.ts +43 -0
  141. package/dist/components/energy-bar-chart.js +22 -0
  142. package/dist/components/energy-bar-chart.js.map +1 -0
  143. package/dist/components/energy-breakdown.cjs +81 -0
  144. package/dist/components/energy-breakdown.cjs.map +1 -0
  145. package/dist/components/energy-breakdown.d.cts +26 -0
  146. package/dist/components/energy-breakdown.d.ts +26 -0
  147. package/dist/components/energy-breakdown.js +79 -0
  148. package/dist/components/energy-breakdown.js.map +1 -0
  149. package/dist/components/energy-history-chart.cjs +64 -0
  150. package/dist/components/energy-history-chart.cjs.map +1 -0
  151. package/dist/components/energy-history-chart.d.cts +66 -0
  152. package/dist/components/energy-history-chart.d.ts +66 -0
  153. package/dist/components/energy-history-chart.js +62 -0
  154. package/dist/components/energy-history-chart.js.map +1 -0
  155. package/dist/components/feed-in-hero.cjs +56 -0
  156. package/dist/components/feed-in-hero.cjs.map +1 -0
  157. package/dist/components/feed-in-hero.d.cts +33 -0
  158. package/dist/components/feed-in-hero.d.ts +33 -0
  159. package/dist/components/feed-in-hero.js +51 -0
  160. package/dist/components/feed-in-hero.js.map +1 -0
  161. package/dist/components/field.cjs +257 -0
  162. package/dist/components/field.cjs.map +1 -0
  163. package/dist/components/field.d.cts +104 -0
  164. package/dist/components/field.d.ts +104 -0
  165. package/dist/components/field.js +243 -0
  166. package/dist/components/field.js.map +1 -0
  167. package/dist/components/icon.cjs +35 -0
  168. package/dist/components/icon.cjs.map +1 -0
  169. package/dist/components/icon.d.cts +27 -0
  170. package/dist/components/icon.d.ts +27 -0
  171. package/dist/components/icon.js +32 -0
  172. package/dist/components/icon.js.map +1 -0
  173. package/dist/components/info-block.cjs +75 -0
  174. package/dist/components/info-block.cjs.map +1 -0
  175. package/dist/components/info-block.d.cts +20 -0
  176. package/dist/components/info-block.d.ts +20 -0
  177. package/dist/components/info-block.js +65 -0
  178. package/dist/components/info-block.js.map +1 -0
  179. package/dist/components/input-group.cjs +164 -0
  180. package/dist/components/input-group.cjs.map +1 -0
  181. package/dist/components/input-group.d.cts +32 -0
  182. package/dist/components/input-group.d.ts +32 -0
  183. package/dist/components/input-group.js +158 -0
  184. package/dist/components/input-group.js.map +1 -0
  185. package/dist/components/input-otp.cjs +113 -0
  186. package/dist/components/input-otp.cjs.map +1 -0
  187. package/dist/components/input-otp.d.cts +22 -0
  188. package/dist/components/input-otp.d.ts +22 -0
  189. package/dist/components/input-otp.js +111 -0
  190. package/dist/components/input-otp.js.map +1 -0
  191. package/dist/components/input.cjs +112 -0
  192. package/dist/components/input.cjs.map +1 -0
  193. package/dist/components/input.d.cts +21 -0
  194. package/dist/components/input.d.ts +21 -0
  195. package/dist/components/input.js +109 -0
  196. package/dist/components/input.js.map +1 -0
  197. package/dist/components/label.cjs +18 -0
  198. package/dist/components/label.cjs.map +1 -0
  199. package/dist/components/label.d.cts +10 -0
  200. package/dist/components/label.d.ts +10 -0
  201. package/dist/components/label.js +15 -0
  202. package/dist/components/label.js.map +1 -0
  203. package/dist/components/layout.cjs +15 -0
  204. package/dist/components/layout.cjs.map +1 -0
  205. package/dist/components/layout.d.cts +12 -0
  206. package/dist/components/layout.d.ts +13 -0
  207. package/dist/components/layout.js +14 -0
  208. package/dist/components/layout.js.map +1 -0
  209. package/dist/components/line-chart.cjs +350 -0
  210. package/dist/components/line-chart.cjs.map +1 -0
  211. package/dist/components/line-chart.d.cts +78 -0
  212. package/dist/components/line-chart.d.ts +78 -0
  213. package/dist/components/line-chart.js +347 -0
  214. package/dist/components/line-chart.js.map +1 -0
  215. package/dist/components/list.cjs +132 -0
  216. package/dist/components/list.cjs.map +1 -0
  217. package/dist/components/list.d.cts +72 -0
  218. package/dist/components/list.d.ts +72 -0
  219. package/dist/components/list.js +122 -0
  220. package/dist/components/list.js.map +1 -0
  221. package/dist/components/marker.cjs +52 -0
  222. package/dist/components/marker.cjs.map +1 -0
  223. package/dist/components/marker.d.cts +29 -0
  224. package/dist/components/marker.d.ts +29 -0
  225. package/dist/components/marker.js +46 -0
  226. package/dist/components/marker.js.map +1 -0
  227. package/dist/components/message-scroller.cjs +73 -0
  228. package/dist/components/message-scroller.cjs.map +1 -0
  229. package/dist/components/message-scroller.d.cts +39 -0
  230. package/dist/components/message-scroller.d.ts +39 -0
  231. package/dist/components/message-scroller.js +62 -0
  232. package/dist/components/message-scroller.js.map +1 -0
  233. package/dist/components/message.cjs +60 -0
  234. package/dist/components/message.cjs.map +1 -0
  235. package/dist/components/message.d.cts +36 -0
  236. package/dist/components/message.d.ts +36 -0
  237. package/dist/components/message.js +52 -0
  238. package/dist/components/message.js.map +1 -0
  239. package/dist/components/metering-row.cjs +43 -0
  240. package/dist/components/metering-row.cjs.map +1 -0
  241. package/dist/components/metering-row.d.cts +32 -0
  242. package/dist/components/metering-row.d.ts +32 -0
  243. package/dist/components/metering-row.js +38 -0
  244. package/dist/components/metering-row.js.map +1 -0
  245. package/dist/components/money-saved-block.cjs +87 -0
  246. package/dist/components/money-saved-block.cjs.map +1 -0
  247. package/dist/components/money-saved-block.d.cts +57 -0
  248. package/dist/components/money-saved-block.d.ts +57 -0
  249. package/dist/components/money-saved-block.js +79 -0
  250. package/dist/components/money-saved-block.js.map +1 -0
  251. package/dist/components/number-flow.cjs +44 -0
  252. package/dist/components/number-flow.cjs.map +1 -0
  253. package/dist/components/number-flow.d.cts +4 -0
  254. package/dist/components/number-flow.d.ts +4 -0
  255. package/dist/components/number-flow.js +42 -0
  256. package/dist/components/number-flow.js.map +1 -0
  257. package/dist/components/on-off-button.cjs +36 -0
  258. package/dist/components/on-off-button.cjs.map +1 -0
  259. package/dist/components/on-off-button.d.cts +20 -0
  260. package/dist/components/on-off-button.d.ts +20 -0
  261. package/dist/components/on-off-button.js +34 -0
  262. package/dist/components/on-off-button.js.map +1 -0
  263. package/dist/components/onboarding-layout.cjs +68 -0
  264. package/dist/components/onboarding-layout.cjs.map +1 -0
  265. package/dist/components/onboarding-layout.d.cts +46 -0
  266. package/dist/components/onboarding-layout.d.ts +46 -0
  267. package/dist/components/onboarding-layout.js +60 -0
  268. package/dist/components/onboarding-layout.js.map +1 -0
  269. package/dist/components/page-header.cjs +50 -0
  270. package/dist/components/page-header.cjs.map +1 -0
  271. package/dist/components/page-header.d.cts +26 -0
  272. package/dist/components/page-header.d.ts +26 -0
  273. package/dist/components/page-header.js +44 -0
  274. package/dist/components/page-header.js.map +1 -0
  275. package/dist/components/page-spinner.cjs +19 -0
  276. package/dist/components/page-spinner.cjs.map +1 -0
  277. package/dist/components/page-spinner.d.cts +14 -0
  278. package/dist/components/page-spinner.d.ts +14 -0
  279. package/dist/components/page-spinner.js +17 -0
  280. package/dist/components/page-spinner.js.map +1 -0
  281. package/dist/components/period-tabs.cjs +79 -0
  282. package/dist/components/period-tabs.cjs.map +1 -0
  283. package/dist/components/period-tabs.d.cts +51 -0
  284. package/dist/components/period-tabs.d.ts +51 -0
  285. package/dist/components/period-tabs.js +73 -0
  286. package/dist/components/period-tabs.js.map +1 -0
  287. package/dist/components/popover.cjs +62 -0
  288. package/dist/components/popover.cjs.map +1 -0
  289. package/dist/components/popover.d.cts +29 -0
  290. package/dist/components/popover.d.ts +29 -0
  291. package/dist/components/popover.js +56 -0
  292. package/dist/components/popover.js.map +1 -0
  293. package/dist/components/power-history-chart.cjs +335 -0
  294. package/dist/components/power-history-chart.cjs.map +1 -0
  295. package/dist/components/power-history-chart.d.cts +63 -0
  296. package/dist/components/power-history-chart.d.ts +63 -0
  297. package/dist/components/power-history-chart.js +332 -0
  298. package/dist/components/power-history-chart.js.map +1 -0
  299. package/dist/components/power-history.cjs +115 -0
  300. package/dist/components/power-history.cjs.map +1 -0
  301. package/dist/components/power-history.d.cts +42 -0
  302. package/dist/components/power-history.d.ts +43 -0
  303. package/dist/components/power-history.js +114 -0
  304. package/dist/components/power-history.js.map +1 -0
  305. package/dist/components/power-network.cjs +530 -0
  306. package/dist/components/power-network.cjs.map +1 -0
  307. package/dist/components/power-network.d.cts +77 -0
  308. package/dist/components/power-network.d.ts +77 -0
  309. package/dist/components/power-network.js +523 -0
  310. package/dist/components/power-network.js.map +1 -0
  311. package/dist/components/progress.cjs +34 -0
  312. package/dist/components/progress.cjs.map +1 -0
  313. package/dist/components/progress.d.cts +17 -0
  314. package/dist/components/progress.d.ts +17 -0
  315. package/dist/components/progress.js +31 -0
  316. package/dist/components/progress.js.map +1 -0
  317. package/dist/components/radio-card-group.cjs +69 -0
  318. package/dist/components/radio-card-group.cjs.map +1 -0
  319. package/dist/components/radio-card-group.d.cts +21 -0
  320. package/dist/components/radio-card-group.d.ts +21 -0
  321. package/dist/components/radio-card-group.js +65 -0
  322. package/dist/components/radio-card-group.js.map +1 -0
  323. package/dist/components/radio.cjs +34 -0
  324. package/dist/components/radio.cjs.map +1 -0
  325. package/dist/components/radio.d.cts +21 -0
  326. package/dist/components/radio.d.ts +21 -0
  327. package/dist/components/radio.js +30 -0
  328. package/dist/components/radio.js.map +1 -0
  329. package/dist/components/reparent.cjs +55 -0
  330. package/dist/components/reparent.cjs.map +1 -0
  331. package/dist/components/reparent.d.cts +29 -0
  332. package/dist/components/reparent.d.ts +29 -0
  333. package/dist/components/reparent.js +49 -0
  334. package/dist/components/reparent.js.map +1 -0
  335. package/dist/components/sankey-chart.cjs +188 -0
  336. package/dist/components/sankey-chart.cjs.map +1 -0
  337. package/dist/components/sankey-chart.d.cts +66 -0
  338. package/dist/components/sankey-chart.d.ts +66 -0
  339. package/dist/components/sankey-chart.js +185 -0
  340. package/dist/components/sankey-chart.js.map +1 -0
  341. package/dist/components/schedule-editor.cjs +82 -0
  342. package/dist/components/schedule-editor.cjs.map +1 -0
  343. package/dist/components/schedule-editor.d.cts +25 -0
  344. package/dist/components/schedule-editor.d.ts +25 -0
  345. package/dist/components/schedule-editor.js +72 -0
  346. package/dist/components/schedule-editor.js.map +1 -0
  347. package/dist/components/schedule-list.cjs +110 -0
  348. package/dist/components/schedule-list.cjs.map +1 -0
  349. package/dist/components/schedule-list.d.cts +29 -0
  350. package/dist/components/schedule-list.d.ts +29 -0
  351. package/dist/components/schedule-list.js +99 -0
  352. package/dist/components/schedule-list.js.map +1 -0
  353. package/dist/components/scroll-area.cjs +53 -0
  354. package/dist/components/scroll-area.cjs.map +1 -0
  355. package/dist/components/scroll-area.d.cts +26 -0
  356. package/dist/components/scroll-area.d.ts +26 -0
  357. package/dist/components/scroll-area.js +44 -0
  358. package/dist/components/scroll-area.js.map +1 -0
  359. package/dist/components/segmented-control.cjs +44 -0
  360. package/dist/components/segmented-control.cjs.map +1 -0
  361. package/dist/components/segmented-control.d.cts +33 -0
  362. package/dist/components/segmented-control.d.ts +33 -0
  363. package/dist/components/segmented-control.js +40 -0
  364. package/dist/components/segmented-control.js.map +1 -0
  365. package/dist/components/select.cjs +136 -0
  366. package/dist/components/select.cjs.map +1 -0
  367. package/dist/components/select.d.cts +63 -0
  368. package/dist/components/select.d.ts +63 -0
  369. package/dist/components/select.js +124 -0
  370. package/dist/components/select.js.map +1 -0
  371. package/dist/components/separator.cjs +38 -0
  372. package/dist/components/separator.cjs.map +1 -0
  373. package/dist/components/separator.d.cts +13 -0
  374. package/dist/components/separator.d.ts +13 -0
  375. package/dist/components/separator.js +35 -0
  376. package/dist/components/separator.js.map +1 -0
  377. package/dist/components/series-legend.cjs +39 -0
  378. package/dist/components/series-legend.cjs.map +1 -0
  379. package/dist/components/series-legend.d.cts +31 -0
  380. package/dist/components/series-legend.d.ts +31 -0
  381. package/dist/components/series-legend.js +37 -0
  382. package/dist/components/series-legend.js.map +1 -0
  383. package/dist/components/sheet.cjs +102 -0
  384. package/dist/components/sheet.cjs.map +1 -0
  385. package/dist/components/sheet.d.cts +46 -0
  386. package/dist/components/sheet.d.ts +46 -0
  387. package/dist/components/sheet.js +90 -0
  388. package/dist/components/sheet.js.map +1 -0
  389. package/dist/components/skeleton.cjs +24 -0
  390. package/dist/components/skeleton.cjs.map +1 -0
  391. package/dist/components/skeleton.d.cts +24 -0
  392. package/dist/components/skeleton.d.ts +24 -0
  393. package/dist/components/skeleton.js +21 -0
  394. package/dist/components/skeleton.js.map +1 -0
  395. package/dist/components/slider.cjs +276 -0
  396. package/dist/components/slider.cjs.map +1 -0
  397. package/dist/components/slider.d.cts +150 -0
  398. package/dist/components/slider.d.ts +150 -0
  399. package/dist/components/slider.js +266 -0
  400. package/dist/components/slider.js.map +1 -0
  401. package/dist/components/smart-toggle-button.cjs +28 -0
  402. package/dist/components/smart-toggle-button.cjs.map +1 -0
  403. package/dist/components/smart-toggle-button.d.cts +18 -0
  404. package/dist/components/smart-toggle-button.d.ts +18 -0
  405. package/dist/components/smart-toggle-button.js +26 -0
  406. package/dist/components/smart-toggle-button.js.map +1 -0
  407. package/dist/components/solar-forecast-chart.cjs +106 -0
  408. package/dist/components/solar-forecast-chart.cjs.map +1 -0
  409. package/dist/components/solar-forecast-chart.d.cts +69 -0
  410. package/dist/components/solar-forecast-chart.d.ts +69 -0
  411. package/dist/components/solar-forecast-chart.js +100 -0
  412. package/dist/components/solar-forecast-chart.js.map +1 -0
  413. package/dist/components/sortable-list.cjs +69 -0
  414. package/dist/components/sortable-list.cjs.map +1 -0
  415. package/dist/components/sortable-list.d.cts +46 -0
  416. package/dist/components/sortable-list.d.ts +46 -0
  417. package/dist/components/sortable-list.js +67 -0
  418. package/dist/components/sortable-list.js.map +1 -0
  419. package/dist/components/spinner.cjs +42 -0
  420. package/dist/components/spinner.cjs.map +1 -0
  421. package/dist/components/spinner.d.cts +15 -0
  422. package/dist/components/spinner.d.ts +15 -0
  423. package/dist/components/spinner.js +39 -0
  424. package/dist/components/spinner.js.map +1 -0
  425. package/dist/components/stat-card.cjs +58 -0
  426. package/dist/components/stat-card.cjs.map +1 -0
  427. package/dist/components/stat-card.d.cts +36 -0
  428. package/dist/components/stat-card.d.ts +36 -0
  429. package/dist/components/stat-card.js +50 -0
  430. package/dist/components/stat-card.js.map +1 -0
  431. package/dist/components/stepper.cjs +79 -0
  432. package/dist/components/stepper.cjs.map +1 -0
  433. package/dist/components/stepper.d.cts +33 -0
  434. package/dist/components/stepper.d.ts +33 -0
  435. package/dist/components/stepper.js +76 -0
  436. package/dist/components/stepper.js.map +1 -0
  437. package/dist/components/switch.cjs +22 -0
  438. package/dist/components/switch.cjs.map +1 -0
  439. package/dist/components/switch.d.cts +28 -0
  440. package/dist/components/switch.d.ts +28 -0
  441. package/dist/components/switch.js +20 -0
  442. package/dist/components/switch.js.map +1 -0
  443. package/dist/components/tabs.cjs +175 -0
  444. package/dist/components/tabs.cjs.map +1 -0
  445. package/dist/components/tabs.d.cts +45 -0
  446. package/dist/components/tabs.d.ts +45 -0
  447. package/dist/components/tabs.js +167 -0
  448. package/dist/components/tabs.js.map +1 -0
  449. package/dist/components/theme.cjs +6 -0
  450. package/dist/components/theme.d.cts +38 -0
  451. package/dist/components/theme.d.ts +38 -0
  452. package/dist/components/theme.js +4 -0
  453. package/dist/components/thumbnail.cjs +54 -0
  454. package/dist/components/thumbnail.cjs.map +1 -0
  455. package/dist/components/thumbnail.d.cts +34 -0
  456. package/dist/components/thumbnail.d.ts +34 -0
  457. package/dist/components/thumbnail.js +51 -0
  458. package/dist/components/thumbnail.js.map +1 -0
  459. package/dist/components/time-picker.cjs +55 -0
  460. package/dist/components/time-picker.cjs.map +1 -0
  461. package/dist/components/time-picker.d.cts +41 -0
  462. package/dist/components/time-picker.d.ts +41 -0
  463. package/dist/components/time-picker.js +51 -0
  464. package/dist/components/time-picker.js.map +1 -0
  465. package/dist/components/toast.cjs +99 -0
  466. package/dist/components/toast.cjs.map +1 -0
  467. package/dist/components/toast.d.cts +18 -0
  468. package/dist/components/toast.d.ts +18 -0
  469. package/dist/components/toast.js +95 -0
  470. package/dist/components/toast.js.map +1 -0
  471. package/dist/components/tooltip.cjs +75 -0
  472. package/dist/components/tooltip.cjs.map +1 -0
  473. package/dist/components/tooltip.d.cts +47 -0
  474. package/dist/components/tooltip.d.ts +47 -0
  475. package/dist/components/tooltip.js +67 -0
  476. package/dist/components/tooltip.js.map +1 -0
  477. package/dist/components/typography.cjs +52 -0
  478. package/dist/components/typography.cjs.map +1 -0
  479. package/dist/components/typography.d.cts +32 -0
  480. package/dist/components/typography.d.ts +32 -0
  481. package/dist/components/typography.js +45 -0
  482. package/dist/components/typography.js.map +1 -0
  483. package/dist/hooks/use-container-width.cjs +22 -0
  484. package/dist/hooks/use-container-width.cjs.map +1 -0
  485. package/dist/hooks/use-container-width.d.cts +7 -0
  486. package/dist/hooks/use-container-width.d.ts +7 -0
  487. package/dist/hooks/use-container-width.js +20 -0
  488. package/dist/hooks/use-container-width.js.map +1 -0
  489. package/dist/icons/index.cjs +7 -0
  490. package/dist/icons/index.d.cts +4 -0
  491. package/dist/icons/index.d.ts +4 -0
  492. package/dist/icons/index.js +3 -0
  493. package/dist/icons/material-symbol.cjs +105 -0
  494. package/dist/icons/material-symbol.cjs.map +1 -0
  495. package/dist/icons/material-symbol.d.cts +23 -0
  496. package/dist/icons/material-symbol.d.ts +23 -0
  497. package/dist/icons/material-symbol.js +100 -0
  498. package/dist/icons/material-symbol.js.map +1 -0
  499. package/dist/input-box-variants-BMDdwvqg.cjs +40 -0
  500. package/dist/input-box-variants-BMDdwvqg.cjs.map +1 -0
  501. package/dist/input-box-variants-Dr1K7uYE.js +28 -0
  502. package/dist/input-box-variants-Dr1K7uYE.js.map +1 -0
  503. package/dist/number-flow-DMJouddg.d.cts +15 -0
  504. package/dist/number-flow-DSbucQ_K.d.ts +15 -0
  505. package/dist/styles/index.css +260 -0
  506. package/dist/styles/internal.css +5 -0
  507. package/dist/styles/material-symbol.css +22 -0
  508. package/dist/styles/spark-default.css +888 -0
  509. package/dist/styles/theme.css +620 -0
  510. package/dist/styles/utilities.css +557 -0
  511. package/dist/theme-C19BbKfO.js +574 -0
  512. package/dist/theme-C19BbKfO.js.map +1 -0
  513. package/dist/theme-CfFWrMEF.cjs +592 -0
  514. package/dist/theme-CfFWrMEF.cjs.map +1 -0
  515. package/dist/theme-types-DoROIXpi.d.ts +30 -0
  516. package/dist/theme-types-r20EJfEC.d.cts +30 -0
  517. package/dist/tones-DjgKOX3s.d.cts +8 -0
  518. package/dist/tones-DyCkL71h.d.ts +8 -0
  519. package/dist/utils/build-sankey-nodes.cjs +72 -0
  520. package/dist/utils/build-sankey-nodes.cjs.map +1 -0
  521. package/dist/utils/build-sankey-nodes.d.cts +27 -0
  522. package/dist/utils/build-sankey-nodes.d.ts +27 -0
  523. package/dist/utils/build-sankey-nodes.js +71 -0
  524. package/dist/utils/build-sankey-nodes.js.map +1 -0
  525. package/dist/utils/chars.cjs +18 -0
  526. package/dist/utils/chars.cjs.map +1 -0
  527. package/dist/utils/chars.d.cts +10 -0
  528. package/dist/utils/chars.d.ts +10 -0
  529. package/dist/utils/chars.js +14 -0
  530. package/dist/utils/chars.js.map +1 -0
  531. package/dist/utils/chart-scale.cjs +43 -0
  532. package/dist/utils/chart-scale.cjs.map +1 -0
  533. package/dist/utils/chart-scale.d.cts +22 -0
  534. package/dist/utils/chart-scale.d.ts +22 -0
  535. package/dist/utils/chart-scale.js +41 -0
  536. package/dist/utils/chart-scale.js.map +1 -0
  537. package/dist/utils/cn.cjs +10 -0
  538. package/dist/utils/cn.d.cts +4 -0
  539. package/dist/utils/cn.d.ts +4 -0
  540. package/dist/utils/cn.js +3 -0
  541. package/dist/utils/date-mask.cjs +45 -0
  542. package/dist/utils/date-mask.cjs.map +1 -0
  543. package/dist/utils/date-mask.d.cts +17 -0
  544. package/dist/utils/date-mask.d.ts +17 -0
  545. package/dist/utils/date-mask.js +41 -0
  546. package/dist/utils/date-mask.js.map +1 -0
  547. package/dist/utils/format.cjs +57 -0
  548. package/dist/utils/format.cjs.map +1 -0
  549. package/dist/utils/format.d.cts +23 -0
  550. package/dist/utils/format.d.ts +23 -0
  551. package/dist/utils/format.js +47 -0
  552. package/dist/utils/format.js.map +1 -0
  553. package/package.json +78 -63
  554. package/dist/index.cjs +0 -1631
  555. package/dist/index.cjs.map +0 -1
  556. package/dist/index.css +0 -1
  557. package/dist/index.d.cts +0 -299
  558. package/dist/index.d.ts +0 -299
  559. package/dist/index.js +0 -1518
  560. package/dist/index.js.map +0 -1
  561. package/dist/styles.js +0 -1
@@ -0,0 +1,888 @@
1
+ /*
2
+ * Default Spark brand tokens.
3
+ *
4
+ * These match the portal runtime generator defaults (primary: #005EB4),
5
+ * but are shipped statically so the UI library has a sensible default.
6
+ *
7
+ * Consumers can override any `--spark-*` variables if they want runtime theming.
8
+ */
9
+
10
+ @layer base {
11
+ :root,
12
+ .light,
13
+ .light-theme {
14
+ --spark-1: #fcfdfe;
15
+ --spark-2: #f6fafe;
16
+ --spark-3: #ebf3fd;
17
+ --spark-4: #dcebfe;
18
+ --spark-5: #cbe1fe;
19
+ --spark-6: #b6d5fc;
20
+ --spark-7: #9dc3f2;
21
+ --spark-8: #7aabe7;
22
+ --spark-9: #005eb4;
23
+ --spark-10: #004fa3;
24
+ --spark-11: #0f65bc;
25
+ --spark-12: #113157;
26
+
27
+ --spark-a1: #0055aa03;
28
+ --spark-a2: #0072e309;
29
+ --spark-a3: #0066e614;
30
+ --spark-a4: #006ef823;
31
+ --spark-a5: #006cfb34;
32
+ --spark-a6: #006df549;
33
+ --spark-a7: #0063de62;
34
+ --spark-a8: #005ed185;
35
+ --spark-a9: #005eb4;
36
+ --spark-a10: #004fa3;
37
+ --spark-a11: #005bb8f0;
38
+ --spark-a12: #00224bee;
39
+
40
+ --spark-contrast: #ffffff;
41
+ --spark-on-solid: #fff;
42
+ --spark-surface: #f4f9fecc;
43
+ --spark-background: #ffffff;
44
+ --spark-indicator: #005eb4;
45
+ --spark-track: #005eb4;
46
+
47
+ /* Companion tokens for the colour axis (Button color="neutral"|"danger").
48
+ These reference gamut-aware scales / flip per appearance, so one declaration
49
+ covers sRGB + p3 and light + dark. --neutral-contrast tracks the neutral knob;
50
+ --red-contrast is white (clears 3:1 on the appearance-stable red-9). */
51
+ --red-contrast: #fff;
52
+ --red-on-solid: #fff;
53
+ --red-surface: var(--red-2);
54
+ --neutral-contrast: var(--neutral-12);
55
+ --neutral-on-solid: #fff;
56
+ --neutral-surface: var(--neutral-2);
57
+
58
+ /* theme.css maps --color-{white,black}-contrast to these; Radix's alpha
59
+ scales don't define them (portal parity: ECP's generator used #fff). */
60
+ --white-contrast: #ffffff;
61
+ --black-contrast: #ffffff;
62
+ }
63
+
64
+ @supports (color: color(display-p3 1 1 1)) {
65
+ @media (color-gamut: p3) {
66
+ :root,
67
+ .light,
68
+ .light-theme {
69
+ --spark-1: oklch(99.4% 0.0013 254.2);
70
+ --spark-2: oklch(98.3% 0.0072 254.2);
71
+ --spark-3: oklch(96.1% 0.0155 254.2);
72
+ --spark-4: oklch(93.5% 0.0304 254.2);
73
+ --spark-5: oklch(90.3% 0.046 254.2);
74
+ --spark-6: oklch(86.3% 0.0643 254.2);
75
+ --spark-7: oklch(80.7% 0.0782 254.2);
76
+ --spark-8: oklch(73% 0.102 254.2);
77
+ --spark-9: oklch(48.6% 0.1556 254.2);
78
+ --spark-10: oklch(43.5% 0.1556 254.2);
79
+ --spark-11: oklch(51% 0.1556 254.2);
80
+ --spark-12: oklch(31.3% 0.077 254.2);
81
+
82
+ --spark-a1: color(display-p3 0.0235 0.349 0.6745 / 0.012);
83
+ --spark-a2: color(display-p3 0.0196 0.3882 0.8784 / 0.032);
84
+ --spark-a3: color(display-p3 0.0078 0.3725 0.8431 / 0.075);
85
+ --spark-a4: color(display-p3 0.0078 0.3804 0.9098 / 0.126);
86
+ --spark-a5: color(display-p3 0.0078 0.3569 0.9176 / 0.189);
87
+ --spark-a6: color(display-p3 0.0039 0.3608 0.898 / 0.263);
88
+ --spark-a7: color(display-p3 0.0039 0.3255 0.8118 / 0.353);
89
+ --spark-a8: color(display-p3 0.0039 0.3098 0.7647 / 0.483);
90
+ --spark-a9: color(display-p3 0 0.2471 0.6235 / 0.848);
91
+ --spark-a10: color(display-p3 0 0.2118 0.5608 / 0.879);
92
+ --spark-a11: color(display-p3 0 0.2549 0.651 / 0.82);
93
+ --spark-a12: color(display-p3 0 0.098 0.2549 / 0.899);
94
+
95
+ --spark-contrast: #ffffff;
96
+ --spark-on-solid: #fff;
97
+ --spark-surface: color(display-p3 0.9608 0.9765 0.9961 / 0.8);
98
+ --spark-background: #ffffff;
99
+ --spark-indicator: oklch(48.6% 0.1556 254.2);
100
+ --spark-track: oklch(48.6% 0.1556 254.2);
101
+ }
102
+ }
103
+ }
104
+
105
+ .dark,
106
+ .dark-theme {
107
+ --spark-1: #000;
108
+ --spark-2: #051222;
109
+ --spark-3: #00234c;
110
+ --spark-4: #002d6d;
111
+ --spark-5: #003a82;
112
+ --spark-6: #004895;
113
+ --spark-7: #0058ae;
114
+ --spark-8: #0069cf;
115
+ --spark-9: #005eb4;
116
+ --spark-10: #00509d;
117
+ --spark-11: #71b8ff;
118
+ --spark-12: #c5e4ff;
119
+
120
+ --spark-a1: #00000000;
121
+ --spark-a2: #2687ff22;
122
+ --spark-a3: #0076ff4c;
123
+ --spark-a4: #006aff6d;
124
+ --spark-a5: #0072ff82;
125
+ --spark-a6: #007cff95;
126
+ --spark-a7: #0081ffae;
127
+ --spark-a8: #0081ffcf;
128
+ --spark-a9: #0085ffb4;
129
+ --spark-a10: #0082ff9d;
130
+ --spark-a11: #71b8ff;
131
+ --spark-a12: #c5e4ff;
132
+
133
+ --spark-contrast: #fff;
134
+ --spark-on-solid: #fff;
135
+ --spark-surface: #0a244480;
136
+ --spark-background: #000;
137
+ --spark-indicator: #005eb4;
138
+ --spark-track: #005eb4;
139
+
140
+ --red-contrast: #fff;
141
+ --red-on-solid: #fff;
142
+ --red-surface: var(--red-2);
143
+ --neutral-contrast: var(--neutral-12);
144
+ --neutral-on-solid: #fff;
145
+ --neutral-surface: var(--neutral-2);
146
+ }
147
+
148
+ @supports (color: color(display-p3 1 1 1)) {
149
+ @media (color-gamut: p3) {
150
+ .dark,
151
+ .dark-theme {
152
+ --spark-1: oklch(0% 0.0326 254.2);
153
+ --spark-2: oklch(18% 0.0382 254.2);
154
+ --spark-3: oklch(25.8% 0.0872 254.2);
155
+ --spark-4: oklch(30.9% 0.126 254.2);
156
+ --spark-5: oklch(35.9% 0.1378 254.2);
157
+ --spark-6: oklch(41% 0.144 254.2);
158
+ --spark-7: oklch(46.6% 0.1556 254.2);
159
+ --spark-8: oklch(52.9% 0.1789 254.2);
160
+ --spark-9: oklch(48.6% 0.1556 254.2);
161
+ --spark-10: oklch(43.5% 0.144 254.2);
162
+ --spark-11: oklch(77.1% 0.1674 254.2);
163
+ --spark-12: oklch(90.8% 0.0614 254.2);
164
+
165
+ --spark-a1: color(display-p3 0 0 0 / 0);
166
+ --spark-a2: color(display-p3 0.2431 0.5451 0.9961 / 0.13);
167
+ --spark-a3: color(display-p3 0.1373 0.4667 1 / 0.287);
168
+ --spark-a4: color(display-p3 0.1451 0.4196 1 / 0.412);
169
+ --spark-a5: color(display-p3 0.1686 0.4588 1 / 0.491);
170
+ --spark-a6: color(display-p3 0.1961 0.4941 1 / 0.565);
171
+ --spark-a7: color(display-p3 0.2157 0.5176 1 / 0.659);
172
+ --spark-a8: color(display-p3 0.2196 0.5137 1 / 0.785);
173
+ --spark-a9: color(display-p3 0.2235 0.5294 1 / 0.683);
174
+ --spark-a10: color(display-p3 0.2118 0.5216 1 / 0.597);
175
+ --spark-a11: color(display-p3 0.5176 0.7294 1 / 0.977);
176
+ --spark-a12: color(display-p3 0.8039 0.902 1 / 0.989);
177
+
178
+ --spark-contrast: #fff;
179
+ --spark-on-solid: #fff;
180
+ --spark-surface: color(display-p3 0.0627 0.1412 0.2588 / 0.5);
181
+ --spark-background: #000;
182
+ --spark-indicator: oklch(48.6% 0.1556 254.2);
183
+ --spark-track: oklch(48.6% 0.1556 254.2);
184
+ }
185
+ }
186
+ }
187
+
188
+ /*
189
+ * Default "shape" (border radius) tokens.
190
+ * Default radius preset = `medium` (factor 2) = today's portal look.
191
+ * The [data-radius] presets below scale the factor; `full` also enables the
192
+ * pill token (--spark-rounded-full) used by the max() idiom on Button etc.
193
+ */
194
+ /* factor + pill on :root only, so nested scopes inherit rather than reset. */
195
+ :root {
196
+ --spark-rounded-factor: 2;
197
+ --spark-rounded-full: 0px;
198
+ }
199
+
200
+ /* size calcs on .spark-theme too, so a scope re-resolves them from its factor. */
201
+ :root,
202
+ .spark-theme {
203
+ --spark-rounded-sm: calc(3px * var(--spark-rounded-factor));
204
+ --spark-rounded-md: calc(4px * var(--spark-rounded-factor));
205
+ --spark-rounded-lg: calc(6px * var(--spark-rounded-factor));
206
+ --spark-rounded-xl: calc(8px * var(--spark-rounded-factor));
207
+ --spark-rounded-2xl: calc(12px * var(--spark-rounded-factor));
208
+ --spark-rounded-3xl: calc(16px * var(--spark-rounded-factor));
209
+ }
210
+
211
+ /*
212
+ * Roundness presets. Sets the factor on the scoped element; descendants
213
+ * inherit, so it cascades and is overridable at any level (global → block →
214
+ * element). No attribute = medium (the :root default above).
215
+ */
216
+ [data-radius='none'] {
217
+ --spark-rounded-factor: 0;
218
+ }
219
+
220
+ [data-radius='small'] {
221
+ --spark-rounded-factor: 1;
222
+ }
223
+
224
+ [data-radius='medium'] {
225
+ --spark-rounded-factor: 2;
226
+ }
227
+
228
+ [data-radius='large'] {
229
+ --spark-rounded-factor: 3;
230
+ }
231
+
232
+ /* non-full presets clear the pill, so a nested override drops an inherited full. */
233
+ [data-radius='none'],
234
+ [data-radius='small'],
235
+ [data-radius='medium'],
236
+ [data-radius='large'] {
237
+ --spark-rounded-full: 0px;
238
+ }
239
+
240
+ /* `full` does two complementary things (both intentional, not a temp hack): */
241
+ [data-radius='full'] {
242
+ --spark-rounded-factor: 3; /* large radii for normally-rounded elements */
243
+ --spark-rounded-full: 9999px; /* + pill token: pill-able components (Button via max()) become pills */
244
+ }
245
+
246
+ /*
247
+ * Neutral scale indirection. The semantic gray tokens in theme.css read
248
+ * --neutral-* instead of a hardwired scale, so [data-neutral-color] can swap the
249
+ * neutral. Default = slate; cascades & overrides like the radius presets.
250
+ */
251
+ /* also under .dark so neutrals re-resolve in dark mode with no [data-neutral-color] set. */
252
+ :root,
253
+ .dark,
254
+ .dark-theme {
255
+ --neutral-1: var(--slate-1);
256
+ --neutral-2: var(--slate-2);
257
+ --neutral-3: var(--slate-3);
258
+ --neutral-4: var(--slate-4);
259
+ --neutral-5: var(--slate-5);
260
+ --neutral-6: var(--slate-6);
261
+ --neutral-7: var(--slate-7);
262
+ --neutral-8: var(--slate-8);
263
+ --neutral-9: var(--slate-9);
264
+ --neutral-10: var(--slate-10);
265
+ --neutral-11: var(--slate-11);
266
+ --neutral-12: var(--slate-12);
267
+ --neutral-a1: var(--slate-a1);
268
+ --neutral-a2: var(--slate-a2);
269
+ --neutral-a3: var(--slate-a3);
270
+ --neutral-a4: var(--slate-a4);
271
+ --neutral-a5: var(--slate-a5);
272
+ --neutral-a6: var(--slate-a6);
273
+ --neutral-a7: var(--slate-a7);
274
+ --neutral-a8: var(--slate-a8);
275
+ --neutral-a9: var(--slate-a9);
276
+ --neutral-a10: var(--slate-a10);
277
+ --neutral-a11: var(--slate-a11);
278
+ --neutral-a12: var(--slate-a12);
279
+ }
280
+
281
+ [data-neutral-color='slate'] {
282
+ --neutral-1: var(--slate-1);
283
+ --neutral-2: var(--slate-2);
284
+ --neutral-3: var(--slate-3);
285
+ --neutral-4: var(--slate-4);
286
+ --neutral-5: var(--slate-5);
287
+ --neutral-6: var(--slate-6);
288
+ --neutral-7: var(--slate-7);
289
+ --neutral-8: var(--slate-8);
290
+ --neutral-9: var(--slate-9);
291
+ --neutral-10: var(--slate-10);
292
+ --neutral-11: var(--slate-11);
293
+ --neutral-12: var(--slate-12);
294
+ --neutral-a1: var(--slate-a1);
295
+ --neutral-a2: var(--slate-a2);
296
+ --neutral-a3: var(--slate-a3);
297
+ --neutral-a4: var(--slate-a4);
298
+ --neutral-a5: var(--slate-a5);
299
+ --neutral-a6: var(--slate-a6);
300
+ --neutral-a7: var(--slate-a7);
301
+ --neutral-a8: var(--slate-a8);
302
+ --neutral-a9: var(--slate-a9);
303
+ --neutral-a10: var(--slate-a10);
304
+ --neutral-a11: var(--slate-a11);
305
+ --neutral-a12: var(--slate-a12);
306
+ }
307
+
308
+ [data-neutral-color='mauve'] {
309
+ --neutral-1: var(--mauve-1);
310
+ --neutral-2: var(--mauve-2);
311
+ --neutral-3: var(--mauve-3);
312
+ --neutral-4: var(--mauve-4);
313
+ --neutral-5: var(--mauve-5);
314
+ --neutral-6: var(--mauve-6);
315
+ --neutral-7: var(--mauve-7);
316
+ --neutral-8: var(--mauve-8);
317
+ --neutral-9: var(--mauve-9);
318
+ --neutral-10: var(--mauve-10);
319
+ --neutral-11: var(--mauve-11);
320
+ --neutral-12: var(--mauve-12);
321
+ --neutral-a1: var(--mauve-a1);
322
+ --neutral-a2: var(--mauve-a2);
323
+ --neutral-a3: var(--mauve-a3);
324
+ --neutral-a4: var(--mauve-a4);
325
+ --neutral-a5: var(--mauve-a5);
326
+ --neutral-a6: var(--mauve-a6);
327
+ --neutral-a7: var(--mauve-a7);
328
+ --neutral-a8: var(--mauve-a8);
329
+ --neutral-a9: var(--mauve-a9);
330
+ --neutral-a10: var(--mauve-a10);
331
+ --neutral-a11: var(--mauve-a11);
332
+ --neutral-a12: var(--mauve-a12);
333
+ }
334
+
335
+ [data-neutral-color='gray'] {
336
+ --neutral-1: var(--gray-1);
337
+ --neutral-2: var(--gray-2);
338
+ --neutral-3: var(--gray-3);
339
+ --neutral-4: var(--gray-4);
340
+ --neutral-5: var(--gray-5);
341
+ --neutral-6: var(--gray-6);
342
+ --neutral-7: var(--gray-7);
343
+ --neutral-8: var(--gray-8);
344
+ --neutral-9: var(--gray-9);
345
+ --neutral-10: var(--gray-10);
346
+ --neutral-11: var(--gray-11);
347
+ --neutral-12: var(--gray-12);
348
+ --neutral-a1: var(--gray-a1);
349
+ --neutral-a2: var(--gray-a2);
350
+ --neutral-a3: var(--gray-a3);
351
+ --neutral-a4: var(--gray-a4);
352
+ --neutral-a5: var(--gray-a5);
353
+ --neutral-a6: var(--gray-a6);
354
+ --neutral-a7: var(--gray-a7);
355
+ --neutral-a8: var(--gray-a8);
356
+ --neutral-a9: var(--gray-a9);
357
+ --neutral-a10: var(--gray-a10);
358
+ --neutral-a11: var(--gray-a11);
359
+ --neutral-a12: var(--gray-a12);
360
+ }
361
+
362
+ [data-neutral-color='sage'] {
363
+ --neutral-1: var(--sage-1);
364
+ --neutral-2: var(--sage-2);
365
+ --neutral-3: var(--sage-3);
366
+ --neutral-4: var(--sage-4);
367
+ --neutral-5: var(--sage-5);
368
+ --neutral-6: var(--sage-6);
369
+ --neutral-7: var(--sage-7);
370
+ --neutral-8: var(--sage-8);
371
+ --neutral-9: var(--sage-9);
372
+ --neutral-10: var(--sage-10);
373
+ --neutral-11: var(--sage-11);
374
+ --neutral-12: var(--sage-12);
375
+ --neutral-a1: var(--sage-a1);
376
+ --neutral-a2: var(--sage-a2);
377
+ --neutral-a3: var(--sage-a3);
378
+ --neutral-a4: var(--sage-a4);
379
+ --neutral-a5: var(--sage-a5);
380
+ --neutral-a6: var(--sage-a6);
381
+ --neutral-a7: var(--sage-a7);
382
+ --neutral-a8: var(--sage-a8);
383
+ --neutral-a9: var(--sage-a9);
384
+ --neutral-a10: var(--sage-a10);
385
+ --neutral-a11: var(--sage-a11);
386
+ --neutral-a12: var(--sage-a12);
387
+ }
388
+
389
+ [data-neutral-color='olive'] {
390
+ --neutral-1: var(--olive-1);
391
+ --neutral-2: var(--olive-2);
392
+ --neutral-3: var(--olive-3);
393
+ --neutral-4: var(--olive-4);
394
+ --neutral-5: var(--olive-5);
395
+ --neutral-6: var(--olive-6);
396
+ --neutral-7: var(--olive-7);
397
+ --neutral-8: var(--olive-8);
398
+ --neutral-9: var(--olive-9);
399
+ --neutral-10: var(--olive-10);
400
+ --neutral-11: var(--olive-11);
401
+ --neutral-12: var(--olive-12);
402
+ --neutral-a1: var(--olive-a1);
403
+ --neutral-a2: var(--olive-a2);
404
+ --neutral-a3: var(--olive-a3);
405
+ --neutral-a4: var(--olive-a4);
406
+ --neutral-a5: var(--olive-a5);
407
+ --neutral-a6: var(--olive-a6);
408
+ --neutral-a7: var(--olive-a7);
409
+ --neutral-a8: var(--olive-a8);
410
+ --neutral-a9: var(--olive-a9);
411
+ --neutral-a10: var(--olive-a10);
412
+ --neutral-a11: var(--olive-a11);
413
+ --neutral-a12: var(--olive-a12);
414
+ }
415
+
416
+ [data-neutral-color='sand'] {
417
+ --neutral-1: var(--sand-1);
418
+ --neutral-2: var(--sand-2);
419
+ --neutral-3: var(--sand-3);
420
+ --neutral-4: var(--sand-4);
421
+ --neutral-5: var(--sand-5);
422
+ --neutral-6: var(--sand-6);
423
+ --neutral-7: var(--sand-7);
424
+ --neutral-8: var(--sand-8);
425
+ --neutral-9: var(--sand-9);
426
+ --neutral-10: var(--sand-10);
427
+ --neutral-11: var(--sand-11);
428
+ --neutral-12: var(--sand-12);
429
+ --neutral-a1: var(--sand-a1);
430
+ --neutral-a2: var(--sand-a2);
431
+ --neutral-a3: var(--sand-a3);
432
+ --neutral-a4: var(--sand-a4);
433
+ --neutral-a5: var(--sand-a5);
434
+ --neutral-a6: var(--sand-a6);
435
+ --neutral-a7: var(--sand-a7);
436
+ --neutral-a8: var(--sand-a8);
437
+ --neutral-a9: var(--sand-a9);
438
+ --neutral-a10: var(--sand-a10);
439
+ --neutral-a11: var(--sand-a11);
440
+ --neutral-a12: var(--sand-a12);
441
+ }
442
+
443
+ /*
444
+ * Spacing density presets. Swaps the Tailwind --spacing base for the scoped
445
+ * subtree (cascades like the others). No attribute = default (0.25rem).
446
+ */
447
+ [data-spacing='dense'] {
448
+ --spark-spacing: 0.2rem;
449
+ }
450
+
451
+ [data-spacing='default'] {
452
+ --spark-spacing: 0.25rem;
453
+ }
454
+
455
+ [data-spacing='roomy'] {
456
+ --spark-spacing: 0.3rem;
457
+ }
458
+
459
+ /*
460
+ * Scaling presets (global zoom). Composes with spacing (--spacing =
461
+ * --spark-spacing * --spark-scaling) and scales --text-*. No attribute = 100%.
462
+ */
463
+ [data-scaling='90%'] {
464
+ --spark-scaling: 0.9;
465
+ }
466
+
467
+ [data-scaling='95%'] {
468
+ --spark-scaling: 0.95;
469
+ }
470
+
471
+ [data-scaling='100%'] {
472
+ --spark-scaling: 1;
473
+ }
474
+
475
+ [data-scaling='105%'] {
476
+ --spark-scaling: 1.05;
477
+ }
478
+
479
+ [data-scaling='110%'] {
480
+ --spark-scaling: 1.1;
481
+ }
482
+
483
+ /* Only declared under [data-style]; no preset → Button falls back to the raw accent.
484
+ The zero-specificity `:where(… .spark-theme)` twin re-declares the tokens inside
485
+ nested themes: var() resolves on the declaring element, so without it a nested
486
+ <Theme accentColor> would inherit the ancestor's already-resolved fg/bg (wrong
487
+ accent, wrong contrast). A nested theme's own [data-style] still wins on specificity. */
488
+ [data-style='solid'],
489
+ :where([data-style='solid'] .spark-theme) {
490
+ --spark-style-bg: var(--spark-9);
491
+ --spark-style-bg-hover: var(--spark-10);
492
+ /* fg intentionally unset: a solid foreground means different things per role, so
493
+ each component falls back to the right contrast — Button *text* → --spark-contrast
494
+ (AA-enforced 4.5:1), Checkbox *check glyph* → --spark-on-solid (native ~3:1, white
495
+ on any accent). Baking one here would give one of them the wrong contrast. */
496
+ --spark-style-border: transparent;
497
+ }
498
+
499
+ [data-style='soft'],
500
+ :where([data-style='soft'] .spark-theme) {
501
+ --spark-style-bg: var(--spark-a3);
502
+ --spark-style-bg-hover: var(--spark-a4);
503
+ --spark-style-fg: var(--spark-a11);
504
+ --spark-style-border: transparent;
505
+ /* soft is borderless in both states (idle-border drops the unchecked affordance border) */
506
+ --spark-style-idle-border: transparent;
507
+ }
508
+
509
+ [data-style='surface'],
510
+ :where([data-style='surface'] .spark-theme) {
511
+ --spark-style-bg: var(--spark-surface);
512
+ --spark-style-bg-hover: var(--spark-a3);
513
+ --spark-style-fg: var(--spark-a11);
514
+ --spark-style-border: var(--spark-a6);
515
+ /* surface = a thin (1px), recessed edge: neutral chrome at rest, accent when
516
+ active — mirrors the switch surface (idle ring neutral, on ring accent). */
517
+ --spark-style-border-width: 1px;
518
+ --spark-style-idle-border: var(--color-gray-a7);
519
+ }
520
+
521
+ [data-style='ghost'],
522
+ :where([data-style='ghost'] .spark-theme) {
523
+ --spark-style-bg: transparent;
524
+ --spark-style-bg-hover: var(--spark-a3);
525
+ --spark-style-fg: var(--spark-a11);
526
+ --spark-style-border: transparent;
527
+ }
528
+
529
+ /* outline: no fill, accent border + accent fg (the unfilled control look). */
530
+ [data-style='outline'],
531
+ :where([data-style='outline'] .spark-theme) {
532
+ --spark-style-bg: transparent;
533
+ --spark-style-bg-hover: var(--spark-a3);
534
+ --spark-style-fg: var(--spark-a11);
535
+ --spark-style-border: var(--spark-a8);
536
+ }
537
+
538
+ /*
539
+ * Colour axis — re-point the accent scale so the shared [data-style] recipes paint
540
+ * with neutral (gray) or danger (red) instead of accent. Set on the element via
541
+ * data-accent-color (Button `color="neutral"|"danger"`). var() resolves on the
542
+ * declaring element, so re-pointing --spark-* here re-colours the recipe that reads
543
+ * them; the :where(… .spark-theme) twin re-resolves inside nested themes. Additive
544
+ * (new selectors, no existing token/value change) → parity holds.
545
+ */
546
+ [data-accent-color='gray'],
547
+ :where([data-accent-color='gray'] .spark-theme) {
548
+ --spark-1: var(--neutral-1);
549
+ --spark-2: var(--neutral-2);
550
+ --spark-3: var(--neutral-3);
551
+ --spark-4: var(--neutral-4);
552
+ --spark-5: var(--neutral-5);
553
+ --spark-6: var(--neutral-6);
554
+ --spark-7: var(--neutral-7);
555
+ --spark-8: var(--neutral-8);
556
+ --spark-9: var(--neutral-9);
557
+ --spark-10: var(--neutral-10);
558
+ --spark-11: var(--neutral-11);
559
+ --spark-12: var(--neutral-12);
560
+ --spark-a1: var(--neutral-a1);
561
+ --spark-a2: var(--neutral-a2);
562
+ --spark-a3: var(--neutral-a3);
563
+ --spark-a4: var(--neutral-a4);
564
+ --spark-a5: var(--neutral-a5);
565
+ --spark-a6: var(--neutral-a6);
566
+ --spark-a7: var(--neutral-a7);
567
+ --spark-a8: var(--neutral-a8);
568
+ --spark-a9: var(--neutral-a9);
569
+ --spark-a10: var(--neutral-a10);
570
+ --spark-a11: var(--neutral-a11);
571
+ --spark-a12: var(--neutral-a12);
572
+ --spark-contrast: var(--neutral-contrast);
573
+ --spark-on-solid: var(--neutral-on-solid);
574
+ --spark-surface: var(--neutral-surface);
575
+ --spark-indicator: var(--neutral-9);
576
+ --spark-track: var(--neutral-9);
577
+ }
578
+
579
+ [data-accent-color='red'],
580
+ :where([data-accent-color='red'] .spark-theme) {
581
+ --spark-1: var(--red-1);
582
+ --spark-2: var(--red-2);
583
+ --spark-3: var(--red-3);
584
+ --spark-4: var(--red-4);
585
+ --spark-5: var(--red-5);
586
+ --spark-6: var(--red-6);
587
+ --spark-7: var(--red-7);
588
+ --spark-8: var(--red-8);
589
+ --spark-9: var(--red-9);
590
+ --spark-10: var(--red-10);
591
+ --spark-11: var(--red-11);
592
+ --spark-12: var(--red-12);
593
+ --spark-a1: var(--red-a1);
594
+ --spark-a2: var(--red-a2);
595
+ --spark-a3: var(--red-a3);
596
+ --spark-a4: var(--red-a4);
597
+ --spark-a5: var(--red-a5);
598
+ --spark-a6: var(--red-a6);
599
+ --spark-a7: var(--red-a7);
600
+ --spark-a8: var(--red-a8);
601
+ --spark-a9: var(--red-a9);
602
+ --spark-a10: var(--red-a10);
603
+ --spark-a11: var(--red-a11);
604
+ --spark-a12: var(--red-a12);
605
+ --spark-contrast: var(--red-contrast);
606
+ --spark-on-solid: var(--red-on-solid);
607
+ --spark-surface: var(--red-surface);
608
+ --spark-indicator: var(--red-9);
609
+ --spark-track: var(--red-9);
610
+ }
611
+
612
+ /*
613
+ * Card container chrome — a CONTAINER-only knob (contract §11). Everything here
614
+ * writes only --spark-card-* / --spark-card-c-*, tokens read EXCLUSIVELY by <Card>;
615
+ * it never touches data-style, --spark-style-*, or the --spark-* scale, so styling
616
+ * OR colouring a card never cascades into the Buttons/Checkboxes inside it.
617
+ *
618
+ * [data-card-variant] = the app-level default look (from <Theme cardVariant>); a
619
+ * per-card `variant` prop overrides it via the cva recipe. [data-card-color='accent']
620
+ * re-points the 5-slot card mini-scale so the chrome tints with the accent while the
621
+ * card's content controls keep their own colour. Neutral fallbacks are baked into the
622
+ * cva classes + the presets below, so a default card tracks the app neutral knob.
623
+ * The :where(… .spark-theme) / (… [data-card-color]) twins re-resolve var() inside
624
+ * nested themes / recoloured cards (same reason as the [data-style] twins above).
625
+ * Every preset re-declares the FULL token set (equal-specificity sibling leak guard,
626
+ * like the [data-high-contrast] block). Additive → parity holds.
627
+ */
628
+ [data-card-color='accent'],
629
+ :where([data-card-color='accent'] .spark-theme) {
630
+ --spark-card-c-soft: var(--spark-a3);
631
+ --spark-card-c-surface: var(--spark-surface);
632
+ --spark-card-c-border: var(--spark-a6);
633
+ --spark-card-c-solid: var(--spark-9);
634
+ --spark-card-c-contrast: var(--spark-contrast);
635
+ }
636
+
637
+ [data-card-variant='soft'],
638
+ :where([data-card-variant='soft'] .spark-theme),
639
+ :where([data-card-variant='soft'] [data-card-color]) {
640
+ --spark-card-px: 1rem;
641
+ --spark-card-bg: var(--spark-card-c-soft, var(--neutral-a3));
642
+ --spark-card-border: transparent;
643
+ --spark-card-border-width: 0px;
644
+ --spark-card-fg: var(--neutral-a12);
645
+ --spark-card-fg-muted: var(--neutral-a11);
646
+ --spark-card-icon: var(--spark-a11);
647
+ }
648
+
649
+ [data-card-variant='surface'],
650
+ :where([data-card-variant='surface'] .spark-theme),
651
+ :where([data-card-variant='surface'] [data-card-color]) {
652
+ --spark-card-px: 1rem;
653
+ --spark-card-bg: var(--spark-card-c-surface, var(--neutral-2));
654
+ --spark-card-border: var(--spark-card-c-border, var(--neutral-a6));
655
+ --spark-card-border-width: 1px;
656
+ --spark-card-fg: var(--neutral-a12);
657
+ --spark-card-fg-muted: var(--neutral-a11);
658
+ --spark-card-icon: var(--spark-a11);
659
+ }
660
+
661
+ [data-card-variant='outline'],
662
+ :where([data-card-variant='outline'] .spark-theme),
663
+ :where([data-card-variant='outline'] [data-card-color]) {
664
+ --spark-card-px: 1rem;
665
+ --spark-card-bg: transparent;
666
+ --spark-card-border: var(--spark-card-c-border, var(--neutral-a6));
667
+ --spark-card-border-width: 1px;
668
+ --spark-card-fg: var(--neutral-a12);
669
+ --spark-card-fg-muted: var(--neutral-a11);
670
+ --spark-card-icon: var(--spark-a11);
671
+ }
672
+
673
+ [data-card-variant='ghost'],
674
+ :where([data-card-variant='ghost'] .spark-theme),
675
+ :where([data-card-variant='ghost'] [data-card-color]) {
676
+ /* flush horizontally (no chrome to inset against); vertical rhythm kept by py-3 */
677
+ --spark-card-px: 0px;
678
+ --spark-card-bg: transparent;
679
+ --spark-card-border: transparent;
680
+ --spark-card-border-width: 0px;
681
+ --spark-card-fg: var(--neutral-a12);
682
+ --spark-card-fg-muted: var(--neutral-a11);
683
+ --spark-card-icon: var(--spark-a11);
684
+ }
685
+
686
+ /* HIDDEN for now: `SparkCardVariant` omits `solid` (content-contrast story TBD),
687
+ so the typed API never emits data-card-variant='solid'. Kept dormant + ready. */
688
+ [data-card-variant='solid'],
689
+ :where([data-card-variant='solid'] .spark-theme),
690
+ :where([data-card-variant='solid'] [data-card-color]) {
691
+ /* dark fill → light contrast ink on all slots (accent contrast is AA-enforced) */
692
+ --spark-card-px: 1rem;
693
+ --spark-card-bg: var(--spark-card-c-solid, var(--neutral-9));
694
+ --spark-card-border: transparent;
695
+ --spark-card-border-width: 0px;
696
+ --spark-card-fg: var(--spark-card-c-contrast, var(--neutral-contrast));
697
+ --spark-card-fg-muted: var(
698
+ --spark-card-c-contrast,
699
+ var(--neutral-contrast)
700
+ );
701
+ --spark-card-icon: var(--spark-card-c-contrast, var(--neutral-contrast));
702
+ }
703
+
704
+ /*
705
+ * High-contrast — an ORTHOGONAL modifier layered on any [data-style]. Per the
706
+ * Spark Foundation reference (default vs high-contrast overview, Figma
707
+ * 1061-3166): a non-solid style keeps its EXACT default fill — HC only darkens
708
+ * the ink (fg a11→a12) and strengthens the visible border (→a11). `solid` is
709
+ * the sole style whose fill changes: it darkens 9→12 (fg stays step-1). Bare
710
+ * [data-high-contrast] = the solid case; each per-style rule must re-declare its
711
+ * default fill because the bare rule has equal specificity and later source
712
+ * order, so it would otherwise leak its step-12 fill onto the other styles.
713
+ * Mirrors the [data-style] `:where(… .spark-theme)` twin for nested themes.
714
+ */
715
+ [data-high-contrast],
716
+ [data-high-contrast] [data-style='solid'],
717
+ :where([data-high-contrast] .spark-theme) {
718
+ /* solid HC: step-12 fill + step-1 fg sit at opposite ends of the scale in
719
+ BOTH appearances, so the fg maximally contrasts the fill either way (a
720
+ fixed white fg would fail in dark mode where step-12 is near-white). */
721
+ --spark-style-bg: var(--spark-12);
722
+ --spark-style-bg-hover: var(--spark-11);
723
+ --spark-style-fg: var(--spark-1);
724
+ --spark-style-border: transparent;
725
+ }
726
+
727
+ [data-high-contrast][data-style='soft'],
728
+ [data-high-contrast] [data-style='soft'],
729
+ :where([data-high-contrast][data-style='soft'] .spark-theme) {
730
+ /* same faint fill as default soft; only the ink darkens (a11→a12) */
731
+ --spark-style-bg: var(--spark-a3);
732
+ --spark-style-bg-hover: var(--spark-a4);
733
+ --spark-style-fg: var(--spark-a12);
734
+ --spark-style-border: transparent;
735
+ --spark-style-idle-border: transparent;
736
+ }
737
+
738
+ [data-high-contrast][data-style='surface'],
739
+ [data-high-contrast] [data-style='surface'],
740
+ :where([data-high-contrast][data-style='surface'] .spark-theme) {
741
+ /* same surface fill as default; ink darkens + border strengthens a6→a11 */
742
+ --spark-style-bg: var(--spark-surface);
743
+ --spark-style-bg-hover: var(--spark-a3);
744
+ --spark-style-fg: var(--spark-a12);
745
+ --spark-style-border: var(--spark-a11);
746
+ }
747
+
748
+ [data-high-contrast][data-style='ghost'],
749
+ [data-high-contrast] [data-style='ghost'],
750
+ :where([data-high-contrast][data-style='ghost'] .spark-theme) {
751
+ --spark-style-bg: transparent;
752
+ --spark-style-bg-hover: var(--spark-a3);
753
+ --spark-style-fg: var(--spark-a12);
754
+ --spark-style-border: transparent;
755
+ }
756
+
757
+ [data-high-contrast][data-style='outline'],
758
+ [data-high-contrast] [data-style='outline'],
759
+ :where([data-high-contrast][data-style='outline'] .spark-theme) {
760
+ /* transparent fill unchanged; ink darkens + border strengthens a8→a11 */
761
+ --spark-style-bg: transparent;
762
+ --spark-style-bg-hover: var(--spark-a3);
763
+ --spark-style-fg: var(--spark-a12);
764
+ --spark-style-border: var(--spark-a11);
765
+ }
766
+
767
+ /*
768
+ * Switch ON-track intensity (Radix-aligned). Unlike a checkbox (fill varies
769
+ * per style), a switch's "on" needs a visibly filled track — so it reads
770
+ * --spark-switch-track, a STRONG accent by default (fallback --spark-9 covers
771
+ * solid/surface/outline); only `soft` lightens it. `surface` still adds its
772
+ * border via --spark-style-border. Matches Radix (classic/surface = strong
773
+ * accent, soft = lighter).
774
+ */
775
+ [data-style='soft'],
776
+ :where([data-style='soft'] .spark-theme) {
777
+ --spark-switch-track: var(--spark-a5);
778
+ }
779
+
780
+ /* surface's hallmark is a bordered ("recessed") track — a neutral ring, most
781
+ visible in the OFF state (Radix "surface"). switch-local so it never touches
782
+ the checkbox's accent idle-border. The ON border stays --spark-style-border. */
783
+ [data-style='surface'],
784
+ :where([data-style='surface'] .spark-theme) {
785
+ --spark-switch-idle-border: var(--color-gray-a7);
786
+ }
787
+
788
+ /* HC = the checkbox HC-solid model applied to the whole switch: the on-track
789
+ deepens to step-12 and the thumb flips to step-1 (opposite ends of the scale,
790
+ so they maximally contrast in BOTH appearances — light: near-white thumb on a
791
+ dark track; dark: near-dark thumb on a bright track). A fixed white thumb can't
792
+ do this (it vanishes on the near-white step-12 track in dark), and step-10 was
793
+ nearly indistinguishable from the default step-9. Uniform across styles so HC
794
+ is an unmistakable, legible override. */
795
+ [data-high-contrast],
796
+ :where([data-high-contrast] .spark-theme) {
797
+ --spark-switch-track: var(--spark-12);
798
+ --spark-switch-thumb: var(--spark-1);
799
+ }
800
+
801
+ /*
802
+ * Radio — a ring + dot (always round), so it can't reuse the checkbox's fill
803
+ * tokens: `solid` needs a VISIBLE accent ring (the checkbox's solid border is
804
+ * transparent), and the dot sits on the unfilled box so it must stay a
805
+ * background-legible accent. Both read radio-specific tokens; the default (solid)
806
+ * falls back to --spark-9 (ring 9, dot 9). soft drops the ring and softens the dot
807
+ * to a11; surface keeps the accent ring but softens the dot. HC deepens to step-12
808
+ * / a12 (the ring/dot darken together, mirroring the checkbox HC model in §11).
809
+ */
810
+ [data-style='soft'],
811
+ :where([data-style='soft'] .spark-theme) {
812
+ --spark-radio-ring: transparent;
813
+ --spark-radio-dot: var(--spark-a11);
814
+ }
815
+
816
+ [data-style='surface'],
817
+ :where([data-style='surface'] .spark-theme) {
818
+ --spark-radio-dot: var(--spark-a11);
819
+ }
820
+
821
+ [data-high-contrast],
822
+ :where([data-high-contrast] .spark-theme) {
823
+ --spark-radio-ring: var(--spark-12);
824
+ --spark-radio-dot: var(--spark-12);
825
+ }
826
+
827
+ [data-high-contrast][data-style='soft'],
828
+ :where([data-high-contrast][data-style='soft'] .spark-theme) {
829
+ --spark-radio-ring: transparent;
830
+ --spark-radio-dot: var(--spark-a12);
831
+ }
832
+
833
+ [data-high-contrast][data-style='surface'],
834
+ :where([data-high-contrast][data-style='surface'] .spark-theme) {
835
+ --spark-radio-dot: var(--spark-a12);
836
+ }
837
+
838
+ /*
839
+ * Tabs — NOT data-style-driven: a tab strip has no solid/soft/surface axis, so it
840
+ * themes via accent + neutral + radius + scaling + high-contrast only. Two component
841
+ * tokens, both accent-by-default via component fallbacks: the active/hover ink
842
+ * (fallback --spark-a11) and the underline indicator (fallback --spark-indicator,
843
+ * i.e. step 9). HC deepens both — ink a11→a12, indicator 9→12 — mirroring the §11
844
+ * model (ink darkens, the accent-filled element deepens to 12).
845
+ */
846
+ [data-high-contrast],
847
+ :where([data-high-contrast] .spark-theme) {
848
+ --spark-tabs-ink: var(--spark-a12);
849
+ --spark-tabs-indicator: var(--spark-12);
850
+ }
851
+
852
+ /*
853
+ * Slider — like Tabs, NOT data-style-driven: a track/thumb has no solid/soft/surface
854
+ * axis (a `soft` a3 fill would make the filled range invisible), so it themes via
855
+ * accent + neutral + radius + scaling + high-contrast only. --spark-slider-range is
856
+ * the accent that fills the range AND paints the thumb (fallback --spark-9); the rail
857
+ * (unfilled remainder) stays a neutral gray. --spark-slider-tick-on is the step-dot
858
+ * colour ON the accent fill (fallback --spark-on-solid, ~white). HC deepens the accent
859
+ * 9→12 (§11); because the HC fill is step-12 (near-white in dark), the on-fill dot
860
+ * flips to step-1 — the same opposite-scale-ends contrast trick as the switch thumb,
861
+ * so it stays legible in both appearances.
862
+ */
863
+ [data-high-contrast],
864
+ :where([data-high-contrast] .spark-theme) {
865
+ --spark-slider-range: var(--spark-12);
866
+ --spark-slider-tick-on: var(--spark-1);
867
+ }
868
+
869
+ /*
870
+ * Badge — a non-interactive chip. Unlike Button/Checkbox (bare = solid accent), an
871
+ * UNSTYLED <Badge> is intentionally NEUTRAL + low-emphasis: the component's own
872
+ * fallbacks read the gray/neutral scale (gray-a3 fill, gray-a11 ink), so with no
873
+ * [data-style] it's a quiet gray chip that ignores the accent. Any data-style brings
874
+ * in the accent via the shared --spark-style-* knob for free — soft, surface and
875
+ * outline already carry the right ink (a11) and borders. Only `solid` needs a fix:
876
+ * its fill is the strong accent (step 9, or step 12 in HC), so the ink must be the
877
+ * readable --spark-contrast, not a11. The shared solid preset leaves --spark-style-fg
878
+ * unset (a checkbox glyph wants --spark-on-solid, badge TEXT wants --spark-contrast),
879
+ * so the badge supplies its own --spark-badge-fg, consulted only when --spark-style-fg
880
+ * is unset — i.e. the solid style. High-contrast needs no badge rule: HC re-declares
881
+ * --spark-style-fg (step-1 on the step-12 solid fill; a12 on the faint non-solid
882
+ * fills), which wins the fallback chain outright.
883
+ */
884
+ [data-style='solid'],
885
+ :where([data-style='solid'] .spark-theme) {
886
+ --spark-badge-fg: var(--spark-contrast);
887
+ }
888
+ }