@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
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["React","cn","Slot","Tooltip","TooltipTrigger","TooltipContent","Popover","PopoverTrigger","ChevronRightIcon","PopoverContent"],"sources":["../../../src/patterns/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n//\n// HEIGHT: the rail hugs its content (`self-start`, so a taller flex parent won't\n// stretch it). For a full-height app-shell rail, pass an explicit height —\n// e.g. `className=\"h-full\"`.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-primary-txt outline-none transition-colors hover:bg-primary-txt/10 focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-full px-3\",\n expanded: \"w-full justify-start gap-3 rounded-full px-3\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-full px-3\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-txt\",\n text: \"ml-auto size-4 shrink-0 text-muted-txt\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-txt\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-txt opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-2 self-start overflow-hidden rounded-16 bg-glass-60-bg p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-primary-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full shrink-0 items-center rounded-full\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-txt\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-45 flex-col gap-0.5 rounded-16 border border-primary-border bg-glass-60-bg p-1.5 text-primary-txt shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-8 px-3 py-2 text-left text-sm text-primary-txt outline-none transition-colors\",\n \"hover:bg-primary-txt/10 focus-visible:bg-primary-txt/10\",\n \"data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["React","cn","Slot","Tooltip","TooltipTrigger","TooltipContent","Popover","PopoverTrigger","Icon","ChevronRightIcon","PopoverContent"],"sources":["../../../src/patterns/NavRail/NavRail.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n//\n// HEIGHT: the rail hugs its content (`self-start`, so a taller flex parent won't\n// stretch it). For a full-height app-shell rail, pass an explicit height —\n// e.g. `className=\"h-full\"`.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-primary-txt outline-none transition-colors hover:bg-primary-txt/10 focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-full px-3\",\n expanded: \"w-full justify-start gap-3 rounded-full px-3\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-full px-3\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-txt\",\n text: \"ml-auto size-4 shrink-0 text-muted-txt\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-txt\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-txt opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-2 self-start overflow-hidden rounded-16 bg-glass-60-bg p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-primary-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full shrink-0 items-center rounded-full\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-txt\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <Icon as={ChevronRightIcon} aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-45 flex-col gap-0.5 rounded-16 border border-primary-border bg-glass-60-bg p-1.5 text-primary-txt shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-8 px-3 py-2 text-left text-sm text-primary-txt outline-none transition-colors\",\n \"hover:bg-primary-txt/10 focus-visible:bg-primary-txt/10\",\n \"data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { t as cn } from "../../cn.js";
2
+ import { t as Icon } from "../../Icon.js";
2
3
  import { Popover as Popover$1, PopoverContent, PopoverTrigger } from "../../primitives/Popover/index.js";
3
4
  import { Tooltip as Tooltip$1, TooltipContent, TooltipTrigger } from "../../primitives/Tooltip/index.js";
4
5
  import * as React from "react";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
5
7
  import { ChevronRightIcon } from "lucide-react";
6
8
  import { Slot } from "radix-ui";
7
- import { jsx, jsxs } from "react/jsx-runtime";
8
9
  //#region src/patterns/NavRail/NavRail.tsx
9
10
  const NavRailContext = React.createContext("icon");
10
11
  const RAIL_BY_MODE = {
@@ -149,7 +150,8 @@ function NavRailMenuTrigger({ label, active, className, children, ...props }) {
149
150
  className: LABEL_BY_MODE[mode],
150
151
  children: label
151
152
  }),
152
- /* @__PURE__ */ jsx(ChevronRightIcon, {
153
+ /* @__PURE__ */ jsx(Icon, {
154
+ as: ChevronRightIcon,
153
155
  "aria-hidden": true,
154
156
  className: CHEVRON_BY_MODE[mode]
155
157
  })
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Tooltip","Popover"],"sources":["../../../src/patterns/NavRail/NavRail.tsx"],"sourcesContent":["import { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n//\n// HEIGHT: the rail hugs its content (`self-start`, so a taller flex parent won't\n// stretch it). For a full-height app-shell rail, pass an explicit height —\n// e.g. `className=\"h-full\"`.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-primary-txt outline-none transition-colors hover:bg-primary-txt/10 focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-full px-3\",\n expanded: \"w-full justify-start gap-3 rounded-full px-3\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-full px-3\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-txt\",\n text: \"ml-auto size-4 shrink-0 text-muted-txt\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-txt\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-txt opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-2 self-start overflow-hidden rounded-16 bg-glass-60-bg p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-primary-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full shrink-0 items-center rounded-full\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-txt\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <ChevronRightIcon aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-45 flex-col gap-0.5 rounded-16 border border-primary-border bg-glass-60-bg p-1.5 text-primary-txt shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-8 px-3 py-2 text-left text-sm text-primary-txt outline-none transition-colors\",\n \"hover:bg-primary-txt/10 focus-visible:bg-primary-txt/10\",\n \"data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":";;;;;;;;AA4BA,MAAM,iBAAiB,MAAM,cAA2B,MAAM;AAE9D,MAAM,eAA4C;CAChD,MAAM;CACN,MAAM;CACN,UAAU;CACV,mBAAmB;AACrB;AAEA,MAAM,YACJ;AAEF,MAAM,eAA4C;CAChD,MAAM;CACN,MAAM;CACN,UAAU;CACV,mBAAmB;AACrB;AAEA,MAAM,eAA4C;CAChD,MAAM;CACN,MAAM;CACN,UAAU;CACV,mBAAmB;AACrB;AAEA,MAAM,YAAY;AAClB,MAAM,gBAA6C;CACjD,MAAM;CACN,MAAM;CACN,UAAU;CAEV,mBAAmB,GACjB,WACA,4EACF;AACF;AAEA,MAAM,kBAA+C;CAEnD,MAAM;CACN,MAAM;CACN,UAAU;CACV,mBACE;AACJ;;AAGA,SAAS,QAAQ,EACf,OAAO,QACP,WACA,GAAG,SAIF;CACD,OACE,oBAAC,eAAe,UAAhB;EAAyB,OAAO;YAC9B,oBAAC,OAAD;GACE,aAAU;GACV,aAAW;GACX,WAAW,GACT,mHACA,aAAa,OACb,SACF;GACA,GAAI;EACL,CAAA;CACsB,CAAA;AAE7B;;AAGA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,oBAAC,OAAD;EACE,aAAU;EACV,MAAK;EACL,WAAW,GAAG,wDAAwD,SAAS;EAC/E,GAAI;CACL,CAAA;AAEL;;AAcA,SAAS,YAAY,EACnB,OACA,QACA,UAAU,OACV,cAAc,SACd,WACA,UACA,GAAG,SACgB;CACnB,MAAM,OAAO,MAAM,WAAW,cAAc;CAC5C,MAAM,SAAS;EACb,aAAa;EACb,eAAe,UAAU,KAAA;EACzB,cAAc;EACd,gBAAgB,SAAU,SAAmB,KAAA;EAC7C,WAAW,GAAG,WAAW,aAAa,OAAO,SAAS;EACtD,GAAG;CACL;CACA,MAAM,UACJ,oBAAC,QAAD;EAAM,aAAU;EAAsB,WAAW,cAAc;YAC5D;CACG,CAAA;CAGR,MAAM,KAAK,UACT,qBAAC,KAAK,MAAN;EAAW,GAAI;YAAf,CACE,oBAAC,KAAK,WAAN,EAAiB,SAAyB,CAAA,GACzC,OACQ;MAEX,qBAAC,UAAD;EAAQ,MAAK;EAAS,GAAI;YAA1B,CACE,oBAAC,QAAD;GAAM,aAAU;GAAqB,WAAW,aAAa;GAC1D;EACG,CAAA,GACL,OACK;;CAGV,IAAI,SAAS,QAAQ,OAAO;CAC5B,OACE,qBAACA,WAAD,EAAA,UAAA,CACE,oBAAC,gBAAD;EAAgB,SAAA;YAAS;CAAmB,CAAA,GAC5C,oBAAC,gBAAD;EAAgB,MAAM;YAAc;CAAsB,CAAA,CACnD,EAAA,CAAA;AAEb;;AAcA,SAAS,YAAY,EAAE,QAAQ,MAAM,OAAO,WAAW,GAAG,SAA2B;CACnF,MAAM,OAAO,MAAM,WAAW,cAAc;CAC5C,MAAM,gBAAgB,SAAS;CAC/B,OACE,qBAAC,OAAD;EACE,aAAU;EACV,WAAW,GAAG,+DAA+D,SAAS;EACtF,GAAI;YAHN,CAOE,oBAAC,QAAD;GACE,aAAU;GACV,WAAU;aAET;EACG,CAAA,GACN,qBAAC,OAAD;GACE,aAAU;GACV,WAAW,GACT,uEACA,iBAAiB,WACjB,SAAS,qBACP,4EACJ;aAPF,CASE,oBAAC,QAAD;IAAM,WAAU;cAAgC;GAAW,CAAA,GAC3D,oBAAC,QAAD;IAAM,WAAU;cAAmC;GAAY,CAAA,CAC5D;IACF;;AAET;;AAKA,SAAS,YAAY,OAA6C;CAChE,OAAO,oBAACC,WAAD,EAAS,GAAI,MAAQ,CAAA;AAC9B;;AAUA,SAAS,mBAAmB,EAC1B,OACA,QACA,WACA,UACA,GAAG,SACuB;CAC1B,MAAM,OAAO,MAAM,WAAW,cAAc;CAC5C,OACE,oBAAC,gBAAD;EAAgB,SAAA;YACd,qBAAC,UAAD;GACE,MAAK;GACL,aAAU;GACV,eAAa,UAAU,KAAA;GACvB,cAAY;GACZ,WAAW,GAAG,WAAW,aAAa,OAAO,SAAS;GACtD,GAAI;aANN;IAQE,oBAAC,QAAD;KAAM,aAAU;KAAqB,WAAW,aAAa;KAC1D;IACG,CAAA;IACN,oBAAC,QAAD;KAAM,aAAU;KAAsB,WAAW,cAAc;eAC5D;IACG,CAAA;IACN,oBAAC,kBAAD;KAAkB,eAAA;KAAY,WAAW,gBAAgB;IAAQ,CAAA;GAC3D;;CACM,CAAA;AAEpB;;AAGA,SAAS,mBAAmB,EAC1B,WACA,OAAO,SACP,QAAQ,SACR,aAAa,GACb,GAAG,SAC2C;CAC9C,OACE,oBAAC,gBAAD;EACE,aAAU;EACJ;EACC;EACK;EAGZ,WAAW,GACT,0IACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAUA,SAAS,gBAAgB,EAAE,WAAW,QAAQ,UAAU,OAAO,GAAG,SAA+B;CAE/F,OACE,oBAFW,UAAU,KAAK,OAAO,UAEjC;EACE,aAAU;EACV,eAAa,UAAU,KAAA;EACvB,gBAAc,SAAS,SAAS,KAAA;EAChC,WAAW,GACT,yIACA,2DACA,mJACA,qFACA,SACF;EACA,GAAK,UAAU,CAAC,IAAI,EAAE,MAAM,SAAkB;EAC9C,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"index.js","names":["Tooltip","Popover"],"sources":["../../../src/patterns/NavRail/NavRail.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { ChevronRightIcon } from \"lucide-react\";\nimport { Slot } from \"radix-ui\";\nimport * as React from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"@/primitives/Popover\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"@/primitives/Tooltip\";\nimport { cn } from \"@/utils\";\n\n// NavRail — a vertical navigation rail (the app's side nav). Four display modes:\n// icon-only (tooltips), text-only, expanded (icon + text), and expand-on-hover\n// (icon-only that widens to reveal labels on hover). Items can open a flyout\n// submenu (NavRailMenu) and the rail can show a user footer (NavRailUser).\n//\n// All items share a constant height (h-10) with the icon pinned to the left, so\n// expanding the rail just REVEALS the labels to the right — the icon never moves\n// and the row height never changes.\n//\n// LAYOUT NOTE: `expand-on-hover` changes the rail's width. To make the content\n// give up space as the rail expands (rather than overlap it), put the rail in a\n// flex row as a `shrink-0` child (it keeps its own w-14/w-56 width) next to a\n// `flex-1 min-w-0` content column — the column shrinks as the rail widens.\n//\n// HEIGHT: the rail hugs its content (`self-start`, so a taller flex parent won't\n// stretch it). For a full-height app-shell rail, pass an explicit height —\n// e.g. `className=\"h-full\"`.\n\ntype NavRailMode = \"icon\" | \"text\" | \"expanded\" | \"expand-on-hover\";\n\nconst NavRailContext = React.createContext<NavRailMode>(\"icon\");\n\nconst RAIL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-14 items-center\",\n text: \"w-56 items-stretch\",\n expanded: \"w-56 items-stretch\",\n \"expand-on-hover\": \"w-14 items-stretch transition-[width] duration-200 ease-out hover:w-56\",\n};\n\nconst ITEM_BASE =\n \"relative flex h-10 cursor-pointer items-center text-primary-txt outline-none transition-colors hover:bg-primary-txt/10 focus-visible:ring-3 focus-visible:ring-focus disabled:pointer-events-none disabled:opacity-50 data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\";\n\nconst ITEM_BY_MODE: Record<NavRailMode, string> = {\n icon: \"w-10 justify-center rounded-full\",\n text: \"w-full justify-start gap-3 rounded-full px-3\",\n expanded: \"w-full justify-start gap-3 rounded-full px-3\",\n \"expand-on-hover\": \"w-full justify-start gap-3 rounded-full px-3\",\n};\n\nconst ICON_BY_MODE: Record<NavRailMode, string> = {\n icon: \"flex shrink-0 items-center justify-center\",\n text: \"hidden\", // text-only mode hides the icon\n expanded: \"flex shrink-0 items-center justify-center\",\n \"expand-on-hover\": \"flex shrink-0 items-center justify-center\",\n};\n\nconst LABEL_ROW = \"min-w-0 flex-1 truncate text-left text-sm font-medium\";\nconst LABEL_BY_MODE: Record<NavRailMode, string> = {\n icon: \"sr-only\",\n text: LABEL_ROW,\n expanded: LABEL_ROW,\n // Always laid out (so the icon never reflows); revealed via opacity on hover.\n \"expand-on-hover\": cn(\n LABEL_ROW,\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n ),\n};\n\nconst CHEVRON_BY_MODE: Record<NavRailMode, string> = {\n // Vertically centered, overhanging the right edge (clear of the centered icon).\n icon: \"absolute top-1/2 right-[-4px] size-3 -translate-y-1/2 text-muted-txt\",\n text: \"ml-auto size-4 shrink-0 text-muted-txt\",\n expanded: \"ml-auto size-4 shrink-0 text-muted-txt\",\n \"expand-on-hover\":\n \"ml-auto size-4 shrink-0 text-muted-txt opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n};\n\n/** The vertical navigation rail container; sets the display `mode` for all items via context. */\nfunction NavRail({\n mode = \"icon\",\n className,\n ...props\n}: React.ComponentProps<\"nav\"> & {\n /** Display mode for the rail and its items: icon-only (tooltips), text-only, expanded (icon + text), or expand-on-hover. */\n mode?: NavRailMode;\n}) {\n return (\n <NavRailContext.Provider value={mode}>\n <nav\n data-slot=\"nav-rail\"\n data-mode={mode}\n className={cn(\n \"group/nav-rail flex flex-col gap-2 self-start overflow-hidden rounded-16 bg-glass-60-bg p-2 backdrop-blur-glass\",\n RAIL_BY_MODE[mode],\n className,\n )}\n {...props}\n />\n </NavRailContext.Provider>\n );\n}\n\n/** A thin divider between groups of rail items. */\nfunction NavRailSeparator({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"nav-rail-separator\"\n role=\"separator\"\n className={cn(\"my-1 h-px w-6 shrink-0 self-center bg-primary-border\", className)}\n {...props}\n />\n );\n}\n\ntype NavRailItemProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip text (icon mode) + accessible name + inline label (text/expanded). */\n label: string;\n /** Marks the item as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n /** Which side the tooltip opens on in icon mode. */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n};\n\n/** A single navigation entry; an icon (as children) plus a `label`, with a tooltip in icon mode. */\nfunction NavRailItem({\n label,\n active,\n asChild = false,\n tooltipSide = \"right\",\n className,\n children,\n ...props\n}: NavRailItemProps) {\n const mode = React.useContext(NavRailContext);\n const shared = {\n \"data-slot\": \"nav-rail-item\",\n \"data-active\": active || undefined,\n \"aria-label\": label,\n \"aria-current\": active ? (\"page\" as const) : undefined,\n className: cn(ITEM_BASE, ITEM_BY_MODE[mode], className),\n ...props,\n };\n const labelEl = (\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n );\n\n const el = asChild ? (\n <Slot.Root {...shared}>\n <Slot.Slottable>{children}</Slot.Slottable>\n {labelEl}\n </Slot.Root>\n ) : (\n <button type=\"button\" {...shared}>\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n {labelEl}\n </button>\n );\n\n if (mode !== \"icon\") return el;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{el}</TooltipTrigger>\n <TooltipContent side={tooltipSide}>{label}</TooltipContent>\n </Tooltip>\n );\n}\n\n// ── User footer ─────────────────────────────────────────────────────────────\n\ntype NavRailUserProps = React.ComponentProps<\"div\"> & {\n /** The avatar element (e.g. an <Avatar />). */\n avatar: React.ReactNode;\n /** The user's display name (hidden in icon mode). */\n name: React.ReactNode;\n /** The user's secondary line, e.g. email (hidden in icon mode). */\n email: React.ReactNode;\n};\n\n/** The footer slot of the rail showing the signed-in user (avatar + name + email). */\nfunction NavRailUser({ avatar, name, email, className, ...props }: NavRailUserProps) {\n const mode = React.useContext(NavRailContext);\n const detailsHidden = mode === \"icon\";\n return (\n <div\n data-slot=\"nav-rail-user\"\n className={cn(\"mt-auto flex h-12 w-full shrink-0 items-center rounded-full\", className)}\n {...props}\n >\n {/* Fixed w-10 slot centers any avatar on the same axis as the icon column,\n so it never shifts between modes regardless of avatar size. */}\n <span\n data-slot=\"nav-rail-user-avatar\"\n className=\"flex w-10 shrink-0 items-center justify-center\"\n >\n {avatar}\n </span>\n <div\n data-slot=\"nav-rail-user-details\"\n className={cn(\n \"flex min-w-0 flex-1 flex-col justify-center text-left leading-tight\",\n detailsHidden && \"sr-only\",\n mode === \"expand-on-hover\" &&\n \"opacity-0 transition-opacity duration-200 group-hover/nav-rail:opacity-100\",\n )}\n >\n <span className=\"truncate text-sm font-medium\">{name}</span>\n <span className=\"truncate text-xs text-muted-txt\">{email}</span>\n </div>\n </div>\n );\n}\n\n// ── Flyout submenu ──────────────────────────────────────────────────────────\n\n/** Root for a rail item that opens a flyout submenu (wraps Popover). */\nfunction NavRailMenu(props: React.ComponentProps<typeof Popover>) {\n return <Popover {...props} />;\n}\n\ntype NavRailMenuTriggerProps = Omit<React.ComponentProps<\"button\">, \"aria-label\"> & {\n /** Tooltip/accessible name + inline label for the trigger item. */\n label: string;\n /** Marks the trigger as active (current section) styling. */\n active?: boolean;\n};\n\n/** The rail item that opens its flyout submenu; renders a chevron affordance. */\nfunction NavRailMenuTrigger({\n label,\n active,\n className,\n children,\n ...props\n}: NavRailMenuTriggerProps) {\n const mode = React.useContext(NavRailContext);\n return (\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n data-slot=\"nav-rail-menu-trigger\"\n data-active={active || undefined}\n aria-label={label}\n className={cn(ITEM_BASE, ITEM_BY_MODE[mode], className)}\n {...props}\n >\n <span data-slot=\"nav-rail-item-icon\" className={ICON_BY_MODE[mode]}>\n {children}\n </span>\n <span data-slot=\"nav-rail-item-label\" className={LABEL_BY_MODE[mode]}>\n {label}\n </span>\n <Icon as={ChevronRightIcon} aria-hidden className={CHEVRON_BY_MODE[mode]} />\n </button>\n </PopoverTrigger>\n );\n}\n\n/** The glass flyout panel that holds the submenu items (portalled Popover content). */\nfunction NavRailMenuContent({\n className,\n side = \"right\",\n align = \"start\",\n sideOffset = 8,\n ...props\n}: React.ComponentProps<typeof PopoverContent>) {\n return (\n <PopoverContent\n data-slot=\"nav-rail-menu-content\"\n side={side}\n align={align}\n sideOffset={sideOffset}\n // Glass flyout (matches the prototype sub-nav): translucent + blurred,\n // 16px radius, hairline border, soft shadow. Tokens, not prototype code.\n className={cn(\n \"flex w-45 flex-col gap-0.5 rounded-16 border border-primary-border bg-glass-60-bg p-1.5 text-primary-txt shadow-sm backdrop-blur-glass\",\n className,\n )}\n {...props}\n />\n );\n}\n\ntype NavRailMenuItemProps = React.ComponentProps<\"button\"> & {\n /** Marks the entry as the current page (active styling + `aria-current=\"page\"`). */\n active?: boolean;\n /** Render the child element instead of a <button> (e.g. a router link). */\n asChild?: boolean;\n};\n\n/** A single entry inside a NavRail flyout submenu. */\nfunction NavRailMenuItem({ className, active, asChild = false, ...props }: NavRailMenuItemProps) {\n const Comp = asChild ? Slot.Root : \"button\";\n return (\n <Comp\n data-slot=\"nav-rail-menu-item\"\n data-active={active || undefined}\n aria-current={active ? \"page\" : undefined}\n className={cn(\n \"flex w-full cursor-pointer items-center gap-2.5 rounded-8 px-3 py-2 text-left text-sm text-primary-txt outline-none transition-colors\",\n \"hover:bg-primary-txt/10 focus-visible:bg-primary-txt/10\",\n \"data-[active=true]:bg-primary-bg data-[active=true]:font-medium data-[active=true]:text-navbar-active-bg data-[active=true]:hover:bg-primary-bg\",\n \"[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n className,\n )}\n {...(asChild ? {} : { type: \"button\" as const })}\n {...props}\n />\n );\n}\n\nexport {\n NavRail,\n NavRailItem,\n NavRailUser,\n NavRailSeparator,\n NavRailMenu,\n NavRailMenuTrigger,\n NavRailMenuContent,\n NavRailMenuItem,\n type NavRailMode,\n type NavRailItemProps,\n type NavRailUserProps,\n type NavRailMenuTriggerProps,\n type NavRailMenuItemProps,\n};\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import * as react_jsx_runtime132 from "react/jsx-runtime";
1
+ import * as react_jsx_runtime189 from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
 
4
4
  //#region src/patterns/SectionCard/SectionCard.d.ts
@@ -15,7 +15,7 @@ declare function SectionCard({
15
15
  className,
16
16
  children,
17
17
  ...props
18
- }: SectionCardProps): react_jsx_runtime132.JSX.Element;
18
+ }: SectionCardProps): react_jsx_runtime189.JSX.Element;
19
19
  //#endregion
20
20
  export { SectionCard, type SectionCardProps };
21
21
  //# sourceMappingURL=index.d.cts.map
@@ -1,5 +1,5 @@
1
1
  import * as React from "react";
2
- import * as react_jsx_runtime54 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime1 from "react/jsx-runtime";
3
3
 
4
4
  //#region src/patterns/SectionCard/SectionCard.d.ts
5
5
  type SectionCardProps = Omit<React.ComponentProps<"div">, "title"> & {
@@ -15,7 +15,7 @@ declare function SectionCard({
15
15
  className,
16
16
  children,
17
17
  ...props
18
- }: SectionCardProps): react_jsx_runtime54.JSX.Element;
18
+ }: SectionCardProps): react_jsx_runtime1.JSX.Element;
19
19
  //#endregion
20
20
  export { SectionCard, type SectionCardProps };
21
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/patterns/SectionCard/SectionCard.tsx"],"mappings":";;;;KASK,gBAAA,GAAmB,KAAK,KAAA,CAAM;;SAE1B,KAAA,CAAM;EAFV;EAAgB,MAAA,CAAA,EAIV,KAAA,CAAM,SAJI;;;iBAQZ,WAAA,CANM;EAAA,KAAA;EAAA,MAAA;EAAA,SAAA;EAAA,QAAA;EAAA,GAAA;AAAA,CAAA,EAMwD,gBANxD,CAAA,EAMwE,mBAAA,CAAA,GAAA,CAAA,OANxE"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/patterns/SectionCard/SectionCard.tsx"],"mappings":";;;;KASK,gBAAA,GAAmB,KAAK,KAAA,CAAM;;SAE1B,KAAA,CAAM;EAFV;EAAgB,MAAA,CAAA,EAIV,KAAA,CAAM,SAJI;;;iBAQZ,WAAA,CANM;EAAA,KAAA;EAAA,MAAA;EAAA,SAAA;EAAA,QAAA;EAAA,GAAA;AAAA,CAAA,EAMwD,gBANxD,CAAA,EAMwE,kBAAA,CAAA,GAAA,CAAA,OANxE"}
@@ -1,5 +1,5 @@
1
1
  import { n as HeadingProps } from "../../index28.cjs";
