@elabs-ai/components-ui 5.0.0 → 5.1.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 (543) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-E3ES2KR6.js → chunk-2DFB4YTK.js} +5 -5
  3. package/dist/{chunk-6QU7OVFA.js → chunk-2ZMPAD6C.js} +7 -7
  4. package/dist/{chunk-U4LHV5DS.js → chunk-36SY7TID.js} +2 -2
  5. package/dist/{chunk-IHMFEPIT.js → chunk-3BZBNDRP.js} +3 -3
  6. package/dist/{chunk-5AWXGBSH.js → chunk-3DJ4KY3U.js} +3 -3
  7. package/dist/{chunk-T4JNXV75.js → chunk-3EDNWHWD.js} +5 -5
  8. package/dist/{chunk-LR2CU7HK.js → chunk-3ZR5PMKB.js} +2 -2
  9. package/dist/{chunk-QDTGDYMM.js → chunk-47YSHR3H.js} +3 -3
  10. package/dist/{chunk-2HXVFC4B.js → chunk-4B2E4OCZ.js} +2 -2
  11. package/dist/{chunk-3B7W334A.js → chunk-4C4D6T5M.js} +3 -3
  12. package/dist/{chunk-U26XDHMX.js → chunk-4DWIMWR5.js} +4 -4
  13. package/dist/{chunk-H5UA5JW4.js → chunk-4DZGAY6R.js} +2 -2
  14. package/dist/{chunk-YWB7HLL7.js → chunk-4NSCLIES.js} +3 -3
  15. package/dist/{chunk-7P24I5OL.js → chunk-4VCU3GFI.js} +2 -2
  16. package/dist/{chunk-UPEMEBWH.js → chunk-55BM2IU2.js} +5 -5
  17. package/dist/{chunk-5V5J7APL.js → chunk-5C5W52O2.js} +2 -2
  18. package/dist/{chunk-FDPONOOT.js → chunk-5MXQ5CP7.js} +2 -2
  19. package/dist/{chunk-NBMF7SIS.js → chunk-6HTZBBTC.js} +2 -2
  20. package/dist/{chunk-5RC32MZH.js → chunk-72H7HUTH.js} +2 -2
  21. package/dist/{chunk-URVAZW44.js → chunk-7KV7H2TW.js} +2 -2
  22. package/dist/{chunk-VFF3AN4Y.js → chunk-7Z2RAGOA.js} +2 -2
  23. package/dist/{chunk-BM6NGS3A.js → chunk-AE6LFFME.js} +3 -3
  24. package/dist/{chunk-OPMMD25Z.js → chunk-ALNJV4XB.js} +4 -4
  25. package/dist/{chunk-KTH3GWAL.js → chunk-AXHMQOIZ.js} +4 -4
  26. package/dist/{chunk-RNC4M6SG.js → chunk-B3DANITU.js} +3 -3
  27. package/dist/{chunk-MGAXCPT7.js → chunk-B7FAQKHH.js} +2 -2
  28. package/dist/{chunk-BN4CKDFU.js → chunk-BDOG4YSM.js} +22 -22
  29. package/dist/{chunk-6HGS5Z2Z.js → chunk-BRL2HMZJ.js} +3 -3
  30. package/dist/{chunk-EY2PGOG3.js → chunk-BYFRDLDL.js} +3 -3
  31. package/dist/{chunk-LVRULYU4.js → chunk-C2ICCCP5.js} +8 -8
  32. package/dist/{chunk-VA2OONPE.js → chunk-C5QBV5RE.js} +2 -2
  33. package/dist/{chunk-7WXDSTNR.js → chunk-CDMJSXCB.js} +2 -2
  34. package/dist/{chunk-XMZ5LXL4.js → chunk-CEDK5GM2.js} +3 -3
  35. package/dist/{chunk-DFYPQ52O.js → chunk-CEHCVDYR.js} +7 -7
  36. package/dist/{chunk-A47AZPCL.js → chunk-CEQ3YKHR.js} +2 -2
  37. package/dist/{chunk-EHGIW7GA.js → chunk-CMP4F537.js} +2 -2
  38. package/dist/{chunk-YXHHUJOZ.js → chunk-CY5ISPFB.js} +3 -3
  39. package/dist/{chunk-6OFWWIEG.js → chunk-D5INX2EF.js} +3 -3
  40. package/dist/{chunk-3EKVSKGJ.js → chunk-DXC3DTCV.js} +3 -3
  41. package/dist/{chunk-XZ23AFOP.js → chunk-E3GNYOLS.js} +2 -2
  42. package/dist/{chunk-ZNFHDBUW.js → chunk-EBNPVPR7.js} +2 -2
  43. package/dist/{chunk-4PITSMJ3.js → chunk-EJ3XWNY3.js} +2 -2
  44. package/dist/{chunk-333EWYWL.js → chunk-ENL3CCZB.js} +5 -5
  45. package/dist/{chunk-HVFYAQLK.js → chunk-ERTYAID6.js} +4 -4
  46. package/dist/{chunk-B5QQLMEE.js → chunk-FG3PDWE3.js} +2 -2
  47. package/dist/{chunk-7PS5MKVH.js → chunk-FLCQKC64.js} +4 -4
  48. package/dist/{chunk-LMO3QK7Q.js → chunk-FXC64HLD.js} +2 -2
  49. package/dist/{chunk-KBNWM27Q.js → chunk-FXWWDMMP.js} +9 -2
  50. package/dist/chunk-FXWWDMMP.js.map +1 -0
  51. package/dist/{chunk-KUAVM54Y.js → chunk-FZEG2R3E.js} +2 -2
  52. package/dist/{chunk-QGX37P5L.js → chunk-GMXSCEYN.js} +2 -2
  53. package/dist/{chunk-FKUP7QRJ.js → chunk-GTBVTLZJ.js} +2 -2
  54. package/dist/{chunk-4GQFIJAE.js → chunk-GTDCC4YX.js} +2 -2
  55. package/dist/{chunk-XONGYCW3.js → chunk-GWHO5ACE.js} +2 -2
  56. package/dist/{chunk-NTTSHOOK.js → chunk-HF6BGFUV.js} +4 -4
  57. package/dist/{chunk-WTB4DDZP.js → chunk-HHZJALGA.js} +5 -5
  58. package/dist/{chunk-QNEOO22E.js → chunk-HND6FAMX.js} +2 -2
  59. package/dist/{chunk-ECCNRCC4.js → chunk-HNLYRHAU.js} +2 -2
  60. package/dist/{chunk-7G63B2B7.js → chunk-HUIYDDDL.js} +7 -7
  61. package/dist/{chunk-R3SYH7RG.js → chunk-HWVU636Q.js} +15 -10
  62. package/dist/chunk-HWVU636Q.js.map +1 -0
  63. package/dist/{chunk-4E73UAFA.js → chunk-HXQ4MDCH.js} +6 -6
  64. package/dist/{chunk-XYACSO57.js → chunk-I3U52BDH.js} +2 -2
  65. package/dist/{chunk-KZWC6JCI.js → chunk-IE5GWE72.js} +5 -5
  66. package/dist/{chunk-RRZUMIYG.js → chunk-IIY5JRNW.js} +3 -3
  67. package/dist/{chunk-UQHWOPUY.js → chunk-IVEDMK5U.js} +2 -2
  68. package/dist/{chunk-35ZTVB35.js → chunk-JTY3REOB.js} +5 -5
  69. package/dist/{chunk-YIVL6HWS.js → chunk-JVCIAEFT.js} +2 -2
  70. package/dist/{chunk-DUF2VZON.js → chunk-K4V2ELUZ.js} +2 -2
  71. package/dist/{chunk-OBEJUAN6.js → chunk-KBWHHAI3.js} +4 -4
  72. package/dist/{chunk-BPXLHGWI.js → chunk-KK2TIWTF.js} +2 -2
  73. package/dist/{chunk-NRSSSVWB.js → chunk-KPZFLTZ2.js} +2 -2
  74. package/dist/{chunk-OYM3NHSD.js → chunk-KXYL3CUS.js} +2 -2
  75. package/dist/{chunk-KOVHUAHG.js → chunk-L5O2O67Y.js} +6 -6
  76. package/dist/{chunk-3LWAAK3J.js → chunk-L6A3RXCU.js} +5 -5
  77. package/dist/{chunk-RM5JIUVW.js → chunk-LG33MONJ.js} +2 -2
  78. package/dist/{chunk-YACASX6X.js → chunk-LLYLDZXC.js} +2 -2
  79. package/dist/{chunk-RWUKMJYA.js → chunk-LMV225AS.js} +2 -2
  80. package/dist/{chunk-OV4GQOLC.js → chunk-M2KNQZUL.js} +2 -2
  81. package/dist/{chunk-WW3CD7AU.js → chunk-M5WPZXBA.js} +6 -6
  82. package/dist/{chunk-FINAKMC6.js → chunk-MDQYRES4.js} +5 -5
  83. package/dist/{chunk-XAFRTZQF.js → chunk-MJAIURHO.js} +2 -2
  84. package/dist/{chunk-KWQ6HV5Z.js → chunk-MRBDJASL.js} +3 -3
  85. package/dist/{chunk-NJAGSGPF.js → chunk-MY5H6D5Y.js} +3 -3
  86. package/dist/{chunk-J2P4YZLC.js → chunk-NRPZ3BH4.js} +5 -5
  87. package/dist/{chunk-YL7VBHPZ.js → chunk-NXCOVGDU.js} +3 -3
  88. package/dist/{chunk-IGP5E4FC.js → chunk-NZUKZRT7.js} +4 -4
  89. package/dist/{chunk-WX3LWMVU.js → chunk-O6V65J5J.js} +2 -2
  90. package/dist/{chunk-PYPNGKRD.js → chunk-OGTILHKP.js} +4 -4
  91. package/dist/{chunk-UXSV6RVS.js → chunk-OKY7ACZK.js} +2 -2
  92. package/dist/{chunk-ULIDYFM7.js → chunk-OPBSVEMX.js} +2 -2
  93. package/dist/{chunk-K6YRTASS.js → chunk-PGKQZBLZ.js} +2 -2
  94. package/dist/{chunk-57C25JYV.js → chunk-PQZD5W3E.js} +2 -2
  95. package/dist/{chunk-533R5EKD.js → chunk-PSXUEWUS.js} +4 -4
  96. package/dist/{chunk-5Z55AFOW.js → chunk-PT5P4AAU.js} +2 -2
  97. package/dist/{chunk-EL3OXVOW.js → chunk-PUACHQRH.js} +2 -2
  98. package/dist/{chunk-HRYH7XQP.js → chunk-QKZX5HDY.js} +2 -2
  99. package/dist/{chunk-LOSXINSS.js → chunk-QLM3KTAQ.js} +4 -4
  100. package/dist/{chunk-JGS2IHER.js → chunk-R27VUCWR.js} +4 -4
  101. package/dist/{chunk-X6J4KKZZ.js → chunk-RFTC5UVB.js} +4 -4
  102. package/dist/{chunk-LXW3GNF7.js → chunk-RHVYRQN4.js} +6 -6
  103. package/dist/{chunk-VRIAWF3A.js → chunk-RIYDAMSQ.js} +2 -2
  104. package/dist/{chunk-A43B4IT7.js → chunk-RYPK72YP.js} +4 -4
  105. package/dist/{chunk-GRWGNWIJ.js → chunk-SCCBEFVK.js} +6 -6
  106. package/dist/{chunk-PP7POY7C.js → chunk-SEGTBIR4.js} +2 -2
  107. package/dist/{chunk-D3C3VVCX.js → chunk-SGBCLZQF.js} +2 -2
  108. package/dist/{chunk-EKY3A5LO.js → chunk-SLDJYJEG.js} +3 -3
  109. package/dist/{chunk-YPLKH5H4.js → chunk-SSQG36MH.js} +6 -6
  110. package/dist/{chunk-WCCCW4KD.js → chunk-SWQCCR6Q.js} +5 -5
  111. package/dist/{chunk-NQY3QNLR.js → chunk-U5BZXNHW.js} +4 -4
  112. package/dist/{chunk-TEKBTTP2.js → chunk-U756JCDK.js} +2 -2
  113. package/dist/{chunk-W6HCXQBH.js → chunk-UG2T7LMX.js} +4 -4
  114. package/dist/{chunk-JNWXHPZG.js → chunk-UPGIQXUY.js} +2 -2
  115. package/dist/{chunk-QTIKGWU4.js → chunk-UQPW7INX.js} +4 -4
  116. package/dist/{chunk-WZTFU6FJ.js → chunk-UUSOIPM2.js} +2 -2
  117. package/dist/{chunk-FYCCNQXQ.js → chunk-V5QCJHDA.js} +6 -6
  118. package/dist/{chunk-V4DDHF7S.js → chunk-V6U75PIG.js} +3 -3
  119. package/dist/{chunk-ZXBUOHCR.js → chunk-VC4GKLZL.js} +2 -2
  120. package/dist/chunk-VFS52GGI.js +2 -0
  121. package/dist/chunk-VFS52GGI.js.map +1 -0
  122. package/dist/{chunk-DT6RNLCP.js → chunk-W26KFY35.js} +2 -2
  123. package/dist/{chunk-R7DDZIE3.js → chunk-W35X6J5P.js} +3 -3
  124. package/dist/{chunk-ITFDGFOT.js → chunk-W7OIVERI.js} +2 -2
  125. package/dist/chunk-WEEVXQIM.js +45 -0
  126. package/dist/chunk-WEEVXQIM.js.map +1 -0
  127. package/dist/{chunk-IZJOZJDL.js → chunk-WEM6XJ7Z.js} +2 -2
  128. package/dist/{chunk-5HBMI2DO.js → chunk-WKNOKJA3.js} +2 -2
  129. package/dist/{chunk-BLNXHETI.js → chunk-Y33ZFTMR.js} +3 -3
  130. package/dist/{chunk-AXKZBRZK.js → chunk-YA2QGLUL.js} +2 -2
  131. package/dist/{chunk-35DUHYPC.js → chunk-YFGFNFVW.js} +3 -3
  132. package/dist/{chunk-6NKILKS6.js → chunk-YFKKMDJL.js} +2 -2
  133. package/dist/chunk-YHVXYOL6.js +80 -0
  134. package/dist/chunk-YHVXYOL6.js.map +1 -0
  135. package/dist/{chunk-CQ5CH3SB.js → chunk-YUFDC6RW.js} +2 -2
  136. package/dist/{chunk-DCI6IOJX.js → chunk-ZALGMUSW.js} +3 -3
  137. package/dist/{chunk-N44PNGDS.js → chunk-ZFMM2NLA.js} +2 -2
  138. package/dist/{chunk-6OPDRLMU.js → chunk-ZRMF4YAS.js} +7 -7
  139. package/dist/{chunk-TU24Y4HN.js → chunk-ZSYT5H6U.js} +2 -2
  140. package/dist/components/accordion/accordion.js +2 -2
  141. package/dist/components/accordion/index.js +2 -2
  142. package/dist/components/advanced-group/advanced-group.js +4 -4
  143. package/dist/components/advanced-group/index.js +4 -4
  144. package/dist/components/alert/alert.js +2 -2
  145. package/dist/components/alert/index.js +2 -2
  146. package/dist/components/alert-dialog/alert-dialog.js +3 -3
  147. package/dist/components/alert-dialog/index.js +3 -3
  148. package/dist/components/ambient-field/ambient-field.js +2 -2
  149. package/dist/components/ambient-field/index.js +2 -2
  150. package/dist/components/app-shell/app-shell.js +4 -4
  151. package/dist/components/app-shell/index.js +4 -4
  152. package/dist/components/app-sidebar/app-sidebar.js +10 -10
  153. package/dist/components/app-sidebar/index.js +10 -10
  154. package/dist/components/attribution-panel/attribution-panel.js +4 -4
  155. package/dist/components/attribution-panel/index.js +4 -4
  156. package/dist/components/avatar/avatar.js +2 -2
  157. package/dist/components/avatar/index.js +2 -2
  158. package/dist/components/badge/badge.js +2 -2
  159. package/dist/components/badge/index.js +2 -2
  160. package/dist/components/bento-grid/bento-grid.js +3 -3
  161. package/dist/components/bento-grid/index.js +3 -3
  162. package/dist/components/bounded-number/bounded-number.js +7 -7
  163. package/dist/components/bounded-number/index.js +7 -7
  164. package/dist/components/breadcrumb/breadcrumb.js +2 -2
  165. package/dist/components/breadcrumb/index.js +2 -2
  166. package/dist/components/button/button.js +2 -2
  167. package/dist/components/button/index.js +2 -2
  168. package/dist/components/button-group/button-group.js +3 -3
  169. package/dist/components/button-group/index.js +3 -3
  170. package/dist/components/calendar/calendar.js +3 -3
  171. package/dist/components/calendar/index.js +3 -3
  172. package/dist/components/card/card.js +2 -2
  173. package/dist/components/card/index.js +2 -2
  174. package/dist/components/carousel/carousel.js +3 -3
  175. package/dist/components/carousel/index.js +3 -3
  176. package/dist/components/change-review/change-review.js +8 -8
  177. package/dist/components/change-review/index.js +8 -8
  178. package/dist/components/checkbox/checkbox.js +2 -2
  179. package/dist/components/checkbox/index.js +2 -2
  180. package/dist/components/collapsible/collapsible.js +2 -2
  181. package/dist/components/collapsible/index.js +2 -2
  182. package/dist/components/collapsible-panel/index.js +2 -2
  183. package/dist/components/collapsible-panel/use-collapsible-panel.js +2 -2
  184. package/dist/components/color-picker/color-picker.js +3 -3
  185. package/dist/components/color-picker/index.js +3 -3
  186. package/dist/components/combobox/combobox.js +8 -8
  187. package/dist/components/combobox/index.js +8 -8
  188. package/dist/components/command/command.js +5 -5
  189. package/dist/components/command/index.js +5 -5
  190. package/dist/components/command-chip/command-chip.js +3 -3
  191. package/dist/components/command-chip/index.js +3 -3
  192. package/dist/components/command-trigger/command-trigger.js +3 -3
  193. package/dist/components/command-trigger/index.js +3 -3
  194. package/dist/components/confirm-dialog/confirm-dialog.js +5 -5
  195. package/dist/components/confirm-dialog/index.js +5 -5
  196. package/dist/components/context-menu/context-menu.js +2 -2
  197. package/dist/components/context-menu/index.js +2 -2
  198. package/dist/components/context-rail/context-rail.js +12 -12
  199. package/dist/components/context-rail/index.js +12 -12
  200. package/dist/components/copyable-value/copyable-value.js +3 -3
  201. package/dist/components/copyable-value/index.js +3 -3
  202. package/dist/components/date-picker/date-picker.js +5 -5
  203. package/dist/components/date-picker/index.js +5 -5
  204. package/dist/components/date-range-picker/date-range-picker.js +5 -5
  205. package/dist/components/date-range-picker/index.js +5 -5
  206. package/dist/components/descriptions/descriptions.js +2 -2
  207. package/dist/components/descriptions/index.js +2 -2
  208. package/dist/components/dialog/dialog.js +4 -4
  209. package/dist/components/dialog/index.js +4 -4
  210. package/dist/components/drafting-marks/drafting-marks.js +14 -0
  211. package/dist/components/drafting-marks/drafting-marks.js.map +1 -0
  212. package/dist/components/drafting-marks/index.js +15 -0
  213. package/dist/components/drafting-marks/index.js.map +1 -0
  214. package/dist/components/drawer/drawer.js +2 -2
  215. package/dist/components/drawer/index.js +2 -2
  216. package/dist/components/dropdown-menu/dropdown-menu.js +2 -2
  217. package/dist/components/dropdown-menu/index.js +2 -2
  218. package/dist/components/empty-state/empty-state.js +4 -4
  219. package/dist/components/empty-state/index.js +4 -4
  220. package/dist/components/error-state/error-state.js +4 -4
  221. package/dist/components/error-state/index.js +4 -4
  222. package/dist/components/expand-dialog/expand-dialog.js +5 -5
  223. package/dist/components/expand-dialog/index.js +5 -5
  224. package/dist/components/field/field.js +4 -4
  225. package/dist/components/field/index.js +4 -4
  226. package/dist/components/field-row/field-row.js +3 -3
  227. package/dist/components/field-row/index.js +3 -3
  228. package/dist/components/file-upload/file-upload.js +4 -4
  229. package/dist/components/file-upload/index.js +4 -4
  230. package/dist/components/form/form.js +3 -3
  231. package/dist/components/hover-card/hover-card.js +2 -2
  232. package/dist/components/hover-card/index.js +2 -2
  233. package/dist/components/icon-button/icon-button.js +4 -4
  234. package/dist/components/icon-button/index.js +4 -4
  235. package/dist/components/input/index.js +2 -2
  236. package/dist/components/input/input.js +2 -2
  237. package/dist/components/input-group/index.js +5 -5
  238. package/dist/components/input-group/input-group.js +5 -5
  239. package/dist/components/input-otp/index.js +2 -2
  240. package/dist/components/input-otp/input-otp.js +2 -2
  241. package/dist/components/install-tabs/index.js +8 -8
  242. package/dist/components/install-tabs/install-tabs.js +8 -8
  243. package/dist/components/integration-matrix/index.js +7 -7
  244. package/dist/components/integration-matrix/integration-matrix.js +7 -7
  245. package/dist/components/kbd/index.js +2 -2
  246. package/dist/components/kbd/kbd.js +2 -2
  247. package/dist/components/key-value-editor/index.js +4 -4
  248. package/dist/components/key-value-editor/key-value-editor.js +4 -4
  249. package/dist/components/keyboard-shortcuts/index.js +8 -8
  250. package/dist/components/keyboard-shortcuts/keyboard-shortcuts.js +8 -8
  251. package/dist/components/label/index.js +2 -2
  252. package/dist/components/label/label.js +2 -2
  253. package/dist/components/link-preview/index.js +3 -3
  254. package/dist/components/link-preview/link-preview.js +3 -3
  255. package/dist/components/list-editor/index.js +4 -4
  256. package/dist/components/list-editor/list-editor.js +4 -4
  257. package/dist/components/loading-state/index.js +4 -4
  258. package/dist/components/loading-state/loading-state.js +4 -4
  259. package/dist/components/match-highlight/index.js +2 -2
  260. package/dist/components/match-highlight/match-highlight.js +2 -2
  261. package/dist/components/mention-input/index.js +4 -4
  262. package/dist/components/mention-input/mention-input.js +4 -4
  263. package/dist/components/menubar/index.js +2 -2
  264. package/dist/components/menubar/menubar.js +2 -2
  265. package/dist/components/meter/index.js +2 -2
  266. package/dist/components/meter/meter.js +2 -2
  267. package/dist/components/metric-card/index.js +6 -6
  268. package/dist/components/metric-card/metric-card.js +6 -6
  269. package/dist/components/model-picker/index.js +9 -9
  270. package/dist/components/model-picker/model-picker.js +9 -9
  271. package/dist/components/nav-main/index.js +11 -11
  272. package/dist/components/nav-main/nav-main.js +11 -11
  273. package/dist/components/nav-notifications/index.js +5 -5
  274. package/dist/components/nav-notifications/nav-notifications.js +5 -5
  275. package/dist/components/nav-user/index.js +12 -12
  276. package/dist/components/nav-user/nav-user.js +12 -12
  277. package/dist/components/navigation-menu/index.js +2 -2
  278. package/dist/components/navigation-menu/navigation-menu.js +2 -2
  279. package/dist/components/number-input/index.js +6 -6
  280. package/dist/components/number-input/number-input.js +6 -6
  281. package/dist/components/page-shell/index.js +2 -2
  282. package/dist/components/page-shell/page-shell.js +2 -2
  283. package/dist/components/pagination/index.js +3 -3
  284. package/dist/components/pagination/pagination.js +3 -3
  285. package/dist/components/popover/index.js +2 -2
  286. package/dist/components/popover/popover.js +2 -2
  287. package/dist/components/progress/index.js +2 -2
  288. package/dist/components/progress/progress.js +2 -2
  289. package/dist/components/radio-group/index.js +2 -2
  290. package/dist/components/radio-group/radio-group.js +2 -2
  291. package/dist/components/rating/index.js +2 -2
  292. package/dist/components/rating/rating.js +2 -2
  293. package/dist/components/resizable/index.js +2 -2
  294. package/dist/components/resizable/resizable.js +2 -2
  295. package/dist/components/reveal/index.js +2 -2
  296. package/dist/components/reveal/reveal.js +2 -2
  297. package/dist/components/revision-timeline/index.js +2 -2
  298. package/dist/components/revision-timeline/revision-timeline.js +2 -2
  299. package/dist/components/schema-form/index.js +27 -27
  300. package/dist/components/schema-form/schema-form.js +23 -23
  301. package/dist/components/scroll-area/index.js +2 -2
  302. package/dist/components/scroll-area/scroll-area.js +2 -2
  303. package/dist/components/section-header/index.js +2 -2
  304. package/dist/components/section-header/section-header.js +2 -2
  305. package/dist/components/segmented-field/index.js +5 -5
  306. package/dist/components/segmented-field/segmented-field.js +5 -5
  307. package/dist/components/select/index.js +2 -2
  308. package/dist/components/select/select.js +2 -2
  309. package/dist/components/separator/index.js +2 -2
  310. package/dist/components/separator/separator.js +2 -2
  311. package/dist/components/sheet/index.js +2 -2
  312. package/dist/components/sheet/sheet.js +2 -2
  313. package/dist/components/side-dock/index.js +4 -4
  314. package/dist/components/side-dock/side-dock.js +4 -4
  315. package/dist/components/sidebar/index.js +9 -9
  316. package/dist/components/sidebar/sidebar.js +9 -9
  317. package/dist/components/skeleton/index.js +2 -2
  318. package/dist/components/skeleton/skeleton.js +2 -2
  319. package/dist/components/skip-link/index.js +2 -2
  320. package/dist/components/skip-link/skip-link.js +2 -2
  321. package/dist/components/slider/index.js +2 -2
  322. package/dist/components/slider/slider.js +2 -2
  323. package/dist/components/slider-number/index.js +8 -8
  324. package/dist/components/slider-number/slider-number.js +8 -8
  325. package/dist/components/sonner/index.js +2 -2
  326. package/dist/components/sonner/sonner.js +2 -2
  327. package/dist/components/spec-playground/index.js +6 -6
  328. package/dist/components/spec-playground/spec-playground.js +6 -6
  329. package/dist/components/spinner/index.js +2 -2
  330. package/dist/components/spinner/spinner.js +2 -2
  331. package/dist/components/split-panel/index.js +2 -2
  332. package/dist/components/split-panel/split-panel.js +2 -2
  333. package/dist/components/state-panel/index.js +3 -3
  334. package/dist/components/state-panel/state-panel.js +3 -3
  335. package/dist/components/status-badge/index.js +3 -3
  336. package/dist/components/status-badge/status-badge.js +3 -3
  337. package/dist/components/surface-tour/index.js +8 -8
  338. package/dist/components/surface-tour/surface-tour.js +8 -8
  339. package/dist/components/switch/index.js +2 -2
  340. package/dist/components/switch/switch.js +2 -2
  341. package/dist/components/table/index.js +2 -2
  342. package/dist/components/table/table.js +2 -2
  343. package/dist/components/tabs/index.js +2 -2
  344. package/dist/components/tabs/tabs.js +2 -2
  345. package/dist/components/tag-input/index.js +7 -7
  346. package/dist/components/tag-input/tag-input.js +7 -7
  347. package/dist/components/team-switcher/index.js +11 -11
  348. package/dist/components/team-switcher/team-switcher.js +11 -11
  349. package/dist/components/textarea/index.js +2 -2
  350. package/dist/components/textarea/textarea.js +2 -2
  351. package/dist/components/theme-family-switch/index.js +5 -5
  352. package/dist/components/theme-family-switch/theme-family-switch.js +5 -5
  353. package/dist/components/theme-switcher/index.js +5 -5
  354. package/dist/components/theme-switcher/theme-switcher.js +5 -5
  355. package/dist/components/timeline/index.js +4 -4
  356. package/dist/components/timeline/timeline.js +4 -4
  357. package/dist/components/toggle/index.js +2 -2
  358. package/dist/components/toggle/toggle.js +2 -2
  359. package/dist/components/toggle-group/index.js +3 -3
  360. package/dist/components/toggle-group/toggle-group.js +3 -3
  361. package/dist/components/token-spotlight/index.js +2 -2
  362. package/dist/components/token-spotlight/token-spotlight.js +2 -2
  363. package/dist/components/toolbar/index.js +4 -4
  364. package/dist/components/toolbar/toolbar.js +4 -4
  365. package/dist/components/tooltip/index.js +2 -2
  366. package/dist/components/tooltip/tooltip.js +2 -2
  367. package/dist/components/top-nav/index.js +2 -2
  368. package/dist/components/top-nav/top-nav.js +2 -2
  369. package/dist/components/transfer/index.js +8 -8
  370. package/dist/components/transfer/transfer.js +8 -8
  371. package/dist/components/tree/index.js +5 -5
  372. package/dist/components/tree/tree.js +5 -5
  373. package/dist/components/tree-select/index.js +9 -9
  374. package/dist/components/tree-select/tree-select.js +9 -9
  375. package/dist/components/typography/index.js +3 -3
  376. package/dist/components/typography/prose.js +3 -3
  377. package/dist/components/typography/typography.js +2 -2
  378. package/dist/components/view-toolbar/index.js +6 -6
  379. package/dist/components/view-toolbar/view-toolbar.js +6 -6
  380. package/dist/components/virtual-select/index.js +6 -6
  381. package/dist/components/virtual-select/virtual-select.js +6 -6
  382. package/dist/components/wizard/index.js +3 -3
  383. package/dist/components/wizard/wizard.js +3 -3
  384. package/dist/components/workspace-picker/index.js +11 -11
  385. package/dist/components/workspace-picker/workspace-picker.js +11 -11
  386. package/dist/form.js +3 -3
  387. package/dist/illustrations/empty-list-illustration.js +3 -3
  388. package/dist/illustrations/error-illustration.js +3 -3
  389. package/dist/illustrations/first-run-illustration.js +3 -3
  390. package/dist/illustrations/illustration-base.js +2 -2
  391. package/dist/illustrations/index.js +11 -11
  392. package/dist/illustrations/no-access-illustration.js +3 -3
  393. package/dist/illustrations/no-results-illustration.js +3 -3
  394. package/dist/illustrations/offline-illustration.js +3 -3
  395. package/dist/illustrations/success-illustration.js +3 -3
  396. package/dist/index.d.ts +44 -4
  397. package/dist/index.js +221 -212
  398. package/dist/lib/cn.js +8 -1
  399. package/dist/lib/cn.js.map +1 -1
  400. package/package.json +4 -4
  401. package/src/components/drafting-marks/drafting-marks.stories.tsx +88 -0
  402. package/src/components/drafting-marks/drafting-marks.test.tsx +55 -0
  403. package/src/components/drafting-marks/drafting-marks.tsx +120 -0
  404. package/src/components/drafting-marks/index.ts +7 -0
  405. package/src/components/section-header/section-header.stories.tsx +23 -0
  406. package/src/components/section-header/section-header.tsx +26 -6
  407. package/src/components/sidebar/sidebar.tsx +6 -1
  408. package/src/decoration.stories.tsx +153 -123
  409. package/src/index.ts +1 -0
  410. package/src/lib/cn.test.ts +29 -0
  411. package/src/lib/cn.ts +7 -0
  412. package/dist/chunk-KBNWM27Q.js.map +0 -1
  413. package/dist/chunk-OZTM6PYF.js +0 -30
  414. package/dist/chunk-OZTM6PYF.js.map +0 -1
  415. package/dist/chunk-R3SYH7RG.js.map +0 -1
  416. /package/dist/{chunk-E3ES2KR6.js.map → chunk-2DFB4YTK.js.map} +0 -0
  417. /package/dist/{chunk-6QU7OVFA.js.map → chunk-2ZMPAD6C.js.map} +0 -0
  418. /package/dist/{chunk-U4LHV5DS.js.map → chunk-36SY7TID.js.map} +0 -0
  419. /package/dist/{chunk-IHMFEPIT.js.map → chunk-3BZBNDRP.js.map} +0 -0
  420. /package/dist/{chunk-5AWXGBSH.js.map → chunk-3DJ4KY3U.js.map} +0 -0
  421. /package/dist/{chunk-T4JNXV75.js.map → chunk-3EDNWHWD.js.map} +0 -0
  422. /package/dist/{chunk-LR2CU7HK.js.map → chunk-3ZR5PMKB.js.map} +0 -0
  423. /package/dist/{chunk-QDTGDYMM.js.map → chunk-47YSHR3H.js.map} +0 -0
  424. /package/dist/{chunk-2HXVFC4B.js.map → chunk-4B2E4OCZ.js.map} +0 -0
  425. /package/dist/{chunk-3B7W334A.js.map → chunk-4C4D6T5M.js.map} +0 -0
  426. /package/dist/{chunk-U26XDHMX.js.map → chunk-4DWIMWR5.js.map} +0 -0
  427. /package/dist/{chunk-H5UA5JW4.js.map → chunk-4DZGAY6R.js.map} +0 -0
  428. /package/dist/{chunk-YWB7HLL7.js.map → chunk-4NSCLIES.js.map} +0 -0
  429. /package/dist/{chunk-7P24I5OL.js.map → chunk-4VCU3GFI.js.map} +0 -0
  430. /package/dist/{chunk-UPEMEBWH.js.map → chunk-55BM2IU2.js.map} +0 -0
  431. /package/dist/{chunk-5V5J7APL.js.map → chunk-5C5W52O2.js.map} +0 -0
  432. /package/dist/{chunk-FDPONOOT.js.map → chunk-5MXQ5CP7.js.map} +0 -0
  433. /package/dist/{chunk-NBMF7SIS.js.map → chunk-6HTZBBTC.js.map} +0 -0
  434. /package/dist/{chunk-5RC32MZH.js.map → chunk-72H7HUTH.js.map} +0 -0
  435. /package/dist/{chunk-URVAZW44.js.map → chunk-7KV7H2TW.js.map} +0 -0
  436. /package/dist/{chunk-VFF3AN4Y.js.map → chunk-7Z2RAGOA.js.map} +0 -0
  437. /package/dist/{chunk-BM6NGS3A.js.map → chunk-AE6LFFME.js.map} +0 -0
  438. /package/dist/{chunk-OPMMD25Z.js.map → chunk-ALNJV4XB.js.map} +0 -0
  439. /package/dist/{chunk-KTH3GWAL.js.map → chunk-AXHMQOIZ.js.map} +0 -0
  440. /package/dist/{chunk-RNC4M6SG.js.map → chunk-B3DANITU.js.map} +0 -0
  441. /package/dist/{chunk-MGAXCPT7.js.map → chunk-B7FAQKHH.js.map} +0 -0
  442. /package/dist/{chunk-BN4CKDFU.js.map → chunk-BDOG4YSM.js.map} +0 -0
  443. /package/dist/{chunk-6HGS5Z2Z.js.map → chunk-BRL2HMZJ.js.map} +0 -0
  444. /package/dist/{chunk-EY2PGOG3.js.map → chunk-BYFRDLDL.js.map} +0 -0
  445. /package/dist/{chunk-LVRULYU4.js.map → chunk-C2ICCCP5.js.map} +0 -0
  446. /package/dist/{chunk-VA2OONPE.js.map → chunk-C5QBV5RE.js.map} +0 -0
  447. /package/dist/{chunk-7WXDSTNR.js.map → chunk-CDMJSXCB.js.map} +0 -0
  448. /package/dist/{chunk-XMZ5LXL4.js.map → chunk-CEDK5GM2.js.map} +0 -0
  449. /package/dist/{chunk-DFYPQ52O.js.map → chunk-CEHCVDYR.js.map} +0 -0
  450. /package/dist/{chunk-A47AZPCL.js.map → chunk-CEQ3YKHR.js.map} +0 -0
  451. /package/dist/{chunk-EHGIW7GA.js.map → chunk-CMP4F537.js.map} +0 -0
  452. /package/dist/{chunk-YXHHUJOZ.js.map → chunk-CY5ISPFB.js.map} +0 -0
  453. /package/dist/{chunk-6OFWWIEG.js.map → chunk-D5INX2EF.js.map} +0 -0
  454. /package/dist/{chunk-3EKVSKGJ.js.map → chunk-DXC3DTCV.js.map} +0 -0
  455. /package/dist/{chunk-XZ23AFOP.js.map → chunk-E3GNYOLS.js.map} +0 -0
  456. /package/dist/{chunk-ZNFHDBUW.js.map → chunk-EBNPVPR7.js.map} +0 -0
  457. /package/dist/{chunk-4PITSMJ3.js.map → chunk-EJ3XWNY3.js.map} +0 -0
  458. /package/dist/{chunk-333EWYWL.js.map → chunk-ENL3CCZB.js.map} +0 -0
  459. /package/dist/{chunk-HVFYAQLK.js.map → chunk-ERTYAID6.js.map} +0 -0
  460. /package/dist/{chunk-B5QQLMEE.js.map → chunk-FG3PDWE3.js.map} +0 -0
  461. /package/dist/{chunk-7PS5MKVH.js.map → chunk-FLCQKC64.js.map} +0 -0
  462. /package/dist/{chunk-LMO3QK7Q.js.map → chunk-FXC64HLD.js.map} +0 -0
  463. /package/dist/{chunk-KUAVM54Y.js.map → chunk-FZEG2R3E.js.map} +0 -0
  464. /package/dist/{chunk-QGX37P5L.js.map → chunk-GMXSCEYN.js.map} +0 -0
  465. /package/dist/{chunk-FKUP7QRJ.js.map → chunk-GTBVTLZJ.js.map} +0 -0
  466. /package/dist/{chunk-4GQFIJAE.js.map → chunk-GTDCC4YX.js.map} +0 -0
  467. /package/dist/{chunk-XONGYCW3.js.map → chunk-GWHO5ACE.js.map} +0 -0
  468. /package/dist/{chunk-NTTSHOOK.js.map → chunk-HF6BGFUV.js.map} +0 -0
  469. /package/dist/{chunk-WTB4DDZP.js.map → chunk-HHZJALGA.js.map} +0 -0
  470. /package/dist/{chunk-QNEOO22E.js.map → chunk-HND6FAMX.js.map} +0 -0
  471. /package/dist/{chunk-ECCNRCC4.js.map → chunk-HNLYRHAU.js.map} +0 -0
  472. /package/dist/{chunk-7G63B2B7.js.map → chunk-HUIYDDDL.js.map} +0 -0
  473. /package/dist/{chunk-4E73UAFA.js.map → chunk-HXQ4MDCH.js.map} +0 -0
  474. /package/dist/{chunk-XYACSO57.js.map → chunk-I3U52BDH.js.map} +0 -0
  475. /package/dist/{chunk-KZWC6JCI.js.map → chunk-IE5GWE72.js.map} +0 -0
  476. /package/dist/{chunk-RRZUMIYG.js.map → chunk-IIY5JRNW.js.map} +0 -0
  477. /package/dist/{chunk-UQHWOPUY.js.map → chunk-IVEDMK5U.js.map} +0 -0
  478. /package/dist/{chunk-35ZTVB35.js.map → chunk-JTY3REOB.js.map} +0 -0
  479. /package/dist/{chunk-YIVL6HWS.js.map → chunk-JVCIAEFT.js.map} +0 -0
  480. /package/dist/{chunk-DUF2VZON.js.map → chunk-K4V2ELUZ.js.map} +0 -0
  481. /package/dist/{chunk-OBEJUAN6.js.map → chunk-KBWHHAI3.js.map} +0 -0
  482. /package/dist/{chunk-BPXLHGWI.js.map → chunk-KK2TIWTF.js.map} +0 -0
  483. /package/dist/{chunk-NRSSSVWB.js.map → chunk-KPZFLTZ2.js.map} +0 -0
  484. /package/dist/{chunk-OYM3NHSD.js.map → chunk-KXYL3CUS.js.map} +0 -0
  485. /package/dist/{chunk-KOVHUAHG.js.map → chunk-L5O2O67Y.js.map} +0 -0
  486. /package/dist/{chunk-3LWAAK3J.js.map → chunk-L6A3RXCU.js.map} +0 -0
  487. /package/dist/{chunk-RM5JIUVW.js.map → chunk-LG33MONJ.js.map} +0 -0
  488. /package/dist/{chunk-YACASX6X.js.map → chunk-LLYLDZXC.js.map} +0 -0
  489. /package/dist/{chunk-RWUKMJYA.js.map → chunk-LMV225AS.js.map} +0 -0
  490. /package/dist/{chunk-OV4GQOLC.js.map → chunk-M2KNQZUL.js.map} +0 -0
  491. /package/dist/{chunk-WW3CD7AU.js.map → chunk-M5WPZXBA.js.map} +0 -0
  492. /package/dist/{chunk-FINAKMC6.js.map → chunk-MDQYRES4.js.map} +0 -0
  493. /package/dist/{chunk-XAFRTZQF.js.map → chunk-MJAIURHO.js.map} +0 -0
  494. /package/dist/{chunk-KWQ6HV5Z.js.map → chunk-MRBDJASL.js.map} +0 -0
  495. /package/dist/{chunk-NJAGSGPF.js.map → chunk-MY5H6D5Y.js.map} +0 -0
  496. /package/dist/{chunk-J2P4YZLC.js.map → chunk-NRPZ3BH4.js.map} +0 -0
  497. /package/dist/{chunk-YL7VBHPZ.js.map → chunk-NXCOVGDU.js.map} +0 -0
  498. /package/dist/{chunk-IGP5E4FC.js.map → chunk-NZUKZRT7.js.map} +0 -0
  499. /package/dist/{chunk-WX3LWMVU.js.map → chunk-O6V65J5J.js.map} +0 -0
  500. /package/dist/{chunk-PYPNGKRD.js.map → chunk-OGTILHKP.js.map} +0 -0
  501. /package/dist/{chunk-UXSV6RVS.js.map → chunk-OKY7ACZK.js.map} +0 -0
  502. /package/dist/{chunk-ULIDYFM7.js.map → chunk-OPBSVEMX.js.map} +0 -0
  503. /package/dist/{chunk-K6YRTASS.js.map → chunk-PGKQZBLZ.js.map} +0 -0
  504. /package/dist/{chunk-57C25JYV.js.map → chunk-PQZD5W3E.js.map} +0 -0
  505. /package/dist/{chunk-533R5EKD.js.map → chunk-PSXUEWUS.js.map} +0 -0
  506. /package/dist/{chunk-5Z55AFOW.js.map → chunk-PT5P4AAU.js.map} +0 -0
  507. /package/dist/{chunk-EL3OXVOW.js.map → chunk-PUACHQRH.js.map} +0 -0
  508. /package/dist/{chunk-HRYH7XQP.js.map → chunk-QKZX5HDY.js.map} +0 -0
  509. /package/dist/{chunk-LOSXINSS.js.map → chunk-QLM3KTAQ.js.map} +0 -0
  510. /package/dist/{chunk-JGS2IHER.js.map → chunk-R27VUCWR.js.map} +0 -0
  511. /package/dist/{chunk-X6J4KKZZ.js.map → chunk-RFTC5UVB.js.map} +0 -0
  512. /package/dist/{chunk-LXW3GNF7.js.map → chunk-RHVYRQN4.js.map} +0 -0
  513. /package/dist/{chunk-VRIAWF3A.js.map → chunk-RIYDAMSQ.js.map} +0 -0
  514. /package/dist/{chunk-A43B4IT7.js.map → chunk-RYPK72YP.js.map} +0 -0
  515. /package/dist/{chunk-GRWGNWIJ.js.map → chunk-SCCBEFVK.js.map} +0 -0
  516. /package/dist/{chunk-PP7POY7C.js.map → chunk-SEGTBIR4.js.map} +0 -0
  517. /package/dist/{chunk-D3C3VVCX.js.map → chunk-SGBCLZQF.js.map} +0 -0
  518. /package/dist/{chunk-EKY3A5LO.js.map → chunk-SLDJYJEG.js.map} +0 -0
  519. /package/dist/{chunk-YPLKH5H4.js.map → chunk-SSQG36MH.js.map} +0 -0
  520. /package/dist/{chunk-WCCCW4KD.js.map → chunk-SWQCCR6Q.js.map} +0 -0
  521. /package/dist/{chunk-NQY3QNLR.js.map → chunk-U5BZXNHW.js.map} +0 -0
  522. /package/dist/{chunk-TEKBTTP2.js.map → chunk-U756JCDK.js.map} +0 -0
  523. /package/dist/{chunk-W6HCXQBH.js.map → chunk-UG2T7LMX.js.map} +0 -0
  524. /package/dist/{chunk-JNWXHPZG.js.map → chunk-UPGIQXUY.js.map} +0 -0
  525. /package/dist/{chunk-QTIKGWU4.js.map → chunk-UQPW7INX.js.map} +0 -0
  526. /package/dist/{chunk-WZTFU6FJ.js.map → chunk-UUSOIPM2.js.map} +0 -0
  527. /package/dist/{chunk-FYCCNQXQ.js.map → chunk-V5QCJHDA.js.map} +0 -0
  528. /package/dist/{chunk-V4DDHF7S.js.map → chunk-V6U75PIG.js.map} +0 -0
  529. /package/dist/{chunk-ZXBUOHCR.js.map → chunk-VC4GKLZL.js.map} +0 -0
  530. /package/dist/{chunk-DT6RNLCP.js.map → chunk-W26KFY35.js.map} +0 -0
  531. /package/dist/{chunk-R7DDZIE3.js.map → chunk-W35X6J5P.js.map} +0 -0
  532. /package/dist/{chunk-ITFDGFOT.js.map → chunk-W7OIVERI.js.map} +0 -0
  533. /package/dist/{chunk-IZJOZJDL.js.map → chunk-WEM6XJ7Z.js.map} +0 -0
  534. /package/dist/{chunk-5HBMI2DO.js.map → chunk-WKNOKJA3.js.map} +0 -0
  535. /package/dist/{chunk-BLNXHETI.js.map → chunk-Y33ZFTMR.js.map} +0 -0
  536. /package/dist/{chunk-AXKZBRZK.js.map → chunk-YA2QGLUL.js.map} +0 -0
  537. /package/dist/{chunk-35DUHYPC.js.map → chunk-YFGFNFVW.js.map} +0 -0
  538. /package/dist/{chunk-6NKILKS6.js.map → chunk-YFKKMDJL.js.map} +0 -0
  539. /package/dist/{chunk-CQ5CH3SB.js.map → chunk-YUFDC6RW.js.map} +0 -0
  540. /package/dist/{chunk-DCI6IOJX.js.map → chunk-ZALGMUSW.js.map} +0 -0
  541. /package/dist/{chunk-N44PNGDS.js.map → chunk-ZFMM2NLA.js.map} +0 -0
  542. /package/dist/{chunk-6OPDRLMU.js.map → chunk-ZRMF4YAS.js.map} +0 -0
  543. /package/dist/{chunk-TU24Y4HN.js.map → chunk-ZSYT5H6U.js.map} +0 -0
