@psnext/design-system 2.2.0 → 2.4.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 (491) hide show
  1. package/DESIGN.md +466 -4
  2. package/README.md +3 -3
  3. package/SKILL.md +83 -5
  4. package/bin/install-agent-skill.mjs +39 -7
  5. package/dist/Header.cjs +214 -108
  6. package/dist/Header.cjs.map +1 -1
  7. package/dist/Header.js +214 -108
  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/MultiColumn.cjs +354 -0
  14. package/dist/MultiColumn.cjs.map +1 -0
  15. package/dist/MultiColumn.js +335 -0
  16. package/dist/MultiColumn.js.map +1 -0
  17. package/dist/Sidebar.cjs +4 -3
  18. package/dist/Sidebar.cjs.map +1 -1
  19. package/dist/Sidebar.js +4 -3
  20. package/dist/Sidebar.js.map +1 -1
  21. package/dist/index.cjs +5 -1
  22. package/dist/index.d.cts +5 -5
  23. package/dist/index.d.cts.map +1 -1
  24. package/dist/index.d.ts +5 -5
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +3 -2
  27. package/dist/index10.d.cts +6 -6
  28. package/dist/index10.d.ts +7 -7
  29. package/dist/index10.d.ts.map +1 -1
  30. package/dist/index11.d.cts +3 -3
  31. package/dist/index11.d.cts.map +1 -1
  32. package/dist/index11.d.ts +3 -3
  33. package/dist/index11.d.ts.map +1 -1
  34. package/dist/index12.d.cts +11 -11
  35. package/dist/index12.d.ts +13 -13
  36. package/dist/index12.d.ts.map +1 -1
  37. package/dist/index13.d.cts +6 -6
  38. package/dist/index13.d.cts.map +1 -1
  39. package/dist/index13.d.ts +6 -6
  40. package/dist/index13.d.ts.map +1 -1
  41. package/dist/index14.d.cts +5 -5
  42. package/dist/index14.d.cts.map +1 -1
  43. package/dist/index14.d.ts +5 -5
  44. package/dist/index15.d.cts +3 -3
  45. package/dist/index15.d.cts.map +1 -1
  46. package/dist/index15.d.ts +3 -3
  47. package/dist/index15.d.ts.map +1 -1
  48. package/dist/index16.d.cts +2 -2
  49. package/dist/index16.d.cts.map +1 -1
  50. package/dist/index16.d.ts +2 -2
  51. package/dist/index16.d.ts.map +1 -1
  52. package/dist/index17.d.cts +4 -4
  53. package/dist/index17.d.cts.map +1 -1
  54. package/dist/index17.d.ts +4 -4
  55. package/dist/index18.d.cts +11 -11
  56. package/dist/index18.d.cts.map +1 -1
  57. package/dist/index18.d.ts +11 -11
  58. package/dist/index18.d.ts.map +1 -1
  59. package/dist/index19.d.cts +10 -10
  60. package/dist/index19.d.cts.map +1 -1
  61. package/dist/index19.d.ts +10 -10
  62. package/dist/index19.d.ts.map +1 -1
  63. package/dist/index2.d.cts +8 -8
  64. package/dist/index2.d.cts.map +1 -1
  65. package/dist/index2.d.ts +7 -7
  66. package/dist/index20.d.cts +16 -16
  67. package/dist/index20.d.cts.map +1 -1
  68. package/dist/index20.d.ts +16 -16
  69. package/dist/index20.d.ts.map +1 -1
  70. package/dist/index21.d.cts +4 -4
  71. package/dist/index21.d.cts.map +1 -1
  72. package/dist/index21.d.ts +4 -4
  73. package/dist/index21.d.ts.map +1 -1
  74. package/dist/index22.d.cts +11 -11
  75. package/dist/index22.d.ts +11 -11
  76. package/dist/index23.d.cts +16 -16
  77. package/dist/index23.d.cts.map +1 -1
  78. package/dist/index23.d.ts +16 -16
  79. package/dist/index23.d.ts.map +1 -1
  80. package/dist/index24.d.cts +10 -10
  81. package/dist/index24.d.cts.map +1 -1
  82. package/dist/index24.d.ts +11 -11
  83. package/dist/index24.d.ts.map +1 -1
  84. package/dist/index25.d.cts +2 -2
  85. package/dist/index25.d.cts.map +1 -1
  86. package/dist/index25.d.ts +2 -2
  87. package/dist/index25.d.ts.map +1 -1
  88. package/dist/index26.d.cts +13 -13
  89. package/dist/index26.d.cts.map +1 -1
  90. package/dist/index26.d.ts +15 -15
  91. package/dist/index26.d.ts.map +1 -1
  92. package/dist/index27.d.cts +7 -7
  93. package/dist/index27.d.cts.map +1 -1
  94. package/dist/index27.d.ts +7 -7
  95. package/dist/index27.d.ts.map +1 -1
  96. package/dist/index28.d.cts +4 -4
  97. package/dist/index28.d.ts +6 -6
  98. package/dist/index28.d.ts.map +1 -1
  99. package/dist/index29.d.cts +4 -4
  100. package/dist/index29.d.cts.map +1 -1
  101. package/dist/index29.d.ts +4 -4
  102. package/dist/index29.d.ts.map +1 -1
  103. package/dist/index3.d.cts +13 -13
  104. package/dist/index3.d.ts +13 -13
  105. package/dist/index30.d.cts +42 -13
  106. package/dist/index30.d.cts.map +1 -1
  107. package/dist/index30.d.ts +43 -14
  108. package/dist/index30.d.ts.map +1 -1
  109. package/dist/index31.d.cts +5 -5
  110. package/dist/index31.d.cts.map +1 -1
  111. package/dist/index31.d.ts +6 -6
  112. package/dist/index31.d.ts.map +1 -1
  113. package/dist/index32.d.cts +6 -6
  114. package/dist/index32.d.cts.map +1 -1
  115. package/dist/index32.d.ts +6 -6
  116. package/dist/index33.d.cts +11 -11
  117. package/dist/index33.d.cts.map +1 -1
  118. package/dist/index33.d.ts +12 -12
  119. package/dist/index33.d.ts.map +1 -1
  120. package/dist/index34.d.cts +5 -5
  121. package/dist/index34.d.cts.map +1 -1
  122. package/dist/index34.d.ts +5 -5
  123. package/dist/index34.d.ts.map +1 -1
  124. package/dist/index35.d.cts +15 -15
  125. package/dist/index35.d.cts.map +1 -1
  126. package/dist/index35.d.ts +16 -16
  127. package/dist/index35.d.ts.map +1 -1
  128. package/dist/index36.d.cts +3 -3
  129. package/dist/index36.d.ts +3 -3
  130. package/dist/index36.d.ts.map +1 -1
  131. package/dist/index37.d.cts +5 -5
  132. package/dist/index37.d.ts +6 -6
  133. package/dist/index38.d.cts +2 -2
  134. package/dist/index38.d.ts +2 -2
  135. package/dist/index39.d.cts +17 -17
  136. package/dist/index39.d.cts.map +1 -1
  137. package/dist/index39.d.ts +17 -17
  138. package/dist/index39.d.ts.map +1 -1
  139. package/dist/index4.d.cts +2 -2
  140. package/dist/index4.d.ts +2 -2
  141. package/dist/index40.d.cts +5 -5
  142. package/dist/index40.d.cts.map +1 -1
  143. package/dist/index40.d.ts +6 -6
  144. package/dist/index40.d.ts.map +1 -1
  145. package/dist/index41.d.cts +11 -11
  146. package/dist/index41.d.cts.map +1 -1
  147. package/dist/index41.d.ts +11 -11
  148. package/dist/index41.d.ts.map +1 -1
  149. package/dist/index42.d.cts +8 -8
  150. package/dist/index42.d.cts.map +1 -1
  151. package/dist/index42.d.ts +8 -8
  152. package/dist/index42.d.ts.map +1 -1
  153. package/dist/index43.d.cts +9 -9
  154. package/dist/index43.d.cts.map +1 -1
  155. package/dist/index43.d.ts +9 -9
  156. package/dist/index43.d.ts.map +1 -1
  157. package/dist/index45.d.cts +8 -8
  158. package/dist/index45.d.cts.map +1 -1
  159. package/dist/index45.d.ts +8 -8
  160. package/dist/index45.d.ts.map +1 -1
  161. package/dist/index46.d.cts +2 -2
  162. package/dist/index46.d.cts.map +1 -1
  163. package/dist/index46.d.ts +2 -2
  164. package/dist/index46.d.ts.map +1 -1
  165. package/dist/index47.d.cts +4 -4
  166. package/dist/index47.d.cts.map +1 -1
  167. package/dist/index47.d.ts +4 -4
  168. package/dist/index47.d.ts.map +1 -1
  169. package/dist/index48.d.cts +4 -4
  170. package/dist/index48.d.cts.map +1 -1
  171. package/dist/index48.d.ts +4 -4
  172. package/dist/index48.d.ts.map +1 -1
  173. package/dist/index49.d.cts +3 -3
  174. package/dist/index49.d.ts +3 -3
  175. package/dist/index5.d.cts +7 -7
  176. package/dist/index5.d.ts +7 -7
  177. package/dist/index5.d.ts.map +1 -1
  178. package/dist/index50.d.cts +11 -11
  179. package/dist/index50.d.cts.map +1 -1
  180. package/dist/index50.d.ts +11 -11
  181. package/dist/index50.d.ts.map +1 -1
  182. package/dist/index51.d.cts +9 -9
  183. package/dist/index51.d.cts.map +1 -1
  184. package/dist/index51.d.ts +9 -9
  185. package/dist/index51.d.ts.map +1 -1
  186. package/dist/index52.d.cts +5 -5
  187. package/dist/index52.d.ts +5 -5
  188. package/dist/index53.d.cts +26 -26
  189. package/dist/index53.d.cts.map +1 -1
  190. package/dist/index53.d.ts +27 -27
  191. package/dist/index53.d.ts.map +1 -1
  192. package/dist/index54.d.cts +5 -5
  193. package/dist/index54.d.ts +5 -5
  194. package/dist/index54.d.ts.map +1 -1
  195. package/dist/index55.d.cts +2 -2
  196. package/dist/index55.d.cts.map +1 -1
  197. package/dist/index55.d.ts +2 -2
  198. package/dist/index56.d.cts +2 -2
  199. package/dist/index56.d.cts.map +1 -1
  200. package/dist/index56.d.ts +2 -2
  201. package/dist/index56.d.ts.map +1 -1
  202. package/dist/index57.d.cts +2 -2
  203. package/dist/index57.d.cts.map +1 -1
  204. package/dist/index57.d.ts +2 -2
  205. package/dist/index57.d.ts.map +1 -1
  206. package/dist/index58.d.cts +4 -4
  207. package/dist/index58.d.ts +4 -4
  208. package/dist/index58.d.ts.map +1 -1
  209. package/dist/index59.d.cts +9 -9
  210. package/dist/index59.d.ts +9 -9
  211. package/dist/index6.d.cts +6 -6
  212. package/dist/index6.d.cts.map +1 -1
  213. package/dist/index6.d.ts +6 -6
  214. package/dist/index6.d.ts.map +1 -1
  215. package/dist/index60.d.cts +9 -9
  216. package/dist/index60.d.cts.map +1 -1
  217. package/dist/index60.d.ts +13 -13
  218. package/dist/index60.d.ts.map +1 -1
  219. package/dist/index61.d.cts +5 -5
  220. package/dist/index61.d.ts +6 -6
  221. package/dist/index62.d.cts +5 -5
  222. package/dist/index62.d.ts +5 -5
  223. package/dist/index62.d.ts.map +1 -1
  224. package/dist/index63.d.cts +2 -2
  225. package/dist/index63.d.cts.map +1 -1
  226. package/dist/index63.d.ts +2 -2
  227. package/dist/index63.d.ts.map +1 -1
  228. package/dist/index64.d.cts +6 -6
  229. package/dist/index64.d.cts.map +1 -1
  230. package/dist/index64.d.ts +7 -7
  231. package/dist/index65.d.cts +3 -3
  232. package/dist/index65.d.ts +4 -4
  233. package/dist/index65.d.ts.map +1 -1
  234. package/dist/index66.d.cts +4 -4
  235. package/dist/index66.d.cts.map +1 -1
  236. package/dist/index66.d.ts +6 -6
  237. package/dist/index66.d.ts.map +1 -1
  238. package/dist/index67.d.cts +83 -11
  239. package/dist/index67.d.cts.map +1 -1
  240. package/dist/index67.d.ts +83 -11
  241. package/dist/index67.d.ts.map +1 -1
  242. package/dist/index68.d.cts +12 -30
  243. package/dist/index68.d.cts.map +1 -1
  244. package/dist/index68.d.ts +12 -30
  245. package/dist/index68.d.ts.map +1 -1
  246. package/dist/index69.d.cts +28 -27
  247. package/dist/index69.d.cts.map +1 -1
  248. package/dist/index69.d.ts +29 -28
  249. package/dist/index69.d.ts.map +1 -1
  250. package/dist/index7.d.cts +8 -8
  251. package/dist/index7.d.cts.map +1 -1
  252. package/dist/index7.d.ts +8 -8
  253. package/dist/index7.d.ts.map +1 -1
  254. package/dist/index70.d.cts +33 -78
  255. package/dist/index70.d.cts.map +1 -1
  256. package/dist/index70.d.ts +33 -78
  257. package/dist/index70.d.ts.map +1 -1
  258. package/dist/index71.d.cts +77 -258
  259. package/dist/index71.d.cts.map +1 -1
  260. package/dist/index71.d.ts +77 -258
  261. package/dist/index71.d.ts.map +1 -1
  262. package/dist/index72.d.cts +278 -0
  263. package/dist/index72.d.cts.map +1 -0
  264. package/dist/index72.d.ts +278 -0
  265. package/dist/index72.d.ts.map +1 -0
  266. package/dist/index8.d.cts +5 -5
  267. package/dist/index8.d.ts +5 -5
  268. package/dist/index8.d.ts.map +1 -1
  269. package/dist/index9.d.cts +2 -2
  270. package/dist/index9.d.cts.map +1 -1
  271. package/dist/index9.d.ts +2 -2
  272. package/dist/layouts/Container/index.cjs +2 -1
  273. package/dist/layouts/Container/index.cjs.map +1 -1
  274. package/dist/layouts/Container/index.js +1 -1
  275. package/dist/layouts/MultiColumn/index.cjs +5 -0
  276. package/dist/layouts/MultiColumn/index.d.cts +2 -0
  277. package/dist/layouts/MultiColumn/index.d.ts +2 -0
  278. package/dist/layouts/MultiColumn/index.js +2 -0
  279. package/dist/layouts/PageBackground/index.d.cts +1 -1
  280. package/dist/layouts/PageBackground/index.d.ts +1 -1
  281. package/dist/layouts/Stack/index.cjs +2 -1
  282. package/dist/layouts/Stack/index.cjs.map +1 -1
  283. package/dist/layouts/Stack/index.d.cts +1 -1
  284. package/dist/layouts/Stack/index.d.ts +1 -1
  285. package/dist/layouts/Stack/index.js +1 -1
  286. package/dist/layouts/TwoColumn/index.cjs +2 -1
  287. package/dist/layouts/TwoColumn/index.cjs.map +1 -1
  288. package/dist/layouts/TwoColumn/index.d.cts +1 -1
  289. package/dist/layouts/TwoColumn/index.d.ts +1 -1
  290. package/dist/layouts/TwoColumn/index.js +1 -1
  291. package/dist/layouts/index.cjs +4 -0
  292. package/dist/layouts/index.d.cts +5 -4
  293. package/dist/layouts/index.d.ts +5 -4
  294. package/dist/layouts/index.js +2 -1
  295. package/dist/patterns/DataTable/index.cjs +6 -2
  296. package/dist/patterns/DataTable/index.cjs.map +1 -1
  297. package/dist/patterns/DataTable/index.d.cts +3 -3
  298. package/dist/patterns/DataTable/index.d.cts.map +1 -1
  299. package/dist/patterns/DataTable/index.d.ts +3 -3
  300. package/dist/patterns/DataTable/index.d.ts.map +1 -1
  301. package/dist/patterns/DataTable/index.js +6 -2
  302. package/dist/patterns/DataTable/index.js.map +1 -1
  303. package/dist/patterns/Footer/index.d.cts +7 -7
  304. package/dist/patterns/Footer/index.d.cts.map +1 -1
  305. package/dist/patterns/Footer/index.d.ts +7 -7
  306. package/dist/patterns/Header/index.d.cts +1 -1
  307. package/dist/patterns/Header/index.d.ts +1 -1
  308. package/dist/patterns/MediaObject/index.cjs +1 -1
  309. package/dist/patterns/MediaObject/index.d.cts +11 -11
  310. package/dist/patterns/MediaObject/index.d.ts +14 -14
  311. package/dist/patterns/MediaObject/index.js +1 -1
  312. package/dist/patterns/NavRail/index.cjs +4 -2
  313. package/dist/patterns/NavRail/index.cjs.map +1 -1
  314. package/dist/patterns/NavRail/index.js +4 -2
  315. package/dist/patterns/NavRail/index.js.map +1 -1
  316. package/dist/patterns/SectionCard/index.d.cts +2 -2
  317. package/dist/patterns/SectionCard/index.d.ts +2 -2
  318. package/dist/patterns/SectionCard/index.d.ts.map +1 -1
  319. package/dist/patterns/SectionHeading/index.d.cts +2 -2
  320. package/dist/patterns/SectionHeading/index.d.ts +2 -2
  321. package/dist/patterns/SectionHeading/index.d.ts.map +1 -1
  322. package/dist/patterns/index.d.cts +1 -1
  323. package/dist/patterns/index.d.ts +1 -1
  324. package/dist/primitives/Accordion/index.cjs +6 -2
  325. package/dist/primitives/Accordion/index.cjs.map +1 -1
  326. package/dist/primitives/Accordion/index.js +6 -2
  327. package/dist/primitives/Accordion/index.js.map +1 -1
  328. package/dist/primitives/Alert/index.cjs +2 -1
  329. package/dist/primitives/Alert/index.cjs.map +1 -1
  330. package/dist/primitives/Alert/index.js +1 -1
  331. package/dist/primitives/AlertDialog/index.cjs +1 -1
  332. package/dist/primitives/AlertDialog/index.js +1 -1
  333. package/dist/primitives/AspectRatio/index.cjs +1 -1
  334. package/dist/primitives/AspectRatio/index.js +1 -1
  335. package/dist/primitives/Avatar/index.cjs +1 -1
  336. package/dist/primitives/Avatar/index.js +1 -1
  337. package/dist/primitives/Badge/index.cjs +3 -2
  338. package/dist/primitives/Badge/index.cjs.map +1 -1
  339. package/dist/primitives/Badge/index.js +2 -2
  340. package/dist/primitives/Breadcrumb/index.cjs +7 -3
  341. package/dist/primitives/Breadcrumb/index.cjs.map +1 -1
  342. package/dist/primitives/Breadcrumb/index.js +7 -3
  343. package/dist/primitives/Breadcrumb/index.js.map +1 -1
  344. package/dist/primitives/Button/index.cjs +3 -2
  345. package/dist/primitives/Button/index.cjs.map +1 -1
  346. package/dist/primitives/Button/index.js +2 -2
  347. package/dist/primitives/ButtonGroup/index.cjs +3 -2
  348. package/dist/primitives/ButtonGroup/index.cjs.map +1 -1
  349. package/dist/primitives/ButtonGroup/index.js +2 -2
  350. package/dist/primitives/Calendar/index.cjs +12 -11
  351. package/dist/primitives/Calendar/index.cjs.map +1 -1
  352. package/dist/primitives/Calendar/index.js +12 -11
  353. package/dist/primitives/Calendar/index.js.map +1 -1
  354. package/dist/primitives/Card/index.cjs +2 -1
  355. package/dist/primitives/Card/index.cjs.map +1 -1
  356. package/dist/primitives/Card/index.js +1 -1
  357. package/dist/primitives/Carousel/index.cjs +4 -3
  358. package/dist/primitives/Carousel/index.cjs.map +1 -1
  359. package/dist/primitives/Carousel/index.js +4 -3
  360. package/dist/primitives/Carousel/index.js.map +1 -1
  361. package/dist/primitives/Checkbox/index.cjs +9 -2
  362. package/dist/primitives/Checkbox/index.cjs.map +1 -1
  363. package/dist/primitives/Checkbox/index.js +9 -2
  364. package/dist/primitives/Checkbox/index.js.map +1 -1
  365. package/dist/primitives/CheckboxTree/index.cjs +6 -2
  366. package/dist/primitives/CheckboxTree/index.cjs.map +1 -1
  367. package/dist/primitives/CheckboxTree/index.js +6 -2
  368. package/dist/primitives/CheckboxTree/index.js.map +1 -1
  369. package/dist/primitives/Collapsible/index.cjs +1 -1
  370. package/dist/primitives/Collapsible/index.js +1 -1
  371. package/dist/primitives/Command/index.cjs +6 -2
  372. package/dist/primitives/Command/index.cjs.map +1 -1
  373. package/dist/primitives/Command/index.js +6 -2
  374. package/dist/primitives/Command/index.js.map +1 -1
  375. package/dist/primitives/ContextMenu/index.cjs +14 -4
  376. package/dist/primitives/ContextMenu/index.cjs.map +1 -1
  377. package/dist/primitives/ContextMenu/index.js +14 -4
  378. package/dist/primitives/ContextMenu/index.js.map +1 -1
  379. package/dist/primitives/Credits/index.cjs +8 -3
  380. package/dist/primitives/Credits/index.cjs.map +1 -1
  381. package/dist/primitives/Credits/index.js +7 -3
  382. package/dist/primitives/Credits/index.js.map +1 -1
  383. package/dist/primitives/Dialog/index.cjs +3 -2
  384. package/dist/primitives/Dialog/index.cjs.map +1 -1
  385. package/dist/primitives/Dialog/index.js +3 -2
  386. package/dist/primitives/Dialog/index.js.map +1 -1
  387. package/dist/primitives/DropdownMenu/index.cjs +14 -4
  388. package/dist/primitives/DropdownMenu/index.cjs.map +1 -1
  389. package/dist/primitives/DropdownMenu/index.js +14 -4
  390. package/dist/primitives/DropdownMenu/index.js.map +1 -1
  391. package/dist/primitives/Empty/index.cjs +1 -1
  392. package/dist/primitives/Empty/index.js +1 -1
  393. package/dist/primitives/Field/index.cjs +1 -1
  394. package/dist/primitives/Field/index.js +1 -1
  395. package/dist/primitives/Form/index.cjs +1 -1
  396. package/dist/primitives/Form/index.js +1 -1
  397. package/dist/primitives/Heading/index.cjs +2 -1
  398. package/dist/primitives/Heading/index.cjs.map +1 -1
  399. package/dist/primitives/Heading/index.js +1 -1
  400. package/dist/primitives/HoverCard/index.cjs +1 -1
  401. package/dist/primitives/HoverCard/index.js +1 -1
  402. package/dist/primitives/InfoBanner/index.cjs +6 -3
  403. package/dist/primitives/InfoBanner/index.cjs.map +1 -1
  404. package/dist/primitives/InfoBanner/index.js +5 -3
  405. package/dist/primitives/InfoBanner/index.js.map +1 -1
  406. package/dist/primitives/Input/index.cjs +2 -1
  407. package/dist/primitives/Input/index.cjs.map +1 -1
  408. package/dist/primitives/Input/index.js +1 -1
  409. package/dist/primitives/InputGroup/index.cjs +1 -1
  410. package/dist/primitives/InputGroup/index.js +1 -1
  411. package/dist/primitives/InputOtp/index.cjs +3 -2
  412. package/dist/primitives/InputOtp/index.cjs.map +1 -1
  413. package/dist/primitives/InputOtp/index.js +3 -2
  414. package/dist/primitives/InputOtp/index.js.map +1 -1
  415. package/dist/primitives/Item/index.cjs +2 -2
  416. package/dist/primitives/Item/index.js +2 -2
  417. package/dist/primitives/Label/index.cjs +1 -1
  418. package/dist/primitives/Label/index.js +1 -1
  419. package/dist/primitives/Link/index.cjs +3 -2
  420. package/dist/primitives/Link/index.cjs.map +1 -1
  421. package/dist/primitives/Link/index.js +2 -2
  422. package/dist/primitives/Menubar/index.cjs +14 -4
  423. package/dist/primitives/Menubar/index.cjs.map +1 -1
  424. package/dist/primitives/Menubar/index.js +14 -4
  425. package/dist/primitives/Menubar/index.js.map +1 -1
  426. package/dist/primitives/NativeSelect/index.cjs +6 -3
  427. package/dist/primitives/NativeSelect/index.cjs.map +1 -1
  428. package/dist/primitives/NativeSelect/index.js +5 -3
  429. package/dist/primitives/NativeSelect/index.js.map +1 -1
  430. package/dist/primitives/NavigationMenu/index.cjs +5 -3
  431. package/dist/primitives/NavigationMenu/index.cjs.map +1 -1
  432. package/dist/primitives/NavigationMenu/index.js +5 -3
  433. package/dist/primitives/NavigationMenu/index.js.map +1 -1
  434. package/dist/primitives/Pagination/index.cjs +6 -2
  435. package/dist/primitives/Pagination/index.cjs.map +1 -1
  436. package/dist/primitives/Pagination/index.js +6 -2
  437. package/dist/primitives/Pagination/index.js.map +1 -1
  438. package/dist/primitives/Popover/index.cjs +1 -1
  439. package/dist/primitives/Popover/index.js +1 -1
  440. package/dist/primitives/Progress/index.cjs +1 -1
  441. package/dist/primitives/Progress/index.js +1 -1
  442. package/dist/primitives/RadioGroup/index.cjs +6 -2
  443. package/dist/primitives/RadioGroup/index.cjs.map +1 -1
  444. package/dist/primitives/RadioGroup/index.js +6 -2
  445. package/dist/primitives/RadioGroup/index.js.map +1 -1
  446. package/dist/primitives/Resizable/index.cjs +6 -2
  447. package/dist/primitives/Resizable/index.cjs.map +1 -1
  448. package/dist/primitives/Resizable/index.js +6 -2
  449. package/dist/primitives/Resizable/index.js.map +1 -1
  450. package/dist/primitives/ScrollArea/index.cjs +1 -1
  451. package/dist/primitives/ScrollArea/index.js +1 -1
  452. package/dist/primitives/Select/index.cjs +18 -5
  453. package/dist/primitives/Select/index.cjs.map +1 -1
  454. package/dist/primitives/Select/index.js +18 -5
  455. package/dist/primitives/Select/index.js.map +1 -1
  456. package/dist/primitives/Separator/index.cjs +1 -1
  457. package/dist/primitives/Separator/index.js +1 -1
  458. package/dist/primitives/Sheet/index.cjs +6 -2
  459. package/dist/primitives/Sheet/index.cjs.map +1 -1
  460. package/dist/primitives/Sheet/index.js +6 -2
  461. package/dist/primitives/Sheet/index.js.map +1 -1
  462. package/dist/primitives/Slider/index.cjs +1 -1
  463. package/dist/primitives/Slider/index.js +1 -1
  464. package/dist/primitives/Sonner/index.cjs +22 -6
  465. package/dist/primitives/Sonner/index.cjs.map +1 -1
  466. package/dist/primitives/Sonner/index.js +22 -6
  467. package/dist/primitives/Sonner/index.js.map +1 -1
  468. package/dist/primitives/Spinner/index.cjs +4 -2
  469. package/dist/primitives/Spinner/index.cjs.map +1 -1
  470. package/dist/primitives/Spinner/index.js +4 -2
  471. package/dist/primitives/Spinner/index.js.map +1 -1
  472. package/dist/primitives/Switch/index.cjs +1 -1
  473. package/dist/primitives/Switch/index.js +1 -1
  474. package/dist/primitives/Tabs/index.cjs +2 -2
  475. package/dist/primitives/Tabs/index.js +2 -2
  476. package/dist/primitives/Text/index.cjs +2 -1
  477. package/dist/primitives/Text/index.cjs.map +1 -1
  478. package/dist/primitives/Text/index.js +1 -1
  479. package/dist/primitives/Textarea/index.cjs +2 -1
  480. package/dist/primitives/Textarea/index.cjs.map +1 -1
  481. package/dist/primitives/Textarea/index.js +1 -1
  482. package/dist/primitives/Toggle/index.cjs +3 -2
  483. package/dist/primitives/Toggle/index.cjs.map +1 -1
  484. package/dist/primitives/Toggle/index.js +2 -2
  485. package/dist/primitives/ToggleGroup/index.cjs +1 -1
  486. package/dist/primitives/ToggleGroup/index.js +1 -1
  487. package/dist/primitives/Tooltip/index.cjs +1 -1
  488. package/dist/primitives/Tooltip/index.js +1 -1
  489. package/dist/primitives/index.cjs +1 -1
  490. package/dist/primitives/index.js +1 -1
  491. package/package.json +2 -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).
