@psnext/design-system 2.3.0 → 2.5.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 (671) hide show
  1. package/DESIGN.md +493 -8
  2. package/README.md +3 -3
  3. package/SKILL.md +84 -6
  4. package/bin/install-agent-skill.mjs +39 -7
  5. package/dist/Header.cjs +152 -21
  6. package/dist/Header.cjs.map +1 -1
  7. package/dist/Header.js +152 -21
  8. package/dist/Header.js.map +1 -1
  9. package/dist/Icon.cjs +40 -8
  10. package/dist/Icon.cjs.map +1 -1
  11. package/dist/Icon.js +40 -8
  12. package/dist/Icon.js.map +1 -1
  13. package/dist/Mosaic.cjs +472 -0
  14. package/dist/Mosaic.cjs.map +1 -0
  15. package/dist/Mosaic.js +459 -0
  16. package/dist/Mosaic.js.map +1 -0
  17. package/dist/MultiColumn.cjs +354 -0
  18. package/dist/MultiColumn.cjs.map +1 -0
  19. package/dist/MultiColumn.js +335 -0
  20. package/dist/MultiColumn.js.map +1 -0
  21. package/dist/Sidebar.cjs +4 -3
  22. package/dist/Sidebar.cjs.map +1 -1
  23. package/dist/Sidebar.js +4 -3
  24. package/dist/Sidebar.js.map +1 -1
  25. package/dist/index.cjs +18 -3
  26. package/dist/index.d.cts +5 -5
  27. package/dist/index.d.cts.map +1 -1
  28. package/dist/index.d.ts +5 -5
  29. package/dist/index.d.ts.map +1 -1
  30. package/dist/index.js +9 -4
  31. package/dist/index10.d.cts +6 -6
  32. package/dist/index10.d.cts.map +1 -1
  33. package/dist/index10.d.ts +6 -6
  34. package/dist/index11.d.cts +3 -3
  35. package/dist/index11.d.cts.map +1 -1
  36. package/dist/index11.d.ts +3 -3
  37. package/dist/index11.d.ts.map +1 -1
  38. package/dist/index12.d.cts +12 -12
  39. package/dist/index12.d.ts +12 -12
  40. package/dist/index13.d.cts +6 -6
  41. package/dist/index13.d.cts.map +1 -1
  42. package/dist/index13.d.ts +6 -6
  43. package/dist/index13.d.ts.map +1 -1
  44. package/dist/index14.d.cts +5 -5
  45. package/dist/index14.d.ts +5 -5
  46. package/dist/index15.d.cts +58 -23
  47. package/dist/index15.d.cts.map +1 -1
  48. package/dist/index15.d.ts +58 -23
  49. package/dist/index15.d.ts.map +1 -1
  50. package/dist/index16.d.cts +23 -32
  51. package/dist/index16.d.cts.map +1 -1
  52. package/dist/index16.d.ts +23 -32
  53. package/dist/index16.d.ts.map +1 -1
  54. package/dist/index17.d.cts +34 -15
  55. package/dist/index17.d.cts.map +1 -1
  56. package/dist/index17.d.ts +34 -15
  57. package/dist/index17.d.ts.map +1 -1
  58. package/dist/index18.d.cts +13 -67
  59. package/dist/index18.d.cts.map +1 -1
  60. package/dist/index18.d.ts +13 -67
  61. package/dist/index18.d.ts.map +1 -1
  62. package/dist/index19.d.cts +55 -48
  63. package/dist/index19.d.cts.map +1 -1
  64. package/dist/index19.d.ts +55 -48
  65. package/dist/index19.d.ts.map +1 -1
  66. package/dist/index2.d.cts +8 -8
  67. package/dist/index2.d.ts +9 -9
  68. package/dist/index20.d.cts +45 -75
  69. package/dist/index20.d.cts.map +1 -1
  70. package/dist/index20.d.ts +45 -75
  71. package/dist/index20.d.ts.map +1 -1
  72. package/dist/index21.d.cts +90 -28
  73. package/dist/index21.d.cts.map +1 -1
  74. package/dist/index21.d.ts +90 -28
  75. package/dist/index21.d.ts.map +1 -1
  76. package/dist/index22.d.cts +28 -56
  77. package/dist/index22.d.cts.map +1 -1
  78. package/dist/index22.d.ts +28 -56
  79. package/dist/index22.d.ts.map +1 -1
  80. package/dist/index23.d.cts +53 -78
  81. package/dist/index23.d.cts.map +1 -1
  82. package/dist/index23.d.ts +53 -78
  83. package/dist/index23.d.ts.map +1 -1
  84. package/dist/index24.d.cts +83 -33
  85. package/dist/index24.d.cts.map +1 -1
  86. package/dist/index24.d.ts +83 -33
  87. package/dist/index24.d.ts.map +1 -1
  88. package/dist/index25.d.cts +43 -11
  89. package/dist/index25.d.cts.map +1 -1
  90. package/dist/index25.d.ts +43 -11
  91. package/dist/index25.d.ts.map +1 -1
  92. package/dist/index26.d.cts +11 -74
  93. package/dist/index26.d.cts.map +1 -1
  94. package/dist/index26.d.ts +11 -74
  95. package/dist/index26.d.ts.map +1 -1
  96. package/dist/index27.d.cts +68 -59
  97. package/dist/index27.d.cts.map +1 -1
  98. package/dist/index27.d.ts +68 -59
  99. package/dist/index27.d.ts.map +1 -1
  100. package/dist/index28.d.cts +47 -30
  101. package/dist/index28.d.cts.map +1 -1
  102. package/dist/index28.d.ts +47 -30
  103. package/dist/index28.d.ts.map +1 -1
  104. package/dist/index29.d.cts +63 -17
  105. package/dist/index29.d.cts.map +1 -1
  106. package/dist/index29.d.ts +63 -17
  107. package/dist/index29.d.ts.map +1 -1
  108. package/dist/index3.d.cts +13 -13
  109. package/dist/index3.d.ts +13 -13
  110. package/dist/index30.d.cts +29 -51
  111. package/dist/index30.d.cts.map +1 -1
  112. package/dist/index30.d.ts +30 -52
  113. package/dist/index30.d.ts.map +1 -1
  114. package/dist/index31.d.cts +19 -34
  115. package/dist/index31.d.cts.map +1 -1
  116. package/dist/index31.d.ts +19 -34
  117. package/dist/index31.d.ts.map +1 -1
  118. package/dist/index32.d.cts +80 -18
  119. package/dist/index32.d.cts.map +1 -1
  120. package/dist/index32.d.ts +79 -17
  121. package/dist/index32.d.ts.map +1 -1
  122. package/dist/index33.d.cts +32 -51
  123. package/dist/index33.d.cts.map +1 -1
  124. package/dist/index33.d.ts +33 -52
  125. package/dist/index33.d.ts.map +1 -1
  126. package/dist/index34.d.cts +19 -36
  127. package/dist/index34.d.cts.map +1 -1
  128. package/dist/index34.d.ts +19 -36
  129. package/dist/index34.d.ts.map +1 -1
  130. package/dist/index35.d.cts +43 -61
  131. package/dist/index35.d.cts.map +1 -1
  132. package/dist/index35.d.ts +44 -62
  133. package/dist/index35.d.ts.map +1 -1
  134. package/dist/index36.d.cts +35 -11
  135. package/dist/index36.d.cts.map +1 -1
  136. package/dist/index36.d.ts +35 -11
  137. package/dist/index36.d.ts.map +1 -1
  138. package/dist/index37.d.cts +68 -20
  139. package/dist/index37.d.cts.map +1 -1
  140. package/dist/index37.d.ts +69 -21
  141. package/dist/index37.d.ts.map +1 -1
  142. package/dist/index38.d.cts +14 -15
  143. package/dist/index38.d.cts.map +1 -1
  144. package/dist/index38.d.ts +14 -15
  145. package/dist/index38.d.ts.map +1 -1
  146. package/dist/index39.d.cts +22 -98
  147. package/dist/index39.d.cts.map +1 -1
  148. package/dist/index39.d.ts +22 -98
  149. package/dist/index39.d.ts.map +1 -1
  150. package/dist/index4.d.cts +2 -2
  151. package/dist/index4.d.cts.map +1 -1
  152. package/dist/index4.d.ts +2 -2
  153. package/dist/index40.d.cts +15 -17
  154. package/dist/index40.d.cts.map +1 -1
  155. package/dist/index40.d.ts +15 -17
  156. package/dist/index40.d.ts.map +1 -1
  157. package/dist/index41.d.cts +84 -35
  158. package/dist/index41.d.cts.map +1 -1
  159. package/dist/index41.d.ts +84 -35
  160. package/dist/index41.d.ts.map +1 -1
  161. package/dist/index42.d.cts +118 -38
  162. package/dist/index42.d.cts.map +1 -1
  163. package/dist/index42.d.ts +118 -38
  164. package/dist/index42.d.ts.map +1 -1
  165. package/dist/index43.d.cts +15 -89
  166. package/dist/index43.d.cts.map +1 -1
  167. package/dist/index43.d.ts +15 -89
  168. package/dist/index43.d.ts.map +1 -1
  169. package/dist/index44.d.cts +56 -1
  170. package/dist/index44.d.cts.map +1 -0
  171. package/dist/index44.d.ts +56 -1
  172. package/dist/index44.d.ts.map +1 -0
  173. package/dist/index45.d.cts +31 -34
  174. package/dist/index45.d.cts.map +1 -1
  175. package/dist/index45.d.ts +31 -34
  176. package/dist/index45.d.ts.map +1 -1
  177. package/dist/index46.d.cts +89 -21
  178. package/dist/index46.d.cts.map +1 -1
  179. package/dist/index46.d.ts +89 -21
  180. package/dist/index46.d.ts.map +1 -1
  181. package/dist/index47.d.cts +1 -41
  182. package/dist/index47.d.ts +1 -41
  183. package/dist/index48.d.cts +122 -20
  184. package/dist/index48.d.cts.map +1 -1
  185. package/dist/index48.d.ts +122 -20
  186. package/dist/index48.d.ts.map +1 -1
  187. package/dist/index49.d.cts +40 -13
  188. package/dist/index49.d.cts.map +1 -1
  189. package/dist/index49.d.ts +40 -13
  190. package/dist/index49.d.ts.map +1 -1
  191. package/dist/index5.d.cts +7 -7
  192. package/dist/index5.d.cts.map +1 -1
  193. package/dist/index5.d.ts +7 -7
  194. package/dist/index50.d.cts +22 -63
  195. package/dist/index50.d.cts.map +1 -1
  196. package/dist/index50.d.ts +22 -63
  197. package/dist/index50.d.ts.map +1 -1
  198. package/dist/index51.d.cts +33 -55
  199. package/dist/index51.d.cts.map +1 -1
  200. package/dist/index51.d.ts +33 -55
  201. package/dist/index51.d.ts.map +1 -1
  202. package/dist/index52.d.cts +18 -24
  203. package/dist/index52.d.cts.map +1 -1
  204. package/dist/index52.d.ts +18 -24
  205. package/dist/index52.d.ts.map +1 -1
  206. package/dist/index53.d.cts +12 -200
  207. package/dist/index53.d.cts.map +1 -1
  208. package/dist/index53.d.ts +12 -200
  209. package/dist/index53.d.ts.map +1 -1
  210. package/dist/index54.d.cts +58 -15
  211. package/dist/index54.d.cts.map +1 -1
  212. package/dist/index54.d.ts +58 -15
  213. package/dist/index54.d.ts.map +1 -1
  214. package/dist/index55.d.cts +93 -23
  215. package/dist/index55.d.cts.map +1 -1
  216. package/dist/index55.d.ts +93 -23
  217. package/dist/index55.d.ts.map +1 -1
  218. package/dist/index56.d.cts +27 -21
  219. package/dist/index56.d.cts.map +1 -1
  220. package/dist/index56.d.ts +27 -21
  221. package/dist/index56.d.ts.map +1 -1
  222. package/dist/index57.d.cts +203 -6
  223. package/dist/index57.d.cts.map +1 -1
  224. package/dist/index57.d.ts +203 -6
  225. package/dist/index57.d.ts.map +1 -1
  226. package/dist/index58.d.cts +17 -41
  227. package/dist/index58.d.cts.map +1 -1
  228. package/dist/index58.d.ts +17 -41
  229. package/dist/index58.d.ts.map +1 -1
  230. package/dist/index59.d.cts +24 -47
  231. package/dist/index59.d.cts.map +1 -1
  232. package/dist/index59.d.ts +24 -47
  233. package/dist/index59.d.ts.map +1 -1
  234. package/dist/index6.d.cts +5 -5
  235. package/dist/index6.d.cts.map +1 -1
  236. package/dist/index6.d.ts +6 -6
  237. package/dist/index60.d.cts +19 -57
  238. package/dist/index60.d.cts.map +1 -1
  239. package/dist/index60.d.ts +19 -57
  240. package/dist/index60.d.ts.map +1 -1
  241. package/dist/index61.d.cts +6 -39
  242. package/dist/index61.d.cts.map +1 -1
  243. package/dist/index61.d.ts +6 -39
  244. package/dist/index61.d.ts.map +1 -1
  245. package/dist/index62.d.cts +44 -18
  246. package/dist/index62.d.cts.map +1 -1
  247. package/dist/index62.d.ts +44 -18
  248. package/dist/index62.d.ts.map +1 -1
  249. package/dist/index63.d.cts +47 -41
  250. package/dist/index63.d.cts.map +1 -1
  251. package/dist/index63.d.ts +47 -41
  252. package/dist/index63.d.ts.map +1 -1
  253. package/dist/index64.d.cts +55 -15
  254. package/dist/index64.d.cts.map +1 -1
  255. package/dist/index64.d.ts +54 -14
  256. package/dist/index64.d.ts.map +1 -1
  257. package/dist/index65.d.cts +36 -39
  258. package/dist/index65.d.cts.map +1 -1
  259. package/dist/index65.d.ts +37 -40
  260. package/dist/index65.d.ts.map +1 -1
  261. package/dist/index66.d.cts +16 -17
  262. package/dist/index66.d.cts.map +1 -1
  263. package/dist/index66.d.ts +17 -18
  264. package/dist/index66.d.ts.map +1 -1
  265. package/dist/index67.d.cts +40 -14
  266. package/dist/index67.d.cts.map +1 -1
  267. package/dist/index67.d.ts +40 -14
  268. package/dist/index67.d.ts.map +1 -1
  269. package/dist/index68.d.cts +16 -30
  270. package/dist/index68.d.cts.map +1 -1
  271. package/dist/index68.d.ts +17 -31
  272. package/dist/index68.d.ts.map +1 -1
  273. package/dist/index69.d.cts +39 -27
  274. package/dist/index69.d.cts.map +1 -1
  275. package/dist/index69.d.ts +40 -28
  276. package/dist/index69.d.ts.map +1 -1
  277. package/dist/index7.d.cts +8 -8
  278. package/dist/index7.d.cts.map +1 -1
  279. package/dist/index7.d.ts +8 -8
  280. package/dist/index7.d.ts.map +1 -1
  281. package/dist/index70.d.cts +22 -78
  282. package/dist/index70.d.cts.map +1 -1
  283. package/dist/index70.d.ts +22 -78
  284. package/dist/index70.d.ts.map +1 -1
  285. package/dist/index71.d.cts +77 -251
  286. package/dist/index71.d.cts.map +1 -1
  287. package/dist/index71.d.ts +77 -251
  288. package/dist/index71.d.ts.map +1 -1
  289. package/dist/index72.d.cts +19 -0
  290. package/dist/index72.d.cts.map +1 -0
  291. package/dist/index72.d.ts +19 -0
  292. package/dist/index72.d.ts.map +1 -0
  293. package/dist/index73.d.cts +37 -0
  294. package/dist/index73.d.cts.map +1 -0
  295. package/dist/index73.d.ts +37 -0
  296. package/dist/index73.d.ts.map +1 -0
  297. package/dist/index74.d.cts +36 -0
  298. package/dist/index74.d.cts.map +1 -0
  299. package/dist/index74.d.ts +36 -0
  300. package/dist/index74.d.ts.map +1 -0
  301. package/dist/index75.d.cts +86 -0
  302. package/dist/index75.d.cts.map +1 -0
  303. package/dist/index75.d.ts +86 -0
  304. package/dist/index75.d.ts.map +1 -0
  305. package/dist/index76.d.cts +278 -0
  306. package/dist/index76.d.cts.map +1 -0
  307. package/dist/index76.d.ts +278 -0
  308. package/dist/index76.d.ts.map +1 -0
  309. package/dist/index8.d.cts +4 -4
  310. package/dist/index8.d.ts +5 -5
  311. package/dist/index9.d.cts +2 -2
  312. package/dist/index9.d.ts +2 -2
  313. package/dist/index9.d.ts.map +1 -1
  314. package/dist/layouts/Container/index.cjs +2 -1
  315. package/dist/layouts/Container/index.cjs.map +1 -1
  316. package/dist/layouts/Container/index.d.cts +1 -1
  317. package/dist/layouts/Container/index.d.ts +1 -1
  318. package/dist/layouts/Container/index.js +1 -1
  319. package/dist/layouts/MultiColumn/index.cjs +5 -0
  320. package/dist/layouts/MultiColumn/index.d.cts +2 -0
  321. package/dist/layouts/MultiColumn/index.d.ts +2 -0
  322. package/dist/layouts/MultiColumn/index.js +2 -0
  323. package/dist/layouts/PageBackground/index.d.cts +1 -1
  324. package/dist/layouts/PageBackground/index.d.ts +1 -1
  325. package/dist/layouts/Stack/index.cjs +2 -1
  326. package/dist/layouts/Stack/index.cjs.map +1 -1
  327. package/dist/layouts/Stack/index.d.cts +1 -1
  328. package/dist/layouts/Stack/index.d.ts +1 -1
  329. package/dist/layouts/Stack/index.js +1 -1
  330. package/dist/layouts/TwoColumn/index.cjs +2 -1
  331. package/dist/layouts/TwoColumn/index.cjs.map +1 -1
  332. package/dist/layouts/TwoColumn/index.d.cts +1 -1
  333. package/dist/layouts/TwoColumn/index.d.ts +1 -1
  334. package/dist/layouts/TwoColumn/index.js +1 -1
  335. package/dist/layouts/index.cjs +4 -0
  336. package/dist/layouts/index.d.cts +6 -5
  337. package/dist/layouts/index.d.ts +6 -5
  338. package/dist/layouts/index.js +2 -1
  339. package/dist/patterns/DataTable/index.cjs +6 -2
  340. package/dist/patterns/DataTable/index.cjs.map +1 -1
  341. package/dist/patterns/DataTable/index.d.cts +3 -3
  342. package/dist/patterns/DataTable/index.d.cts.map +1 -1
  343. package/dist/patterns/DataTable/index.d.ts +3 -3
  344. package/dist/patterns/DataTable/index.d.ts.map +1 -1
  345. package/dist/patterns/DataTable/index.js +6 -2
  346. package/dist/patterns/DataTable/index.js.map +1 -1
  347. package/dist/patterns/Footer/index.d.cts +7 -7
  348. package/dist/patterns/Footer/index.d.cts.map +1 -1
  349. package/dist/patterns/Footer/index.d.ts +7 -7
  350. package/dist/patterns/Footer/index.d.ts.map +1 -1
  351. package/dist/patterns/Header/index.d.cts +1 -1
  352. package/dist/patterns/Header/index.d.ts +1 -1
  353. package/dist/patterns/MediaObject/index.cjs +1 -1
  354. package/dist/patterns/MediaObject/index.d.cts +14 -14
  355. package/dist/patterns/MediaObject/index.d.cts.map +1 -1
  356. package/dist/patterns/MediaObject/index.d.ts +12 -12
  357. package/dist/patterns/MediaObject/index.js +1 -1
  358. package/dist/patterns/NavRail/index.cjs +4 -2
  359. package/dist/patterns/NavRail/index.cjs.map +1 -1
  360. package/dist/patterns/NavRail/index.d.cts +1 -1
  361. package/dist/patterns/NavRail/index.d.ts +1 -1
  362. package/dist/patterns/NavRail/index.js +4 -2
  363. package/dist/patterns/NavRail/index.js.map +1 -1
  364. package/dist/patterns/SectionCard/index.d.cts +2 -2
  365. package/dist/patterns/SectionCard/index.d.cts.map +1 -1
  366. package/dist/patterns/SectionCard/index.d.ts +2 -2
  367. package/dist/patterns/SectionCard/index.d.ts.map +1 -1
  368. package/dist/patterns/SectionHeading/index.d.cts +3 -3
  369. package/dist/patterns/SectionHeading/index.d.cts.map +1 -1
  370. package/dist/patterns/SectionHeading/index.d.ts +3 -3
  371. package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
  372. package/dist/patterns/index.d.cts +2 -2
  373. package/dist/patterns/index.d.ts +2 -2
  374. package/dist/primitives/Accordion/index.cjs +6 -2
  375. package/dist/primitives/Accordion/index.cjs.map +1 -1
  376. package/dist/primitives/Accordion/index.js +6 -2
  377. package/dist/primitives/Accordion/index.js.map +1 -1
  378. package/dist/primitives/Alert/index.cjs +2 -1
  379. package/dist/primitives/Alert/index.cjs.map +1 -1
  380. package/dist/primitives/Alert/index.js +1 -1
  381. package/dist/primitives/AlertDialog/index.cjs +1 -1
  382. package/dist/primitives/AlertDialog/index.js +1 -1
  383. package/dist/primitives/AspectRatio/index.cjs +1 -1
  384. package/dist/primitives/AspectRatio/index.js +1 -1
  385. package/dist/primitives/Avatar/index.cjs +1 -1
  386. package/dist/primitives/Avatar/index.js +1 -1
  387. package/dist/primitives/Badge/index.cjs +3 -2
  388. package/dist/primitives/Badge/index.cjs.map +1 -1
  389. package/dist/primitives/Badge/index.js +2 -2
  390. package/dist/primitives/Breadcrumb/index.cjs +7 -3
  391. package/dist/primitives/Breadcrumb/index.cjs.map +1 -1
  392. package/dist/primitives/Breadcrumb/index.js +7 -3
  393. package/dist/primitives/Breadcrumb/index.js.map +1 -1
  394. package/dist/primitives/Button/index.cjs +3 -2
  395. package/dist/primitives/Button/index.cjs.map +1 -1
  396. package/dist/primitives/Button/index.js +2 -2
  397. package/dist/primitives/ButtonGroup/index.cjs +3 -2
  398. package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
  399. package/dist/primitives/ButtonGroup/index.js +2 -2
  400. package/dist/primitives/Calendar/index.cjs +12 -11
  401. package/dist/primitives/Calendar/index.cjs.map +1 -1
  402. package/dist/primitives/Calendar/index.js +12 -11
  403. package/dist/primitives/Calendar/index.js.map +1 -1
  404. package/dist/primitives/Card/index.cjs +2 -1
  405. package/dist/primitives/Card/index.cjs.map +1 -1
  406. package/dist/primitives/Card/index.js +1 -1
  407. package/dist/primitives/Carousel/index.cjs +4 -3
  408. package/dist/primitives/Carousel/index.cjs.map +1 -1
  409. package/dist/primitives/Carousel/index.js +4 -3
  410. package/dist/primitives/Carousel/index.js.map +1 -1
  411. package/dist/primitives/Checkbox/index.cjs +10 -3
  412. package/dist/primitives/Checkbox/index.cjs.map +1 -1
  413. package/dist/primitives/Checkbox/index.d.cts +1 -1
  414. package/dist/primitives/Checkbox/index.d.ts +1 -1
  415. package/dist/primitives/Checkbox/index.js +10 -3
  416. package/dist/primitives/Checkbox/index.js.map +1 -1
  417. package/dist/primitives/CheckboxTree/index.cjs +6 -2
  418. package/dist/primitives/CheckboxTree/index.cjs.map +1 -1
  419. package/dist/primitives/CheckboxTree/index.d.cts +1 -1
  420. package/dist/primitives/CheckboxTree/index.d.ts +1 -1
  421. package/dist/primitives/CheckboxTree/index.js +6 -2
  422. package/dist/primitives/CheckboxTree/index.js.map +1 -1
  423. package/dist/primitives/CircularProgress/index.cjs +106 -0
  424. package/dist/primitives/CircularProgress/index.cjs.map +1 -0
  425. package/dist/primitives/CircularProgress/index.d.cts +2 -0
  426. package/dist/primitives/CircularProgress/index.d.ts +2 -0
  427. package/dist/primitives/CircularProgress/index.js +105 -0
  428. package/dist/primitives/CircularProgress/index.js.map +1 -0
  429. package/dist/primitives/Collapsible/index.cjs +1 -1
  430. package/dist/primitives/Collapsible/index.d.cts +1 -1
  431. package/dist/primitives/Collapsible/index.d.ts +1 -1
  432. package/dist/primitives/Collapsible/index.js +1 -1
  433. package/dist/primitives/Command/index.cjs +6 -2
  434. package/dist/primitives/Command/index.cjs.map +1 -1
  435. package/dist/primitives/Command/index.d.cts +1 -1
  436. package/dist/primitives/Command/index.d.ts +1 -1
  437. package/dist/primitives/Command/index.js +6 -2
  438. package/dist/primitives/Command/index.js.map +1 -1
  439. package/dist/primitives/ContextMenu/index.cjs +14 -4
  440. package/dist/primitives/ContextMenu/index.cjs.map +1 -1
  441. package/dist/primitives/ContextMenu/index.d.cts +1 -1
  442. package/dist/primitives/ContextMenu/index.d.ts +1 -1
  443. package/dist/primitives/ContextMenu/index.js +14 -4
  444. package/dist/primitives/ContextMenu/index.js.map +1 -1
  445. package/dist/primitives/Credits/index.cjs +8 -3
  446. package/dist/primitives/Credits/index.cjs.map +1 -1
  447. package/dist/primitives/Credits/index.d.cts +1 -1
  448. package/dist/primitives/Credits/index.d.ts +1 -1
  449. package/dist/primitives/Credits/index.js +7 -3
  450. package/dist/primitives/Credits/index.js.map +1 -1
  451. package/dist/primitives/Dialog/index.cjs +3 -2
  452. package/dist/primitives/Dialog/index.cjs.map +1 -1
  453. package/dist/primitives/Dialog/index.d.cts +1 -1
  454. package/dist/primitives/Dialog/index.d.ts +1 -1
  455. package/dist/primitives/Dialog/index.js +3 -2
  456. package/dist/primitives/Dialog/index.js.map +1 -1
  457. package/dist/primitives/Drawer/index.cjs +34 -2
  458. package/dist/primitives/Drawer/index.cjs.map +1 -1
  459. package/dist/primitives/Drawer/index.d.cts +1 -1
  460. package/dist/primitives/Drawer/index.d.ts +1 -1
  461. package/dist/primitives/Drawer/index.js +34 -2
  462. package/dist/primitives/Drawer/index.js.map +1 -1
  463. package/dist/primitives/DropdownMenu/index.cjs +14 -4
  464. package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
  465. package/dist/primitives/DropdownMenu/index.d.cts +1 -1
  466. package/dist/primitives/DropdownMenu/index.d.ts +1 -1
  467. package/dist/primitives/DropdownMenu/index.js +14 -4
  468. package/dist/primitives/DropdownMenu/index.js.map +1 -1
  469. package/dist/primitives/Empty/index.cjs +1 -1
  470. package/dist/primitives/Empty/index.d.cts +1 -1
  471. package/dist/primitives/Empty/index.d.ts +1 -1
  472. package/dist/primitives/Empty/index.js +1 -1
  473. package/dist/primitives/Field/index.cjs +1 -1
  474. package/dist/primitives/Field/index.d.cts +1 -1
  475. package/dist/primitives/Field/index.d.ts +1 -1
  476. package/dist/primitives/Field/index.js +1 -1
  477. package/dist/primitives/FileUpload/index.cjs +354 -0
  478. package/dist/primitives/FileUpload/index.cjs.map +1 -0
  479. package/dist/primitives/FileUpload/index.d.cts +2 -0
  480. package/dist/primitives/FileUpload/index.d.ts +2 -0
  481. package/dist/primitives/FileUpload/index.js +351 -0
  482. package/dist/primitives/FileUpload/index.js.map +1 -0
  483. package/dist/primitives/Form/index.cjs +1 -1
  484. package/dist/primitives/Form/index.d.cts +1 -1
  485. package/dist/primitives/Form/index.d.ts +1 -1
  486. package/dist/primitives/Form/index.js +1 -1
  487. package/dist/primitives/Heading/index.cjs +2 -1
  488. package/dist/primitives/Heading/index.cjs.map +1 -1
  489. package/dist/primitives/Heading/index.d.cts +1 -1
  490. package/dist/primitives/Heading/index.d.ts +1 -1
  491. package/dist/primitives/Heading/index.js +1 -1
  492. package/dist/primitives/HoverCard/index.cjs +1 -1
  493. package/dist/primitives/HoverCard/index.d.cts +1 -1
  494. package/dist/primitives/HoverCard/index.d.ts +1 -1
  495. package/dist/primitives/HoverCard/index.js +1 -1
  496. package/dist/primitives/Icon/index.d.cts +1 -1
  497. package/dist/primitives/Icon/index.d.ts +1 -1
  498. package/dist/primitives/InfoBanner/index.cjs +6 -3
  499. package/dist/primitives/InfoBanner/index.cjs.map +1 -1
  500. package/dist/primitives/InfoBanner/index.d.cts +1 -1
  501. package/dist/primitives/InfoBanner/index.d.ts +1 -1
  502. package/dist/primitives/InfoBanner/index.js +5 -3
  503. package/dist/primitives/InfoBanner/index.js.map +1 -1
  504. package/dist/primitives/Input/index.cjs +2 -1
  505. package/dist/primitives/Input/index.cjs.map +1 -1
  506. package/dist/primitives/Input/index.d.cts +1 -1
  507. package/dist/primitives/Input/index.d.ts +1 -1
  508. package/dist/primitives/Input/index.js +1 -1
  509. package/dist/primitives/InputGroup/index.cjs +1 -1
  510. package/dist/primitives/InputGroup/index.d.cts +1 -1
  511. package/dist/primitives/InputGroup/index.d.ts +1 -1
  512. package/dist/primitives/InputGroup/index.js +1 -1
  513. package/dist/primitives/InputOtp/index.cjs +3 -2
  514. package/dist/primitives/InputOtp/index.cjs.map +1 -1
  515. package/dist/primitives/InputOtp/index.d.cts +1 -1
  516. package/dist/primitives/InputOtp/index.d.ts +1 -1
  517. package/dist/primitives/InputOtp/index.js +3 -2
  518. package/dist/primitives/InputOtp/index.js.map +1 -1
  519. package/dist/primitives/Item/index.cjs +2 -2
  520. package/dist/primitives/Item/index.d.cts +1 -1
  521. package/dist/primitives/Item/index.d.ts +1 -1
  522. package/dist/primitives/Item/index.js +2 -2
  523. package/dist/primitives/Kbd/index.d.cts +1 -1
  524. package/dist/primitives/Kbd/index.d.ts +1 -1
  525. package/dist/primitives/Label/index.cjs +1 -1
  526. package/dist/primitives/Label/index.d.cts +1 -1
  527. package/dist/primitives/Label/index.d.ts +1 -1
  528. package/dist/primitives/Label/index.js +1 -1
  529. package/dist/primitives/Link/index.cjs +3 -2
  530. package/dist/primitives/Link/index.cjs.map +1 -1
  531. package/dist/primitives/Link/index.d.cts +1 -1
  532. package/dist/primitives/Link/index.d.ts +1 -1
  533. package/dist/primitives/Link/index.js +2 -2
  534. package/dist/primitives/Logo/index.d.cts +1 -1
  535. package/dist/primitives/Logo/index.d.ts +1 -1
  536. package/dist/primitives/Menubar/index.cjs +14 -4
  537. package/dist/primitives/Menubar/index.cjs.map +1 -1
  538. package/dist/primitives/Menubar/index.d.cts +1 -1
  539. package/dist/primitives/Menubar/index.d.ts +1 -1
  540. package/dist/primitives/Menubar/index.js +14 -4
  541. package/dist/primitives/Menubar/index.js.map +1 -1
  542. package/dist/primitives/Mosaic/index.cjs +4 -0
  543. package/dist/primitives/Mosaic/index.d.cts +2 -0
  544. package/dist/primitives/Mosaic/index.d.ts +2 -0
  545. package/dist/primitives/Mosaic/index.js +2 -0
  546. package/dist/primitives/NativeSelect/index.cjs +6 -3
  547. package/dist/primitives/NativeSelect/index.cjs.map +1 -1
  548. package/dist/primitives/NativeSelect/index.d.cts +1 -1
  549. package/dist/primitives/NativeSelect/index.d.ts +1 -1
  550. package/dist/primitives/NativeSelect/index.js +5 -3
  551. package/dist/primitives/NativeSelect/index.js.map +1 -1
  552. package/dist/primitives/NavRail/index.d.cts +2 -2
  553. package/dist/primitives/NavRail/index.d.ts +2 -2
  554. package/dist/primitives/NavigationMenu/index.cjs +5 -3
  555. package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
  556. package/dist/primitives/NavigationMenu/index.d.cts +1 -1
  557. package/dist/primitives/NavigationMenu/index.d.ts +1 -1
  558. package/dist/primitives/NavigationMenu/index.js +5 -3
  559. package/dist/primitives/NavigationMenu/index.js.map +1 -1
  560. package/dist/primitives/NotchedCard/index.cjs +390 -0
  561. package/dist/primitives/NotchedCard/index.cjs.map +1 -0
  562. package/dist/primitives/NotchedCard/index.d.cts +2 -0
  563. package/dist/primitives/NotchedCard/index.d.ts +2 -0
  564. package/dist/primitives/NotchedCard/index.js +385 -0
  565. package/dist/primitives/NotchedCard/index.js.map +1 -0
  566. package/dist/primitives/Pagination/index.cjs +6 -2
  567. package/dist/primitives/Pagination/index.cjs.map +1 -1
  568. package/dist/primitives/Pagination/index.d.cts +1 -1
  569. package/dist/primitives/Pagination/index.d.ts +1 -1
  570. package/dist/primitives/Pagination/index.js +6 -2
  571. package/dist/primitives/Pagination/index.js.map +1 -1
  572. package/dist/primitives/Popover/index.cjs +1 -1
  573. package/dist/primitives/Popover/index.d.cts +1 -1
  574. package/dist/primitives/Popover/index.d.ts +1 -1
  575. package/dist/primitives/Popover/index.js +1 -1
  576. package/dist/primitives/Progress/index.cjs +1 -1
  577. package/dist/primitives/Progress/index.d.cts +1 -1
  578. package/dist/primitives/Progress/index.d.ts +1 -1
  579. package/dist/primitives/Progress/index.js +1 -1
  580. package/dist/primitives/RadioGroup/index.cjs +7 -3
  581. package/dist/primitives/RadioGroup/index.cjs.map +1 -1
  582. package/dist/primitives/RadioGroup/index.d.cts +1 -1
  583. package/dist/primitives/RadioGroup/index.d.ts +1 -1
  584. package/dist/primitives/RadioGroup/index.js +7 -3
  585. package/dist/primitives/RadioGroup/index.js.map +1 -1
  586. package/dist/primitives/Resizable/index.cjs +6 -2
  587. package/dist/primitives/Resizable/index.cjs.map +1 -1
  588. package/dist/primitives/Resizable/index.d.cts +1 -1
  589. package/dist/primitives/Resizable/index.d.ts +1 -1
  590. package/dist/primitives/Resizable/index.js +6 -2
  591. package/dist/primitives/Resizable/index.js.map +1 -1
  592. package/dist/primitives/ScrollArea/index.cjs +1 -1
  593. package/dist/primitives/ScrollArea/index.d.cts +1 -1
  594. package/dist/primitives/ScrollArea/index.d.ts +1 -1
  595. package/dist/primitives/ScrollArea/index.js +1 -1
  596. package/dist/primitives/Select/index.cjs +18 -5
  597. package/dist/primitives/Select/index.cjs.map +1 -1
  598. package/dist/primitives/Select/index.d.cts +1 -1
  599. package/dist/primitives/Select/index.d.ts +1 -1
  600. package/dist/primitives/Select/index.js +18 -5
  601. package/dist/primitives/Select/index.js.map +1 -1
  602. package/dist/primitives/Separator/index.cjs +1 -1
  603. package/dist/primitives/Separator/index.js +1 -1
  604. package/dist/primitives/Sheet/index.cjs +40 -4
  605. package/dist/primitives/Sheet/index.cjs.map +1 -1
  606. package/dist/primitives/Sheet/index.d.cts +1 -1
  607. package/dist/primitives/Sheet/index.d.ts +1 -1
  608. package/dist/primitives/Sheet/index.js +40 -4
  609. package/dist/primitives/Sheet/index.js.map +1 -1
  610. package/dist/primitives/Sidebar/index.d.cts +1 -1
  611. package/dist/primitives/Sidebar/index.d.ts +1 -1
  612. package/dist/primitives/Skeleton/index.d.cts +1 -1
  613. package/dist/primitives/Skeleton/index.d.ts +1 -1
  614. package/dist/primitives/Slider/index.cjs +1 -1
  615. package/dist/primitives/Slider/index.d.cts +1 -1
  616. package/dist/primitives/Slider/index.d.ts +1 -1
  617. package/dist/primitives/Slider/index.js +1 -1
  618. package/dist/primitives/Sonner/index.cjs +22 -6
  619. package/dist/primitives/Sonner/index.cjs.map +1 -1
  620. package/dist/primitives/Sonner/index.d.cts +1 -1
  621. package/dist/primitives/Sonner/index.d.ts +1 -1
  622. package/dist/primitives/Sonner/index.js +22 -6
  623. package/dist/primitives/Sonner/index.js.map +1 -1
  624. package/dist/primitives/Spinner/index.cjs +4 -2
  625. package/dist/primitives/Spinner/index.cjs.map +1 -1
  626. package/dist/primitives/Spinner/index.d.cts +1 -1
  627. package/dist/primitives/Spinner/index.d.ts +1 -1
  628. package/dist/primitives/Spinner/index.js +4 -2
  629. package/dist/primitives/Spinner/index.js.map +1 -1
  630. package/dist/primitives/Switch/index.cjs +1 -1
  631. package/dist/primitives/Switch/index.d.cts +1 -1
  632. package/dist/primitives/Switch/index.d.ts +1 -1
  633. package/dist/primitives/Switch/index.js +1 -1
  634. package/dist/primitives/Table/index.d.cts +1 -1
  635. package/dist/primitives/Table/index.d.ts +1 -1
  636. package/dist/primitives/Tabs/index.cjs +2 -2
  637. package/dist/primitives/Tabs/index.d.cts +1 -1
  638. package/dist/primitives/Tabs/index.d.ts +1 -1
  639. package/dist/primitives/Tabs/index.js +2 -2
  640. package/dist/primitives/Text/index.cjs +2 -1
  641. package/dist/primitives/Text/index.cjs.map +1 -1
  642. package/dist/primitives/Text/index.d.cts +1 -1
  643. package/dist/primitives/Text/index.d.ts +1 -1
  644. package/dist/primitives/Text/index.js +1 -1
  645. package/dist/primitives/Textarea/index.cjs +2 -1
  646. package/dist/primitives/Textarea/index.cjs.map +1 -1
  647. package/dist/primitives/Textarea/index.d.cts +1 -1
  648. package/dist/primitives/Textarea/index.d.ts +1 -1
  649. package/dist/primitives/Textarea/index.js +1 -1
  650. package/dist/primitives/ThemeProvider/index.d.cts +1 -1
  651. package/dist/primitives/ThemeProvider/index.d.ts +1 -1
  652. package/dist/primitives/Toggle/index.cjs +3 -2
  653. package/dist/primitives/Toggle/index.cjs.map +1 -1
  654. package/dist/primitives/Toggle/index.d.cts +1 -1
  655. package/dist/primitives/Toggle/index.d.ts +1 -1
  656. package/dist/primitives/Toggle/index.js +2 -2
  657. package/dist/primitives/ToggleGroup/index.cjs +1 -1
  658. package/dist/primitives/ToggleGroup/index.d.cts +1 -1
  659. package/dist/primitives/ToggleGroup/index.d.ts +1 -1
  660. package/dist/primitives/ToggleGroup/index.js +1 -1
  661. package/dist/primitives/Tooltip/index.cjs +1 -1
  662. package/dist/primitives/Tooltip/index.d.cts +1 -1
  663. package/dist/primitives/Tooltip/index.d.ts +1 -1
  664. package/dist/primitives/Tooltip/index.js +1 -1
  665. package/dist/primitives/index.cjs +14 -3
  666. package/dist/primitives/index.d.cts +55 -51
  667. package/dist/primitives/index.d.ts +55 -51
  668. package/dist/primitives/index.js +8 -4
  669. package/package.json +2 -1
  670. package/dist/index47.d.cts.map +0 -1
  671. package/dist/index47.d.ts.map +0 -1