package/dist/lib/cn.js CHANGED
@@ -13,7 +13,14 @@ var TEXT_ROLES = [
13
13
  "heading-xs",
14
14
  "kpi",
15
15
  "kpi-sm",
16
- "code"
16
+ "code",
17
+ // Chart type roles (RM-019, themes.css § chart type roles). They were missing
18
+ // here from RM-019 until the 2026-09-21 new-user test: `cn("text-chart-source",
19
+ // "text-chart-foreground-muted")` dropped the role and every ChartCard source
20
+ // row rendered at body size. `cn.test.ts` now derives the expected list from
21
+ // themes.css, so a new `--text-<role>` token cannot drift from this list again.
22
+ "chart-value",
23
+ "chart-source"
17
24
  ];
18
25
  var isVarShorthand = (value) => /^\(--[\w-]+\)$/.test(value);
19
26
  var twMerge = extendTailwindMerge({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * The semantic type roles (`--text-<role>` tokens → `text-<role>` utilities, #187).\n * tailwind-merge doesn't know custom theme keys, so without registration it\n * classifies `text-title` as a text COLOR — and `cn(\"text-kpi\", \"text-foreground\")`\n * would silently drop the role. Registering the roles in the `font-size` class\n * group makes role-vs-role and role-vs-raw-size conflicts resolve correctly while\n * keeping role + color independent.\n */\nconst TEXT_ROLES = [\n \"display-lg\",\n \"display\",\n \"title\",\n \"subtitle\",\n \"body\",\n \"caption\",\n \"meta\",\n \"eyebrow\",\n \"heading-xs\",\n \"kpi\",\n \"kpi-sm\",\n \"code\",\n];\n\n/**\n * Tailwind v4's CSS-variable shorthand (`leading-(--card-title-leading)`).\n * tailwind-merge 2.x predates it and leaves such a class beside a caller's\n * `leading-tight`, letting stylesheet order pick the winner. A typed hint\n * (`text-(length:--x)`) is read as a variant prefix by 2.x and cannot be\n * registered — give that seam a named `@theme` utility instead\n * (`text-table-header`).\n */\nconst isVarShorthand = (value: string) => /^\\(--[\\w-]+\\)$/.test(value);\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [{ text: [...TEXT_ROLES, \"table-header\"] }],\n leading: [{ leading: [isVarShorthand] }],\n tracking: [{ tracking: [isVarShorthand] }],\n // `font-display` is the display-face seam (sibling of font-mono, #187).\n \"font-family\": [{ font: [\"display\"] }],\n // Theme-driven control/table/surface knobs (themes.css § CONTROL UTILITIES\n // and the `@theme inline` bridge) — so a caller's `h-8` / `rounded-none` /\n // `font-bold` / `shadow-none` still replaces the token default.\n \"font-weight\": [{ font: [\"control\", \"table-header\", \"tabs-active\"] }],\n rounded: [{ rounded: [\"control\", \"badge\"] }],\n shadow: [{ shadow: [\"input\", \"card\", \"popover\", \"dialog\"] }],\n h: [{ h: [\"control\", \"control-sm\", \"control-lg\", \"header\"] }],\n size: [{ size: [\"control\", \"control-sm\", \"control-lg\"] }],\n \"min-w\": [{ \"min-w\": [\"control\", \"control-sm\", \"control-lg\"] }],\n },\n },\n});\n\n/**\n * Merge class names with conflict resolution. `clsx` handles conditionals;\n * `tailwind-merge` ensures later Tailwind utilities win (e.g. `p-2 p-4` -> `p-4`).\n * Use this in every component that accepts a `className` prop.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";AAAA,SAAS,YAA6B;AACtC,SAAS,2BAA2B;AAUpC,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAUA,IAAM,iBAAiB,CAAC,UAAkB,iBAAiB,KAAK,KAAK;AAErE,IAAM,UAAU,oBAAoB;AAAA,EAClC,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,aAAa,CAAC,EAAE,MAAM,CAAC,GAAG,YAAY,cAAc,EAAE,CAAC;AAAA,MACvD,SAAS,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;AAAA,MACvC,UAAU,CAAC,EAAE,UAAU,CAAC,cAAc,EAAE,CAAC;AAAA;AAAA,MAEzC,eAAe,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,MAIrC,eAAe,CAAC,EAAE,MAAM,CAAC,WAAW,gBAAgB,aAAa,EAAE,CAAC;AAAA,MACpE,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,OAAO,EAAE,CAAC;AAAA,MAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS,QAAQ,WAAW,QAAQ,EAAE,CAAC;AAAA,MAC3D,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,cAAc,cAAc,QAAQ,EAAE,CAAC;AAAA,MAC5D,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,cAAc,YAAY,EAAE,CAAC;AAAA,MACxD,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,cAAc,YAAY,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACF,CAAC;AAOM,SAAS,MAAM,QAA8B;AAClD,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n/**\n * The semantic type roles (`--text-<role>` tokens → `text-<role>` utilities, #187).\n * tailwind-merge doesn't know custom theme keys, so without registration it\n * classifies `text-title` as a text COLOR — and `cn(\"text-kpi\", \"text-foreground\")`\n * would silently drop the role. Registering the roles in the `font-size` class\n * group makes role-vs-role and role-vs-raw-size conflicts resolve correctly while\n * keeping role + color independent.\n */\nconst TEXT_ROLES = [\n \"display-lg\",\n \"display\",\n \"title\",\n \"subtitle\",\n \"body\",\n \"caption\",\n \"meta\",\n \"eyebrow\",\n \"heading-xs\",\n \"kpi\",\n \"kpi-sm\",\n \"code\",\n // Chart type roles (RM-019, themes.css § chart type roles). They were missing\n // here from RM-019 until the 2026-09-21 new-user test: `cn(\"text-chart-source\",\n // \"text-chart-foreground-muted\")` dropped the role and every ChartCard source\n // row rendered at body size. `cn.test.ts` now derives the expected list from\n // themes.css, so a new `--text-<role>` token cannot drift from this list again.\n \"chart-value\",\n \"chart-source\",\n];\n\n/**\n * Tailwind v4's CSS-variable shorthand (`leading-(--card-title-leading)`).\n * tailwind-merge 2.x predates it and leaves such a class beside a caller's\n * `leading-tight`, letting stylesheet order pick the winner. A typed hint\n * (`text-(length:--x)`) is read as a variant prefix by 2.x and cannot be\n * registered — give that seam a named `@theme` utility instead\n * (`text-table-header`).\n */\nconst isVarShorthand = (value: string) => /^\\(--[\\w-]+\\)$/.test(value);\n\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [{ text: [...TEXT_ROLES, \"table-header\"] }],\n leading: [{ leading: [isVarShorthand] }],\n tracking: [{ tracking: [isVarShorthand] }],\n // `font-display` is the display-face seam (sibling of font-mono, #187).\n \"font-family\": [{ font: [\"display\"] }],\n // Theme-driven control/table/surface knobs (themes.css § CONTROL UTILITIES\n // and the `@theme inline` bridge) — so a caller's `h-8` / `rounded-none` /\n // `font-bold` / `shadow-none` still replaces the token default.\n \"font-weight\": [{ font: [\"control\", \"table-header\", \"tabs-active\"] }],\n rounded: [{ rounded: [\"control\", \"badge\"] }],\n shadow: [{ shadow: [\"input\", \"card\", \"popover\", \"dialog\"] }],\n h: [{ h: [\"control\", \"control-sm\", \"control-lg\", \"header\"] }],\n size: [{ size: [\"control\", \"control-sm\", \"control-lg\"] }],\n \"min-w\": [{ \"min-w\": [\"control\", \"control-sm\", \"control-lg\"] }],\n },\n },\n});\n\n/**\n * Merge class names with conflict resolution. `clsx` handles conditionals;\n * `tailwind-merge` ensures later Tailwind utilities win (e.g. `p-2 p-4` -> `p-4`).\n * Use this in every component that accepts a `className` prop.\n */\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n"],"mappings":";AAAA,SAAS,YAA6B;AACtC,SAAS,2BAA2B;AAUpC,IAAM,aAAa;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA;AAAA,EACA;AACF;AAUA,IAAM,iBAAiB,CAAC,UAAkB,iBAAiB,KAAK,KAAK;AAErE,IAAM,UAAU,oBAAoB;AAAA,EAClC,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,aAAa,CAAC,EAAE,MAAM,CAAC,GAAG,YAAY,cAAc,EAAE,CAAC;AAAA,MACvD,SAAS,CAAC,EAAE,SAAS,CAAC,cAAc,EAAE,CAAC;AAAA,MACvC,UAAU,CAAC,EAAE,UAAU,CAAC,cAAc,EAAE,CAAC;AAAA;AAAA,MAEzC,eAAe,CAAC,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;AAAA;AAAA;AAAA;AAAA,MAIrC,eAAe,CAAC,EAAE,MAAM,CAAC,WAAW,gBAAgB,aAAa,EAAE,CAAC;AAAA,MACpE,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,OAAO,EAAE,CAAC;AAAA,MAC3C,QAAQ,CAAC,EAAE,QAAQ,CAAC,SAAS,QAAQ,WAAW,QAAQ,EAAE,CAAC;AAAA,MAC3D,GAAG,CAAC,EAAE,GAAG,CAAC,WAAW,cAAc,cAAc,QAAQ,EAAE,CAAC;AAAA,MAC5D,MAAM,CAAC,EAAE,MAAM,CAAC,WAAW,cAAc,YAAY,EAAE,CAAC;AAAA,MACxD,SAAS,CAAC,EAAE,SAAS,CAAC,WAAW,cAAc,YAAY,EAAE,CAAC;AAAA,IAChE;AAAA,EACF;AACF,CAAC;AAOM,SAAS,MAAM,QAA8B;AAClD,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elabs-ai/components-ui",
3
- "version": "5.0.0",
3
+ "version": "5.1.0",
4
4
  "license": "MIT",
5
5
  "repository": {
6
6
  "type": "git",
@@ -81,7 +81,7 @@
81
81
  "react": "^18.2.0 || ^19.0.0",
82
82
  "react-dom": "^18.2.0 || ^19.0.0",
83
83
  "react-hook-form": "^7.54.2",
84
- "@elabs-ai/components-tokens": "5.0.0"
84
+ "@elabs-ai/components-tokens": "^5.1.0"
85
85
  },
86
86
  "peerDependenciesMeta": {
87
87
  "@hookform/resolvers": {
@@ -113,8 +113,8 @@
113
113
  "vitest": "^3.0.2",
114
114
  "zod": "^3.24.1",
115
115
  "@elabs-ai/components-eslint-config": "0.1.0",
116
- "@elabs-ai/components-typescript-config": "0.1.0",
117
- "@elabs-ai/components-tokens": "5.0.0"
116
+ "@elabs-ai/components-tokens": "5.1.0",
117
+ "@elabs-ai/components-typescript-config": "0.1.0"
118
118
  },
119
119
  "scripts": {
120
120
  "build": "rm -rf dist && tsup && node ../../scripts/link-dist-css.mjs",
@@ -0,0 +1,88 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { expect } from "storybook/test";
3
+ import { DraftingMarks } from "./drafting-marks";
4
+
5
+ const meta = {
6
+ title: "Foundations/DraftingMarks",
7
+ component: DraftingMarks,
8
+ tags: ["autodocs"],
9
+ parameters: { layout: "fullscreen" },
10
+ argTypes: {
11
+ anchor: {
12
+ description: "The corner the construction grows out of, and fades away from.",
13
+ control: { type: "radio" },
14
+ options: ["top-start", "top-end", "bottom-start", "bottom-end"],
15
+ table: { category: "Appearance" },
16
+ },
17
+ accent: {
18
+ description: "Ink the station point in `--primary` and the plate in `--chart-2`.",
19
+ control: "boolean",
20
+ table: { category: "Appearance" },
21
+ },
22
+ },
23
+ } satisfies Meta<typeof DraftingMarks>;
24
+ export default meta;
25
+ type Story = StoryObj<typeof meta>;
26
+
27
+ function Band({ children, className }: { children: React.ReactNode; className?: string }) {
28
+ return (
29
+ <header
30
+ className={`relative isolate overflow-hidden bg-surface-muted px-6 py-24 text-center ${className ?? ""}`}
31
+ >
32
+ {children}
33
+ <h2 className="relative text-display font-semibold text-balance">
34
+ The hard screens, one system.
35
+ </h2>
36
+ <p className="relative mx-auto mt-3 max-w-prose text-subtitle text-muted-foreground">
37
+ A construction drawing in the corner the copy leaves empty. It fades out long before it
38
+ reaches the text.
39
+ </p>
40
+ </header>
41
+ );
42
+ }
43
+
44
+ /** One drawing, in the corner the header's content leaves empty. */
45
+ export const Default: Story = {
46
+ args: { anchor: "top-start", accent: true },
47
+ render: (args) => (
48
+ <Band>
49
+ <DraftingMarks {...args} />
50
+ </Band>
51
+ ),
52
+ play: async ({ canvasElement }) => {
53
+ const svg = canvasElement.querySelector('[data-slot="drafting-marks"]') as SVGSVGElement;
54
+ await expect(svg).toHaveAttribute("aria-hidden", "true");
55
+ await expect(getComputedStyle(svg).pointerEvents).toBe("none");
56
+ await expect(getComputedStyle(svg).maskImage).toContain("radial-gradient");
57
+ },
58
+ };
59
+
60
+ /** Paired with the corner stripes: drawing at one end of the band, stripes at the other. */
61
+ export const WithCornerStripes: Story = {
62
+ render: () => (
63
+ <Band className="bg-hairline-stripes">
64
+ <DraftingMarks anchor="bottom-start" />
65
+ </Band>
66
+ ),
67
+ };
68
+
69
+ /** `accent={false}` — rule ink only, for a band that already carries colour. */
70
+ export const RuleInkOnly: Story = {
71
+ render: () => (
72
+ <Band>
73
+ <DraftingMarks anchor="top-end" accent={false} />
74
+ </Band>
75
+ ),
76
+ };
77
+
78
+ /** All four anchors are the same drawing, mirrored. */
79
+ export const Anchors: Story = {
80
+ render: () => (
81
+ <div className="relative isolate h-[44rem] overflow-hidden bg-background">
82
+ <DraftingMarks anchor="top-start" />
83
+ <DraftingMarks anchor="top-end" />
84
+ <DraftingMarks anchor="bottom-start" />
85
+ <DraftingMarks anchor="bottom-end" />
86
+ </div>
87
+ ),
88
+ };
@@ -0,0 +1,55 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { render } from "@testing-library/react";
3
+ import { createRef } from "react";
4
+ import { DraftingMarks } from "./drafting-marks";
5
+
6
+ const marks = (container: HTMLElement) =>
7
+ container.querySelector('[data-slot="drafting-marks"]') as SVGSVGElement;
8
+
9
+ describe("DraftingMarks", () => {
10
+ it("is decorative and inert: hidden from AT, no pointer events, absolutely positioned", () => {
11
+ const { container } = render(<DraftingMarks />);
12
+ const svg = marks(container);
13
+ expect(svg).toHaveAttribute("aria-hidden", "true");
14
+ expect(svg).toHaveClass("pointer-events-none", "absolute");
15
+ });
16
+
17
+ it("grows out of the top-start corner by default and mirrors for the other anchors", () => {
18
+ const { container, rerender } = render(<DraftingMarks />);
19
+ expect(marks(container)).toHaveAttribute("data-anchor", "top-start");
20
+ expect(marks(container)).toHaveClass("top-0", "start-0");
21
+ rerender(<DraftingMarks anchor="bottom-end" />);
22
+ expect(marks(container)).toHaveClass("bottom-0", "end-0", "-scale-100");
23
+ });
24
+
25
+ it("inks from tokens only, and fades away from its corner", () => {
26
+ const { container } = render(<DraftingMarks />);
27
+ const svg = marks(container);
28
+ expect(svg).toHaveAttribute("stroke", "var(--hairline-ink-strong)");
29
+ expect(svg.style.maskImage).toBe("var(--drafting-marks-fade, var(--deco-fade-corner))");
30
+ const fills = Array.from(svg.querySelectorAll("[fill]")).map((el) => el.getAttribute("fill"));
31
+ for (const fill of fills) expect(fill).toMatch(/^(none|var\(--|url\(#)/);
32
+ });
33
+
34
+ it("`accent={false}` drops the two coloured accents", () => {
35
+ const { container, rerender } = render(<DraftingMarks />);
36
+ expect(marks(container).querySelectorAll('[fill="var(--primary)"]').length).toBe(2);
37
+ rerender(<DraftingMarks accent={false} />);
38
+ expect(marks(container).querySelectorAll('[fill="var(--primary)"]').length).toBe(0);
39
+ expect(marks(container).querySelector('[fill="var(--chart-2)"]')).toBeNull();
40
+ });
41
+
42
+ it("gives each instance its own dot-pattern id, forwards the ref and merges className", () => {
43
+ const ref = createRef<SVGSVGElement>();
44
+ const { container } = render(
45
+ <div>
46
+ <DraftingMarks ref={ref} className="opacity-60" />
47
+ <DraftingMarks />
48
+ </div>,
49
+ );
50
+ const ids = Array.from(container.querySelectorAll("pattern")).map((p) => p.id);
51
+ expect(new Set(ids).size).toBe(2);
52
+ expect(ref.current).toBe(container.querySelector("svg"));
53
+ expect(ref.current).toHaveClass("opacity-60");
54
+ });
55
+ });
@@ -0,0 +1,120 @@
1
+ import * as React from "react";
2
+ import { cn } from "../../lib/cn";
3
+
4
+ /** Which corner of the host the drawing grows out of. Logical: `start`/`end` follow the text direction. */
5
+ export type DraftingMarksAnchor = "top-start" | "top-end" | "bottom-start" | "bottom-end";
6
+
7
+ export interface DraftingMarksProps extends Omit<React.SVGAttributes<SVGSVGElement>, "children"> {
8
+ /** The corner the construction grows out of, and fades away from. Default `"top-start"`. */
9
+ anchor?: DraftingMarksAnchor;
10
+ /**
11
+ * Ink the two small accents — a `--primary` station point and a `--chart-2` tinted plate.
12
+ * `false` keeps the whole drawing in rule ink. Default `true`.
13
+ */
14
+ accent?: boolean;
15
+ }
16
+
17
+ /** The drawing's own size, in px. Fixed, so every hairline stays one device-crisp pixel. */
18
+ export const DRAFTING_MARKS_WIDTH = 560;
19
+ export const DRAFTING_MARKS_HEIGHT = 360;
20
+
21
+ // The drawing is authored ONCE, growing out of the top-left corner; the other three anchors
22
+ // are the same drawing mirrored. `start`/`end` are logical, so the mirror itself flips under RTL.
23
+ const ANCHOR_CLASS: Record<DraftingMarksAnchor, string> = {
24
+ "top-start": "top-0 start-0 rtl:-scale-x-100",
25
+ "top-end": "top-0 end-0 -scale-x-100 rtl:scale-x-100",
26
+ "bottom-start": "bottom-0 start-0 -scale-y-100 rtl:-scale-x-100",
27
+ "bottom-end": "bottom-0 end-0 -scale-100 rtl:scale-x-100",
28
+ };
29
+
30
+ /**
31
+ * DraftingMarks — a quiet construction drawing in one corner of a header or hero band: two
32
+ * guides that cross at a station point, the arcs struck from it, a dimension tick, a field of
33
+ * dots and a few registration crosses. It is the hairline family's one ILLUSTRATION: where the
34
+ * `hairline-*` utilities rule edges, this gives an empty corner the look of a sheet someone
35
+ * measured on.
36
+ *
37
+ * Decorative and inert: `aria-hidden`, `pointer-events: none`, absolutely positioned in the
38
+ * corner named by `anchor` and faded out away from it, so it never reaches the text in the
39
+ * middle of the band (`--drafting-marks-fade` swaps the falloff — e.g.
40
+ * `var(--deco-fade-corner-tight)` where the copy comes close). Put it first inside a positioned (`relative`) host that clips
41
+ * (`overflow-hidden`). Lines take the theme's `--hairline-ink-strong`; the two accents take
42
+ * `--primary` and `--chart-2` — no literal colour, so it re-inks with the theme.
43
+ *
44
+ * One per band, in a corner the content leaves empty. It is a ground gesture like the paper
45
+ * utilities — never behind body text, never inside a control.
46
+ */
47
+ export const DraftingMarks = React.forwardRef<SVGSVGElement, DraftingMarksProps>(
48
+ function DraftingMarks({ anchor = "top-start", accent = true, className, style, ...props }, ref) {
49
+ const dotsId = `drafting-dots-${React.useId().replace(/:/g, "")}`;
50
+ return (
51
+ <svg
52
+ ref={ref}
53
+ aria-hidden="true"
54
+ data-slot="drafting-marks"
55
+ data-anchor={anchor}
56
+ fill="none"
57
+ height={DRAFTING_MARKS_HEIGHT}
58
+ width={DRAFTING_MARKS_WIDTH}
59
+ viewBox={`0 0 ${DRAFTING_MARKS_WIDTH} ${DRAFTING_MARKS_HEIGHT}`}
60
+ stroke="var(--hairline-ink-strong)"
61
+ strokeWidth={1}
62
+ className={cn("pointer-events-none absolute max-w-none", ANCHOR_CLASS[anchor], className)}
63
+ style={{
64
+ // Fades away from its own corner (authored top-left; the mirror carries the mask along).
65
+ maskImage: "var(--drafting-marks-fade, var(--deco-fade-corner))",
66
+ WebkitMaskImage: "var(--drafting-marks-fade, var(--deco-fade-corner))",
67
+ ...style,
68
+ }}
69
+ {...props}
70
+ >
71
+ <defs>
72
+ <pattern id={dotsId} width={12} height={12} patternUnits="userSpaceOnUse">
73
+ <circle cx={6} cy={6} r={0.75} fill="var(--hairline-ink-strong)" stroke="none" />
74
+ </pattern>
75
+ </defs>
76
+
77
+ {/* The dot field, tucked between the guides. */}
78
+ <rect x={132} y={36} width={216} height={48} fill={`url(#${dotsId})`} stroke="none" />
79
+
80
+ {/* The tinted plate, hung from the horizontal guide. */}
81
+ {accent ? (
82
+ <rect
83
+ x={40}
84
+ y={96.5}
85
+ width={56}
86
+ height={44}
87
+ fill="var(--chart-2)"
88
+ fillOpacity={0.16}
89
+ stroke="none"
90
+ />
91
+ ) : null}
92
+
93
+ {/* Guides: they cross at the station point (96.5, 96.5). Half-pixel centres keep a
94
+ 1px stroke on one device row. */}
95
+ <path d="M0 96.5H520M520 90.5v12" />
96
+ <path d="M96.5 0v300M90.5 300.5h12" />
97
+ <path d="M72.5 24v250M0 140.5h210" strokeDasharray="1 4" />
98
+
99
+ {/* Arcs struck from the station point. */}
100
+ <path d="M252.5 96.5A156 156 0 0 1 40 241.8" />
101
+ <path d="M96.5 40.5A56 56 0 0 0 40.5 96.5V241.8" />
102
+ <path d="M40.5 222.5h78M118.5 218.5v8" />
103
+
104
+ {/* A dimension tick and the registration crosses. */}
105
+ <path d="M18.5 40v28M14.5 40.5h8M14.5 67.5h8" />
106
+ <path d="M52 322.5h12M58.5 316v12M404 44.5h12M410.5 38v12M236 292.5h12M242.5 286v12" />
107
+
108
+ {/* A door-swing of three concentric arcs, further along the floor line. */}
109
+ <path d="M300.5 300.5H470M300.5 300.5V236M300.5 244.5A56 56 0 0 1 356.5 300.5M300.5 252.5A48 48 0 0 1 348.5 300.5M300.5 260.5A40 40 0 0 1 340.5 300.5" />
110
+
111
+ {accent ? (
112
+ <>
113
+ <rect x={289} y={222} width={7} height={12} fill="var(--primary)" stroke="none" />
114
+ <circle cx={96.5} cy={96.5} r={3} fill="var(--primary)" stroke="none" />
115
+ </>
116
+ ) : null}
117
+ </svg>
118
+ );
119
+ },
120
+ );
@@ -0,0 +1,7 @@
1
+ export {
2
+ DraftingMarks,
3
+ DRAFTING_MARKS_HEIGHT,
4
+ DRAFTING_MARKS_WIDTH,
5
+ type DraftingMarksAnchor,
6
+ type DraftingMarksProps,
7
+ } from "./drafting-marks";
@@ -55,3 +55,26 @@ export const DefaultLevelIsH2: Story = {
55
55
  await expect(canvas.queryByRole("heading", { level: 1 })).toBeNull();
56
56
  },
57
57
  };
58
+
59
+ /**
60
+ * `size="lg"` is for the sections of a LONG page — a landing page, a docs overview — that a
61
+ * reader scans by its headings: the title moves up to the display rung and the description
62
+ * keeps a readable measure. The eyebrow stays small above it, and the heading level is still
63
+ * `as`'s business, so the outline is unchanged.
64
+ */
65
+ export const LargeForLongPages: Story = {
66
+ args: {
67
+ size: "lg",
68
+ eyebrow: "02 / Blocks",
69
+ title: "Blocks you copy and own",
70
+ description:
71
+ "Compositions from the registry, grouped by what they are for. One command puts the source in your repo.",
72
+ actions: <Button variant="outline">All blocks</Button>,
73
+ },
74
+ play: async ({ canvasElement }) => {
75
+ const canvas = within(canvasElement);
76
+ const heading = canvas.getByRole("heading", { level: 2, name: "Blocks you copy and own" });
77
+ await expect(heading.classList.contains("text-display")).toBe(true);
78
+ await expect(heading.classList.contains("text-title")).toBe(false);
79
+ },
80
+ };
@@ -10,14 +10,21 @@ export interface SectionHeaderProps {
10
10
  eyebrow?: ReactNode;
11
11
  /**
12
12
  * The heading LEVEL the title contributes to the document outline. The
13
- * visual (`text-title`) is identical for every value — pick the level the
14
- * page's structure calls for, not the size you want (WCAG 1.3.1).
13
+ * visual is identical for every value — pick the level the page's structure
14
+ * calls for, not the size you want (WCAG 1.3.1); the size is `size`.
15
15
  *
16
16
  * Use `as="h1"` when this header titles the PAGE (a screen whose route it
17
17
  * names); leave it at the default when it titles a section INSIDE a page
18
18
  * that already has an `<h1>` elsewhere. @default "h2"
19
19
  */
20
20
  as?: "h1" | "h2" | "h3" | "h4" | "h5" | "h6";
21
+ /**
22
+ * Title size: `"default"` (`text-title`) for a section inside a screen; `"lg"`
23
+ * (`text-display`, description at a readable measure) for the sections of a LONG page a
24
+ * reader scans by its headings — a landing page, a docs overview. Visual only: it never
25
+ * changes the heading level (`as`). @default "default"
26
+ */
27
+ size?: "default" | "lg";
21
28
  className?: string;
22
29
  }
23
30
 
@@ -28,16 +35,29 @@ export function SectionHeader({
28
35
  actions,
29
36
  eyebrow,
30
37
  as: TitleTag = "h2",
38
+ size = "default",
31
39
  className,
32
40
  }: SectionHeaderProps) {
41
+ const lg = size === "lg";
33
42
  return (
34
- <div className={cn("flex flex-wrap items-end justify-between gap-4", className)}>
35
- <div className="space-y-1">
43
+ <div
44
+ data-size={size}
45
+ className={cn("flex flex-wrap items-end justify-between gap-4", className)}
46
+ >
47
+ <div className={lg ? "space-y-2" : "space-y-1"}>
36
48
  {eyebrow ? (
37
49
  <div className="text-eyebrow uppercase text-muted-foreground">{eyebrow}</div>
38
50
  ) : null}
39
- <TitleTag className="text-title text-foreground">{title}</TitleTag>
40
- {description ? <p className="text-body text-muted-foreground">{description}</p> : null}
51
+ <TitleTag
52
+ className={cn("text-foreground", lg ? "text-display text-balance" : "text-title")}
53
+ >
54
+ {title}
55
+ </TitleTag>
56
+ {description ? (
57
+ <p className={cn("text-body text-muted-foreground", lg && "max-w-prose text-pretty")}>
58
+ {description}
59
+ </p>
60
+ ) : null}
41
61
  </div>
42
62
  {actions ? <div className="flex items-center gap-2">{actions}</div> : null}
43
63
  </div>
@@ -531,7 +531,12 @@ export const SidebarInset = forwardRef<HTMLDivElement, SidebarInsetProps>(functi
531
531
  ref={ref}
532
532
  data-slot="sidebar-inset"
533
533
  className={cn(
534
- "relative flex w-full flex-1 flex-col bg-background",
534
+ // `min-w-0`: a flex item defaults to `min-width: auto`, so one wide child
535
+ // (a Table, a chart in a CSS grid) pushed the whole page wider than the
536
+ // viewport instead of scrolling inside its card (2026-09-21 new-user
537
+ // test: 1076 px wide at an 820 px viewport). With it, overflow stays
538
+ // where the child's own `overflow-*` puts it.
539
+ "relative flex w-full min-w-0 flex-1 flex-col bg-background",
535
540
  // Ancestor-scoped (#342 fix): `group/sidebar-wrapper` spans the whole
536
541
  // frame, so this reaches a right-hand or reordered `Sidebar` the old
537
542
  // peer-* combinator could not (it only matches a sibling that comes