@@ -290,6 +381,20 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
290
381
  - **Custom props**: `value` (balance, required); `lowThreshold` (default `200`); `icon` override; `format` override (default floor+thousands).
291
382
  - **Notes**: Color escalates as balance drops (neutral → amber ≤ threshold → red ≤ 0).
292
383
 
384
+ <!-- variant-facts:Credits:start — GENERATED by `pnpm docs:variants`; edit
385
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
386
+
387
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
388
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
389
+
390
+ | variant | fill | text | border | hover fill |
391
+ |---|---|---|---|---|
392
+ | `default`\* | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) | #111827 → #f3f4f6 | #e5e7eb → #374151 | — |
393
+ | `warning` | #ffedd5 → #431407 | #c2410c → #fdba74 | hairline | — |
394
+ | `critical` | #fde6ea → #6c0016 | #bc0126 → #f699ac | hairline | — |
395
+
396
+ <!-- variant-facts:Credits:end -->
397
+
293
398
  ### Dialog
294
399
  - **Exports**: Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger
295
400
  - **Variants**: DialogContent `size: sm | default* | lg | xl`
@@ -327,6 +432,25 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
327
432
  - **Custom props**: `as` — semantic element (default `h2`, independent of visual `size`).
328
433
  - **Notes**: `gradient` fills text with the brand gradient.