package/DESIGN.md CHANGED
@@ -201,6 +201,21 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
201
201
  - **Custom props**: `flipIcon` — moves leading icon to trailing edge (default `false`).
202
202
  - **Notes**: `role="alert"`; compose `AlertContent` (title+description) with a leading `<svg>` and optional `AlertAction`. Not dismissible (use InfoBanner for that).
203
203
 
204
+ <!-- variant-facts:Alert:start — GENERATED by `pnpm docs:variants`; edit
205
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
206
+
207
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
208
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
209
+
210
+ | variant | use when | fill | text | border | hover fill | tell |
211
+ |---|---|---|---|---|---|---|
212
+ | `default`\* | inline contextual notice inside the content flow | #ffffff → #111827 | #111827 → #f3f4f6 | — | — | white card with icon, neutral text |
213
+ | `destructive` | inline error notice tied to nearby content | #ffffff → #111827 | #bc0126 → #f699ac | — | — | red text on a white card (not a red band) |
214
+
215
+ Confusable: Alert vs InfoBanner vs toast → Alert = static notice inline in the content flow; InfoBanner = full-width severity band at page/section level; toast (sonner) = transient overlay.
216
+
217
+ <!-- variant-facts:Alert:end -->
218
+
204
219
  ### AlertDialog
205
220
  - **Exports**: AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogMedia, AlertDialogOverlay, AlertDialogPortal, AlertDialogTitle, AlertDialogTrigger