2
- import * as react_jsx_runtime123 from "react/jsx-runtime";
2
+ import * as react_jsx_runtime231 from "react/jsx-runtime";
3
3
  import * as React from "react";
4
4
 
5
5
  //#region src/patterns/SectionHeading/SectionHeading.d.ts
@@ -31,7 +31,7 @@ declare function SectionHeading({
31
31
  titleAs,
32
32
  className,
33
33
  ...props
34
- }: SectionHeadingProps): react_jsx_runtime123.JSX.Element;
34
+ }: SectionHeadingProps): react_jsx_runtime231.JSX.Element;
35
35
  //#endregion
36
36
  export { SectionHeading, type SectionHeadingProps };
37
37
  //# sourceMappingURL=index.d.cts.map
@@ -1,6 +1,6 @@
1
1
  import { n as HeadingProps } from "../../index28.js";
2
2
  import * as React from "react";
3
- import * as react_jsx_runtime45 from "react/jsx-runtime";
3
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
4
4
 
5
5
  //#region src/patterns/SectionHeading/SectionHeading.d.ts
6
6
  /** Props for the {@link SectionHeading} pattern. */
@@ -31,7 +31,7 @@ declare function SectionHeading({
31
31
  titleAs,
32
32
  className,
33
33
  ...props
34
- }: SectionHeadingProps): react_jsx_runtime45.JSX.Element;
34
+ }: SectionHeadingProps): react_jsx_runtime0.JSX.Element;
35
35
  //#endregion