329
434
 
435
+ <!-- variant-facts:Heading:start — GENERATED by `pnpm docs:variants`; edit
436
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
437
+
438
+ **Choosing a `gradient`** — colors are `light → dark` mode actuals. Never re-skin a
439
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
440
+
441
+ | gradient | fill | text | border | hover fill |
442
+ |---|---|---|---|---|
443
+ | `true` | — | — | — | — |
444
+ | `false`\* | — | #111827 → #f3f4f6 | — | — |
445
+
446
+ **size**: `1` · `2`\* · `3` · `4` · `5` · `6` · `7`
447
+
448
+ **weight**: `normal` · `medium` · `semibold`
449
+
450
+ **align**: `left` · `center` · `right`
451
+
452
+ <!-- variant-facts:Heading:end -->
453
+
330
454
  ### HoverCard
331
455
  - **Exports**: HoverCard, HoverCardTrigger, HoverCardContent
332
456
  - **Custom props**: HoverCardContent `align` (default `center`), `sideOffset` (default `4`).
@@ -335,8 +459,10 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
335
459
  ### Icon
336
460
  - **Exports**: Icon, IconProps (type), IconName (type), ICON_NAMES
337
461
  - **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.
462
+ - **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.
463
+ - **Custom props**: `strokeWidth`; `label` a11y label (sets `role="img"`, else aria-hidden).
464
+ - **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.
465
+ - **Notes**: `shape` wraps the glyph in a padded box where `fill`/`color` apply. Existing `icon="name"` usage is unchanged — `as` is purely additive.
340
466
 