206
221
  - **Variants**: AlertDialogContent `size: default* | large`; AlertDialogAction `variant: default* | destructive`
@@ -221,6 +236,30 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
221
236
  - **Custom props**: `asChild` — render child element via Radix Slot (default `false`).
222
237
  - **Notes**: Renders `<span>` by default; `ai` variant is a gradient ring with brand label.
223
238
 
239
+ <!-- variant-facts:Badge:start — GENERATED by `pnpm docs:variants`; edit
240
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
241
+
242
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
243
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
244
+
245
+ | variant | use when | fill | text | border | hover fill | tell |
246
+ |---|---|---|---|---|---|---|
247
+ | `default`\* | high-emphasis label or count (new, selected filter, unread) | #111827 → #ffffff | #f3f4f6 → #111827 | hairline | — | the only filled high-contrast badge |
248
+ | `secondary` | neutral metadata label (category, tag, version) | #e5e7eb → #4b5563 | #374151 → #e5e7eb | hairline | — | quiet gray fill |
249
+ | `destructive` | error / blocking status | #fde6ea → #6c0016 | #bc0126 → #f699ac | hairline | — | red-tint fill + red text |
250
+ | `outline` | neutral label on busy/colored/glass surfaces | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) | #111827 → #f3f4f6 | #e5e7eb → #374151 | — | visible border, translucent fill |
251
+ | `ghost` | quietest label; inline counts | rgb(255 255 255 / 0.0001) → rgb(255 255 255 / 0.0001) | #111827 → #f3f4f6 | hairline | — | no visible fill — just padded text |
252
+ | `success` | positive status (done, active, healthy) | #ecfccb → #365314 | #4d7c0f → #bef264 | hairline | — | green tint |
253
+ | `warning` | caution status (pending, degraded) | #ffedd5 → #431407 | #c2410c → #fdba74 | hairline | — | orange tint |
254
+ | `info` | informational status (beta, new feature) | #e0f2fe → #0c4a6e | #0369a1 → #7dd3fc | hairline | — | blue tint |
255
+ | `ai` | AI-generated / AI-related markers only | — | #e90130 → #e90130 | — | — | gradient border, brand-colored text |
256
+
257
+ Confusable: Severity tints (`info`/`success`/`warning`/`destructive`) are for STATUS; `default`/`secondary` are for plain labels — don't color a neutral tag. `outline` vs `ghost` → outline keeps a visible border (busy/colored surfaces); ghost is text-only quietness.
258
+
259
+ **shape**: `default`\* 8px radius · `round` pill
260
+
261
+ <!-- variant-facts:Badge:end -->
262
+
224
263
  ### Breadcrumb
