@elabs-ai/components-ui 5.0.0 → 5.2.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.
- package/README.md +1 -1
- package/dist/{chunk-6QU7OVFA.js → chunk-2ZMPAD6C.js} +7 -7
- package/dist/{chunk-OBEJUAN6.js → chunk-2ZWUTZHE.js} +5 -5
- package/dist/{chunk-U4LHV5DS.js → chunk-36SY7TID.js} +2 -2
- package/dist/{chunk-IHMFEPIT.js → chunk-3BZBNDRP.js} +3 -3
- package/dist/{chunk-5AWXGBSH.js → chunk-3DJ4KY3U.js} +3 -3
- package/dist/{chunk-LR2CU7HK.js → chunk-3ZR5PMKB.js} +2 -2
- package/dist/{chunk-QDTGDYMM.js → chunk-47YSHR3H.js} +3 -3
- package/dist/{chunk-2HXVFC4B.js → chunk-4B2E4OCZ.js} +2 -2
- package/dist/{chunk-3B7W334A.js → chunk-4C4D6T5M.js} +3 -3
- package/dist/{chunk-YWB7HLL7.js → chunk-4NSCLIES.js} +3 -3
- package/dist/{chunk-UPEMEBWH.js → chunk-55BM2IU2.js} +5 -5
- package/dist/{chunk-XMZ5LXL4.js → chunk-5AJQUJ5C.js} +4 -4
- package/dist/{chunk-5V5J7APL.js → chunk-5C5W52O2.js} +2 -2
- package/dist/{chunk-FINAKMC6.js → chunk-5KNLME6F.js} +14 -8
- package/dist/chunk-5KNLME6F.js.map +1 -0
- package/dist/{chunk-FDPONOOT.js → chunk-5MXQ5CP7.js} +2 -2
- package/dist/{chunk-HVFYAQLK.js → chunk-5QQFXDUY.js} +8 -6
- package/dist/{chunk-HVFYAQLK.js.map → chunk-5QQFXDUY.js.map} +1 -1
- package/dist/{chunk-XZ23AFOP.js → chunk-64BKIIJC.js} +2 -2
- package/dist/{chunk-NBMF7SIS.js → chunk-6HTZBBTC.js} +2 -2
- package/dist/{chunk-5RC32MZH.js → chunk-72H7HUTH.js} +2 -2
- package/dist/{chunk-URVAZW44.js → chunk-7KV7H2TW.js} +2 -2
- package/dist/{chunk-VFF3AN4Y.js → chunk-7Z2RAGOA.js} +2 -2
- package/dist/{chunk-LXW3GNF7.js → chunk-7ZJLR6RP.js} +7 -7
- package/dist/{chunk-R3SYH7RG.js → chunk-A3JF66ZC.js} +16 -11
- package/dist/chunk-A3JF66ZC.js.map +1 -0
- package/dist/{chunk-IGP5E4FC.js → chunk-A3TT32GE.js} +5 -5
- package/dist/{chunk-LVRULYU4.js → chunk-A4ZSNEZD.js} +9 -9
- package/dist/{chunk-BM6NGS3A.js → chunk-AE6LFFME.js} +3 -3
- package/dist/{chunk-KTH3GWAL.js → chunk-AR5PJ5ZR.js} +6 -6
- package/dist/{chunk-RNC4M6SG.js → chunk-B3DANITU.js} +3 -3
- package/dist/{chunk-MGAXCPT7.js → chunk-B7FAQKHH.js} +2 -2
- package/dist/{chunk-35ZTVB35.js → chunk-BGXBANS2.js} +6 -6
- package/dist/{chunk-NJAGSGPF.js → chunk-C4FNDXBM.js} +4 -4
- package/dist/{chunk-VA2OONPE.js → chunk-C5QBV5RE.js} +2 -2
- package/dist/{chunk-LOSXINSS.js → chunk-C6I5I5LA.js} +5 -5
- package/dist/{chunk-7WXDSTNR.js → chunk-CDMJSXCB.js} +2 -2
- package/dist/{chunk-A47AZPCL.js → chunk-CEQ3YKHR.js} +2 -2
- package/dist/{chunk-A43B4IT7.js → chunk-CGY25FAG.js} +5 -5
- package/dist/{chunk-EHGIW7GA.js → chunk-CMP4F537.js} +2 -2
- package/dist/{chunk-6OFWWIEG.js → chunk-D5INX2EF.js} +3 -3
- package/dist/{chunk-HDS64Z5L.js → chunk-DIL73NE3.js} +2 -2
- package/dist/{chunk-3EKVSKGJ.js → chunk-DXC3DTCV.js} +3 -3
- package/dist/{chunk-ZNFHDBUW.js → chunk-EBNPVPR7.js} +2 -2
- package/dist/{chunk-ZXBUOHCR.js → chunk-EHN5ZAHP.js} +3 -3
- package/dist/{chunk-4PITSMJ3.js → chunk-EJ3XWNY3.js} +2 -2
- package/dist/{chunk-4E73UAFA.js → chunk-F6FF4EJN.js} +7 -7
- package/dist/{chunk-FYCCNQXQ.js → chunk-FC2LHNJG.js} +7 -7
- package/dist/{chunk-6OPDRLMU.js → chunk-FCVHZDP7.js} +8 -8
- package/dist/{chunk-B5QQLMEE.js → chunk-FG3PDWE3.js} +2 -2
- package/dist/{chunk-EY2PGOG3.js → chunk-FKDI2T7X.js} +4 -4
- package/dist/{chunk-XONGYCW3.js → chunk-FNRVVVXX.js} +3 -3
- package/dist/{chunk-BLNXHETI.js → chunk-FWAFP76U.js} +4 -4
- package/dist/{chunk-KBNWM27Q.js → chunk-FXWWDMMP.js} +9 -2
- package/dist/chunk-FXWWDMMP.js.map +1 -0
- package/dist/{chunk-KUAVM54Y.js → chunk-FZEG2R3E.js} +2 -2
- package/dist/{chunk-FKUP7QRJ.js → chunk-GTBVTLZJ.js} +2 -2
- package/dist/{chunk-NTTSHOOK.js → chunk-HF6BGFUV.js} +4 -4
- package/dist/{chunk-QNEOO22E.js → chunk-HND6FAMX.js} +2 -2
- package/dist/{chunk-ECCNRCC4.js → chunk-HNLYRHAU.js} +2 -2
- package/dist/{chunk-7G63B2B7.js → chunk-HUIYDDDL.js} +7 -7
- package/dist/{chunk-DCI6IOJX.js → chunk-HUXLE3K3.js} +4 -4
- package/dist/{chunk-HANBQNW3.js → chunk-I2C5RZ4S.js} +25 -1
- package/dist/{chunk-HANBQNW3.js.map → chunk-I2C5RZ4S.js.map} +1 -1
- package/dist/{chunk-J2P4YZLC.js → chunk-I3LBIBVN.js} +6 -6
- package/dist/{chunk-XYACSO57.js → chunk-I3U52BDH.js} +2 -2
- package/dist/{chunk-RRZUMIYG.js → chunk-IIY5JRNW.js} +3 -3
- package/dist/{chunk-4GQFIJAE.js → chunk-IV6OYZTL.js} +3 -3
- package/dist/{chunk-UQHWOPUY.js → chunk-IVEDMK5U.js} +2 -2
- package/dist/{chunk-U26XDHMX.js → chunk-JQIXRCLG.js} +5 -5
- package/dist/{chunk-WW3CD7AU.js → chunk-JU4KW7JN.js} +7 -7
- package/dist/{chunk-YIVL6HWS.js → chunk-JVCIAEFT.js} +2 -2
- package/dist/{chunk-DUF2VZON.js → chunk-K4V2ELUZ.js} +2 -2
- package/dist/{chunk-BPXLHGWI.js → chunk-KK2TIWTF.js} +2 -2
- package/dist/{chunk-NRSSSVWB.js → chunk-KPZFLTZ2.js} +2 -2
- package/dist/{chunk-OYM3NHSD.js → chunk-KXYL3CUS.js} +2 -2
- package/dist/{chunk-KOVHUAHG.js → chunk-L5O2O67Y.js} +6 -6
- package/dist/{chunk-RM5JIUVW.js → chunk-LG33MONJ.js} +2 -2
- package/dist/{chunk-YACASX6X.js → chunk-LLYLDZXC.js} +2 -2
- package/dist/{chunk-RWUKMJYA.js → chunk-LMV225AS.js} +2 -2
- package/dist/{chunk-533R5EKD.js → chunk-LVY7B5PD.js} +5 -5
- package/dist/{chunk-OV4GQOLC.js → chunk-M2KNQZUL.js} +2 -2
- package/dist/{chunk-7PS5MKVH.js → chunk-MIWFBH5S.js} +5 -5
- package/dist/{chunk-XAFRTZQF.js → chunk-MJAIURHO.js} +2 -2
- package/dist/{chunk-YL7VBHPZ.js → chunk-NXCOVGDU.js} +3 -3
- package/dist/{chunk-6TJVJPNU.js → chunk-O6AIFSTX.js} +46 -1
- package/dist/chunk-O6AIFSTX.js.map +1 -0
- package/dist/{chunk-WX3LWMVU.js → chunk-O6V65J5J.js} +2 -2
- package/dist/{chunk-EJQYE4MY.js → chunk-OFFWEDKY.js} +2 -2
- package/dist/{chunk-UXSV6RVS.js → chunk-OKY7ACZK.js} +2 -2
- package/dist/{chunk-ITFDGFOT.js → chunk-ONXBRQJT.js} +3 -3
- package/dist/{chunk-ULIDYFM7.js → chunk-OPBSVEMX.js} +2 -2
- package/dist/{chunk-333EWYWL.js → chunk-PCNQ6NP2.js} +6 -6
- package/dist/{chunk-6HGS5Z2Z.js → chunk-PFGQDW3H.js} +4 -4
- package/dist/{chunk-K6YRTASS.js → chunk-PGKQZBLZ.js} +2 -2
- package/dist/{chunk-57C25JYV.js → chunk-PQZD5W3E.js} +2 -2
- package/dist/{chunk-5Z55AFOW.js → chunk-PT5P4AAU.js} +2 -2
- package/dist/{chunk-EL3OXVOW.js → chunk-PUACHQRH.js} +2 -2
- package/dist/{chunk-HRYH7XQP.js → chunk-QKZX5HDY.js} +2 -2
- package/dist/{chunk-KZWC6JCI.js → chunk-QXXHK34V.js} +6 -6
- package/dist/{chunk-JGS2IHER.js → chunk-R27VUCWR.js} +4 -4
- package/dist/{chunk-QGX37P5L.js → chunk-R6CITZBB.js} +2 -2
- package/dist/{chunk-X6J4KKZZ.js → chunk-RFTC5UVB.js} +4 -4
- package/dist/{chunk-YXHHUJOZ.js → chunk-RHZSAWAU.js} +3 -3
- package/dist/{chunk-LMO3QK7Q.js → chunk-S7YR3FYZ.js} +3 -3
- package/dist/{chunk-GRWGNWIJ.js → chunk-SCCBEFVK.js} +6 -6
- package/dist/{chunk-R7DDZIE3.js → chunk-SD5MGHIJ.js} +4 -4
- package/dist/{chunk-PP7POY7C.js → chunk-SEGTBIR4.js} +2 -2
- package/dist/{chunk-D3C3VVCX.js → chunk-SGBCLZQF.js} +2 -2
- package/dist/{chunk-E3ES2KR6.js → chunk-SJHDX73F.js} +6 -6
- package/dist/{chunk-EKY3A5LO.js → chunk-SLDJYJEG.js} +3 -3
- package/dist/{chunk-KWQ6HV5Z.js → chunk-SQLEVIAD.js} +4 -4
- package/dist/{chunk-T4JNXV75.js → chunk-SR3SC2Q3.js} +6 -6
- package/dist/{chunk-YPLKH5H4.js → chunk-SSQG36MH.js} +6 -6
- package/dist/{chunk-NQY3QNLR.js → chunk-U5BZXNHW.js} +4 -4
- package/dist/{chunk-TEKBTTP2.js → chunk-U756JCDK.js} +2 -2
- package/dist/{chunk-DFYPQ52O.js → chunk-U7CSWQAE.js} +8 -8
- package/dist/{chunk-WCCCW4KD.js → chunk-U7FC5J6J.js} +6 -6
- package/dist/{chunk-W6HCXQBH.js → chunk-UG2T7LMX.js} +4 -4
- package/dist/{chunk-JNWXHPZG.js → chunk-UPGIQXUY.js} +2 -2
- package/dist/{chunk-WZTFU6FJ.js → chunk-UUSOIPM2.js} +2 -2
- package/dist/{chunk-7P24I5OL.js → chunk-UVVVKPSH.js} +2 -2
- package/dist/{chunk-V4DDHF7S.js → chunk-V6U75PIG.js} +3 -3
- package/dist/{chunk-BN4CKDFU.js → chunk-VAWYYETZ.js} +23 -23
- package/dist/chunk-VFS52GGI.js +2 -0
- package/dist/chunk-VFS52GGI.js.map +1 -0
- package/dist/{chunk-DT6RNLCP.js → chunk-W26KFY35.js} +2 -2
- package/dist/{chunk-OPMMD25Z.js → chunk-WDZ47ZTX.js} +5 -5
- package/dist/chunk-WEEVXQIM.js +45 -0
- package/dist/chunk-WEEVXQIM.js.map +1 -0
- package/dist/{chunk-IZJOZJDL.js → chunk-WEM6XJ7Z.js} +2 -2
- package/dist/{chunk-5HBMI2DO.js → chunk-WKNOKJA3.js} +2 -2
- package/dist/{chunk-WTB4DDZP.js → chunk-WL2EZDSD.js} +6 -6
- package/dist/{chunk-QTIKGWU4.js → chunk-XE6GYGWS.js} +4 -4
- package/dist/{chunk-PYPNGKRD.js → chunk-Y3CKZ7SH.js} +5 -5
- package/dist/{chunk-VRIAWF3A.js → chunk-YA2CG4YL.js} +2 -2
- package/dist/{chunk-AXKZBRZK.js → chunk-YA2QGLUL.js} +2 -2
- package/dist/{chunk-35DUHYPC.js → chunk-YFGFNFVW.js} +3 -3
- package/dist/{chunk-6NKILKS6.js → chunk-YFKKMDJL.js} +2 -2
- package/dist/chunk-YHVXYOL6.js +80 -0
- package/dist/chunk-YHVXYOL6.js.map +1 -0
- package/dist/{chunk-CQ5CH3SB.js → chunk-YUFDC6RW.js} +2 -2
- package/dist/{chunk-H5UA5JW4.js → chunk-ZESSUMCO.js} +3 -3
- package/dist/{chunk-N44PNGDS.js → chunk-ZFMM2NLA.js} +2 -2
- package/dist/{chunk-3LWAAK3J.js → chunk-ZGNWDYSC.js} +6 -6
- package/dist/{chunk-TU24Y4HN.js → chunk-ZSYT5H6U.js} +2 -2
- package/dist/components/accordion/accordion.js +2 -2
- package/dist/components/accordion/index.js +2 -2
- package/dist/components/advanced-group/advanced-group.js +6 -6
- package/dist/components/advanced-group/index.js +6 -6
- package/dist/components/alert/alert.js +2 -2
- package/dist/components/alert/index.js +2 -2
- package/dist/components/alert-dialog/alert-dialog.js +3 -3
- package/dist/components/alert-dialog/index.js +3 -3
- package/dist/components/ambient-field/ambient-field.js +2 -2
- package/dist/components/ambient-field/index.js +2 -2
- package/dist/components/app-shell/app-shell.js +4 -4
- package/dist/components/app-shell/index.js +4 -4
- package/dist/components/app-sidebar/app-sidebar.js +12 -12
- package/dist/components/app-sidebar/index.js +12 -12
- package/dist/components/attribution-panel/attribution-panel.js +7 -7
- package/dist/components/attribution-panel/attributions.generated.js +1 -1
- package/dist/components/attribution-panel/index.js +7 -7
- package/dist/components/avatar/avatar.js +2 -2
- package/dist/components/avatar/index.js +2 -2
- package/dist/components/badge/badge.js +2 -2
- package/dist/components/badge/index.js +2 -2
- package/dist/components/bento-grid/bento-grid.js +3 -3
- package/dist/components/bento-grid/index.js +3 -3
- package/dist/components/bounded-number/bounded-number.js +9 -9
- package/dist/components/bounded-number/index.js +9 -9
- package/dist/components/breadcrumb/breadcrumb.js +4 -4
- package/dist/components/breadcrumb/index.js +4 -4
- package/dist/components/button/button.js +2 -2
- package/dist/components/button/index.js +2 -2
- package/dist/components/button-group/button-group.js +3 -3
- package/dist/components/button-group/index.js +3 -3
- package/dist/components/calendar/calendar.js +3 -3
- package/dist/components/calendar/index.js +3 -3
- package/dist/components/card/card.js +2 -2
- package/dist/components/card/index.js +2 -2
- package/dist/components/carousel/carousel.js +5 -5
- package/dist/components/carousel/index.js +5 -5
- package/dist/components/change-review/change-review.js +10 -10
- package/dist/components/change-review/index.js +10 -10
- package/dist/components/checkbox/checkbox.js +2 -2
- package/dist/components/checkbox/index.js +2 -2
- package/dist/components/collapsible/collapsible.js +2 -2
- package/dist/components/collapsible/index.js +2 -2
- package/dist/components/collapsible-panel/index.js +2 -2
- package/dist/components/collapsible-panel/use-collapsible-panel.js +2 -2
- package/dist/components/color-picker/color-picker.js +5 -5
- package/dist/components/color-picker/index.js +5 -5
- package/dist/components/combobox/combobox.js +10 -10
- package/dist/components/combobox/index.js +10 -10
- package/dist/components/command/command.js +7 -7
- package/dist/components/command/index.js +7 -7
- package/dist/components/command-chip/command-chip.js +3 -3
- package/dist/components/command-chip/index.js +3 -3
- package/dist/components/command-trigger/command-trigger.js +3 -3
- package/dist/components/command-trigger/index.js +3 -3
- package/dist/components/confirm-dialog/confirm-dialog.js +7 -7
- package/dist/components/confirm-dialog/index.js +7 -7
- package/dist/components/context-menu/context-menu.js +2 -2
- package/dist/components/context-menu/index.js +2 -2
- package/dist/components/context-rail/context-rail.js +14 -14
- package/dist/components/context-rail/index.js +14 -14
- package/dist/components/copyable-value/copyable-value.js +5 -5
- package/dist/components/copyable-value/index.js +5 -5
- package/dist/components/date-picker/date-picker.js +7 -7
- package/dist/components/date-picker/index.js +7 -7
- package/dist/components/date-range-picker/date-range-picker.js +7 -7
- package/dist/components/date-range-picker/index.js +7 -7
- package/dist/components/descriptions/descriptions.js +2 -2
- package/dist/components/descriptions/index.js +2 -2
- package/dist/components/dialog/dialog.js +6 -6
- package/dist/components/dialog/index.js +6 -6
- package/dist/components/drafting-marks/drafting-marks.js +14 -0
- package/dist/components/drafting-marks/drafting-marks.js.map +1 -0
- package/dist/components/drafting-marks/index.js +15 -0
- package/dist/components/drafting-marks/index.js.map +1 -0
- package/dist/components/drawer/drawer.js +2 -2
- package/dist/components/drawer/index.js +2 -2
- package/dist/components/dropdown-menu/dropdown-menu.js +2 -2
- package/dist/components/dropdown-menu/index.js +2 -2
- package/dist/components/empty-state/empty-state.js +6 -6
- package/dist/components/empty-state/index.js +6 -6
- package/dist/components/error-state/error-state.js +6 -6
- package/dist/components/error-state/index.js +6 -6
- package/dist/components/expand-dialog/expand-dialog.js +7 -7
- package/dist/components/expand-dialog/index.js +7 -7
- package/dist/components/field/field.js +4 -4
- package/dist/components/field/index.js +4 -4
- package/dist/components/field-row/field-row.js +3 -3
- package/dist/components/field-row/index.js +3 -3
- package/dist/components/file-upload/file-upload.js +6 -6
- package/dist/components/file-upload/index.js +6 -6
- package/dist/components/form/form.js +3 -3
- package/dist/components/hover-card/hover-card.js +2 -2
- package/dist/components/hover-card/index.js +2 -2
- package/dist/components/icon-button/icon-button.js +4 -4
- package/dist/components/icon-button/index.js +4 -4
- package/dist/components/input/index.js +2 -2
- package/dist/components/input/input.js +2 -2
- package/dist/components/input-group/index.js +5 -5
- package/dist/components/input-group/input-group.js +5 -5
- package/dist/components/input-otp/index.js +2 -2
- package/dist/components/input-otp/input-otp.js +2 -2
- package/dist/components/install-tabs/index.js +8 -8
- package/dist/components/install-tabs/install-tabs.js +8 -8
- package/dist/components/integration-matrix/index.js +7 -7
- package/dist/components/integration-matrix/integration-matrix.js +7 -7
- package/dist/components/kbd/index.js +2 -2
- package/dist/components/kbd/kbd.js +2 -2
- package/dist/components/key-value-editor/index.js +6 -6
- package/dist/components/key-value-editor/key-value-editor.js +6 -6
- package/dist/components/keyboard-shortcuts/index.js +10 -10
- package/dist/components/keyboard-shortcuts/keyboard-shortcuts.js +10 -10
- package/dist/components/label/index.js +2 -2
- package/dist/components/label/label.js +2 -2
- package/dist/components/link-preview/index.js +3 -3
- package/dist/components/link-preview/link-preview.js +3 -3
- package/dist/components/list-editor/index.js +6 -6
- package/dist/components/list-editor/list-editor.js +6 -6
- package/dist/components/loading-state/index.js +6 -6
- package/dist/components/loading-state/loading-state.js +6 -6
- package/dist/components/locale-provider/index.js +2 -2
- package/dist/components/locale-provider/locale-provider.js +2 -2
- package/dist/components/locale-provider/messages.js +1 -1
- package/dist/components/match-highlight/index.js +2 -2
- package/dist/components/match-highlight/match-highlight.js +2 -2
- package/dist/components/mention-input/index.js +6 -6
- package/dist/components/mention-input/mention-input.js +6 -6
- package/dist/components/menubar/index.js +2 -2
- package/dist/components/menubar/menubar.js +2 -2
- package/dist/components/meter/index.js +2 -2
- package/dist/components/meter/meter.js +2 -2
- package/dist/components/metric-card/index.js +8 -8
- package/dist/components/metric-card/metric-card.js +8 -8
- package/dist/components/model-picker/index.js +11 -11
- package/dist/components/model-picker/model-picker.js +11 -11
- package/dist/components/nav-main/index.js +13 -13
- package/dist/components/nav-main/nav-main.js +13 -13
- package/dist/components/nav-notifications/index.js +7 -7
- package/dist/components/nav-notifications/nav-notifications.js +7 -7
- package/dist/components/nav-user/index.js +14 -14
- package/dist/components/nav-user/nav-user.js +14 -14
- package/dist/components/navigation-menu/index.js +2 -2
- package/dist/components/navigation-menu/navigation-menu.js +2 -2
- package/dist/components/number-input/index.js +8 -8
- package/dist/components/number-input/number-input.js +8 -8
- package/dist/components/page-shell/index.js +2 -2
- package/dist/components/page-shell/page-shell.js +2 -2
- package/dist/components/pagination/index.js +5 -5
- package/dist/components/pagination/pagination.js +5 -5
- package/dist/components/popover/index.js +2 -2
- package/dist/components/popover/popover.js +2 -2
- package/dist/components/progress/index.js +2 -2
- package/dist/components/progress/progress.js +2 -2
- package/dist/components/radio-group/index.js +2 -2
- package/dist/components/radio-group/radio-group.js +2 -2
- package/dist/components/rating/index.js +2 -2
- package/dist/components/rating/rating.js +2 -2
- package/dist/components/resizable/index.js +2 -2
- package/dist/components/resizable/resizable.js +2 -2
- package/dist/components/reveal/index.js +2 -2
- package/dist/components/reveal/reveal.js +2 -2
- package/dist/components/revision-timeline/index.js +4 -4
- package/dist/components/revision-timeline/revision-timeline.js +4 -4
- package/dist/components/schema-form/index.js +29 -29
- package/dist/components/schema-form/schema-form.js +25 -25
- package/dist/components/scroll-area/index.js +2 -2
- package/dist/components/scroll-area/scroll-area.js +2 -2
- package/dist/components/section-header/index.js +2 -2
- package/dist/components/section-header/section-header.js +2 -2
- package/dist/components/segmented-field/index.js +5 -5
- package/dist/components/segmented-field/segmented-field.js +5 -5
- package/dist/components/select/index.js +2 -2
- package/dist/components/select/select.js +2 -2
- package/dist/components/separator/index.js +2 -2
- package/dist/components/separator/separator.js +2 -2
- package/dist/components/sheet/index.js +4 -4
- package/dist/components/sheet/sheet.js +4 -4
- package/dist/components/side-dock/index.js +6 -6
- package/dist/components/side-dock/side-dock.js +6 -6
- package/dist/components/sidebar/index.js +11 -11
- package/dist/components/sidebar/sidebar.js +11 -11
- package/dist/components/skeleton/index.js +2 -2
- package/dist/components/skeleton/skeleton.js +2 -2
- package/dist/components/skip-link/index.js +2 -2
- package/dist/components/skip-link/skip-link.js +2 -2
- package/dist/components/slider/index.js +2 -2
- package/dist/components/slider/slider.js +2 -2
- package/dist/components/slider-number/index.js +10 -10
- package/dist/components/slider-number/slider-number.js +10 -10
- package/dist/components/sonner/index.js +2 -2
- package/dist/components/sonner/sonner.js +2 -2
- package/dist/components/spec-playground/index.js +6 -6
- package/dist/components/spec-playground/spec-playground.js +6 -6
- package/dist/components/spinner/index.js +4 -4
- package/dist/components/spinner/spinner.js +4 -4
- package/dist/components/split-panel/index.js +2 -2
- package/dist/components/split-panel/split-panel.js +2 -2
- package/dist/components/state-panel/index.js +5 -5
- package/dist/components/state-panel/state-panel.js +5 -5
- package/dist/components/status-badge/index.js +3 -3
- package/dist/components/status-badge/status-badge.js +3 -3
- package/dist/components/surface-tour/index.js +8 -8
- package/dist/components/surface-tour/surface-tour.js +8 -8
- package/dist/components/switch/index.js +2 -2
- package/dist/components/switch/switch.js +2 -2
- package/dist/components/table/index.js +4 -4
- package/dist/components/table/table.js +4 -4
- package/dist/components/tabs/index.js +2 -2
- package/dist/components/tabs/tabs.js +2 -2
- package/dist/components/tag-input/index.js +7 -7
- package/dist/components/tag-input/tag-input.js +7 -7
- package/dist/components/team-switcher/index.js +13 -13
- package/dist/components/team-switcher/team-switcher.js +13 -13
- package/dist/components/textarea/index.js +2 -2
- package/dist/components/textarea/textarea.js +2 -2
- package/dist/components/theme-family-switch/index.js +5 -5
- package/dist/components/theme-family-switch/theme-family-switch.js +5 -5
- package/dist/components/theme-switcher/index.js +7 -7
- package/dist/components/theme-switcher/theme-switcher.js +7 -7
- package/dist/components/timeline/index.js +4 -4
- package/dist/components/timeline/timeline.js +4 -4
- package/dist/components/toggle/index.js +2 -2
- package/dist/components/toggle/toggle.js +2 -2
- package/dist/components/toggle-group/index.js +3 -3
- package/dist/components/toggle-group/toggle-group.js +3 -3
- package/dist/components/token-spotlight/index.js +2 -2
- package/dist/components/token-spotlight/token-spotlight.js +2 -2
- package/dist/components/toolbar/index.js +4 -4
- package/dist/components/toolbar/toolbar.js +4 -4
- package/dist/components/tooltip/index.js +2 -2
- package/dist/components/tooltip/tooltip.js +2 -2
- package/dist/components/top-nav/index.js +2 -2
- package/dist/components/top-nav/top-nav.js +2 -2
- package/dist/components/transfer/index.js +10 -10
- package/dist/components/transfer/transfer.js +10 -10
- package/dist/components/tree/index.js +7 -7
- package/dist/components/tree/tree.js +7 -7
- package/dist/components/tree-select/index.js +11 -11
- package/dist/components/tree-select/tree-select.js +11 -11
- package/dist/components/typography/index.js +3 -3
- package/dist/components/typography/prose.js +3 -3
- package/dist/components/typography/typography.js +2 -2
- package/dist/components/view-toolbar/index.js +8 -8
- package/dist/components/view-toolbar/view-toolbar.js +8 -8
- package/dist/components/virtual-select/index.js +8 -8
- package/dist/components/virtual-select/virtual-select.js +8 -8
- package/dist/components/wizard/index.js +3 -3
- package/dist/components/wizard/wizard.js +3 -3
- package/dist/components/workspace-picker/index.js +13 -13
- package/dist/components/workspace-picker/workspace-picker.js +13 -13
- package/dist/form.js +3 -3
- package/dist/illustrations/empty-list-illustration.js +3 -3
- package/dist/illustrations/error-illustration.js +3 -3
- package/dist/illustrations/first-run-illustration.js +3 -3
- package/dist/illustrations/illustration-base.js +2 -2
- package/dist/illustrations/index.js +11 -11
- package/dist/illustrations/no-access-illustration.js +3 -3
- package/dist/illustrations/no-results-illustration.js +3 -3
- package/dist/illustrations/offline-illustration.js +3 -3
- package/dist/illustrations/success-illustration.js +3 -3
- package/dist/index.d.ts +60 -5
- package/dist/index.js +229 -217
- package/dist/lib/cn.js +8 -1
- package/dist/lib/cn.js.map +1 -1
- package/dist/lib/streamdown-translations.js +3 -3
- package/package.json +4 -4
- package/src/components/attribution-panel/attributions.generated.ts +25 -1
- package/src/components/drafting-marks/drafting-marks.stories.tsx +88 -0
- package/src/components/drafting-marks/drafting-marks.test.tsx +55 -0
- package/src/components/drafting-marks/drafting-marks.tsx +120 -0
- package/src/components/drafting-marks/index.ts +7 -0
- package/src/components/locale-provider/messages.ts +47 -0
- package/src/components/section-header/section-header.stories.tsx +23 -0
- package/src/components/section-header/section-header.tsx +26 -6
- package/src/components/sidebar/sidebar.tsx +6 -1
- package/src/components/toolbar/toolbar.tsx +4 -2
- package/src/components/tree/tree.stories.tsx +28 -0
- package/src/components/tree/tree.tsx +17 -2
- package/src/decoration.stories.tsx +153 -123
- package/src/index.ts +4 -0
- package/src/lib/cn.test.ts +29 -0
- package/src/lib/cn.ts +7 -0
- package/dist/chunk-6TJVJPNU.js.map +0 -1
- package/dist/chunk-FINAKMC6.js.map +0 -1
- package/dist/chunk-KBNWM27Q.js.map +0 -1
- package/dist/chunk-OZTM6PYF.js +0 -30
- package/dist/chunk-OZTM6PYF.js.map +0 -1
- package/dist/chunk-R3SYH7RG.js.map +0 -1
- /package/dist/{chunk-6QU7OVFA.js.map → chunk-2ZMPAD6C.js.map} +0 -0
- /package/dist/{chunk-OBEJUAN6.js.map → chunk-2ZWUTZHE.js.map} +0 -0
- /package/dist/{chunk-U4LHV5DS.js.map → chunk-36SY7TID.js.map} +0 -0
- /package/dist/{chunk-IHMFEPIT.js.map → chunk-3BZBNDRP.js.map} +0 -0
- /package/dist/{chunk-5AWXGBSH.js.map → chunk-3DJ4KY3U.js.map} +0 -0
- /package/dist/{chunk-LR2CU7HK.js.map → chunk-3ZR5PMKB.js.map} +0 -0
- /package/dist/{chunk-QDTGDYMM.js.map → chunk-47YSHR3H.js.map} +0 -0
- /package/dist/{chunk-2HXVFC4B.js.map → chunk-4B2E4OCZ.js.map} +0 -0
- /package/dist/{chunk-3B7W334A.js.map → chunk-4C4D6T5M.js.map} +0 -0
- /package/dist/{chunk-YWB7HLL7.js.map → chunk-4NSCLIES.js.map} +0 -0
- /package/dist/{chunk-UPEMEBWH.js.map → chunk-55BM2IU2.js.map} +0 -0
- /package/dist/{chunk-XMZ5LXL4.js.map → chunk-5AJQUJ5C.js.map} +0 -0
- /package/dist/{chunk-5V5J7APL.js.map → chunk-5C5W52O2.js.map} +0 -0
- /package/dist/{chunk-FDPONOOT.js.map → chunk-5MXQ5CP7.js.map} +0 -0
- /package/dist/{chunk-XZ23AFOP.js.map → chunk-64BKIIJC.js.map} +0 -0
- /package/dist/{chunk-NBMF7SIS.js.map → chunk-6HTZBBTC.js.map} +0 -0
- /package/dist/{chunk-5RC32MZH.js.map → chunk-72H7HUTH.js.map} +0 -0
- /package/dist/{chunk-URVAZW44.js.map → chunk-7KV7H2TW.js.map} +0 -0
- /package/dist/{chunk-VFF3AN4Y.js.map → chunk-7Z2RAGOA.js.map} +0 -0
- /package/dist/{chunk-LXW3GNF7.js.map → chunk-7ZJLR6RP.js.map} +0 -0
- /package/dist/{chunk-IGP5E4FC.js.map → chunk-A3TT32GE.js.map} +0 -0
- /package/dist/{chunk-LVRULYU4.js.map → chunk-A4ZSNEZD.js.map} +0 -0
- /package/dist/{chunk-BM6NGS3A.js.map → chunk-AE6LFFME.js.map} +0 -0
- /package/dist/{chunk-KTH3GWAL.js.map → chunk-AR5PJ5ZR.js.map} +0 -0
- /package/dist/{chunk-RNC4M6SG.js.map → chunk-B3DANITU.js.map} +0 -0
- /package/dist/{chunk-MGAXCPT7.js.map → chunk-B7FAQKHH.js.map} +0 -0
- /package/dist/{chunk-35ZTVB35.js.map → chunk-BGXBANS2.js.map} +0 -0
- /package/dist/{chunk-NJAGSGPF.js.map → chunk-C4FNDXBM.js.map} +0 -0
- /package/dist/{chunk-VA2OONPE.js.map → chunk-C5QBV5RE.js.map} +0 -0
- /package/dist/{chunk-LOSXINSS.js.map → chunk-C6I5I5LA.js.map} +0 -0
- /package/dist/{chunk-7WXDSTNR.js.map → chunk-CDMJSXCB.js.map} +0 -0
- /package/dist/{chunk-A47AZPCL.js.map → chunk-CEQ3YKHR.js.map} +0 -0
- /package/dist/{chunk-A43B4IT7.js.map → chunk-CGY25FAG.js.map} +0 -0
- /package/dist/{chunk-EHGIW7GA.js.map → chunk-CMP4F537.js.map} +0 -0
- /package/dist/{chunk-6OFWWIEG.js.map → chunk-D5INX2EF.js.map} +0 -0
- /package/dist/{chunk-HDS64Z5L.js.map → chunk-DIL73NE3.js.map} +0 -0
- /package/dist/{chunk-3EKVSKGJ.js.map → chunk-DXC3DTCV.js.map} +0 -0
- /package/dist/{chunk-ZNFHDBUW.js.map → chunk-EBNPVPR7.js.map} +0 -0
- /package/dist/{chunk-ZXBUOHCR.js.map → chunk-EHN5ZAHP.js.map} +0 -0
- /package/dist/{chunk-4PITSMJ3.js.map → chunk-EJ3XWNY3.js.map} +0 -0
- /package/dist/{chunk-4E73UAFA.js.map → chunk-F6FF4EJN.js.map} +0 -0
- /package/dist/{chunk-FYCCNQXQ.js.map → chunk-FC2LHNJG.js.map} +0 -0
- /package/dist/{chunk-6OPDRLMU.js.map → chunk-FCVHZDP7.js.map} +0 -0
- /package/dist/{chunk-B5QQLMEE.js.map → chunk-FG3PDWE3.js.map} +0 -0
- /package/dist/{chunk-EY2PGOG3.js.map → chunk-FKDI2T7X.js.map} +0 -0
- /package/dist/{chunk-XONGYCW3.js.map → chunk-FNRVVVXX.js.map} +0 -0
- /package/dist/{chunk-BLNXHETI.js.map → chunk-FWAFP76U.js.map} +0 -0
- /package/dist/{chunk-KUAVM54Y.js.map → chunk-FZEG2R3E.js.map} +0 -0
- /package/dist/{chunk-FKUP7QRJ.js.map → chunk-GTBVTLZJ.js.map} +0 -0
- /package/dist/{chunk-NTTSHOOK.js.map → chunk-HF6BGFUV.js.map} +0 -0
- /package/dist/{chunk-QNEOO22E.js.map → chunk-HND6FAMX.js.map} +0 -0
- /package/dist/{chunk-ECCNRCC4.js.map → chunk-HNLYRHAU.js.map} +0 -0
- /package/dist/{chunk-7G63B2B7.js.map → chunk-HUIYDDDL.js.map} +0 -0
- /package/dist/{chunk-DCI6IOJX.js.map → chunk-HUXLE3K3.js.map} +0 -0
- /package/dist/{chunk-J2P4YZLC.js.map → chunk-I3LBIBVN.js.map} +0 -0
- /package/dist/{chunk-XYACSO57.js.map → chunk-I3U52BDH.js.map} +0 -0
- /package/dist/{chunk-RRZUMIYG.js.map → chunk-IIY5JRNW.js.map} +0 -0
- /package/dist/{chunk-4GQFIJAE.js.map → chunk-IV6OYZTL.js.map} +0 -0
- /package/dist/{chunk-UQHWOPUY.js.map → chunk-IVEDMK5U.js.map} +0 -0
- /package/dist/{chunk-U26XDHMX.js.map → chunk-JQIXRCLG.js.map} +0 -0
- /package/dist/{chunk-WW3CD7AU.js.map → chunk-JU4KW7JN.js.map} +0 -0
- /package/dist/{chunk-YIVL6HWS.js.map → chunk-JVCIAEFT.js.map} +0 -0
- /package/dist/{chunk-DUF2VZON.js.map → chunk-K4V2ELUZ.js.map} +0 -0
- /package/dist/{chunk-BPXLHGWI.js.map → chunk-KK2TIWTF.js.map} +0 -0
- /package/dist/{chunk-NRSSSVWB.js.map → chunk-KPZFLTZ2.js.map} +0 -0
- /package/dist/{chunk-OYM3NHSD.js.map → chunk-KXYL3CUS.js.map} +0 -0
- /package/dist/{chunk-KOVHUAHG.js.map → chunk-L5O2O67Y.js.map} +0 -0
- /package/dist/{chunk-RM5JIUVW.js.map → chunk-LG33MONJ.js.map} +0 -0
- /package/dist/{chunk-YACASX6X.js.map → chunk-LLYLDZXC.js.map} +0 -0
- /package/dist/{chunk-RWUKMJYA.js.map → chunk-LMV225AS.js.map} +0 -0
- /package/dist/{chunk-533R5EKD.js.map → chunk-LVY7B5PD.js.map} +0 -0
- /package/dist/{chunk-OV4GQOLC.js.map → chunk-M2KNQZUL.js.map} +0 -0
- /package/dist/{chunk-7PS5MKVH.js.map → chunk-MIWFBH5S.js.map} +0 -0
- /package/dist/{chunk-XAFRTZQF.js.map → chunk-MJAIURHO.js.map} +0 -0
- /package/dist/{chunk-YL7VBHPZ.js.map → chunk-NXCOVGDU.js.map} +0 -0
- /package/dist/{chunk-WX3LWMVU.js.map → chunk-O6V65J5J.js.map} +0 -0
- /package/dist/{chunk-EJQYE4MY.js.map → chunk-OFFWEDKY.js.map} +0 -0
- /package/dist/{chunk-UXSV6RVS.js.map → chunk-OKY7ACZK.js.map} +0 -0
- /package/dist/{chunk-ITFDGFOT.js.map → chunk-ONXBRQJT.js.map} +0 -0
- /package/dist/{chunk-ULIDYFM7.js.map → chunk-OPBSVEMX.js.map} +0 -0
- /package/dist/{chunk-333EWYWL.js.map → chunk-PCNQ6NP2.js.map} +0 -0
- /package/dist/{chunk-6HGS5Z2Z.js.map → chunk-PFGQDW3H.js.map} +0 -0
- /package/dist/{chunk-K6YRTASS.js.map → chunk-PGKQZBLZ.js.map} +0 -0
- /package/dist/{chunk-57C25JYV.js.map → chunk-PQZD5W3E.js.map} +0 -0
- /package/dist/{chunk-5Z55AFOW.js.map → chunk-PT5P4AAU.js.map} +0 -0
- /package/dist/{chunk-EL3OXVOW.js.map → chunk-PUACHQRH.js.map} +0 -0
- /package/dist/{chunk-HRYH7XQP.js.map → chunk-QKZX5HDY.js.map} +0 -0
- /package/dist/{chunk-KZWC6JCI.js.map → chunk-QXXHK34V.js.map} +0 -0
- /package/dist/{chunk-JGS2IHER.js.map → chunk-R27VUCWR.js.map} +0 -0
- /package/dist/{chunk-QGX37P5L.js.map → chunk-R6CITZBB.js.map} +0 -0
- /package/dist/{chunk-X6J4KKZZ.js.map → chunk-RFTC5UVB.js.map} +0 -0
- /package/dist/{chunk-YXHHUJOZ.js.map → chunk-RHZSAWAU.js.map} +0 -0
- /package/dist/{chunk-LMO3QK7Q.js.map → chunk-S7YR3FYZ.js.map} +0 -0
- /package/dist/{chunk-GRWGNWIJ.js.map → chunk-SCCBEFVK.js.map} +0 -0
- /package/dist/{chunk-R7DDZIE3.js.map → chunk-SD5MGHIJ.js.map} +0 -0
- /package/dist/{chunk-PP7POY7C.js.map → chunk-SEGTBIR4.js.map} +0 -0
- /package/dist/{chunk-D3C3VVCX.js.map → chunk-SGBCLZQF.js.map} +0 -0
- /package/dist/{chunk-E3ES2KR6.js.map → chunk-SJHDX73F.js.map} +0 -0
- /package/dist/{chunk-EKY3A5LO.js.map → chunk-SLDJYJEG.js.map} +0 -0
- /package/dist/{chunk-KWQ6HV5Z.js.map → chunk-SQLEVIAD.js.map} +0 -0
- /package/dist/{chunk-T4JNXV75.js.map → chunk-SR3SC2Q3.js.map} +0 -0
- /package/dist/{chunk-YPLKH5H4.js.map → chunk-SSQG36MH.js.map} +0 -0
- /package/dist/{chunk-NQY3QNLR.js.map → chunk-U5BZXNHW.js.map} +0 -0
- /package/dist/{chunk-TEKBTTP2.js.map → chunk-U756JCDK.js.map} +0 -0
- /package/dist/{chunk-DFYPQ52O.js.map → chunk-U7CSWQAE.js.map} +0 -0
- /package/dist/{chunk-WCCCW4KD.js.map → chunk-U7FC5J6J.js.map} +0 -0
- /package/dist/{chunk-W6HCXQBH.js.map → chunk-UG2T7LMX.js.map} +0 -0
- /package/dist/{chunk-JNWXHPZG.js.map → chunk-UPGIQXUY.js.map} +0 -0
- /package/dist/{chunk-WZTFU6FJ.js.map → chunk-UUSOIPM2.js.map} +0 -0
- /package/dist/{chunk-7P24I5OL.js.map → chunk-UVVVKPSH.js.map} +0 -0
- /package/dist/{chunk-V4DDHF7S.js.map → chunk-V6U75PIG.js.map} +0 -0
- /package/dist/{chunk-BN4CKDFU.js.map → chunk-VAWYYETZ.js.map} +0 -0
- /package/dist/{chunk-DT6RNLCP.js.map → chunk-W26KFY35.js.map} +0 -0
- /package/dist/{chunk-OPMMD25Z.js.map → chunk-WDZ47ZTX.js.map} +0 -0
- /package/dist/{chunk-IZJOZJDL.js.map → chunk-WEM6XJ7Z.js.map} +0 -0
- /package/dist/{chunk-5HBMI2DO.js.map → chunk-WKNOKJA3.js.map} +0 -0
- /package/dist/{chunk-WTB4DDZP.js.map → chunk-WL2EZDSD.js.map} +0 -0
- /package/dist/{chunk-QTIKGWU4.js.map → chunk-XE6GYGWS.js.map} +0 -0
- /package/dist/{chunk-PYPNGKRD.js.map → chunk-Y3CKZ7SH.js.map} +0 -0
- /package/dist/{chunk-VRIAWF3A.js.map → chunk-YA2CG4YL.js.map} +0 -0
- /package/dist/{chunk-AXKZBRZK.js.map → chunk-YA2QGLUL.js.map} +0 -0
- /package/dist/{chunk-35DUHYPC.js.map → chunk-YFGFNFVW.js.map} +0 -0
- /package/dist/{chunk-6NKILKS6.js.map → chunk-YFKKMDJL.js.map} +0 -0
- /package/dist/{chunk-CQ5CH3SB.js.map → chunk-YUFDC6RW.js.map} +0 -0
- /package/dist/{chunk-H5UA5JW4.js.map → chunk-ZESSUMCO.js.map} +0 -0
- /package/dist/{chunk-N44PNGDS.js.map → chunk-ZFMM2NLA.js.map} +0 -0
- /package/dist/{chunk-3LWAAK3J.js.map → chunk-ZGNWDYSC.js.map} +0 -0
- /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({
|
package/dist/lib/cn.js.map
CHANGED
|
@@ -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":[]}
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import {
|
|
4
4
|
STREAMDOWN_TRANSLATION_KEYS,
|
|
5
5
|
useStreamdownTranslations
|
|
6
|
-
} from "../chunk-
|
|
6
|
+
} from "../chunk-DIL73NE3.js";
|
|
7
7
|
import "../chunk-6ROQKB4U.js";
|
|
8
|
-
import "../chunk-
|
|
9
|
-
import "../chunk-
|
|
8
|
+
import "../chunk-OFFWEDKY.js";
|
|
9
|
+
import "../chunk-O6AIFSTX.js";
|
|
10
10
|
import "../chunk-DCHYNTHI.js";
|
|
11
11
|
export {
|
|
12
12
|
STREAMDOWN_TRANSLATION_KEYS,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elabs-ai/components-ui",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.2.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.
|
|
84
|
+
"@elabs-ai/components-tokens": "^5.2.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-
|
|
117
|
-
"@elabs-ai/components-
|
|
116
|
+
"@elabs-ai/components-tokens": "5.2.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",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Run `pnpm gen` after changing a dependency, a vendored font, or
|
|
3
3
|
// scripts/attributions.sources.json. `pnpm gen:check` fails on a stale copy.
|
|
4
4
|
//
|
|
5
|
-
//
|
|
5
|
+
// 124 entries (data: 4, source: 20, font: 2, dependency: 98).
|
|
6
6
|
|
|
7
7
|
import type { Attribution } from "./attribution-types";
|
|
8
8
|
|
|
@@ -1208,6 +1208,18 @@ export const ATTRIBUTIONS: readonly Attribution[] = [
|
|
|
1208
1208
|
required: false,
|
|
1209
1209
|
note: null,
|
|
1210
1210
|
},
|
|
1211
|
+
{
|
|
1212
|
+
id: "mdast-util-directive",
|
|
1213
|
+
category: "dependency",
|
|
1214
|
+
name: "mdast-util-directive",
|
|
1215
|
+
version: "3.1.0",
|
|
1216
|
+
license: "MIT",
|
|
1217
|
+
copyright: "Titus Wormer",
|
|
1218
|
+
url: "https://www.npmjs.com/package/mdast-util-directive",
|
|
1219
|
+
usedBy: ["@elabs-ai/components-editor"],
|
|
1220
|
+
required: false,
|
|
1221
|
+
note: null,
|
|
1222
|
+
},
|
|
1211
1223
|
{
|
|
1212
1224
|
id: "mermaid",
|
|
1213
1225
|
category: "dependency",
|
|
@@ -1220,6 +1232,18 @@ export const ATTRIBUTIONS: readonly Attribution[] = [
|
|
|
1220
1232
|
required: false,
|
|
1221
1233
|
note: null,
|
|
1222
1234
|
},
|
|
1235
|
+
{
|
|
1236
|
+
id: "micromark-extension-directive",
|
|
1237
|
+
category: "dependency",
|
|
1238
|
+
name: "micromark-extension-directive",
|
|
1239
|
+
version: "4.0.0",
|
|
1240
|
+
license: "MIT",
|
|
1241
|
+
copyright: "Titus Wormer",
|
|
1242
|
+
url: "https://www.npmjs.com/package/micromark-extension-directive",
|
|
1243
|
+
usedBy: ["@elabs-ai/components-editor"],
|
|
1244
|
+
required: false,
|
|
1245
|
+
note: null,
|
|
1246
|
+
},
|
|
1223
1247
|
{
|
|
1224
1248
|
id: "motion",
|
|
1225
1249
|
category: "dependency",
|
|
@@ -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
|
+
);
|
|
@@ -419,6 +419,13 @@ export const DEFAULT_MESSAGES: Record<string, MessageValue> = {
|
|
|
419
419
|
"charts.gantt.unitMinute": "Minute",
|
|
420
420
|
"charts.gantt.unitSecond": "Second",
|
|
421
421
|
"charts.gantt.unitMillisecond": "Millisecond",
|
|
422
|
+
// Gantt zoom controls (the scale buttons are presets; these move the density freely).
|
|
423
|
+
"charts.gantt.zoom": "Zoom",
|
|
424
|
+
"charts.gantt.zoomIn": "Zoom in",
|
|
425
|
+
"charts.gantt.zoomOut": "Zoom out",
|
|
426
|
+
"charts.gantt.zoomToFit": "Fit to width",
|
|
427
|
+
"charts.gantt.scrollToToday": "Today",
|
|
428
|
+
"charts.gantt.scrollToTask": "Scroll to {name}",
|
|
422
429
|
// BulletChart (Few's bullet graph, RM-061). The SVG is aria-hidden, so this
|
|
423
430
|
// sentence — built from these fragments — is the ONLY thing AT reads: it
|
|
424
431
|
// states the value, its relationship to the target, and which qualitative
|
|
@@ -464,6 +471,46 @@ export const DEFAULT_MESSAGES: Record<string, MessageValue> = {
|
|
|
464
471
|
"charts.dashboard.edit.moveCancelled": "Move cancelled. Restored to column {x}, row {y}",
|
|
465
472
|
"charts.dashboard.edit.resizeCancelled":
|
|
466
473
|
"Resize cancelled. Restored to column {x}, row {y}, size {w} by {h}",
|
|
474
|
+
// dashboard pack rebuild: locked tiles, the empty sheet, the edit-mode tile chrome.
|
|
475
|
+
"charts.dashboard.edit.locked": "{title} is locked",
|
|
476
|
+
"charts.dashboard.edit.lock": "Lock position and size",
|
|
477
|
+
"charts.dashboard.edit.unlock": "Unlock",
|
|
478
|
+
"charts.dashboard.edit.emptyTitle": "This sheet is empty",
|
|
479
|
+
"charts.dashboard.edit.emptyDescription":
|
|
480
|
+
"Drag a tile from the asset panel onto the sheet, or press Add in the toolbar.",
|
|
481
|
+
"charts.dashboard.edit.emptyViewTitle": "Nothing to show yet",
|
|
482
|
+
"charts.dashboard.edit.emptyViewDescription": "Switch to Edit to add the first tile.",
|
|
483
|
+
"charts.dashboard.edit.tileDuplicate": "Duplicate {title}",
|
|
484
|
+
"charts.dashboard.edit.tileDelete": "Delete {title}",
|
|
485
|
+
"charts.dashboard.edit.tileProperties": "Properties of {title}",
|
|
486
|
+
"charts.dashboard.edit.tileMore": "More actions for {title}",
|
|
487
|
+
"charts.dashboard.toolbar.assets": "Assets",
|
|
488
|
+
"charts.dashboard.toolbar.properties": "Properties",
|
|
489
|
+
"charts.dashboard.toolbar.layout": "Layout",
|
|
490
|
+
"charts.dashboard.toolbar.showGrid": "Show grid",
|
|
491
|
+
"charts.dashboard.toolbar.tidyUp": "Tidy up",
|
|
492
|
+
"charts.dashboard.toolbar.tidyUpDescription": "Reflow every tile into a clean reading order",
|
|
493
|
+
"charts.dashboard.toolbar.selectAll": "Select all",
|
|
494
|
+
"charts.dashboard.toolbar.deleteSelection": "Delete selection",
|
|
495
|
+
"charts.dashboard.toolbar.duplicateSelection": "Duplicate selection",
|
|
496
|
+
"charts.dashboard.toolbar.editSheet": "Edit sheet",
|
|
497
|
+
"charts.dashboard.toolbar.done": "Done",
|
|
498
|
+
"charts.dashboard.toolbar.more": "More",
|
|
499
|
+
"charts.dashboard.toolbar.saved": "All changes saved",
|
|
500
|
+
"charts.dashboard.toolbar.layoutFor": "Layout for",
|
|
501
|
+
"charts.dashboard.toolbar.layoutBase": "Desktop",
|
|
502
|
+
"charts.dashboard.toolbar.layoutMd": "Tablet",
|
|
503
|
+
"charts.dashboard.toolbar.layoutSm": "Phone",
|
|
504
|
+
"charts.dashboard.toolbar.gridDensityNow": "{columns} × {rows} cells",
|
|
505
|
+
"charts.dashboard.toolbar.gridDensityFlow": "{columns} columns · {rowHeight} px rows",
|
|
506
|
+
"charts.dashboard.properties.layout": "Layout",
|
|
507
|
+
"charts.dashboard.properties.column": "Column",
|
|
508
|
+
"charts.dashboard.properties.row": "Row",
|
|
509
|
+
"charts.dashboard.properties.width": "Width",
|
|
510
|
+
"charts.dashboard.properties.height": "Height",
|
|
511
|
+
"charts.dashboard.properties.lockedDescription":
|
|
512
|
+
"A locked tile keeps its cells when others move.",
|
|
513
|
+
"charts.dashboard.properties.noRoom": "No room for that size here",
|
|
467
514
|
// dashboard toolbar — RM-079: mode switch, undo/redo, grid settings, save/discard, shortcuts.
|
|
468
515
|
"charts.dashboard.toolbar.ariaLabel": "Dashboard toolbar",
|
|
469
516
|
"charts.dashboard.toolbar.viewMode": "View",
|
|
@@ -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
|
|
14
|
-
*
|
|
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
|
|
35
|
-
|
|
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
|
|
40
|
-
|
|
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
|
-
|
|
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
|
|
@@ -122,8 +122,10 @@ export const ToolbarSeparator = forwardRef<
|
|
|
122
122
|
data-slot="toolbar-separator"
|
|
123
123
|
className={cn(
|
|
124
124
|
"bg-border-strong mx-1 shrink-0",
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
// Radix flips the separator's orientation relative to the toolbar: a HORIZONTAL toolbar
|
|
126
|
+
// gets `data-orientation="vertical"` separators (a vertical hairline between groups).
|
|
127
|
+
"data-[orientation=vertical]:h-5 data-[orientation=vertical]:w-px",
|
|
128
|
+
"data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-5",
|
|
127
129
|
className,
|
|
128
130
|
)}
|
|
129
131
|
{...props}
|
|
@@ -347,6 +347,34 @@ export const Multiple: Story = {
|
|
|
347
347
|
},
|
|
348
348
|
};
|
|
349
349
|
|
|
350
|
+
/**
|
|
351
|
+
* `expandOn="chevron"`: a click on a branch row only SELECTS it — expanding is the
|
|
352
|
+
* chevron's (and ArrowRight's) job. The shape a filter tree wants, where a parent value is
|
|
353
|
+
* selectable in its own right.
|
|
354
|
+
*/
|
|
355
|
+
export const ExpandOnChevron: Story = {
|
|
356
|
+
args: {
|
|
357
|
+
nodes: orgTree,
|
|
358
|
+
defaultExpandedIds: ["engineering"],
|
|
359
|
+
selectionMode: "multiple",
|
|
360
|
+
checkboxes: true,
|
|
361
|
+
expandOn: "chevron",
|
|
362
|
+
},
|
|
363
|
+
play: async ({ canvasElement, userEvent }) => {
|
|
364
|
+
const canvas = within(canvasElement);
|
|
365
|
+
const frontend = canvas.getByRole("treeitem", { name: /^frontend$/i });
|
|
366
|
+
await expect(frontend).toHaveAttribute("aria-expanded", "false");
|
|
367
|
+
// The row click selects without expanding …
|
|
368
|
+
await userEvent.click(frontend);
|
|
369
|
+
await expect(frontend).toHaveAttribute("aria-checked", "true");
|
|
370
|
+
await expect(frontend).toHaveAttribute("aria-expanded", "false");
|
|
371
|
+
// … the keyboard still expands.
|
|
372
|
+
frontend.focus();
|
|
373
|
+
await userEvent.keyboard("{ArrowRight}");
|
|
374
|
+
await expect(frontend).toHaveAttribute("aria-expanded", "true");
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
|
|
350
378
|
/** Fully expanded at mount via defaultExpandedIds. */
|
|
351
379
|
export const Expanded: Story = {
|
|
352
380
|
args: {
|