341
467
  ### InfoBanner
342
468
  - **Exports**: InfoBanner, infoBannerVariants, InfoBannerProps (type)
@@ -344,11 +470,48 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
344
470
  - **Custom props**: `title` (required); `description`; `icon` override; `dismissible` (default `true`); `visible` (controlled); `onDismiss`.
345
471
  - **Notes**: `role="status"`; dismissible — distinct from the non-dismissible Alert.
346
472
 
473
+ <!-- variant-facts:InfoBanner:start — GENERATED by `pnpm docs:variants`; edit
474
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
475
+
476
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
477
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
478
+
479
+ | variant | use when | fill | text | border | hover fill | tell |
480
+ |---|---|---|---|---|---|---|
481
+ | `info`\* | announcements, tips, FYI messaging | #e0f2fe → #0c4a6e | #0369a1 → #7dd3fc | — | — | blue band |
482
+ | `success` | operation completed / healthy state | #ecfccb → #365314 | #4d7c0f → #bef264 | — | — | green band |
483
+ | `warning` | caution or degraded state, action may be needed | #ffedd5 → #431407 | #c2410c → #fdba74 | — | — | orange band |
484
+ | `error` | failure that needs attention | #fde6ea → #6c0016 | #bc0126 → #f699ac | — | — | red band |
485
+ | `neutral` | generic notice with no severity | #f3f4f6 → #111827 | #111827 → #f3f4f6 | — | — | gray band |
486
+
487
+ Confusable: InfoBanner vs Alert → banner is a full-width severity band at page/section level; Alert sits inline in the content flow.
488
+
489
+ <!-- variant-facts:InfoBanner:end -->
490
+
347
491
  ### Input