225
264
  - **Exports**: Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis
226
265
  - **Custom props**: BreadcrumbLink `asChild` — render passed child (e.g. router Link) instead of `<a>`.
@@ -232,12 +271,45 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
232
271
  - **Custom props**: `asChild` — Radix Slot composition (default `false`); `loading` — show Spinner + disable (default `false`).
233
272
  - **Notes**: forwardRef (usable as overlay trigger via `asChild`); spinner only rendered when not `asChild`.
234
273
 
274
+ <!-- variant-facts:Button:start — GENERATED by `pnpm docs:variants`; edit
275
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
276
+
277
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
278
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
279
+
280
+ | variant | use when | fill | text | border | hover fill | tell |
281
+ |---|---|---|---|---|---|---|
282
+ | `default`\* | THE one main action of a view (submit, save, primary CTA) | #111827 → #ffffff | #f3f4f6 → #111827 | — | #374151 → #d1d5db | the only filled high-contrast button |
283
+ | `destructive` | irreversible action (delete, remove) | #fde6ea → #6c0016 | #bc0126 → #f699ac | — | #fde6ea @80% → #6c0016 @80% | red fill |
284
+ | `outline` | secondary action on busy/colored/glass surfaces | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) | #111827 → #f3f4f6 | #d1d5db → #374151 | rgb(31 40 50 / 0.0333) → rgb(255 255 255 / 0.1) | has a visible border |
285
+ | `secondary` | secondary action next to a primary | #ffffff → #111827 | #111827 → #f3f4f6 | — | #f9fafb → #111827 | filled but low-contrast, no border |
286
+ | `ghost` | low-emphasis: toolbars, icon rows, cancel | rgb(255 255 255 / 0.0001) → rgb(255 255 255 / 0.0001) | #111827 → #f3f4f6 | — | rgb(31 40 50 / 0.05) → rgb(255 255 255 / 0.1) | invisible at rest — only the label/icon shows |
287
+ | `link` | inline navigation styled as text | — | #111827 → #f3f4f6 | — | — | no box at all |
288
+ | `ai` | AI-powered affordances only | #ffffff → #111827 | #bc0126 → #fbccd6 | — | — | animated gradient border, brand-colored label |
289
+ | `destructive-ghost` | destructive icon buttons / low-emphasis delete | rgb(255 255 255 / 0.0001) → rgb(255 255 255 / 0.0001) | #bc0126 → #f699ac | — | #fde6ea → #6c0016 | red text without a red fill |
290
+
291
+ Confusable: `outline` vs `ghost` → outline has a border (survives on photos / colored bg); ghost is borderless (dense toolbars). `secondary` vs `outline` → secondary is a solid gray fill; outline is translucent with a border.
292
+
293
+ **size**: `xs` 30px · `sm` 36px · `default`\* 40px · `lg` 44px · `xl` 48px · `icon` 36px square · `icon-xs` 24px square · `icon-sm` 32px square · `icon-lg` 40px square · `icon-xl` 48px square
294
+
295
+ **shape**: `default`\* pill · `square` 6px radius
296
+
297
+ <!-- variant-facts:Button:end -->
298
+
235
299
  ### ButtonGroup
236
300
  - **Exports**: ButtonGroup, ButtonGroupSeparator, ButtonGroupText, buttonGroupVariants
237
301
  - **Variants**: ButtonGroup `orientation: horizontal* | vertical`
238
302
  - **Custom props**: ButtonGroupText `asChild` (default `false`).
239
303
  - **Notes**: Merges child borders/corners into one attached unit; `role="group"`.
240
304
 
305
+ <!-- variant-facts:ButtonGroup:start — GENERATED by `pnpm docs:variants`; edit
306
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
307
+
308
+
309
+ **orientation**: `horizontal`\* · `vertical`
310
+
311
+ <!-- variant-facts:ButtonGroup:end -->
312
+
241
313
  ### Calendar