36
36
  export { SectionHeading, type SectionHeadingProps };
37
37
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/patterns/SectionHeading/SectionHeading.tsx"],"mappings":";;;;;;KAYK,mBAAA,GAAsB,KAAK,KAAA,CAAM;;EAAjC,KAAA,EAEI,KAAA,CAAM,SAFS;EAAA;UAAQ,CAAM,EAIzB,KAAA,CAAM,SAJmB;;SAE7B,CAAA,EAIG,KAAA,CAAM,SAJH;;OAIH,CAAA,EAAA,QAAM,GAAA,MAAA;;UAQN,CAAM,EAAA,OAAA;EAAW;EAIpB,SAAA,CAAA,EANK,YAMS,CAAA,MAAA,CAAA;EAAA;SACrB,CAAA,EALU,KAAA,CAAM,WAKhB;;;iBADO,cAAA,CAIP;EAAA,KAAA;EAAA,QAAA;EAAA,OAAA;EAAA,KAAA;EAAA,QAAA;EAAA,SAAA;EAAA,OAAA;EAAA,SAAA;EAAA,GAAA;AAAA,CAAA,EAMC,mBAND,CAAA,EAMoB,mBAAA,CAAA,GAAA,CAAA,OANpB"}
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../../../src/patterns/SectionHeading/SectionHeading.tsx"],"mappings":";;;;;;KAYK,mBAAA,GAAsB,KAAK,KAAA,CAAM;;EAAjC,KAAA,EAEI,KAAA,CAAM,SAFS;EAAA;UAAQ,CAAM,EAIzB,KAAA,CAAM,SAJmB;;SAE7B,CAAA,EAIG,KAAA,CAAM,SAJH;;OAIH,CAAA,EAAA,QAAM,GAAA,MAAA;;UAQN,CAAM,EAAA,OAAA;EAAW;EAIpB,SAAA,CAAA,EANK,YAMS,CAAA,MAAA,CAAA;EAAA;SACrB,CAAA,EALU,KAAA,CAAM,WAKhB;;;iBADO,cAAA,CAIP;EAAA,KAAA;EAAA,QAAA;EAAA,OAAA;EAAA,KAAA;EAAA,QAAA;EAAA,SAAA;EAAA,OAAA;EAAA,SAAA;EAAA,GAAA;AAAA,CAAA,EAMC,mBAND,CAAA,EAMoB,kBAAA,CAAA,GAAA,CAAA,OANpB"}
@@ -1,7 +1,7 @@
1
1
  import { a as NavRailMenuContent, c as NavRailMenuTrigger, d as NavRailSeparator, f as NavRailUser, i as NavRailMenu, l as NavRailMenuTriggerProps, n as NavRailItem, o as NavRailMenuItem, p as NavRailUserProps, r as NavRailItemProps, s as NavRailMenuItemProps, t as NavRail, u as NavRailMode } from "../index43.cjs";