348
492
  - **Exports**: Input, inputVariants
349
493
  - **Variants**: `variant: default* | ai`, `size: xs | sm | default* | lg`, `shape: default* (12px) | round (pill)`
350
494
  - **Notes**: Native `<input>` passthrough; `ai` swaps border for the AI gradient; `aria-invalid` triggers the error ring.
351
495
 
496
+ <!-- variant-facts:Input:start — GENERATED by `pnpm docs:variants`; edit
497
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
498
+
499
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
500
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
501
+
502
+ | variant | use when | fill | text | border | hover fill | tell |
503
+ |---|---|---|---|---|---|---|
504
+ | `default`\* | any standard text entry | #ffffff → #1f2832 | — | #e5e7eb → #374151 | — | white fill, gray hairline border |
505
+ | `ai` | AI prompt / ask-anything fields only | — | — | — | — | gradient AI border |
506
+
507
+ Confusable: `ai` is reserved for AI prompt fields — a normal field with AI autofill is still `default`.
508
+
509
+ **size**: `xs` 24px · `sm` 32px · `default`\* 36px · `lg` 40px
510
+
511
+ **shape**: `default`\* 12px radius · `round` pill
512
+
513
+ <!-- variant-facts:Input:end -->
514
+
352
515
  ### InputGroup
353
516
  - **Exports**: InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea
354
517
  - **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 +543,22 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
380
543
  - **Variants**: `variant: default* | muted | subtle`, `underline: always* | hover`
381
544
  - **Custom props**: `asChild` — render a router link instead of `<a>` (default `false`).
382
545
 
546
+ <!-- variant-facts:Link:start — GENERATED by `pnpm docs:variants`; edit
547
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
548
+
549
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
550
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
551
+
552
+ | variant | fill | text | border | hover fill |
553
+ |---|---|---|---|---|
554
+ | `default`\* | — | #111827 @80% → #f3f4f6 @80% | — | — |
555
+ | `muted` | — | #111827 → #f3f4f6 | — | — |
556
+ | `subtle` | — | #111827 @80% → #f3f4f6 @80% | — | — |
557
+
558
+ **underline**: `always`\* · `hover`
559
+
560
+ <!-- variant-facts:Link:end -->
561
+
383
562
  ### Logo
384
563
  - **Exports**: Logo, LogoBrand (type), LogoVariant (type)
385
564
  - **Variants**: `variant: logo* | icon`
@@ -397,6 +576,14 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
397
576
  - **Variants**: `size: xs | sm | default* | lg`
398
577
  - **Notes**: Styled native `<select>` with chevron affordance; pass `<option>`/`<optgroup>` children; mirrors Input visuals.
399
578
 
579
+ <!-- variant-facts:NativeSelect:start — GENERATED by `pnpm docs:variants`; edit
580
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
581
+
582
+
583
+ **size**: `xs` 24px · `sm` 32px · `default`\* 36px · `lg` 40px
584
+
585
+ <!-- variant-facts:NativeSelect:end -->
586
+
400
587
  ### NavigationMenu