242
314
  - **Exports**: Calendar, CalendarDayButton
243
315
  - **Custom props**: `buttonVariant` — Button variant for prev/next nav (default `outline`); `showOutsideDays` (default `true`); `captionLayout` (default `label`, `dropdown` for month/year selects).
@@ -248,6 +320,25 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
248
320
  - **Variants**: Card `variant: default* | glass | brand | ai | inverted`, `tint: subtle | light* | medium | heavy` (glass only); CardHeader `align: start | center* | end`; CardFooter `tone: default* | brand | muted | card`
249
321
  - **Notes**: `tint` applies only to `variant="glass"`; footer `brand`/`muted`/`card` render a full-width band — pair with `<Card className="overflow-hidden">`. Card defaults to `justify-between` vertical distribution (overridable via className).
250
322
 
323
+ <!-- HAND-WRITTEN choosing table (compoundVariants — not generated; keep in sync with cardVariants). -->
324
+
325
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
326
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
327
+
328
+ | variant | use when | looks like | tell |
329
+ |---|---|---|---|
330
+ | `default`\* | standard content container on plain page chrome | opaque `#ffffff → #111827`, hairline border, shadow-sm | solid card with border + shadow |
331
+ | `glass` | card floating over `PageBackground` / imagery | translucent white → translucent dark-navy, backdrop-blurred; `tint` sets opacity | see-through + blurred, borderless |
332
+ | `brand` | promotional / product-branded surface | left→right brand gradient (`--theme-brand-700` → `-500`), white text — does **not** flip in dark mode | colorful gradient fill |
333
+ | `ai` | AI feature surface | normal surface wrapped in the gradient AI ring | gradient border, normal inside |
334
+ | `inverted` | contrast block (CTA band, spotlight) | dark card in light mode `#111827`, light card in dark `#ffffff` | opposite of the page |
335
+
336
+ **tint** (glass only): `subtle` 20% · `light`\* 40% · `medium` 40% (no 50% token yet) · `heavy` 60%.
337
+
338
+ Confusable: `default` vs `glass` → default is opaque with border+shadow; glass is
339
+ translucent+blurred with no border, and needs a textured layer behind it
340
+ (`PageBackground`) to read as glass.
341
+
251
342
  ### Carousel
252
343
  - **Exports**: CarouselApi (type), Carousel, CarouselContent, CarouselItem, CarouselPrevious, CarouselNext
253
344
  - **Custom props**: `opts` (Embla options), `plugins`, `orientation: horizontal* | vertical`, `setApi` (receives Embla API).
@@ -269,6 +360,12 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
269
360
  - **Custom props**: `nodes` (hierarchical `{id, label, children}` data); `value` (controlled selected ids, required); `onValueChange`; `defaultExpandedIds`.
270
361
  - **Notes**: Controlled only; tri-state propagation across subtrees; `role="tree"`. This is the DS answer to hierarchical multi-select.
271
362
 
363
+ ### CircularProgress
364
+ - **Exports**: CircularProgress, CircularProgressProps (type), CircularProgressVariant (type)
365
+ - **Variants**: `variant: default* | brand | success | warning | info | destructive | analyzing | ingesting` (indicator stroke); `trackVariant` — same scale for the track (defaults to `variant`, rendered at /20 opacity)
366
+ - **Custom props**: `value` (omit → indeterminate spinning arc), `min`/`max` (aria/value normalization, default 0/100), `size` (diameter px, default `48`), `strokeWidth` (px, default `4`), `progressColor`/`trackColor` (explicit CSS colours, override the variant classes), `label` (centered node), `showValueLabel` (centered `%` text when determinate, default `false`), `indeterminateLabel` (a11y text for loading state, default `Loading`).
367
+ - **Notes**: `role="progressbar"` with normalized aria values and a polite live region. Determinate animates stroke-dashoffset (500ms, motion-reduce respected); indeterminate spins a 35% arc (`motion-safe`). Circular counterpart to the linear `Progress` bar.
368
+
272
369
  ### Collapsible
273
370
  - **Exports**: Collapsible, CollapsibleTrigger, CollapsibleContent
274
371
  - **Notes**: Radix Collapsible passthrough (controlled/uncontrolled via `open`/`defaultOpen`); no styling applied.
@@ -290,6 +387,20 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
290
387
  - **Custom props**: `value` (balance, required); `lowThreshold` (default `200`); `icon` override; `format` override (default floor+thousands).
291
388
  - **Notes**: Color escalates as balance drops (neutral → amber ≤ threshold → red ≤ 0).
292
389
 
390
+ <!-- variant-facts:Credits:start — GENERATED by `pnpm docs:variants`; edit
391
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
392
+
393
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
394
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
395
+
396
+ | variant | fill | text | border | hover fill |
397
+ |---|---|---|---|---|
398
+ | `default`\* | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) | #111827 → #f3f4f6 | #e5e7eb → #374151 | — |
399
+ | `warning` | #ffedd5 → #431407 | #c2410c → #fdba74 | hairline | — |
400
+ | `critical` | #fde6ea → #6c0016 | #bc0126 → #f699ac | hairline | — |
401
+
402
+ <!-- variant-facts:Credits:end -->
403
+
293
404
  ### Dialog
294
405
  - **Exports**: Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger
295
406
  - **Variants**: DialogContent `size: sm | default* | lg | xl`
@@ -298,7 +409,8 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
298
409
 
299
410
  ### Drawer
300
411
  - **Exports**: Drawer, DrawerPortal, DrawerOverlay, DrawerTrigger, DrawerClose, DrawerContent, DrawerHeader, DrawerFooter, DrawerTitle, DrawerDescription
301
- - **Notes**: Built on `vaul`; slide `direction` (top/bottom/left/right) set on the `Drawer` root. `DrawerContent` self-portals + renders overlay; bottom drawer shows a drag handle.
412
+ - **Variants**: DrawerContent `size: small | default* | medium | large | extraLarge`
413
+ - **Notes**: Built on `vaul`; slide `direction` (top/bottom/left/right) set on the `Drawer` root. `DrawerContent` self-portals + renders overlay; bottom drawer shows a drag handle. `size` scales the panel per direction — left/right width caps: `small` xs (20rem) · `default` sm (24rem) · `medium` md (28rem) · `large` lg (32rem) · `extraLarge` 2xl (42rem); top/bottom max-heights: 60 / 80 / 85 / 90 / 95vh. Prefer `size` over a width/height `className` override.
302
414
 
303
415
  ### DropdownMenu
304
416
  - **Exports**: DropdownMenu, DropdownMenuPortal, DropdownMenuTrigger, DropdownMenuContent, DropdownMenuGroup, DropdownMenuLabel, DropdownMenuItem, DropdownMenuCheckboxItem, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubTrigger, DropdownMenuSubContent
@@ -317,6 +429,11 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
317
429
  - **Custom props**: FieldError accepts `errors` array (deduped, listed when >1) or `children`; FieldSeparator optional centered label.
318
430
  - **Notes**: Layout primitives for forms (non-react-hook-form); `FieldError` is `role="alert"` and renders nothing when empty.
319
431
 
432
+ ### FileUpload
433
+ - **Exports**: FileUpload, FileUploadHandler (type), FileUploadItem (type), FileUploadProps (type), FileUploadStatus (type)
434
+ - **Custom props**: `multiple` (default `false`); `accept` — native accept filter (e.g. `"image/*,.pdf"`); `maxFiles` (default unlimited when `multiple`, `1` otherwise); `maxFileSize` — bytes, oversized files rejected with a message; `validateFile` — custom validator, return a message to reject or `null` to accept; `onUpload` — async handler per accepted file, receives `{ file, signal, reportProgress }`; `onItemsChange` — fires whenever file entries change (added/progress/completed/removed); `dropzoneAriaLabel` (default `"File upload drop zone"`); `disabled`.
435
+ - **Notes**: Click-to-browse + drag-and-drop dropzone with per-file states (`idle | uploading | success | error`), progress bars, and remove/cancel controls. Wire real uploads via `onUpload` — call `reportProgress(0–100)` as bytes stream and throw to mark the file failed; the `signal` aborts when the user cancels/removes. Validation errors (accept/size/custom/maxFiles) render in an `aria-live` list under the dropzone.
436
+
320
437
  ### Form
321
438
  - **Exports**: useFormField, Form, FormItem, FormLabel, FormControl, FormDescription, FormMessage, FormField
322
439
  - **Notes**: react-hook-form binding layer over the Field primitives; `Form` = RHF `FormProvider`, `FormField` wraps `Controller`. `FormControl` wires id/aria-describedby/aria-invalid via Slot; must be used within `FormField`/`FormItem`.
@@ -327,6 +444,25 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
327
444
  - **Custom props**: `as` — semantic element (default `h2`, independent of visual `size`).
328
445
  - **Notes**: `gradient` fills text with the brand gradient.
329
446
 
447
+ <!-- variant-facts:Heading:start — GENERATED by `pnpm docs:variants`; edit
448
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
449
+
450
+ **Choosing a `gradient`** — colors are `light → dark` mode actuals. Never re-skin a
451
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
452
+
453
+ | gradient | fill | text | border | hover fill |
454
+ |---|---|---|---|---|
455
+ | `true` | — | — | — | — |
456
+ | `false`\* | — | #111827 → #f3f4f6 | — | — |
457
+
458
+ **size**: `1` · `2`\* · `3` · `4` · `5` · `6` · `7`
459
+
460
+ **weight**: `normal` · `medium` · `semibold`
461
+
462
+ **align**: `left` · `center` · `right`
463
+
464
+ <!-- variant-facts:Heading:end -->
465
+
330
466
  ### HoverCard
331
467
  - **Exports**: HoverCard, HoverCardTrigger, HoverCardContent
332
468
  - **Custom props**: HoverCardContent `align` (default `center`), `sideOffset` (default `4`).
@@ -335,8 +471,10 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
335
471
  ### Icon
336
472
  - **Exports**: Icon, IconProps (type), IconName (type), ICON_NAMES
337
473
  - **Variants**: `color: default* | muted | primary | success | destructive | inverted`, `shape: square | round` (unset = bare glyph), `fill: subtle* | solid` (boxed only), `size: xs | sm | md* | lg | xl`