2
2
  import { ColumnDef, DataTable, DataTableColumnHeader } from "./DataTable/index.cjs";
3
3
  import { Footer, FooterCenter, FooterEnd, FooterPoweredBy, FooterSeparator, FooterStart } from "./Footer/index.cjs";
4
- import { C as Fetcher, E as ProjectNode, S as ThemeToggle, T as HeaderProps, _ as Header, a as getSessionClaims, b as OrgPill, c as HeaderSelection, d as useHeaderProject, f as GlobalHeaderState, g as ProjectPicker, h as useGlobalHeader, i as SessionClaims, l as UseHeaderProjectResult, m as ToggleProjectDropdownDetail, n as Labels, o as getSessionToken, p as TOGGLE_PROJECT_DROPDOWN_EVENT, r as buildEndpoints, s as isSessionValid, t as DEFAULT_LABELS, u as useHeaderCredits, v as HeaderBar, w as HeaderEndpoints, x as ProfileMenu, y as HeaderLogo } from "../index71.cjs";
4
+ import { C as Fetcher, E as ProjectNode, S as ThemeToggle, T as HeaderProps, _ as Header, a as getSessionClaims, b as OrgPill, c as HeaderSelection, d as useHeaderProject, f as GlobalHeaderState, g as ProjectPicker, h as useGlobalHeader, i as SessionClaims, l as UseHeaderProjectResult, m as ToggleProjectDropdownDetail, n as Labels, o as getSessionToken, p as TOGGLE_PROJECT_DROPDOWN_EVENT, r as buildEndpoints, s as isSessionValid, t as DEFAULT_LABELS, u as useHeaderCredits, v as HeaderBar, w as HeaderEndpoints, x as ProfileMenu, y as HeaderLogo } from "../index72.cjs";
5
5
  import { MediaObject, MediaObjectActions, MediaObjectContent, MediaObjectGroup, MediaObjectGroupProps, MediaObjectIcon, MediaObjectImage, MediaObjectImageProps, MediaObjectProps, MediaObjectText, MediaObjectTitle, MediaObjectTitleProps, mediaObjectGroupVariants } from "./MediaObject/index.cjs";
6
6
  import { SectionCard, SectionCardProps } from "./SectionCard/index.cjs";
7
7
  import { SectionHeading, SectionHeadingProps } from "./SectionHeading/index.cjs";
@@ -1,7 +1,7 @@
1
1
  import { a as NavRailMenuContent, c as NavRailMenuTrigger, d as NavRailSeparator, f as NavRailUser, i as NavRailMenu, l as NavRailMenuTriggerProps, n as NavRailItem, o as NavRailMenuItem, p as NavRailUserProps, r as NavRailItemProps, s as NavRailMenuItemProps, t as NavRail, u as NavRailMode } from "../index43.js";
2
2
  import { ColumnDef, DataTable, DataTableColumnHeader } from "./DataTable/index.js";
3
3
  import { Footer, FooterCenter, FooterEnd, FooterPoweredBy, FooterSeparator, FooterStart } from "./Footer/index.js";
4
- import { C as Fetcher, E as ProjectNode, S as ThemeToggle, T as HeaderProps, _ as Header, a as getSessionClaims, b as OrgPill, c as HeaderSelection, d as useHeaderProject, f as GlobalHeaderState, g as ProjectPicker, h as useGlobalHeader, i as SessionClaims, l as UseHeaderProjectResult, m as ToggleProjectDropdownDetail, n as Labels, o as getSessionToken, p as TOGGLE_PROJECT_DROPDOWN_EVENT, r as buildEndpoints, s as isSessionValid, t as DEFAULT_LABELS, u as useHeaderCredits, v as HeaderBar, w as HeaderEndpoints, x as ProfileMenu, y as HeaderLogo } from "../index71.js";
4
+ import { C as Fetcher, E as ProjectNode, S as ThemeToggle, T as HeaderProps, _ as Header, a as getSessionClaims, b as OrgPill, c as HeaderSelection, d as useHeaderProject, f as GlobalHeaderState, g as ProjectPicker, h as useGlobalHeader, i as SessionClaims, l as UseHeaderProjectResult, m as ToggleProjectDropdownDetail, n as Labels, o as getSessionToken, p as TOGGLE_PROJECT_DROPDOWN_EVENT, r as buildEndpoints, s as isSessionValid, t as DEFAULT_LABELS, u as useHeaderCredits, v as HeaderBar, w as HeaderEndpoints, x as ProfileMenu, y as HeaderLogo } from "../index72.js";
5
5
  import { MediaObject, MediaObjectActions, MediaObjectContent, MediaObjectGroup, MediaObjectGroupProps, MediaObjectIcon, MediaObjectImage, MediaObjectImageProps, MediaObjectProps, MediaObjectText, MediaObjectTitle, MediaObjectTitleProps, mediaObjectGroupVariants } from "./MediaObject/index.js";
6
6
  import { SectionCard, SectionCardProps } from "./SectionCard/index.js";