401
588
  - **Exports**: NavigationMenu, NavigationMenuList, NavigationMenuItem, NavigationMenuContent, NavigationMenuTrigger, NavigationMenuLink, NavigationMenuIndicator, NavigationMenuViewport, navigationMenuTriggerStyle
402
589
  - **Custom props**: NavigationMenu `viewport` (default `true` — shared animated viewport; `false` renders content inline)
@@ -456,6 +643,21 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
456
643
  - **Variants**: Sidebar `side: left* | right`, `variant: sidebar* | floating | inset`, `collapsible: offcanvas* | icon | none`
457
644
  - **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
645
 
646
+ <!-- variant-facts:Sidebar:start — GENERATED by `pnpm docs:variants`; edit
647
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
648
+
649
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
650
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
651
+
652
+ | variant | fill | text | border | hover fill |
653
+ |---|---|---|---|---|
654
+ | `default`\* | — | #111827 → #f3f4f6 | — | #e5e7eb @50% → #4b5563 @50% |
655
+ | `outline` | #ffffff → #111827 | #111827 → #f3f4f6 | — | #e5e7eb @50% → #4b5563 @50% |
656
+
657
+ **size**: `default`\* 32px · `sm` 28px · `lg` 48px
658
+
659
+ <!-- variant-facts:Sidebar:end -->
660
+
459
661
  ### Skeleton
460
662
  - **Exports**: Skeleton, SkeletonAvatar, SkeletonLine, SkeletonObject
461
663
  - **Notes**: `skeleton-shimmer` divs; presets: Avatar (size-10 round), Line (h-4 full), Object (96px block).
@@ -491,17 +693,79 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
491
693
  - **Custom props**: TabsList `tabPrefix`/`tabSuffix` (nodes)
492
694
  - **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
695
 
696
+ <!-- HAND-WRITTEN choosing table (compoundVariants — not generated; keep in sync with tabsListVariants/tabsTriggerVariants). -->
697
+
698
+ **Choosing a `variant`** — never re-skin a variant with paint classes (SKILL.md →
699
+ "Never re-skin a variant").
700
+
701
+ | variant | use when | looks like | tell |
702
+ |---|---|---|---|
703
+ | `line` | quiet content-section switching inside a page | plain text row; 2px underline slides beneath the active tab | underline only, no fills |
704
+ | `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 |
705
+ | `segmented` | tight toggle-group of 2–5 short options | track with ONE animated indicator that slides behind triggers | single sliding thumb |
706
+ | `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 |
707
+
708
+ **size** — track heights (`pill`/`segmented`, horizontal): `sm` 24px · `md`\* 35px ·
709
+ `lg` 40px. `fancy` trigger padding: `sm` 8/16px (text-sm) · `md` 12/24px (text-sm) ·
710
+ `lg` 16/24px (text-base) — an `lg` fancy tab card runs ≈56px tall.
711
+
712
+ Confusable: `pill` vs `segmented` → both are tracks, but segmented animates one
713
+ shared indicator while pill styles the active trigger itself. `fancy` is only for
714
+ glass compositions (needs `PageBackground` behind it); everywhere else pick one of
715
+ the other three.
716
+
494
717
  ### Text
495
718
  - **Exports**: Text, textVariants, TextProps (type)
496
719
  - **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
720
  - **Custom props**: `as` (default `p`)
498
721
  - **Notes**: Body-copy primitive; sizes map to the paragraph type-scale tokens.
499
722
 
723
+ <!-- variant-facts:Text:start — GENERATED by `pnpm docs:variants`; edit
724
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
725
+
726
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
727
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
728
+
729
+ | variant | fill | text | border | hover fill |
730
+ |---|---|---|---|---|
731
+ | `default`\* | — | #111827 → #f3f4f6 | — | — |
732
+ | `muted` | — | #6b7280 → #9ca3af | — | — |
733
+ | `primary` | — | #111827 → #f3f4f6 | — | — |
734
+ | `destructive` | — | #bc0126 → #f699ac | — | — |
735
+ | `success` | — | #4d7c0f → #bef264 | — | — |
736
+
737
+ **size**: `large` · `regular`\* · `small` · `mini` · `caption`
738
+
739
+ **weight**: `normal`\* · `medium` · `semibold`
740
+
741
+ **font**: `body`\* · `heading` · `mono`
742
+
743
+ **align**: `left` · `center` · `right`
744
+
745
+ **truncate**: `true`
746
+
747
+ <!-- variant-facts:Text:end -->
748
+
500
749
  ### Textarea
501
750
  - **Exports**: Textarea, textareaVariants
502
751
  - **Variants**: `variant: default* | ai` (gradient border), `shape: default* (12px) | round (16px)`
503
752
  - **Notes**: Auto-grows via `field-sizing-content`; chrome matches Input; supports aria-invalid.
504
753
 
754
+ <!-- variant-facts:Textarea:start — GENERATED by `pnpm docs:variants`; edit
755
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
756
+
757
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
758
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
759
+
760
+ | variant | fill | text | border | hover fill |
761
+ |---|---|---|---|---|
762
+ | `default`\* | #ffffff → #1f2832 | — | #e5e7eb → #374151 | — |
763
+ | `ai` | — | — | — | — |
764
+
765
+ **shape**: `default`\* 12px radius · `round` 16px radius
766
+
767
+ <!-- variant-facts:Textarea:end -->
768
+
505
769
  ### ThemeProvider
506
770
  - **Exports**: ThemeProvider, useTheme, ThemeContext, ThemeMode (type), ThemeProduct (type)
507
771
  - **Custom props**: `defaultTheme: light* | dark`, `defaultProduct: slingshot* | sustain | bodhi | psai`, `storageKey` (default `ds-theme-preferences`)
@@ -537,8 +801,8 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
537
801
 
538
802
  ### Header