338
- - **Custom props**: `icon` (typed lucide name, required); `strokeWidth`; `label` — a11y label (sets `role="img"`, else aria-hidden).
339
- - **Notes**: Lazily code-splits each lucide icon; `shape` wraps the glyph in a padded box where `fill`/`color` apply.
474
+ - **Glyph source (pass exactly one)**: `icon` — a typed lucide NAME string (`<Icon icon="search" />`), lazily code-split one chunk per icon; best for app/content icons chosen at runtime. `as` — an icon COMPONENT, lucide **or your own custom icon** (`<Icon as={Search} />`), rendered synchronously and, when un-boxed, as a bare `<svg>` so it drops into a component's direct-child `[&>svg]` slot styling; best inside components and for static/custom icons.
475
+ - **Custom props**: `strokeWidth`; `label` a11y label (sets `role="img"`, else aria-hidden).
476
+ - **Color**: `color="default"` **inherits** the surrounding text color (currentColor — deliberately no `text-*` class, so guarded slot rules like Select's `[&_svg:not([class*='text-'])]` still apply) — a bare icon on a Button matches the label instead of forcing a dark glyph on a dark surface. On normal chrome it still resolves to `text-primary-txt` (via `<body>`). Override with a semantic `color` or a `text-*` className.
477
+ - **Notes**: `shape` wraps the glyph in a padded box where `fill`/`color` apply. Existing `icon="name"` usage is unchanged — `as` is purely additive.
340
478
 
341
479
  ### InfoBanner
342
480
  - **Exports**: InfoBanner, infoBannerVariants, InfoBannerProps (type)
@@ -344,11 +482,48 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
344
482
  - **Custom props**: `title` (required); `description`; `icon` override; `dismissible` (default `true`); `visible` (controlled); `onDismiss`.
345
483
  - **Notes**: `role="status"`; dismissible — distinct from the non-dismissible Alert.
346
484
 
485
+ <!-- variant-facts:InfoBanner:start — GENERATED by `pnpm docs:variants`; edit
486
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
487
+
488
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
489
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
490
+
491
+ | variant | use when | fill | text | border | hover fill | tell |
492
+ |---|---|---|---|---|---|---|
493
+ | `info`\* | announcements, tips, FYI messaging | #e0f2fe → #0c4a6e | #0369a1 → #7dd3fc | — | — | blue band |
494
+ | `success` | operation completed / healthy state | #ecfccb → #365314 | #4d7c0f → #bef264 | — | — | green band |
495
+ | `warning` | caution or degraded state, action may be needed | #ffedd5 → #431407 | #c2410c → #fdba74 | — | — | orange band |
496
+ | `error` | failure that needs attention | #fde6ea → #6c0016 | #bc0126 → #f699ac | — | — | red band |
497
+ | `neutral` | generic notice with no severity | #f3f4f6 → #111827 | #111827 → #f3f4f6 | — | — | gray band |
498
+
499
+ Confusable: InfoBanner vs Alert → banner is a full-width severity band at page/section level; Alert sits inline in the content flow.
500
+
501
+ <!-- variant-facts:InfoBanner:end -->
502
+
347
503
  ### Input
348
504
  - **Exports**: Input, inputVariants
349
505
  - **Variants**: `variant: default* | ai`, `size: xs | sm | default* | lg`, `shape: default* (12px) | round (pill)`
350
506
  - **Notes**: Native `<input>` passthrough; `ai` swaps border for the AI gradient; `aria-invalid` triggers the error ring.
351
507
 
508
+ <!-- variant-facts:Input:start — GENERATED by `pnpm docs:variants`; edit
509
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
510
+
511
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
512
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
513
+
514
+ | variant | use when | fill | text | border | hover fill | tell |
515
+ |---|---|---|---|---|---|---|
516
+ | `default`\* | any standard text entry | #ffffff → #1f2832 | — | #e5e7eb → #374151 | — | white fill, gray hairline border |
517
+ | `ai` | AI prompt / ask-anything fields only | — | — | — | — | gradient AI border |
518
+
519
+ Confusable: `ai` is reserved for AI prompt fields — a normal field with AI autofill is still `default`.
520
+
521
+ **size**: `xs` 24px · `sm` 32px · `default`\* 36px · `lg` 40px
522
+
523
+ **shape**: `default`\* 12px radius · `round` pill
524
+
525
+ <!-- variant-facts:Input:end -->
526
+
352
527
  ### InputGroup
353
528
  - **Exports**: InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea
354
529
  - **Variants**: InputGroup `variant: default* | ai`; InputGroupAddon `align: inline-start* | inline-end | block-start | block-end`; InputGroupButton `size: xs* | sm | icon-xs | icon-sm`
@@ -380,6 +555,22 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
380
555
  - **Variants**: `variant: default* | muted | subtle`, `underline: always* | hover`
381
556
  - **Custom props**: `asChild` — render a router link instead of `<a>` (default `false`).
382
557
 
558
+ <!-- variant-facts:Link:start — GENERATED by `pnpm docs:variants`; edit
559
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
560
+
561
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
562
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
563
+
564
+ | variant | fill | text | border | hover fill |
565
+ |---|---|---|---|---|
566
+ | `default`\* | — | #111827 @80% → #f3f4f6 @80% | — | — |
567
+ | `muted` | — | #111827 → #f3f4f6 | — | — |
568
+ | `subtle` | — | #111827 @80% → #f3f4f6 @80% | — | — |
569
+
570
+ **underline**: `always`\* · `hover`
571
+
572
+ <!-- variant-facts:Link:end -->
573
+
383
574
  ### Logo
384
575
  - **Exports**: Logo, LogoBrand (type), LogoVariant (type)
385
576
  - **Variants**: `variant: logo* | icon`
@@ -392,16 +583,35 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
392
583
  - **Custom props**: Item/Label/SubTrigger `inset` (default `false`)
393
584
  - **Notes**: Radix Menubar; content self-portals; auto-indents plain items when checkbox/radio items present.
394
585
 
586
+ ### Mosaic
587
+ - **Exports**: Mosaic, MosaicWindow, MosaicProps (type), MosaicWindowProps (type), and tree types re-exported from Mosaic.utils: MosaicNode, MosaicParent, MosaicKey, MosaicDirection, MosaicPath, DropZone
588
+ - **Custom props**: `value` / `defaultValue` — the pane tree, controlled or uncontrolled (`MosaicNode<T>` = leaf id `T` or `{ direction: "row" | "column", first, second, splitPercentage? }`); `onChange` — fires with the updated tree after resize/split/remove/drag (no strict veto); `renderTile` — renders a leaf's content (required); `renderTitle` — pane toolbar title (default `String(id)`); `renderControls` — extra toolbar actions after split/remove; `createNode` — id factory for toolbar splits (required); `dragToRearrange` (default `true`); `dropZoneFraction` — edge-zone fraction 0–1 (default `0.25`); `minPaneSizePercentage` (default `10`); `emptyPlaceholder` — rendered when every pane is removed; `renamable` (default `false`) — pencil button + double-click title to rename a pane in place; `paneNames` / `defaultPaneNames` / `onPaneNamesChange` — custom pane names keyed by leaf id, controlled or uncontrolled.
589
+ - **Notes**: Recursive tiling layout (react-mosaic-style) built on the DS Resizable panels: panes split into rows/columns, resize via draggable dividers, and rearrange by dragging a pane's title bar onto another pane's edge (splits there) or center (swaps). Every drag outcome is also reachable via each pane's keyboard-operable toolbar split/remove buttons. `useMosaic` is intentionally not exported — `MosaicWindow` is the supported extension point.
590
+
395
591
  ### NativeSelect
396
592
  - **Exports**: NativeSelect, nativeSelectVariants
397
593
  - **Variants**: `size: xs | sm | default* | lg`
398
594
  - **Notes**: Styled native `<select>` with chevron affordance; pass `<option>`/`<optgroup>` children; mirrors Input visuals.
399
595
 
596
+ <!-- variant-facts:NativeSelect:start — GENERATED by `pnpm docs:variants`; edit
597
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
598
+
599
+
600
+ **size**: `xs` 24px · `sm` 32px · `default`\* 36px · `lg` 40px
601
+
602
+ <!-- variant-facts:NativeSelect:end -->
603
+
400
604
  ### NavigationMenu
401
605
  - **Exports**: NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuContent, NavigationMenuTrigger, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuViewport, navigationMenuTriggerStyle
402
606
  - **Custom props**: NavigationMenu `viewport` (default `true` — shared animated viewport; `false` renders content inline)
403
607
  - **Notes**: Radix NavigationMenu; `NavigationMenuLink` takes `active` to mark the current page.
404
608
 
609
+ ### NotchedCard
610
+ - **Exports**: NotchedCard, buildNotchedCardPath, notchedCardVariants, NotchedCardProps (type), NotchedCardVariant (type)
611
+ - **Variants**: `variant: default* | muted | glass | brand | inverted` (surface fill + inherited text colour)
612
+ - **Custom props**: `topLeftComponent` / `topRightComponent` / `bottomLeftComponent` / `bottomRightComponent` (corner slots — each occupied corner notches the background around its content), `backgroundImage` (cover image inside the clipped surface), `backgroundImageOpacity` (default `0.8`), `radius` (px, default `16`), `notchRadius` (concave fillet px, default `12`), `notchGap` (gutter px between corner content and background edge, default `12`), `padding` (px, default `24`), `avoidNotches` (default `true` — float spacers with `shape-outside` keep flowing content wrapped around the cutouts; set `false` when `contentClassName` makes the wrapper flex/grid, floats have no effect there), `bordered` (default on for `default`/`muted`, off otherwise), `backgroundClassName` (classes for the clipped background layer — put custom `bg-*`/gradient fills here, NOT in `className`; the layer sits behind the content so hover fills need `group-hover:bg-*`, keyed off the root's `group` marker), `contentClassName`
613
+ - **Notes**: With no corner content it renders a plain rounded rectangle (no clipping/measuring). Corner sizes are tracked with ResizeObserver, so slots can be any content — text, icons, buttons, clusters. `className` styles the root (size/placement); the surface fill lives on an inner clipped layer, hence `backgroundClassName`. Outline is an SVG stroke following the notches (`primary-border`); surface shadow is a drop-shadow filter (box-shadow would be clipped away).
614
+
405
615
  ### Pagination
406
616
  - **Exports**: Pagination, PaginationContent, PaginationLink, PaginationItem, PaginationPrevious, PaginationNext, PaginationEllipsis
407
617
  - **Custom props**: PaginationLink `isActive` (aria-current; default `false`), `size` (default `icon`)
@@ -416,7 +626,7 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
416
626
  - **Exports**: Progress
417
627
  - **Variants**: `variant: default* | brand | success | warning | info | destructive | analyzing | ingesting`
418
628
  - **Custom props**: `value` (omit/null → indeterminate sliding segment)
419
- - **Notes**: Radix Progress; variant sets both track and indicator colors.
629
+ - **Notes**: Radix Progress; variant sets both track and indicator colors. Radial counterpart: `CircularProgress`.
420
630
 
421
631
  ### RadioGroup
422
632
  - **Exports**: RadioGroup, RadioGroupItem, RichRadioItem
@@ -447,15 +657,30 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
447
657
 
448
658
  ### Sheet
449
659
  - **Exports**: Sheet, SheetTrigger, SheetClose, SheetContent, SheetHeader, SheetFooter, SheetTitle, SheetDescription
450
- - **Variants**: SheetContent `side: top | right* | bottom | left`, `overlay: default* | dark | glass | none`
660
+ - **Variants**: SheetContent `side: top | right* | bottom | left`, `overlay: default* | dark | glass | none`, `size: small | default* | medium | large | extraLarge`
451
661
  - **Custom props**: SheetContent `showCloseButton` (default `true`)
452
- - **Notes**: Radix Dialog under the hood; content self-portals with overlay; radius on the inward edge only.
662
+ - **Notes**: Radix Dialog under the hood; content self-portals with overlay; radius on the inward edge only. `size` scales the panel per side — left/right width caps: `small` xs (20rem) · `default` sm (24rem) · `medium` md (28rem) · `large` lg (32rem) · `extraLarge` 2xl (42rem); top/bottom heights: 40vh / auto (content) / 60vh / 80vh / 95vh. Prefer `size` over a width/height `className` override.
453
663
 
454
664
  ### Sidebar
455
665
  - **Exports**: Sidebar, SidebarProvider, SidebarTrigger, SidebarRail, SidebarInset, SidebarInput, SidebarHeader, SidebarFooter, SidebarContent, SidebarGroup, SidebarGroupLabel, SidebarGroupAction, SidebarGroupContent, SidebarMenu, SidebarMenuItem, SidebarMenuButton, SidebarMenuAction, SidebarMenuBadge, SidebarMenuSkeleton, SidebarMenuSub, SidebarMenuSubItem, SidebarMenuSubButton, SidebarSeparator, useSidebar
456
666
  - **Variants**: Sidebar `side: left* | right`, `variant: sidebar* | floating | inset`, `collapsible: offcanvas* | icon | none`
457
667
  - **Notes**: Wrap the layout in `SidebarProvider` (owns open state, cookie persistence, and the keyboard shortcut); renders as a fixed desktop rail or a mobile Sheet. `useSidebar()` must be inside the provider. For a compact app rail prefer `NavRail`.
458
668
 
669
+ <!-- variant-facts:Sidebar:start — GENERATED by `pnpm docs:variants`; edit
670
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
671
+
672
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
673
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
674
+
675
+ | variant | fill | text | border | hover fill |
676
+ |---|---|---|---|---|
677
+ | `default`\* | — | #111827 → #f3f4f6 | — | #e5e7eb @50% → #4b5563 @50% |
678
+ | `outline` | #ffffff → #111827 | #111827 → #f3f4f6 | — | #e5e7eb @50% → #4b5563 @50% |
679
+
680
+ **size**: `default`\* 32px · `sm` 28px · `lg` 48px
681
+
682
+ <!-- variant-facts:Sidebar:end -->
683
+
459
684
  ### Skeleton
460
685
  - **Exports**: Skeleton, SkeletonAvatar, SkeletonLine, SkeletonObject
461
686
  - **Notes**: `skeleton-shimmer` divs; presets: Avatar (size-10 round), Line (h-4 full), Object (96px block).
@@ -491,17 +716,79 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
491
716
  - **Custom props**: TabsList `tabPrefix`/`tabSuffix` (nodes)
492
717
  - **Notes**: Set variant/size/orientation on the root only (shared via context). `segmented` has an animated sliding indicator; `fancy` merges the active tab into the TabsContent glass panel.
493
718
 
719
+ <!-- HAND-WRITTEN choosing table (compoundVariants — not generated; keep in sync with tabsListVariants/tabsTriggerVariants). -->
720
+
721
+ **Choosing a `variant`** — never re-skin a variant with paint classes (SKILL.md →
722
+ "Never re-skin a variant").
723
+
724
+ | variant | use when | looks like | tell |
725
+ |---|---|---|---|
726
+ | `line` | quiet content-section switching inside a page | plain text row; 2px underline slides beneath the active tab | underline only, no fills |
727
+ | `pill`\* | default control-style switching | track row; active tab is a raised solid pill (`#ffffff → #111827` fill + shadow) | active tab looks like a pressed pill |
728
+ | `segmented` | tight toggle-group of 2–5 short options | track with ONE animated indicator that slides behind triggers | single sliding thumb |
729
+ | `fancy` | hero/login compositions on glass — tab cards that merge into the panel | translucent gradient tab cards (glass 60→20 vertical); the active card turns flat-bottomed and fuses into the glass `TabsContent` panel with concave 16px corner curves | card-shaped tabs joined to their panel |
730
+
731
+ **size** — track heights (`pill`/`segmented`, horizontal): `sm` 24px · `md`\* 35px ·
732
+ `lg` 40px. `fancy` trigger padding: `sm` 8/16px (text-sm) · `md` 12/24px (text-sm) ·
733
+ `lg` 16/24px (text-base) — an `lg` fancy tab card runs ≈56px tall.
734
+
735
+ Confusable: `pill` vs `segmented` → both are tracks, but segmented animates one
736
+ shared indicator while pill styles the active trigger itself. `fancy` is only for
737
+ glass compositions (needs `PageBackground` behind it); everywhere else pick one of
738
+ the other three.
739
+
494
740
  ### Text
495
741
  - **Exports**: Text, textVariants, TextProps (type)
496
742
  - **Variants**: `size: large | regular* | small | mini | caption`, `weight: normal* | medium | semibold`, `variant: default* | muted | primary | destructive | success`, `font: body* | heading | mono`, `align: left | center | right`, `truncate: true`
497
743
  - **Custom props**: `as` (default `p`)
498
744
  - **Notes**: Body-copy primitive; sizes map to the paragraph type-scale tokens.
499
745
 
746
+ <!-- variant-facts:Text:start — GENERATED by `pnpm docs:variants`; edit
747
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
748
+
749
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
750
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
751
+
752
+ | variant | fill | text | border | hover fill |
753
+ |---|---|---|---|---|
754
+ | `default`\* | — | #111827 → #f3f4f6 | — | — |
755
+ | `muted` | — | #6b7280 → #9ca3af | — | — |
756
+ | `primary` | — | #111827 → #f3f4f6 | — | — |
757
+ | `destructive` | — | #bc0126 → #f699ac | — | — |
758
+ | `success` | — | #4d7c0f → #bef264 | — | — |
759
+
760
+ **size**: `large` · `regular`\* · `small` · `mini` · `caption`
761
+
762
+ **weight**: `normal`\* · `medium` · `semibold`
763
+
764
+ **font**: `body`\* · `heading` · `mono`
765
+
766
+ **align**: `left` · `center` · `right`
767
+
768
+ **truncate**: `true`
769
+
770
+ <!-- variant-facts:Text:end -->
771
+
500
772
  ### Textarea
501
773
  - **Exports**: Textarea, textareaVariants
502
774
  - **Variants**: `variant: default* | ai` (gradient border), `shape: default* (12px) | round (16px)`
503
775
  - **Notes**: Auto-grows via `field-sizing-content`; chrome matches Input; supports aria-invalid.
504
776
 
777
+ <!-- variant-facts:Textarea:start — GENERATED by `pnpm docs:variants`; edit
778
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
779
+
780
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
781
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
782
+
783
+ | variant | fill | text | border | hover fill |
784
+ |---|---|---|---|---|
785
+ | `default`\* | #ffffff → #1f2832 | — | #e5e7eb → #374151 | — |
786
+ | `ai` | — | — | — | — |
787
+
788
+ **shape**: `default`\* 12px radius · `round` 16px radius
789
+
790
+ <!-- variant-facts:Textarea:end -->
791
+
505
792
  ### ThemeProvider
506
793
  - **Exports**: ThemeProvider, useTheme, ThemeContext, ThemeMode (type), ThemeProduct (type)
507
794
  - **Custom props**: `defaultTheme: light* | dark`, `defaultProduct: slingshot* | sustain | bodhi | psai`, `storageKey` (default `ds-theme-preferences`)
@@ -537,8 +824,8 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
537
824
 
538
825
  ### Header
539
826
  - **Exports**: `Header` (wired), `HeaderBar`, `HeaderLogo`, `OrgPill`, `ProfileMenu`, `ThemeToggle`, `ProjectPicker`; hooks/data layer `useGlobalHeader`, `useHeaderCredits`, `useHeaderProject`, `getSessionToken`, `getSessionClaims`, `isSessionValid`, `buildEndpoints`, `DEFAULT_LABELS`; consts/types `TOGGLE_PROJECT_DROPDOWN_EVENT`, `GlobalHeaderState`, `ToggleProjectDropdownDetail`, `HeaderSelection`, `UseHeaderProjectResult`, `Labels`, `Fetcher`, `HeaderEndpoints`, `HeaderProps`, `ProjectNode`, `SessionClaims`
540
- - **Custom props** (HeaderProps): `apiBaseUrl` — studio-auth API host (required); `environmentId` — reads `{environmentId}-sessionId` cookie (required); `logoType` — ThemeProduct, defaults to active product; `logoHref` — logo link destination (defaults to the product's public site); `showOrg`/`showProjectDropdown`/`showProfile`/`showThemeSwitcher`/`showCredits` — visibility toggles (all default `false`); `pageTitle`; `feedbackUrl`; `clientId` — active org id; `_dangerouslyInjectAccessToken` — escape hatch, avoid; `onProjectChange` — fires on user pick or automatic default; `logoAddon` — node between logo and picker; `actionsStart`/`actionsEnd` — nodes at the start/end of the right-hand actions cluster; `endpoints` — per-path overrides; `fetcher` — custom fetch (default global); `staleTime` (default 5 min); `gcTime` (default 10 min).
541
- - **Notes**: Must render inside a `<ThemeProvider>`; owns an internal singleton QueryClient (no app setup). Auth state and user identity (email, client id) are decoded from the `{environmentId}-sessionId` JWT cookie — no `/me` call. Logged-out users see no user content; `ProjectNode` shape = `{ id, name, children: ProjectNode[], isContextOnly? }`. Project selection is per-tab (sessionStorage); explicit picks are remembered cross-tab in localStorage `lastSelectedProject`, and a tab with no valid selection auto-defaults to that (else the first selectable project) — there is no selection overlay.
827
+ - **Custom props** (HeaderProps): `apiBaseUrl` — studio-auth API host (required); `environmentId` — reads `{environmentId}-sessionId` cookie (required); `logoType` — ThemeProduct, defaults to active product; `logoHref` — logo link destination (defaults to the product's public site); `showOrg`/`showProjectDropdown`/`showProfile`/`showThemeSwitcher`/`showCredits` — visibility toggles (all default `false`); `pageTitle`; `feedbackUrl`; `clientId` — active org id; `defaultProjectId` — auto-selected when the tab has no selection and `lastSelectedProject` is absent/invalid; `_dangerouslyInjectAccessToken` — escape hatch, avoid; `onProjectChange` — fires on user pick or automatic default; `logoAddon` — node between logo and picker; `actionsStart`/`actionsEnd` — nodes at the start/end of the right-hand actions cluster; `endpoints` — per-path overrides; `fetcher` — custom fetch (default global); `staleTime` (default 5 min); `gcTime` (default 10 min).
828
+ - **Notes**: Must render inside a `<ThemeProvider>`; owns an internal singleton QueryClient (no app setup). Auth state and user identity (email, client id) are decoded from the `{environmentId}-sessionId` JWT cookie — no `/me` call. Logged-out users see no user content; `ProjectNode` shape = `{ id, name, children: ProjectNode[], isContextOnly? }`. Project selection is per-tab (sessionStorage); explicit picks are remembered cross-tab in localStorage `lastSelectedProject`, and a tab with no valid selection auto-defaults to that (else `defaultProjectId`, else the first selectable project) — there is no selection overlay. The paginated projects API is fetched page-by-page until exhausted and the merged tree is cached in sessionStorage keyed by client id + user id, so it is hit once per tab session per identity.
542
829
 
543
830
  ### MediaObject
544
831
  - **Exports**: `MediaObject`, `MediaObjectImage`, `MediaObjectIcon`, `MediaObjectContent`, `MediaObjectTitle`, `MediaObjectText`, `MediaObjectActions`, `MediaObjectGroup`, `mediaObjectGroupVariants`, types `MediaObjectProps`, `MediaObjectImageProps`, `MediaObjectTitleProps`, `MediaObjectGroupProps`
@@ -546,6 +833,16 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
546
833
  - **Custom props**: (MediaObject) `interactive` — CSS hover lift + shadow. (MediaObjectImage) `alt` — required alt text. (MediaObjectTitle) `size` — Heading size (default `"4"`).
547
834
  - **Notes**: Radix-style compositional card; root is `<article>`, image is 16/9 cover; pure-CSS hover (no JS state).
548
835
 
836
+ <!-- variant-facts:MediaObject:start — GENERATED by `pnpm docs:variants`; edit
837
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
838
+
839
+
840
+ **columns**: `1` · `2` · `3`\* · `4`
841
+
842
+ **gap**: `sm` · `md` · `lg`\*
843
+
844
+ <!-- variant-facts:MediaObject:end -->
845
+
549
846
  ### NavRail
550
847
  - **Exports**: NavRail, NavRailItem, NavRailUser, NavRailSeparator, NavRailMenu, NavRailMenuTrigger, NavRailMenuContent, NavRailMenuItem, + prop types
551
848
  - **Variants**: NavRail `mode: icon* | text | expanded | expand-on-hover`
@@ -570,6 +867,39 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
570
867
  - **Custom props**: `as` — element/component to render (default `div`).
571
868
  - **Notes**: Centered max-width column with gutters; `glass` uses `bg-glass-40-bg backdrop-blur-glass`.
572
869
 
870
+ <!-- variant-facts:Container:start — GENERATED by `pnpm docs:variants`; edit
871
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
872
+
873
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
874
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
875
+
876
+ | variant | fill | text | border | hover fill |
877
+ |---|---|---|---|---|
878
+ | `default`\* | — | — | — | — |
879
+ | `glass` | rgb(255 255 255 / 0.4) → rgb(31 40 50 / 0.4) | — | — | — |
880
+
881
+ **size**: `narrow` · `content`\* · `wide` · `full`
882
+
883
+ <!-- variant-facts:Container:end -->
884
+
885
+ ### MultiColumn
886
+ - **Exports**: `MultiColumn`, `MultiColumnItem`, `multiColumnVariants`, types `MultiColumnProps`, `MultiColumnItemProps`
887
+ - **Variants** (MultiColumn): `gap`: `none` | `sm` | `md` | `lg`* | `xl`; `stackBelow`: `sm` | `md` | `lg`* | `xl` — breakpoint the grid activates at.
888
+ - **Custom props**: `columns` (MultiColumn, required) — one CSS grid track per column (`"240px"` fixed, `"20%"` percent, `"1fr"` fractional, `"minmax(200px,1fr)"`); array length sets the column count (3, 4, 5, ...N). `order` (MultiColumnItem) — visual position via CSS `order`, independent of DOM order; also the initial position when the parent is `reorderable`. `align` (MultiColumnItem) — `start` | `center` | `end` | `stretch` (`align-self`). `id` (MultiColumnItem) — native `id`; give every item one when the parent is `reorderable` so `onReorderChange` reports stable identities.
889
+ - **Resizable** (opt-in, default off): `resizable` renders a drag/Arrow-key handle between adjacent columns; `onColumnsChange(columns)` fires with the updated array (pass a `columns` value you update to control it, omit for internal/uncontrolled tracking); `minColumnSize` (default `"80px"`) floors how small a column can be dragged. A dragged pair freezes to explicit px; a `minmax(min,max)` column keeps its own authored bounds even after being resized (never silently discarded). Handles are keyboard-operable (`role="separator"`, Arrow Left/Right) and hidden below `stackBelow`.
890
+ - **Reorderable** (opt-in, default off): `reorderable` renders a drag grip on every `MultiColumnItem`; drag onto another item to swap positions, or focus a grip and press Ctrl+Left/Ctrl+Right. `onReorderChange(orderedIds)` fires with the new left-to-right order of each item's `id` (falls back to a generated id with a console warning if `id` is omitted). Grips hidden below `stackBelow`.
891
+ - **Notes**: CSS Grid (not flex) so `minmax()` and mixed fixed/%/fr tracks work in one template; `TwoColumn` stays the recommended API for the aside+main pattern. Compose `<MultiColumn columns={[...]}><MultiColumnItem/>...</MultiColumn>`; stacks to `flex flex-col` below `stackBelow`. The per-instance track list is set via the `--mc-columns` custom property (inline style) and read by a static `<bp>:grid-cols-[var(--mc-columns)]` class, so Tailwind's source scanner still sees a literal class to generate (same technique as `Sidebar`'s `w-(--sidebar-width)`). Resize math and reorder math are pure functions in `MultiColumn.utils.ts` (unit-tested); the actual browser layout resolution (`getComputedStyle`) they depend on is real-browser-only and verified manually/in Storybook, not by jsdom.
892
+
893
+ <!-- variant-facts:MultiColumn:start — GENERATED by `pnpm docs:variants`; edit
894
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
895
+
896
+
897
+ **gap**: `none` · `sm` · `md` · `lg`\* · `xl`
898
+
899
+ **stackBelow**: `sm` · `md` · `lg`\* · `xl`
900
+
901
+ <!-- variant-facts:MultiColumn:end -->
902
+
573
903
  ### PageBackground
574
904
  - **Exports**: `PageBackground`, type `PageBackgroundProps`
575
905
  - **Custom props**: `fixed` — fixed to viewport (default `true`) vs absolute-fill of positioned parent.
@@ -580,11 +910,35 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
580
910
  - **Variants**: `direction`: `vertical`* | `horizontal`; `gap`: `none` | `xs` | `sm` | `md`* | `lg` | `xl` | `2xl`; `align`: `start` | `center` | `end` | `stretch`*; `justify`: `start` | `center` | `between` | `end`
581
911
  - **Custom props**: `as` — render as different element (default `div`).
582
912
 
913
+ <!-- variant-facts:Stack:start — GENERATED by `pnpm docs:variants`; edit
914
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
915
+
916
+
917
+ **direction**: `vertical`\* · `horizontal`
918
+
919
+ **gap**: `none` · `xs` · `sm` · `md`\* · `lg` · `xl` · `2xl`
920
+
921
+ **align**: `start` · `center` · `end` · `stretch`\*
922
+
923
+ **justify**: `start` · `center` · `between` · `end`
924
+
925
+ <!-- variant-facts:Stack:end -->
926
+
583
927
  ### TwoColumn
584
928
  - **Exports**: `TwoColumn`, `TwoColumnAside`, `TwoColumnMain`, `twoColumnVariants`, type `TwoColumnProps`
585
929
  - **Variants** (TwoColumn): `gap`: `none` | `sm` | `md` | `lg`* | `xl`; `reverse`: aside after main at lg+
586
930
  - **Notes**: Compose `<TwoColumn><TwoColumnAside/><TwoColumnMain/></TwoColumn>`; stacks below `lg`. Aside default `lg:w-64` (override via className); Main is `min-w-0 flex-1`.
587
931
 
932
+ <!-- variant-facts:TwoColumn:start — GENERATED by `pnpm docs:variants`; edit
933
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
934
+
935
+
936
+ **gap**: `none` · `sm` · `md` · `lg`\* · `xl`
937
+
938
+ **reverse**: `true`
939
+
940
+ <!-- variant-facts:TwoColumn:end -->
941
+
588
942
  ### Utils
589
943
 
590
944
  ### cn
@@ -637,3 +991,134 @@ Both mode files define the identical names (`mode-light.css` on `:root`, `mode-d
637
991
  - Charts: `--chart-1`…`--chart-5`; `--chart-blue(-subtle)`, `--chart-emerald(-subtle)`, `--chart-amber(-subtle)`, `--chart-red(-subtle)`, `--chart-purple(-subtle)`, `--chart-lime(-subtle)`, `--chart-indigo(-subtle)`, `--chart-orange(-subtle)`
638
992
  - AI affordance: `--ai-surface`, `--ai-gradient-from`, `--ai-gradient-to`
639
993
  - Logo ink: `--logo-mark-dark` (mode-driven, defined in base.css)
994
+
995
+ <!-- token-facts:start — GENERATED by `pnpm docs:variants` from
996
+ docs/css-variables.json; edit src/styles/tokens/* and re-run, not this block. -->
997
+
998
+ ### 7.3 Resolved token values
999
+
1000
+ Actual values per mode, `light → dark` (a single value is identical in both
1001
+ modes). Product-scoped tokens are listed per product; `slingshot` is the
1002
+ default (`:root`) product.
1003
+
1004
+ **Backgrounds**
1005
+
1006
+ | token | light → dark |
1007
+ |---|---|
1008
+ | `--danger-bg` | #fde6ea → #6c0016 |
1009
+ | `--ghost-bg` | rgb(255 255 255 / 0.0001) |
1010
+ | `--ghost-hover-bg` | rgb(31 40 50 / 0.05) → rgb(255 255 255 / 0.1) |
1011
+ | `--info-bg` | #e0f2fe → #0c4a6e |
1012
+ | `--input-bg` | #ffffff → #1f2832 |
1013
+ | `--muted-bg` | #f3f4f6 → #111827 |
1014
+ | `--navbar-active-bg` | #e90130 |
1015
+ | `--outline-bg` | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) |
1016
+ | `--outline-hover-bg` | rgb(31 40 50 / 0.0333) → rgb(255 255 255 / 0.1) |
1017
+ | `--overlay-bg` | rgb(31 40 50 / 0.4) |
1018
+ | `--primary-bg` | #ffffff → #111827 |
1019
+ | `--primary-invert-bg` | #111827 → #ffffff |
1020
+ | `--primary-invert-hover-bg` | #374151 → #d1d5db |
1021
+ | `--secondary-bg` | #e5e7eb → #4b5563 |
1022
+ | `--secondary-hover-bg` | #f9fafb → #111827 |
1023
+ | `--success-bg` | #ecfccb → #365314 |
1024
+ | `--switch-active-bg` | #84cc16 |
1025
+ | `--toggle-active-bg` | rgb(31 40 50 / 0.05) → rgb(255 255 255 / 0.1) |
1026
+ | `--warning-bg` | #ffedd5 → #431407 |
1027
+
1028
+ **Glass**
1029
+
1030
+ | token | light → dark |
1031
+ |---|---|
1032
+ | `--glass-20-bg` | rgb(255 255 255 / 0.2) → rgb(31 40 50 / 0.2) |
1033
+ | `--glass-40-bg` | rgb(255 255 255 / 0.4) → rgb(31 40 50 / 0.4) |
1034
+ | `--glass-60-bg` | rgb(255 255 255 / 0.6) → rgb(31 40 50 / 0.6) |
1035
+ | `--glass-blur` | 45px |
1036
+ | `--glass-none-bg` | #ffffff → #111827 |
1037
+
1038
+ **Text**
1039
+
1040
+ | token | light → dark |
1041
+ |---|---|
1042
+ | `--danger-txt` | #bc0126 → #f699ac |
1043
+ | `--info-txt` | #0369a1 → #7dd3fc |
1044
+ | `--muted-txt` | #6b7280 → #9ca3af |
1045
+ | `--primary-invert-txt` | #f3f4f6 → #111827 |
1046
+ | `--primary-txt` | #111827 → #f3f4f6 |
1047
+ | `--secondary-txt` | #374151 → #e5e7eb |
1048
+ | `--success-txt` | #4d7c0f → #bef264 |
1049
+ | `--warning-txt` | #c2410c → #fdba74 |
1050
+
1051
+ **Borders**
1052
+
1053
+ | token | light → dark |
1054
+ |---|---|
1055
+ | `--danger-border` | #bc0126 → #f699ac |
1056
+ | `--info-border` | #0369a1 → #7dd3fc |
1057
+ | `--muted-border` | #f3f4f6 → #111827 |
1058
+ | `--primary-border` | #e5e7eb → #374151 |
1059
+ | `--primary-invert-border` | #9ca3af → #4b5563 |
1060
+ | `--secondary-border` | #d1d5db → #374151 |
1061
+ | `--selected-border` | #1f2937 → #f9fafb |
1062
+ | `--success-border` | #4d7c0f → #bef264 |
1063
+ | `--warning-border` | #c2410c → #fdba74 |
1064
+
1065
+ **Focus**
1066
+
1067
+ | token | light → dark |
1068
+ |---|---|
1069
+ | `--focus` | #d1d5db → #374151 |
1070
+ | `--focus-error` | #f699ac → #6c0016 |
1071
+
1072
+ **Charts**
1073
+
1074
+ | token | light → dark |
1075
+ |---|---|
1076
+ | `--chart-1` | #f54a00 |
1077
+ | `--chart-2` | #009689 |
1078
+ | `--chart-3` | #104e64 |
1079
+ | `--chart-4` | #ffb900 |
1080
+ | `--chart-5` | #fe9a00 |
1081
+ | `--chart-amber` | #fbbf24 → #b45309 |
1082
+ | `--chart-amber-subtle` | #fde68a → #78350f |
1083
+ | `--chart-blue` | #60a5fa → #1d4ed8 |
1084
+ | `--chart-blue-subtle` | #bfdbfe → #1e3a8a |
1085
+ | `--chart-emerald` | #34d399 → #047857 |
1086
+ | `--chart-emerald-subtle` | #a7f3d0 → #064e3b |
1087
+ | `--chart-indigo` | #818cf8 → #4338ca |
1088
+ | `--chart-indigo-subtle` | #c7d2fe → #312e81 |
1089
+ | `--chart-lime` | #a3e635 → #4d7c0f |
1090
+ | `--chart-lime-subtle` | #d9f99d → #365314 |
1091
+ | `--chart-orange` | #fb923c → #c2410c |
1092
+ | `--chart-orange-subtle` | #fed7aa → #7c2d12 |
1093
+ | `--chart-purple` | #c084fc → #7e22ce |
1094
+ | `--chart-purple-subtle` | #e9d5ff → #581c87 |
1095
+ | `--chart-red` | #f26783 → #bc0126 |
1096
+ | `--chart-red-subtle` | #fbccd6 → #6c0016 |
1097
+
1098
+ **Logo ink**
1099
+
1100
+ | token | light → dark |
1101
+ |---|---|
1102
+ | `--logo-mark-dark` | #111827 → #ffffff |
1103
+
1104
+ **Other**
1105
+
1106
+ | token | light → dark |
1107
+ |---|---|
1108
+ | `--ai-gradient-to` | #9ca3af → #4b5563 |
1109
+ | `--brand-gradient-to` | #e2e8f0 → #020617 |
1110
+
1111
+ **Brand & gradients (per product)**
1112
+
1113
+ | token | slingshot | bodhi | sustain |
1114
+ |---|---|---|---|
1115
+ | `--ai-gradient-from` | #e90130 | #3b82f6 | #6366f1 |
1116
+ | `--brand-200` | #fbccd6 → #6c0016 | #bfdbfe → #6c0016 | #c7d2fe → #6c0016 |
1117
+ | `--brand-50` | #fef2f5 → #3d000d | #eff6ff → #3d000d | #eef2ff → #3d000d |
1118
+ | `--brand-500-primary` | #e90130 | #3b82f6 | #6366f1 |
1119
+ | `--brand-700` | #bc0126 → #fbccd6 | #1d4ed8 → #bfdbfe | #4338ca → #c7d2fe |
1120
+ | `--brand-800` | #8d011d → #fbccd6 | #1e40af → #bfdbfe | #3730a3 → #c7d2fe |
1121
+ | `--brand-950` | #3d000d → #fef2f5 | #172554 → #eff6ff | #1e1b4b → #eef2ff |
1122
+ | `--brand-gradient-from` | #fbccd6 → #3d000d | #bfdbfe → #172554 | #c7d2fe → #1e1b4b |
1123
+
1124
+ <!-- token-facts:end -->