7
7
  import { SectionHeading, SectionHeadingProps } from "./SectionHeading/index.js";
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
+ const require_Icon = require("../../Icon.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
3
5
  let lucide_react = require("lucide-react");
4
6
  let radix_ui = require("radix-ui");
5
- let react_jsx_runtime = require("react/jsx-runtime");
6
7
  //#region src/primitives/Accordion/Accordion.tsx
7
8
  /** A vertically stacked set of collapsible sections built on Radix Accordion. */
8
9
  function Accordion({ className, variant = "line", ...props }) {
@@ -29,7 +30,10 @@ function AccordionTrigger({ className, children, ...props }) {
29
30
  "data-slot": "accordion-trigger",
30
31
  className: require_cn.cn("flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", "group-data-[variant=bordered]/accordion:px-4", className),
31
32
  ...props,
32
- children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200" })]
33
+ children: [children, /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
34
+ as: lucide_react.ChevronDownIcon,
35
+ className: "pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200"
36
+ })]
33
37
  })
34
38
  });
35
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["AccordionPrimitive","cn","ChevronDownIcon"],"sources":["../../../src/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import { cn } from \"@/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\n\n/** A vertically stacked set of collapsible sections built on Radix Accordion. */\nfunction Accordion({\n className,\n variant = \"line\",\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root> & {\n /** Visual style: `line` (divider rows) or `bordered` (rounded border with inset rows). */\n variant?: \"line\" | \"bordered\";\n}) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n // `bordered` wraps the group in a rounded border; items keep their\n // dividers and triggers/content inset via the group-data selector below.\n className={cn(\n \"group/accordion\",\n variant === \"bordered\" && \"rounded-16 border border-primary-border\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single collapsible section; identified by its required `value`. */\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"border-b border-primary-border group-data-[variant=bordered]/accordion:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The clickable header that toggles its section open or closed. */\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n \"group-data-[variant=bordered]/accordion:px-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\n/** The animated collapsible panel revealed when its section is open. */\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm leading-5\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 pb-4 group-data-[variant=bordered]/accordion:px-4 group-data-[variant=bordered]/accordion:pt-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;AAKA,SAAS,UAAU,EACjB,WACA,UAAU,QACV,GAAG,SAIF;CACD,OACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,UAAmB,MAApB;EACE,aAAU;EACV,gBAAc;EAGd,WAAWC,WAAAA,GACT,mBACA,YAAY,cAAc,2CAC1B,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,UAAmB,MAApB;EACE,aAAU;EACV,WAAWC,WAAAA,GACT,0FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,UAAmB,QAApB;EAA2B,WAAU;YACnC,iBAAA,GAAA,kBAAA,MAACA,SAAAA,UAAmB,SAApB;GACE,aAAU;GACV,WAAWC,WAAAA,GACT,ySACA,gDACA,SACF;GACA,GAAI;aAPN,CASG,UACD,iBAAA,GAAA,kBAAA,KAACC,aAAAA,iBAAD,EAAiB,WAAU,uFAAwF,CAAA,CACzF;;CACH,CAAA;AAE/B;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,iBAAA,GAAA,kBAAA,KAACF,SAAAA,UAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;GACE,WAAWC,WAAAA,GACT,uGACA,SACF;GAEC;EACE,CAAA;CACqB,CAAA;AAEhC"}
1
+ {"version":3,"file":"index.cjs","names":["AccordionPrimitive","cn","Icon","ChevronDownIcon"],"sources":["../../../src/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { cn } from \"@/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\n\n/** A vertically stacked set of collapsible sections built on Radix Accordion. */\nfunction Accordion({\n className,\n variant = \"line\",\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root> & {\n /** Visual style: `line` (divider rows) or `bordered` (rounded border with inset rows). */\n variant?: \"line\" | \"bordered\";\n}) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n // `bordered` wraps the group in a rounded border; items keep their\n // dividers and triggers/content inset via the group-data selector below.\n className={cn(\n \"group/accordion\",\n variant === \"bordered\" && \"rounded-16 border border-primary-border\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single collapsible section; identified by its required `value`. */\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"border-b border-primary-border group-data-[variant=bordered]/accordion:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The clickable header that toggles its section open or closed. */\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n \"group-data-[variant=bordered]/accordion:px-4\",\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n as={ChevronDownIcon}\n className=\"pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\n/** The animated collapsible panel revealed when its section is open. */\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm leading-5\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 pb-4 group-data-[variant=bordered]/accordion:px-4 group-data-[variant=bordered]/accordion:pt-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;;AAMA,SAAS,UAAU,EACjB,WACA,UAAU,QACV,GAAG,SAIF;CACD,OACE,iBAAA,GAAA,kBAAA,KAACA,SAAAA,UAAmB,MAApB;EACE,aAAU;EACV,gBAAc;EAGd,WAAWC,WAAAA,GACT,mBACA,YAAY,cAAc,2CAC1B,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,UAAmB,MAApB;EACE,aAAU;EACV,WAAWC,WAAAA,GACT,0FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,iBAAA,GAAA,kBAAA,KAACD,SAAAA,UAAmB,QAApB;EAA2B,WAAU;YACnC,iBAAA,GAAA,kBAAA,MAACA,SAAAA,UAAmB,SAApB;GACE,aAAU;GACV,WAAWC,WAAAA,GACT,ySACA,gDACA,SACF;GACA,GAAI;aAPN,CASG,UACD,iBAAA,GAAA,kBAAA,KAACC,aAAAA,MAAD;IACE,IAAIC,aAAAA;IACJ,WAAU;GACX,CAAA,CACyB;;CACH,CAAA;AAE/B;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,iBAAA,GAAA,kBAAA,KAACH,SAAAA,UAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;YAEJ,iBAAA,GAAA,kBAAA,KAAC,OAAD;GACE,WAAWC,WAAAA,GACT,uGACA,SACF;GAEC;EACE,CAAA;CACqB,CAAA;AAEhC"}
@@ -1,7 +1,8 @@
1
1
  import { t as cn } from "../../cn.js";
2
+ import { t as Icon } from "../../Icon.js";
3
+ import { jsx, jsxs } from "react/jsx-runtime";
2
4
  import { ChevronDownIcon } from "lucide-react";
3
5
  import { Accordion as Accordion$1 } from "radix-ui";
4
- import { jsx, jsxs } from "react/jsx-runtime";
5
6
  //#region src/primitives/Accordion/Accordion.tsx
6
7
  /** A vertically stacked set of collapsible sections built on Radix Accordion. */
7
8
  function Accordion({ className, variant = "line", ...props }) {
@@ -28,7 +29,10 @@ function AccordionTrigger({ className, children, ...props }) {
28
29
  "data-slot": "accordion-trigger",
29
30
  className: cn("flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180", "group-data-[variant=bordered]/accordion:px-4", className),
30
31
  ...props,
31
- children: [children, /* @__PURE__ */ jsx(ChevronDownIcon, { className: "pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200" })]
32
+ children: [children, /* @__PURE__ */ jsx(Icon, {
33
+ as: ChevronDownIcon,
34
+ className: "pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200"
35
+ })]
32
36
  })
33
37
  });