539
803
  - **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`; `onCloseProjectOverlay`; `logoAddon` — node between logo and picker; `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? }`.
804
+ - **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).
805
+ - **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
806
 
543
807
  ### MediaObject
544
808
  - **Exports**: `MediaObject`, `MediaObjectImage`, `MediaObjectIcon`, `MediaObjectContent`, `MediaObjectTitle`, `MediaObjectText`, `MediaObjectActions`, `MediaObjectGroup`, `mediaObjectGroupVariants`, types `MediaObjectProps`, `MediaObjectImageProps`, `MediaObjectTitleProps`, `MediaObjectGroupProps`
@@ -546,6 +810,16 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
546
810
  - **Custom props**: (MediaObject) `interactive` — CSS hover lift + shadow. (MediaObjectImage) `alt` — required alt text. (MediaObjectTitle) `size` — Heading size (default `"4"`).
547
811
  - **Notes**: Radix-style compositional card; root is `<article>`, image is 16/9 cover; pure-CSS hover (no JS state).
548
812
 
813
+ <!-- variant-facts:MediaObject:start — GENERATED by `pnpm docs:variants`; edit
814
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
815
+
816
+
817
+ **columns**: `1` · `2` · `3`\* · `4`
818
+
819
+ **gap**: `sm` · `md` · `lg`\*
820
+
821
+ <!-- variant-facts:MediaObject:end -->
822
+
549
823
  ### NavRail
550
824
  - **Exports**: NavRail, NavRailItem, NavRailUser, NavRailSeparator, NavRailMenu, NavRailMenuTrigger, NavRailMenuContent, NavRailMenuItem, + prop types
551
825
  - **Variants**: NavRail `mode: icon* | text | expanded | expand-on-hover`
@@ -570,6 +844,39 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
570
844
  - **Custom props**: `as` — element/component to render (default `div`).
571
845
  - **Notes**: Centered max-width column with gutters; `glass` uses `bg-glass-40-bg backdrop-blur-glass`.
572
846
 
847
+ <!-- variant-facts:Container:start — GENERATED by `pnpm docs:variants`; edit
848
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
849
+
850
+ **Choosing a `variant`** — colors are `light → dark` mode actuals. Never re-skin a
851
+ variant with paint classes (SKILL.md → "Never re-skin a variant").
852
+
853
+ | variant | fill | text | border | hover fill |
854
+ |---|---|---|---|---|
855
+ | `default`\* | — | — | — | — |
856
+ | `glass` | rgb(255 255 255 / 0.4) → rgb(31 40 50 / 0.4) | — | — | — |
857
+
858
+ **size**: `narrow` · `content`\* · `wide` · `full`
859
+
860
+ <!-- variant-facts:Container:end -->
861
+
862
+ ### MultiColumn
863
+ - **Exports**: `MultiColumn`, `MultiColumnItem`, `multiColumnVariants`, types `MultiColumnProps`, `MultiColumnItemProps`
864
+ - **Variants** (MultiColumn): `gap`: `none` | `sm` | `md` | `lg`* | `xl`; `stackBelow`: `sm` | `md` | `lg`* | `xl` — breakpoint the grid activates at.
865
+ - **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.
866
+ - **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`.
867
+ - **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`.
868
+ - **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.
869
+
870
+ <!-- variant-facts:MultiColumn:start — GENERATED by `pnpm docs:variants`; edit
871
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
872
+
873
+
874
+ **gap**: `none` · `sm` · `md` · `lg`\* · `xl`
875
+
876
+ **stackBelow**: `sm` · `md` · `lg`\* · `xl`
877
+
878
+ <!-- variant-facts:MultiColumn:end -->
879
+
573
880
  ### PageBackground
574
881
  - **Exports**: `PageBackground`, type `PageBackgroundProps`
575
882
  - **Custom props**: `fixed` — fixed to viewport (default `true`) vs absolute-fill of positioned parent.
@@ -580,11 +887,35 @@ Stories in `src/<layer>/<Component>/<Component>.stories.tsx` are the canonical e
580
887
  - **Variants**: `direction`: `vertical`* | `horizontal`; `gap`: `none` | `xs` | `sm` | `md`* | `lg` | `xl` | `2xl`; `align`: `start` | `center` | `end` | `stretch`*; `justify`: `start` | `center` | `between` | `end`
581
888
  - **Custom props**: `as` — render as different element (default `div`).
582
889
 
890
+ <!-- variant-facts:Stack:start — GENERATED by `pnpm docs:variants`; edit
891
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
892
+
893
+
894
+ **direction**: `vertical`\* · `horizontal`
895
+
896
+ **gap**: `none` · `xs` · `sm` · `md`\* · `lg` · `xl` · `2xl`
897
+
898
+ **align**: `start` · `center` · `end` · `stretch`\*
899
+
900
+ **justify**: `start` · `center` · `between` · `end`
901
+
902
+ <!-- variant-facts:Stack:end -->
903
+
583
904
  ### TwoColumn
584
905
  - **Exports**: `TwoColumn`, `TwoColumnAside`, `TwoColumnMain`, `twoColumnVariants`, type `TwoColumnProps`
585
906
  - **Variants** (TwoColumn): `gap`: `none` | `sm` | `md` | `lg`* | `xl`; `reverse`: aside after main at lg+
586
907
  - **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
908
 
909
+ <!-- variant-facts:TwoColumn:start — GENERATED by `pnpm docs:variants`; edit
910
+ scripts/variant-intent.json (judgment) or the component (facts), not this block. -->
911
+
912
+
913
+ **gap**: `none` · `sm` · `md` · `lg`\* · `xl`
914
+
915
+ **reverse**: `true`
916
+
917
+ <!-- variant-facts:TwoColumn:end -->
918
+
588
919
  ### Utils
589
920
 
590
921
  ### cn
@@ -637,3 +968,134 @@ Both mode files define the identical names (`mode-light.css` on `:root`, `mode-d
637
968
  - 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
969
  - AI affordance: `--ai-surface`, `--ai-gradient-from`, `--ai-gradient-to`
639
970
  - Logo ink: `--logo-mark-dark` (mode-driven, defined in base.css)