34
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["AccordionPrimitive"],"sources":["../../../src/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import { cn } from \"@/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\n\n/** A vertically stacked set of collapsible sections built on Radix Accordion. */\nfunction Accordion({\n className,\n variant = \"line\",\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root> & {\n /** Visual style: `line` (divider rows) or `bordered` (rounded border with inset rows). */\n variant?: \"line\" | \"bordered\";\n}) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n // `bordered` wraps the group in a rounded border; items keep their\n // dividers and triggers/content inset via the group-data selector below.\n className={cn(\n \"group/accordion\",\n variant === \"bordered\" && \"rounded-16 border border-primary-border\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single collapsible section; identified by its required `value`. */\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"border-b border-primary-border group-data-[variant=bordered]/accordion:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The clickable header that toggles its section open or closed. */\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n \"group-data-[variant=bordered]/accordion:px-4\",\n className,\n )}\n {...props}\n >\n {children}\n <ChevronDownIcon className=\"pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200\" />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\n/** The animated collapsible panel revealed when its section is open. */\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm leading-5\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 pb-4 group-data-[variant=bordered]/accordion:px-4 group-data-[variant=bordered]/accordion:pt-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;AAKA,SAAS,UAAU,EACjB,WACA,UAAU,QACV,GAAG,SAIF;CACD,OACE,oBAACA,YAAmB,MAApB;EACE,aAAU;EACV,gBAAc;EAGd,WAAW,GACT,mBACA,YAAY,cAAc,2CAC1B,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,oBAACA,YAAmB,MAApB;EACE,aAAU;EACV,WAAW,GACT,0FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,YAAmB,QAApB;EAA2B,WAAU;YACnC,qBAACA,YAAmB,SAApB;GACE,aAAU;GACV,WAAW,GACT,ySACA,gDACA,SACF;GACA,GAAI;aAPN,CASG,UACD,oBAAC,iBAAD,EAAiB,WAAU,uFAAwF,CAAA,CACzF;;CACH,CAAA;AAE/B;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,YAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;YAEJ,oBAAC,OAAD;GACE,WAAW,GACT,uGACA,SACF;GAEC;EACE,CAAA;CACqB,CAAA;AAEhC"}
1
+ {"version":3,"file":"index.js","names":["AccordionPrimitive"],"sources":["../../../src/primitives/Accordion/Accordion.tsx"],"sourcesContent":["import { Icon } from \"@/primitives/Icon\";\nimport { cn } from \"@/utils\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { Accordion as AccordionPrimitive } from \"radix-ui\";\n\n/** A vertically stacked set of collapsible sections built on Radix Accordion. */\nfunction Accordion({\n className,\n variant = \"line\",\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Root> & {\n /** Visual style: `line` (divider rows) or `bordered` (rounded border with inset rows). */\n variant?: \"line\" | \"bordered\";\n}) {\n return (\n <AccordionPrimitive.Root\n data-slot=\"accordion\"\n data-variant={variant}\n // `bordered` wraps the group in a rounded border; items keep their\n // dividers and triggers/content inset via the group-data selector below.\n className={cn(\n \"group/accordion\",\n variant === \"bordered\" && \"rounded-16 border border-primary-border\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** A single collapsible section; identified by its required `value`. */\nfunction AccordionItem({\n className,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Item>) {\n return (\n <AccordionPrimitive.Item\n data-slot=\"accordion-item\"\n className={cn(\n \"border-b border-primary-border group-data-[variant=bordered]/accordion:last:border-b-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\n/** The clickable header that toggles its section open or closed. */\nfunction AccordionTrigger({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Trigger>) {\n return (\n <AccordionPrimitive.Header className=\"flex\">\n <AccordionPrimitive.Trigger\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex flex-1 items-center justify-between gap-4 rounded-8 py-4 text-left text-sm leading-5 font-medium text-primary-txt transition-all outline-none hover:underline focus-visible:ring-focus focus-visible:ring-3 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180\",\n \"group-data-[variant=bordered]/accordion:px-4\",\n className,\n )}\n {...props}\n >\n {children}\n <Icon\n as={ChevronDownIcon}\n className=\"pointer-events-none size-4 shrink-0 text-muted-txt transition-transform duration-200\"\n />\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n}\n\n/** The animated collapsible panel revealed when its section is open. */\nfunction AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<typeof AccordionPrimitive.Content>) {\n return (\n <AccordionPrimitive.Content\n data-slot=\"accordion-content\"\n className=\"data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm leading-5\"\n {...props}\n >\n <div\n className={cn(\n \"pt-0 pb-4 group-data-[variant=bordered]/accordion:px-4 group-data-[variant=bordered]/accordion:pt-4\",\n className,\n )}\n >\n {children}\n </div>\n </AccordionPrimitive.Content>\n );\n}\n\nexport { Accordion, AccordionItem, AccordionTrigger, AccordionContent };\n"],"mappings":";;;;;;;AAMA,SAAS,UAAU,EACjB,WACA,UAAU,QACV,GAAG,SAIF;CACD,OACE,oBAACA,YAAmB,MAApB;EACE,aAAU;EACV,gBAAc;EAGd,WAAW,GACT,mBACA,YAAY,cAAc,2CAC1B,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,cAAc,EACrB,WACA,GAAG,SACoD;CACvD,OACE,oBAACA,YAAmB,MAApB;EACE,aAAU;EACV,WAAW,GACT,0FACA,SACF;EACA,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,YAAmB,QAApB;EAA2B,WAAU;YACnC,qBAACA,YAAmB,SAApB;GACE,aAAU;GACV,WAAW,GACT,ySACA,gDACA,SACF;GACA,GAAI;aAPN,CASG,UACD,oBAAC,MAAD;IACE,IAAI;IACJ,WAAU;GACX,CAAA,CACyB;;CACH,CAAA;AAE/B;;AAGA,SAAS,iBAAiB,EACxB,WACA,UACA,GAAG,SACuD;CAC1D,OACE,oBAACA,YAAmB,SAApB;EACE,aAAU;EACV,WAAU;EACV,GAAI;YAEJ,oBAAC,OAAD;GACE,WAAW,GACT,uGACA,SACF;GAEC;EACE,CAAA;CACqB,CAAA;AAEhC"}
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
+ let class_variance_authority = require("class-variance-authority");
3
4
  let react_jsx_runtime = require("react/jsx-runtime");
4
5
  //#region src/primitives/Alert/Alert.tsx
5
- const alertVariants = (0, require("class-variance-authority").cva)(require_cn.cn("relative flex w-full items-start gap-3 rounded-8 border border-primary-border px-4 py-3 text-sm leading-5", "[&>svg]:order-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:translate-y-0.5 [&>svg]:text-current", "data-[flip-icon=true]:[&>svg]:order-3"), {
6
+ const alertVariants = (0, class_variance_authority.cva)(require_cn.cn("relative flex w-full items-start gap-3 rounded-8 border border-primary-border px-4 py-3 text-sm leading-5", "[&>svg]:order-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:translate-y-0.5 [&>svg]:text-current", "data-[flip-icon=true]:[&>svg]:order-3"), {
6
7
  variants: { variant: {
7
8
  default: "bg-glass-none-bg text-primary-txt",
8
9
  destructive: "text-danger-txt bg-glass-none-bg [&_[data-slot=alert-description]]:text-danger-txt"
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["cn"],"sources":["../../../src/primitives/Alert/Alert.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\nconst alertVariants = cva(\n cn(\n \"relative flex w-full items-start gap-3 rounded-8 border border-primary-border px-4 py-3 text-sm leading-5\",\n // Figma wraps the icon in a pt-0.5 aligner so it sits on the first text line.\n \"[&>svg]:order-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n // `flipIcon` moves the icon to the trailing edge (Figma \"Flip Icon\").\n \"data-[flip-icon=true]:[&>svg]:order-3\",\n ),\n {\n variants: {\n variant: {\n default: \"bg-glass-none-bg text-primary-txt\",\n destructive:\n \"text-danger-txt bg-glass-none-bg [&_[data-slot=alert-description]]:text-danger-txt\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n/** Callout banner for surfacing contextual messages, statuses, and errors. */\nfunction Alert({\n className,\n variant,\n flipIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof alertVariants> & {\n /** Visual tone of the alert. */\n variant?: VariantProps<typeof alertVariants>[\"variant\"];\n /** Moves the leading icon to the trailing edge (Figma \"Flip Icon\"). */\n flipIcon?: boolean;\n }) {\n return (\n <div\n data-slot=\"alert\"\n data-flip-icon={flipIcon}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\n/** Wraps the title + description so the icon and action can sit beside them. */\nfunction AlertContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-content\"\n className={cn(\"order-2 flex min-w-0 flex-1 flex-col gap-0.5\", className)}\n {...props}\n />\n );\n}\n\n/** Primary heading line of the alert. */\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"h5\">) {\n return (\n <h5\n data-slot=\"alert-title\"\n className={cn(\"min-h-4 font-medium tracking-tight\", className)}\n {...props}\n />\n );\n}\n\n/** Secondary supporting text shown beneath the title. */\nfunction AlertDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"text-muted-txt text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n );\n}\n\n/** Trailing action slot (Figma \"Show Button\"); always sits at the trailing edge. */\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"order-4 flex shrink-0 items-center self-center\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertContent, AlertAction };\n"],"mappings":";;;;AAKA,MAAM,iBAAA,qCAAA,EAAA,KACJA,WAAAA,GACE,6GAEA,gGAEA,uCACF,GACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;CACJ,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;;AAGA,SAAS,MAAM,EACb,WACA,SACA,WAAW,OACX,GAAG,SAOA;CACH,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,kBAAgB;EAChB,MAAK;EACL,WAAWA,WAAAA,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAqC;CACvE,OACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,sCAAsC,SAAS;EAC7D,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,kDAAkD,SAAS;EACzE,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"index.cjs","names":["cn"],"sources":["../../../src/primitives/Alert/Alert.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport type * as React from \"react\";\n\nimport { cn } from \"../../utils\";\n\nconst alertVariants = cva(\n cn(\n \"relative flex w-full items-start gap-3 rounded-8 border border-primary-border px-4 py-3 text-sm leading-5\",\n // Figma wraps the icon in a pt-0.5 aligner so it sits on the first text line.\n \"[&>svg]:order-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:translate-y-0.5 [&>svg]:text-current\",\n // `flipIcon` moves the icon to the trailing edge (Figma \"Flip Icon\").\n \"data-[flip-icon=true]:[&>svg]:order-3\",\n ),\n {\n variants: {\n variant: {\n default: \"bg-glass-none-bg text-primary-txt\",\n destructive:\n \"text-danger-txt bg-glass-none-bg [&_[data-slot=alert-description]]:text-danger-txt\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\n/** Callout banner for surfacing contextual messages, statuses, and errors. */\nfunction Alert({\n className,\n variant,\n flipIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> &\n VariantProps<typeof alertVariants> & {\n /** Visual tone of the alert. */\n variant?: VariantProps<typeof alertVariants>[\"variant\"];\n /** Moves the leading icon to the trailing edge (Figma \"Flip Icon\"). */\n flipIcon?: boolean;\n }) {\n return (\n <div\n data-slot=\"alert\"\n data-flip-icon={flipIcon}\n role=\"alert\"\n className={cn(alertVariants({ variant }), className)}\n {...props}\n />\n );\n}\n\n/** Wraps the title + description so the icon and action can sit beside them. */\nfunction AlertContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-content\"\n className={cn(\"order-2 flex min-w-0 flex-1 flex-col gap-0.5\", className)}\n {...props}\n />\n );\n}\n\n/** Primary heading line of the alert. */\nfunction AlertTitle({ className, ...props }: React.ComponentProps<\"h5\">) {\n return (\n <h5\n data-slot=\"alert-title\"\n className={cn(\"min-h-4 font-medium tracking-tight\", className)}\n {...props}\n />\n );\n}\n\n/** Secondary supporting text shown beneath the title. */\nfunction AlertDescription({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(\"text-muted-txt text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n );\n}\n\n/** Trailing action slot (Figma \"Show Button\"); always sits at the trailing edge. */\nfunction AlertAction({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-action\"\n className={cn(\"order-4 flex shrink-0 items-center self-center\", className)}\n {...props}\n />\n );\n}\n\nexport { Alert, AlertTitle, AlertDescription, AlertContent, AlertAction };\n"],"mappings":";;;;;AAKA,MAAM,iBAAA,GAAA,yBAAA,KACJA,WAAAA,GACE,6GAEA,gGAEA,uCACF,GACA;CACE,UAAU,EACR,SAAS;EACP,SAAS;EACT,aACE;CACJ,EACF;CACA,iBAAiB,EACf,SAAS,UACX;AACF,CACF;;AAGA,SAAS,MAAM,EACb,WACA,SACA,WAAW,OACX,GAAG,SAOA;CACH,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,kBAAgB;EAChB,MAAK;EACL,WAAWA,WAAAA,GAAG,cAAc,EAAE,QAAQ,CAAC,GAAG,SAAS;EACnD,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,aAAa,EAAE,WAAW,GAAG,SAAsC;CAC1E,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,WAAW,EAAE,WAAW,GAAG,SAAqC;CACvE,OACE,iBAAA,GAAA,kBAAA,KAAC,MAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,sCAAsC,SAAS;EAC7D,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,iBAAiB,EAAE,WAAW,GAAG,SAAsC;CAC9E,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,gDAAgD,SAAS;EACvE,GAAI;CACL,CAAA;AAEL;;AAGA,SAAS,YAAY,EAAE,WAAW,GAAG,SAAsC;CACzE,OACE,iBAAA,GAAA,kBAAA,KAAC,OAAD;EACE,aAAU;EACV,WAAWA,WAAAA,GAAG,kDAAkD,SAAS;EACzE,GAAI;CACL,CAAA;AAEL"}
@@ -1,6 +1,6 @@
1
1
  import { t as cn } from "../../cn.js";
2
- import { jsx } from "react/jsx-runtime";
3
2
  import { cva } from "class-variance-authority";
3
+ import { jsx } from "react/jsx-runtime";
4
4
  //#region src/primitives/Alert/Alert.tsx
5
5
  const alertVariants = cva(cn("relative flex w-full items-start gap-3 rounded-8 border border-primary-border px-4 py-3 text-sm leading-5", "[&>svg]:order-1 [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:translate-y-0.5 [&>svg]:text-current", "data-[flip-icon=true]:[&>svg]:order-3"), {
6
6
  variants: { variant: {
@@ -1,8 +1,8 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
3
  const require_primitives_Button_index = require("../Button/index.cjs");
4
- let radix_ui = require("radix-ui");
5
4
  let react_jsx_runtime = require("react/jsx-runtime");
5
+ let radix_ui = require("radix-ui");
6
6
  //#region src/primitives/AlertDialog/AlertDialog.tsx
7
7
  /** A modal confirmation dialog that interrupts the user and expects a deliberate response. */
8
8
  function AlertDialog({ ...props }) {
@@ -1,7 +1,7 @@
1
1
  import { t as cn } from "../../cn.js";
2
2
  import { buttonVariants } from "../Button/index.js";
3
- import { AlertDialog as AlertDialog$1 } from "radix-ui";
4
3
  import { jsx, jsxs } from "react/jsx-runtime";
4
+ import { AlertDialog as AlertDialog$1 } from "radix-ui";
5
5
  //#region src/primitives/AlertDialog/AlertDialog.tsx
6
6
  /** A modal confirmation dialog that interrupts the user and expects a deliberate response. */
7
7
  function AlertDialog({ ...props }) {
@@ -1,6 +1,6 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- let radix_ui = require("radix-ui");
3
2
  let react_jsx_runtime = require("react/jsx-runtime");
3
+ let radix_ui = require("radix-ui");
4
4
  //#region src/primitives/AspectRatio/AspectRatio.tsx
5
5
  /** Constrains its children to a fixed width-to-height `ratio` (e.g. media, thumbnails, embeds). */
6
6
  function AspectRatio({ ...props }) {
@@ -1,5 +1,5 @@
1
- import { AspectRatio as AspectRatio$1 } from "radix-ui";
2
1
  import { jsx } from "react/jsx-runtime";
2
+ import { AspectRatio as AspectRatio$1 } from "radix-ui";
3
3
  //#region src/primitives/AspectRatio/AspectRatio.tsx
4
4
  /** Constrains its children to a fixed width-to-height `ratio` (e.g. media, thumbnails, embeds). */
5
5
  function AspectRatio({ ...props }) {
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
- let radix_ui = require("radix-ui");
4
3
  let react_jsx_runtime = require("react/jsx-runtime");
4
+ let radix_ui = require("radix-ui");
5
5
  //#region src/primitives/Avatar/Avatar.tsx
6
6
  /** Root avatar container — sizes/shapes the image+fallback and exposes data attrs for descendants. */
7
7
  function Avatar({ className, size = "default", shape = "round", ...props }) {
@@ -1,6 +1,6 @@
1
1
  import { t as cn } from "../../cn.js";
2
- import { Avatar as Avatar$1 } from "radix-ui";
3
2
  import { jsx } from "react/jsx-runtime";
3
+ import { Avatar as Avatar$1 } from "radix-ui";
4
4
  //#region src/primitives/Avatar/Avatar.tsx
5
5
  /** Root avatar container — sizes/shapes the image+fallback and exposes data attrs for descendants. */
6
6
  function Avatar({ className, size = "default", shape = "round", ...props }) {
@@ -1,9 +1,10 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
- let radix_ui = require("radix-ui");
3
+ let class_variance_authority = require("class-variance-authority");
4
4
  let react_jsx_runtime = require("react/jsx-runtime");
5
+ let radix_ui = require("radix-ui");
5
6
  //#region src/primitives/Badge/Badge.tsx
6
- const badgeVariants = (0, require("class-variance-authority").cva)("inline-flex items-center justify-center border px-2 py-0.5 text-xs leading-4 font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-focus focus-visible:ring-3 aria-invalid:ring-focus-error aria-invalid:border-danger-border transition-[color,box-shadow] overflow-hidden", {
7
+ const badgeVariants = (0, class_variance_authority.cva)("inline-flex items-center justify-center border px-2 py-0.5 text-xs leading-4 font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-focus focus-visible:ring-3 aria-invalid:ring-focus-error aria-invalid:border-danger-border transition-[color,box-shadow] overflow-hidden", {
7
8
  variants: {
8
9
  variant: {
9
10
  default: "border-transparent bg-primary-invert-bg text-primary-invert-txt [a&]:hover:bg-primary-invert-hover-bg",
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["Slot","cn"],"sources":["../../../src/primitives/Badge/Badge.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils/index\";\n\n/* Figma: PS AI Helix – Core → Badge (19:6979). 20px pill: mini/bold type\n (12/16 Semibold), px-2 py-0.5, status variants on the *-bg/*-txt pairs. */\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center border px-2 py-0.5 text-xs leading-4 font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-focus focus-visible:ring-3 aria-invalid:ring-focus-error aria-invalid:border-danger-border transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary-invert-bg text-primary-invert-txt [a&]:hover:bg-primary-invert-hover-bg\",\n secondary:\n \"border-transparent bg-secondary-bg text-secondary-txt [a&]:hover:bg-secondary-bg/80\",\n destructive:\n \"border-transparent bg-danger-bg text-danger-txt [a&]:hover:brightness-95 focus-visible:ring-focus-error\",\n outline:\n \"border-primary-border bg-outline-bg text-primary-txt [a&]:hover:bg-ghost-hover-bg\",\n ghost: \"border-transparent bg-ghost-bg text-primary-txt [a&]:hover:bg-ghost-hover-bg\",\n success: \"border-transparent bg-success-bg text-success-txt [a&]:hover:brightness-95\",\n warning: \"border-transparent bg-warning-bg text-warning-txt [a&]:hover:brightness-95\",\n info: \"border-transparent bg-info-bg text-info-txt [a&]:hover:brightness-95\",\n // AI affordance: gradient ring, brand-colored label (Figma binds\n // brand/500-primary here).\n ai: \"ai-border text-brand-500-primary\",\n },\n shape: {\n default: \"rounded-8\",\n round: \"rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n shape: \"default\",\n },\n },\n);\n\n/** A compact label for status, counts, or metadata. Renders a `span` by default. */\nfunction Badge({\n className,\n /** Visual style — solid (`default`/`secondary`), `outline`/`ghost`, a soft semantic tint (`destructive`/`success`/`warning`/`info`), or the `ai` gradient ring. */\n variant = \"default\",\n /** Corner radius — `default` is 8px, `round` is a full pill. */\n shape = \"default\",\n /** Render the child element instead of a `span` (Radix `Slot`), e.g. to make a link badge. */\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant, shape }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"mappings":";;;;;AAQA,MAAM,iBAAA,qCAAA,EAAA,KACJ,4UACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,WACE;GACF,aACE;GACF,SACE;GACF,OAAO;GACP,SAAS;GACT,SAAS;GACT,MAAM;GAGN,IAAI;EACN;EACA,OAAO;GACL,SAAS;GACT,OAAO;EACT;CACF;CACA,iBAAiB;EACf,SAAS;EACT,OAAO;CACT;AACF,CACF;;AAGA,SAAS,MAAM,EACb,WAEA,UAAU,WAEV,QAAQ,WAER,UAAU,OACV,GAAG,SACyF;CAG5F,OACE,iBAAA,GAAA,kBAAA,KAHW,UAAUA,SAAAA,KAAK,OAAO,QAGjC;EACE,aAAU;EACV,gBAAc;EACd,WAAWC,WAAAA,GAAG,cAAc;GAAE;GAAS;EAAM,CAAC,GAAG,SAAS;EAC1D,GAAI;CACL,CAAA;AAEL"}
1
+ {"version":3,"file":"index.cjs","names":["Slot","cn"],"sources":["../../../src/primitives/Badge/Badge.tsx"],"sourcesContent":["import { type VariantProps, cva } from \"class-variance-authority\";\nimport { Slot } from \"radix-ui\";\nimport type * as React from \"react\";\n\nimport { cn } from \"@/utils/index\";\n\n/* Figma: PS AI Helix – Core → Badge (19:6979). 20px pill: mini/bold type\n (12/16 Semibold), px-2 py-0.5, status variants on the *-bg/*-txt pairs. */\nconst badgeVariants = cva(\n \"inline-flex items-center justify-center border px-2 py-0.5 text-xs leading-4 font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-focus focus-visible:ring-3 aria-invalid:ring-focus-error aria-invalid:border-danger-border transition-[color,box-shadow] overflow-hidden\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary-invert-bg text-primary-invert-txt [a&]:hover:bg-primary-invert-hover-bg\",\n secondary:\n \"border-transparent bg-secondary-bg text-secondary-txt [a&]:hover:bg-secondary-bg/80\",\n destructive:\n \"border-transparent bg-danger-bg text-danger-txt [a&]:hover:brightness-95 focus-visible:ring-focus-error\",\n outline:\n \"border-primary-border bg-outline-bg text-primary-txt [a&]:hover:bg-ghost-hover-bg\",\n ghost: \"border-transparent bg-ghost-bg text-primary-txt [a&]:hover:bg-ghost-hover-bg\",\n success: \"border-transparent bg-success-bg text-success-txt [a&]:hover:brightness-95\",\n warning: \"border-transparent bg-warning-bg text-warning-txt [a&]:hover:brightness-95\",\n info: \"border-transparent bg-info-bg text-info-txt [a&]:hover:brightness-95\",\n // AI affordance: gradient ring, brand-colored label (Figma binds\n // brand/500-primary here).\n ai: \"ai-border text-brand-500-primary\",\n },\n shape: {\n default: \"rounded-8\",\n round: \"rounded-full\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n shape: \"default\",\n },\n },\n);\n\n/** A compact label for status, counts, or metadata. Renders a `span` by default. */\nfunction Badge({\n className,\n /** Visual style — solid (`default`/`secondary`), `outline`/`ghost`, a soft semantic tint (`destructive`/`success`/`warning`/`info`), or the `ai` gradient ring. */\n variant = \"default\",\n /** Corner radius — `default` is 8px, `round` is a full pill. */\n shape = \"default\",\n /** Render the child element instead of a `span` (Radix `Slot`), e.g. to make a link badge. */\n asChild = false,\n ...props\n}: React.ComponentProps<\"span\"> & VariantProps<typeof badgeVariants> & { asChild?: boolean }) {\n const Comp = asChild ? Slot.Root : \"span\";\n\n return (\n <Comp\n data-slot=\"badge\"\n data-variant={variant}\n className={cn(badgeVariants({ variant, shape }), className)}\n {...props}\n />\n );\n}\n\nexport { Badge, badgeVariants };\n"],"mappings":";;;;;;AAQA,MAAM,iBAAA,GAAA,yBAAA,KACJ,4UACA;CACE,UAAU;EACR,SAAS;GACP,SACE;GACF,WACE;GACF,aACE;GACF,SACE;GACF,OAAO;GACP,SAAS;GACT,SAAS;GACT,MAAM;GAGN,IAAI;EACN;EACA,OAAO;GACL,SAAS;GACT,OAAO;EACT;CACF;CACA,iBAAiB;EACf,SAAS;EACT,OAAO;CACT;AACF,CACF;;AAGA,SAAS,MAAM,EACb,WAEA,UAAU,WAEV,QAAQ,WAER,UAAU,OACV,GAAG,SACyF;CAG5F,OACE,iBAAA,GAAA,kBAAA,KAHW,UAAUA,SAAAA,KAAK,OAAO,QAGjC;EACE,aAAU;EACV,gBAAc;EACd,WAAWC,WAAAA,GAAG,cAAc;GAAE;GAAS;EAAM,CAAC,GAAG,SAAS;EAC1D,GAAI;CACL,CAAA;AAEL"}
@@ -1,7 +1,7 @@
1
1
  import { t as cn } from "../../cn.js";
2
- import { Slot } from "radix-ui";
3
- import { jsx } from "react/jsx-runtime";
4
2
  import { cva } from "class-variance-authority";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { Slot } from "radix-ui";
5
5
  //#region src/primitives/Badge/Badge.tsx
6
6
  const badgeVariants = cva("inline-flex items-center justify-center border px-2 py-0.5 text-xs leading-4 font-semibold w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:ring-focus focus-visible:ring-3 aria-invalid:ring-focus-error aria-invalid:border-danger-border transition-[color,box-shadow] overflow-hidden", {
7
7
  variants: {
@@ -1,8 +1,9 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  const require_cn = require("../../cn.cjs");
3
+ const require_Icon = require("../../Icon.cjs");
4
+ let react_jsx_runtime = require("react/jsx-runtime");
3
5
  let lucide_react = require("lucide-react");
4
6
  let radix_ui = require("radix-ui");
5
- let react_jsx_runtime = require("react/jsx-runtime");
6
7
  //#region src/primitives/Breadcrumb/Breadcrumb.tsx
7
8
  /** Navigation landmark that wraps a breadcrumb trail (renders a labelled `<nav>`). */
8
9
  function Breadcrumb({ ...props }) {
@@ -53,7 +54,7 @@ function BreadcrumbSeparator({ children, className, ...props }) {
53
54
  "aria-hidden": "true",
54
55
  className: require_cn.cn("[&>svg]:size-3.5", className),
55
56
  ...props,
56
- children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, {})
57
+ children: children ?? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, { as: lucide_react.ChevronRight })
57
58
  });
58
59
  }
59
60
  /** Collapsed-trail indicator that stands in for omitted middle segments. */
@@ -64,7 +65,10 @@ function BreadcrumbEllipsis({ className, ...props }) {
64
65
  "aria-hidden": "true",
65
66
  className: require_cn.cn("hover:bg-muted-bg hover:text-primary-txt inline-flex size-5 items-center justify-center rounded-4 px-1 py-0.5 transition-colors", className),
66
67
  ...props,
67
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.MoreHorizontal, { className: "size-4" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
68
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_Icon.Icon, {
69
+ as: lucide_react.MoreHorizontal,
70
+ className: "size-4"
71
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
68
72
  className: "sr-only",
69
73
  children: "More"
70
74
  })]