971
+
972
+ <!-- token-facts:start — GENERATED by `pnpm docs:variants` from
973
+ docs/css-variables.json; edit src/styles/tokens/* and re-run, not this block. -->
974
+
975
+ ### 7.3 Resolved token values
976
+
977
+ Actual values per mode, `light → dark` (a single value is identical in both
978
+ modes). Product-scoped tokens are listed per product; `slingshot` is the
979
+ default (`:root`) product.
980
+
981
+ **Backgrounds**
982
+
983
+ | token | light → dark |
984
+ |---|---|
985
+ | `--danger-bg` | #fde6ea → #6c0016 |
986
+ | `--ghost-bg` | rgb(255 255 255 / 0.0001) |
987
+ | `--ghost-hover-bg` | rgb(31 40 50 / 0.05) → rgb(255 255 255 / 0.1) |
988
+ | `--info-bg` | #e0f2fe → #0c4a6e |
989
+ | `--input-bg` | #ffffff → #1f2832 |
990
+ | `--muted-bg` | #f3f4f6 → #111827 |
991
+ | `--navbar-active-bg` | #e90130 |
992
+ | `--outline-bg` | rgb(255 255 255 / 0.1) → rgb(255 255 255 / 0.05) |
993
+ | `--outline-hover-bg` | rgb(31 40 50 / 0.0333) → rgb(255 255 255 / 0.1) |
994
+ | `--overlay-bg` | rgb(31 40 50 / 0.4) |
995
+ | `--primary-bg` | #ffffff → #111827 |
996
+ | `--primary-invert-bg` | #111827 → #ffffff |
997
+ | `--primary-invert-hover-bg` | #374151 → #d1d5db |
998
+ | `--secondary-bg` | #e5e7eb → #4b5563 |
999
+ | `--secondary-hover-bg` | #f9fafb → #111827 |
1000
+ | `--success-bg` | #ecfccb → #365314 |
1001
+ | `--switch-active-bg` | #84cc16 |
1002
+ | `--toggle-active-bg` | rgb(31 40 50 / 0.05) → rgb(255 255 255 / 0.1) |
1003
+ | `--warning-bg` | #ffedd5 → #431407 |
1004
+
1005
+ **Glass**
1006
+
1007
+ | token | light → dark |
1008
+ |---|---|
1009
+ | `--glass-20-bg` | rgb(255 255 255 / 0.2) → rgb(31 40 50 / 0.2) |
1010
+ | `--glass-40-bg` | rgb(255 255 255 / 0.4) → rgb(31 40 50 / 0.4) |
1011
+ | `--glass-60-bg` | rgb(255 255 255 / 0.6) → rgb(31 40 50 / 0.6) |
1012
+ | `--glass-blur` | 45px |
1013
+ | `--glass-none-bg` | #ffffff → #111827 |
1014
+
1015
+ **Text**
1016
+
1017
+ | token | light → dark |
1018
+ |---|---|
1019
+ | `--danger-txt` | #bc0126 → #f699ac |
1020
+ | `--info-txt` | #0369a1 → #7dd3fc |
1021
+ | `--muted-txt` | #6b7280 → #9ca3af |
1022
+ | `--primary-invert-txt` | #f3f4f6 → #111827 |
1023
+ | `--primary-txt` | #111827 → #f3f4f6 |
1024
+ | `--secondary-txt` | #374151 → #e5e7eb |
1025
+ | `--success-txt` | #4d7c0f → #bef264 |
1026
+ | `--warning-txt` | #c2410c → #fdba74 |
1027
+
1028
+ **Borders**
1029
+
1030
+ | token | light → dark |
1031
+ |---|---|
1032
+ | `--danger-border` | #bc0126 → #f699ac |
1033
+ | `--info-border` | #0369a1 → #7dd3fc |
1034
+ | `--muted-border` | #f3f4f6 → #111827 |
1035
+ | `--primary-border` | #e5e7eb → #374151 |
1036
+ | `--primary-invert-border` | #9ca3af → #4b5563 |
1037
+ | `--secondary-border` | #d1d5db → #374151 |
1038
+ | `--selected-border` | #1f2937 → #f9fafb |
1039
+ | `--success-border` | #4d7c0f → #bef264 |
1040
+ | `--warning-border` | #c2410c → #fdba74 |
1041
+
1042
+ **Focus**
1043
+
1044
+ | token | light → dark |
1045
+ |---|---|
1046
+ | `--focus` | #d1d5db → #374151 |
1047
+ | `--focus-error` | #f699ac → #6c0016 |
1048
+
1049
+ **Charts**
1050
+
1051
+ | token | light → dark |
1052
+ |---|---|
1053
+ | `--chart-1` | #f54a00 |
1054
+ | `--chart-2` | #009689 |
1055
+ | `--chart-3` | #104e64 |
1056
+ | `--chart-4` | #ffb900 |
1057
+ | `--chart-5` | #fe9a00 |
1058
+ | `--chart-amber` | #fbbf24 → #b45309 |
1059
+ | `--chart-amber-subtle` | #fde68a → #78350f |
1060
+ | `--chart-blue` | #60a5fa → #1d4ed8 |
1061
+ | `--chart-blue-subtle` | #bfdbfe → #1e3a8a |
1062
+ | `--chart-emerald` | #34d399 → #047857 |
1063
+ | `--chart-emerald-subtle` | #a7f3d0 → #064e3b |
1064
+ | `--chart-indigo` | #818cf8 → #4338ca |
1065
+ | `--chart-indigo-subtle` | #c7d2fe → #312e81 |
1066
+ | `--chart-lime` | #a3e635 → #4d7c0f |
1067
+ | `--chart-lime-subtle` | #d9f99d → #365314 |
1068
+ | `--chart-orange` | #fb923c → #c2410c |
1069
+ | `--chart-orange-subtle` | #fed7aa → #7c2d12 |
1070
+ | `--chart-purple` | #c084fc → #7e22ce |
1071
+ | `--chart-purple-subtle` | #e9d5ff → #581c87 |
1072
+ | `--chart-red` | #f26783 → #bc0126 |
1073
+ | `--chart-red-subtle` | #fbccd6 → #6c0016 |
1074
+
1075
+ **Logo ink**
1076
+
1077
+ | token | light → dark |
1078
+ |---|---|
1079
+ | `--logo-mark-dark` | #111827 → #ffffff |
1080
+
1081
+ **Other**
1082
+
1083
+ | token | light → dark |
1084
+ |---|---|
1085
+ | `--ai-gradient-to` | #9ca3af → #4b5563 |
1086
+ | `--brand-gradient-to` | #e2e8f0 → #020617 |
1087
+
1088
+ **Brand & gradients (per product)**
1089
+
1090
+ | token | slingshot | bodhi | sustain |
1091
+ |---|---|---|---|
1092
+ | `--ai-gradient-from` | #e90130 | #3b82f6 | #6366f1 |
1093
+ | `--brand-200` | #fbccd6 → #6c0016 | #bfdbfe → #6c0016 | #c7d2fe → #6c0016 |
1094
+ | `--brand-50` | #fef2f5 → #3d000d | #eff6ff → #3d000d | #eef2ff → #3d000d |
1095
+ | `--brand-500-primary` | #e90130 | #3b82f6 | #6366f1 |
1096
+ | `--brand-700` | #bc0126 → #fbccd6 | #1d4ed8 → #bfdbfe | #4338ca → #c7d2fe |
1097
+ | `--brand-800` | #8d011d → #fbccd6 | #1e40af → #bfdbfe | #3730a3 → #c7d2fe |
1098
+ | `--brand-950` | #3d000d → #fef2f5 | #172554 → #eff6ff | #1e1b4b → #eef2ff |
1099
+ | `--brand-gradient-from` | #fbccd6 → #3d000d | #bfdbfe → #172554 | #c7d2fe → #1e1b4b |
1100
+
1101
+ <!-- token-facts:end -->
package/README.md CHANGED
@@ -7,7 +7,7 @@ Bodhi, Sustain, …), in light and dark.
7
7
 
8
8
  - **65 primitives** (Button, Dialog, Input, Select, Table, Tabs, Card, Chart, …)
9
9
  - **7 patterns** (Header, Footer, DataTable, MediaObject, SectionCard, …)
10
- - **5 layouts** (Container, Stack, TwoColumn, PageBackground, …)
10
+ - **5 layouts** (Container, MultiColumn, Stack, TwoColumn, PageBackground)
11
11
  - Dual **ESM + CJS** builds with **TypeScript declarations**; deep imports are tree-shakeable.
12
12
 
13
13
  > **Browse every component in Storybook** — each has a live preview, a props
@@ -43,7 +43,7 @@ will write DS-native code instead of guessing:
43
43
 
44
44
  ### Install them as an Agent Skill (recommended)
45
45
 
46
- Run this in your app to copy both docs into `.agents/skills/design-system/`,
46
+ Run this in your app to copy both docs into `.agent/skills/design-system/`,
47
47
  where coding agents pick them up automatically:
48
48
 
49
49
  ```bash
@@ -128,7 +128,7 @@ shown on its **Storybook Docs** page (generated from the source types + JSDoc).
128
128
  |---|---|
129
129
  | `@psnext/design-system/primitives/*` · `…/primitives` | Button, Dialog, Input, Select, Table, Tabs, Card, Chart, Badge, Text, Heading, Icon, `Logo`, Credits, `ThemeProvider`/`useTheme`, … (65) |
130
130
  | `@psnext/design-system/patterns/*` · `…/patterns` | `Header`, `Footer`, `DataTable`, `MediaObject`, `NavRail`, `SectionCard`, `SectionHeading` |
131
- | `@psnext/design-system/layouts/*` · `…/layouts` | `Container`, `Stack`, `TwoColumn`, `PageBackground` |
131
+ | `@psnext/design-system/layouts/*` · `…/layouts` | `Container`, `MultiColumn`, `Stack`, `TwoColumn`, `PageBackground` |
132
132
  | `@psnext/design-system/styles` | the single raw-CSS entry (tokens + themes + bridge) |
133
133
 
134
134
  The package is **side-effect-free** (`sideEffects: ["**/*.css"]`), so unused