@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.
- package/README.md +1 -1
- package/dist/{chunk-E3ES2KR6.js → chunk-2DFB4YTK.js} +5 -5
- package/dist/{chunk-6QU7OVFA.js → chunk-2ZMPAD6C.js} +7 -7
- 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-T4JNXV75.js → chunk-3EDNWHWD.js} +5 -5
- 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-U26XDHMX.js → chunk-4DWIMWR5.js} +4 -4
- package/dist/{chunk-H5UA5JW4.js → chunk-4DZGAY6R.js} +2 -2
- package/dist/{chunk-YWB7HLL7.js → chunk-4NSCLIES.js} +3 -3
- package/dist/{chunk-7P24I5OL.js → chunk-4VCU3GFI.js} +2 -2
- package/dist/{chunk-UPEMEBWH.js → chunk-55BM2IU2.js} +5 -5
- package/dist/{chunk-5V5J7APL.js → chunk-5C5W52O2.js} +2 -2
- package/dist/{chunk-FDPONOOT.js → chunk-5MXQ5CP7.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-BM6NGS3A.js → chunk-AE6LFFME.js} +3 -3
- package/dist/{chunk-OPMMD25Z.js → chunk-ALNJV4XB.js} +4 -4
- package/dist/{chunk-KTH3GWAL.js → chunk-AXHMQOIZ.js} +4 -4
- package/dist/{chunk-RNC4M6SG.js → chunk-B3DANITU.js} +3 -3
- package/dist/{chunk-MGAXCPT7.js → chunk-B7FAQKHH.js} +2 -2
- package/dist/{chunk-BN4CKDFU.js → chunk-BDOG4YSM.js} +22 -22
- package/dist/{chunk-6HGS5Z2Z.js → chunk-BRL2HMZJ.js} +3 -3
- package/dist/{chunk-EY2PGOG3.js → chunk-BYFRDLDL.js} +3 -3
- package/dist/{chunk-LVRULYU4.js → chunk-C2ICCCP5.js} +8 -8
- package/dist/{chunk-VA2OONPE.js → chunk-C5QBV5RE.js} +2 -2
- package/dist/{chunk-7WXDSTNR.js → chunk-CDMJSXCB.js} +2 -2
- package/dist/{chunk-XMZ5LXL4.js → chunk-CEDK5GM2.js} +3 -3
- package/dist/{chunk-DFYPQ52O.js → chunk-CEHCVDYR.js} +7 -7
- package/dist/{chunk-A47AZPCL.js → chunk-CEQ3YKHR.js} +2 -2
- package/dist/{chunk-EHGIW7GA.js → chunk-CMP4F537.js} +2 -2
- package/dist/{chunk-YXHHUJOZ.js → chunk-CY5ISPFB.js} +3 -3
- package/dist/{chunk-6OFWWIEG.js → chunk-D5INX2EF.js} +3 -3
- package/dist/{chunk-3EKVSKGJ.js → chunk-DXC3DTCV.js} +3 -3
- package/dist/{chunk-XZ23AFOP.js → chunk-E3GNYOLS.js} +2 -2
- package/dist/{chunk-ZNFHDBUW.js → chunk-EBNPVPR7.js} +2 -2
- package/dist/{chunk-4PITSMJ3.js → chunk-EJ3XWNY3.js} +2 -2
- package/dist/{chunk-333EWYWL.js → chunk-ENL3CCZB.js} +5 -5
- package/dist/{chunk-HVFYAQLK.js → chunk-ERTYAID6.js} +4 -4
- package/dist/{chunk-B5QQLMEE.js → chunk-FG3PDWE3.js} +2 -2
- package/dist/{chunk-7PS5MKVH.js → chunk-FLCQKC64.js} +4 -4
- package/dist/{chunk-LMO3QK7Q.js → chunk-FXC64HLD.js} +2 -2
- 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-QGX37P5L.js → chunk-GMXSCEYN.js} +2 -2
- package/dist/{chunk-FKUP7QRJ.js → chunk-GTBVTLZJ.js} +2 -2
- package/dist/{chunk-4GQFIJAE.js → chunk-GTDCC4YX.js} +2 -2
- package/dist/{chunk-XONGYCW3.js → chunk-GWHO5ACE.js} +2 -2
- package/dist/{chunk-NTTSHOOK.js → chunk-HF6BGFUV.js} +4 -4
- package/dist/{chunk-WTB4DDZP.js → chunk-HHZJALGA.js} +5 -5
- 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-R3SYH7RG.js → chunk-HWVU636Q.js} +15 -10
- package/dist/chunk-HWVU636Q.js.map +1 -0
- package/dist/{chunk-4E73UAFA.js → chunk-HXQ4MDCH.js} +6 -6
- package/dist/{chunk-XYACSO57.js → chunk-I3U52BDH.js} +2 -2
- package/dist/{chunk-KZWC6JCI.js → chunk-IE5GWE72.js} +5 -5
- package/dist/{chunk-RRZUMIYG.js → chunk-IIY5JRNW.js} +3 -3
- package/dist/{chunk-UQHWOPUY.js → chunk-IVEDMK5U.js} +2 -2
- package/dist/{chunk-35ZTVB35.js → chunk-JTY3REOB.js} +5 -5
- package/dist/{chunk-YIVL6HWS.js → chunk-JVCIAEFT.js} +2 -2
- package/dist/{chunk-DUF2VZON.js → chunk-K4V2ELUZ.js} +2 -2
- package/dist/{chunk-OBEJUAN6.js → chunk-KBWHHAI3.js} +4 -4
- 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-3LWAAK3J.js → chunk-L6A3RXCU.js} +5 -5
- 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-OV4GQOLC.js → chunk-M2KNQZUL.js} +2 -2
- package/dist/{chunk-WW3CD7AU.js → chunk-M5WPZXBA.js} +6 -6
- package/dist/{chunk-FINAKMC6.js → chunk-MDQYRES4.js} +5 -5
- package/dist/{chunk-XAFRTZQF.js → chunk-MJAIURHO.js} +2 -2
- package/dist/{chunk-KWQ6HV5Z.js → chunk-MRBDJASL.js} +3 -3
- package/dist/{chunk-NJAGSGPF.js → chunk-MY5H6D5Y.js} +3 -3
- package/dist/{chunk-J2P4YZLC.js → chunk-NRPZ3BH4.js} +5 -5
- package/dist/{chunk-YL7VBHPZ.js → chunk-NXCOVGDU.js} +3 -3
- package/dist/{chunk-IGP5E4FC.js → chunk-NZUKZRT7.js} +4 -4
- package/dist/{chunk-WX3LWMVU.js → chunk-O6V65J5J.js} +2 -2
- package/dist/{chunk-PYPNGKRD.js → chunk-OGTILHKP.js} +4 -4
- package/dist/{chunk-UXSV6RVS.js → chunk-OKY7ACZK.js} +2 -2
- package/dist/{chunk-ULIDYFM7.js → chunk-OPBSVEMX.js} +2 -2
- package/dist/{chunk-K6YRTASS.js → chunk-PGKQZBLZ.js} +2 -2
- package/dist/{chunk-57C25JYV.js → chunk-PQZD5W3E.js} +2 -2
- package/dist/{chunk-533R5EKD.js → chunk-PSXUEWUS.js} +4 -4
- 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-LOSXINSS.js → chunk-QLM3KTAQ.js} +4 -4
- package/dist/{chunk-JGS2IHER.js → chunk-R27VUCWR.js} +4 -4
- package/dist/{chunk-X6J4KKZZ.js → chunk-RFTC5UVB.js} +4 -4
- package/dist/{chunk-LXW3GNF7.js → chunk-RHVYRQN4.js} +6 -6
- package/dist/{chunk-VRIAWF3A.js → chunk-RIYDAMSQ.js} +2 -2
- package/dist/{chunk-A43B4IT7.js → chunk-RYPK72YP.js} +4 -4
- package/dist/{chunk-GRWGNWIJ.js → chunk-SCCBEFVK.js} +6 -6
- package/dist/{chunk-PP7POY7C.js → chunk-SEGTBIR4.js} +2 -2
- package/dist/{chunk-D3C3VVCX.js → chunk-SGBCLZQF.js} +2 -2
- package/dist/{chunk-EKY3A5LO.js → chunk-SLDJYJEG.js} +3 -3
- package/dist/{chunk-YPLKH5H4.js → chunk-SSQG36MH.js} +6 -6
- package/dist/{chunk-WCCCW4KD.js → chunk-SWQCCR6Q.js} +5 -5
- package/dist/{chunk-NQY3QNLR.js → chunk-U5BZXNHW.js} +4 -4
- package/dist/{chunk-TEKBTTP2.js → chunk-U756JCDK.js} +2 -2
- package/dist/{chunk-W6HCXQBH.js → chunk-UG2T7LMX.js} +4 -4
- package/dist/{chunk-JNWXHPZG.js → chunk-UPGIQXUY.js} +2 -2
- package/dist/{chunk-QTIKGWU4.js → chunk-UQPW7INX.js} +4 -4
- package/dist/{chunk-WZTFU6FJ.js → chunk-UUSOIPM2.js} +2 -2
- package/dist/{chunk-FYCCNQXQ.js → chunk-V5QCJHDA.js} +6 -6
- package/dist/{chunk-V4DDHF7S.js → chunk-V6U75PIG.js} +3 -3
- package/dist/{chunk-ZXBUOHCR.js → chunk-VC4GKLZL.js} +2 -2
- 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-R7DDZIE3.js → chunk-W35X6J5P.js} +3 -3
- package/dist/{chunk-ITFDGFOT.js → chunk-W7OIVERI.js} +2 -2
- 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-BLNXHETI.js → chunk-Y33ZFTMR.js} +3 -3
- 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-DCI6IOJX.js → chunk-ZALGMUSW.js} +3 -3
- package/dist/{chunk-N44PNGDS.js → chunk-ZFMM2NLA.js} +2 -2
- package/dist/{chunk-6OPDRLMU.js → chunk-ZRMF4YAS.js} +7 -7
- 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 +4 -4
- package/dist/components/advanced-group/index.js +4 -4
- 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 +10 -10
- package/dist/components/app-sidebar/index.js +10 -10
- package/dist/components/attribution-panel/attribution-panel.js +4 -4
- package/dist/components/attribution-panel/index.js +4 -4
- 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 +7 -7
- package/dist/components/bounded-number/index.js +7 -7
- package/dist/components/breadcrumb/breadcrumb.js +2 -2
- package/dist/components/breadcrumb/index.js +2 -2
- 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 +3 -3
- package/dist/components/carousel/index.js +3 -3
- package/dist/components/change-review/change-review.js +8 -8
- package/dist/components/change-review/index.js +8 -8
- 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 +3 -3
- package/dist/components/color-picker/index.js +3 -3
- package/dist/components/combobox/combobox.js +8 -8
- package/dist/components/combobox/index.js +8 -8
- package/dist/components/command/command.js +5 -5
- package/dist/components/command/index.js +5 -5
- 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 +5 -5
- package/dist/components/confirm-dialog/index.js +5 -5
- 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 +12 -12
- package/dist/components/context-rail/index.js +12 -12
- package/dist/components/copyable-value/copyable-value.js +3 -3
- package/dist/components/copyable-value/index.js +3 -3
- package/dist/components/date-picker/date-picker.js +5 -5
- package/dist/components/date-picker/index.js +5 -5
- package/dist/components/date-range-picker/date-range-picker.js +5 -5
- package/dist/components/date-range-picker/index.js +5 -5
- package/dist/components/descriptions/descriptions.js +2 -2
- package/dist/components/descriptions/index.js +2 -2
- package/dist/components/dialog/dialog.js +4 -4
- package/dist/components/dialog/index.js +4 -4
- 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 +4 -4
- package/dist/components/empty-state/index.js +4 -4
- package/dist/components/error-state/error-state.js +4 -4
- package/dist/components/error-state/index.js +4 -4
- package/dist/components/expand-dialog/expand-dialog.js +5 -5
- package/dist/components/expand-dialog/index.js +5 -5
- 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 +4 -4
- package/dist/components/file-upload/index.js +4 -4
- 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 +4 -4
- package/dist/components/key-value-editor/key-value-editor.js +4 -4
- package/dist/components/keyboard-shortcuts/index.js +8 -8
- package/dist/components/keyboard-shortcuts/keyboard-shortcuts.js +8 -8
- 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 +4 -4
- package/dist/components/list-editor/list-editor.js +4 -4
- package/dist/components/loading-state/index.js +4 -4
- package/dist/components/loading-state/loading-state.js +4 -4
- 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 +4 -4
- package/dist/components/mention-input/mention-input.js +4 -4
- 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 +6 -6
- package/dist/components/metric-card/metric-card.js +6 -6
- package/dist/components/model-picker/index.js +9 -9
- package/dist/components/model-picker/model-picker.js +9 -9
- package/dist/components/nav-main/index.js +11 -11
- package/dist/components/nav-main/nav-main.js +11 -11
- package/dist/components/nav-notifications/index.js +5 -5
- package/dist/components/nav-notifications/nav-notifications.js +5 -5
- package/dist/components/nav-user/index.js +12 -12
- package/dist/components/nav-user/nav-user.js +12 -12
- 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 +6 -6
- package/dist/components/number-input/number-input.js +6 -6
- 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 +3 -3
- package/dist/components/pagination/pagination.js +3 -3
- 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 +2 -2
- package/dist/components/revision-timeline/revision-timeline.js +2 -2
- package/dist/components/schema-form/index.js +27 -27
- package/dist/components/schema-form/schema-form.js +23 -23
- 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 +2 -2
- package/dist/components/sheet/sheet.js +2 -2
- package/dist/components/side-dock/index.js +4 -4
- package/dist/components/side-dock/side-dock.js +4 -4
- package/dist/components/sidebar/index.js +9 -9
- package/dist/components/sidebar/sidebar.js +9 -9
- 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 +8 -8
- package/dist/components/slider-number/slider-number.js +8 -8
- 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 +2 -2
- package/dist/components/spinner/spinner.js +2 -2
- 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 +3 -3
- package/dist/components/state-panel/state-panel.js +3 -3
- 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 +2 -2
- package/dist/components/table/table.js +2 -2
- 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 +11 -11
- package/dist/components/team-switcher/team-switcher.js +11 -11
- 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 +5 -5
- package/dist/components/theme-switcher/theme-switcher.js +5 -5
- 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 +8 -8
- package/dist/components/transfer/transfer.js +8 -8
- package/dist/components/tree/index.js +5 -5
- package/dist/components/tree/tree.js +5 -5
- package/dist/components/tree-select/index.js +9 -9
- package/dist/components/tree-select/tree-select.js +9 -9
- 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 +6 -6
- package/dist/components/view-toolbar/view-toolbar.js +6 -6
- package/dist/components/virtual-select/index.js +6 -6
- package/dist/components/virtual-select/virtual-select.js +6 -6
- package/dist/components/wizard/index.js +3 -3
- package/dist/components/wizard/wizard.js +3 -3
- package/dist/components/workspace-picker/index.js +11 -11
- package/dist/components/workspace-picker/workspace-picker.js +11 -11
- 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 +44 -4
- package/dist/index.js +221 -212
- package/dist/lib/cn.js +8 -1
- package/dist/lib/cn.js.map +1 -1
- package/package.json +4 -4
- 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/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/decoration.stories.tsx +153 -123
- package/src/index.ts +1 -0
- package/src/lib/cn.test.ts +29 -0
- package/src/lib/cn.ts +7 -0
- 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-E3ES2KR6.js.map → chunk-2DFB4YTK.js.map} +0 -0
- /package/dist/{chunk-6QU7OVFA.js.map → chunk-2ZMPAD6C.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-T4JNXV75.js.map → chunk-3EDNWHWD.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-U26XDHMX.js.map → chunk-4DWIMWR5.js.map} +0 -0
- /package/dist/{chunk-H5UA5JW4.js.map → chunk-4DZGAY6R.js.map} +0 -0
- /package/dist/{chunk-YWB7HLL7.js.map → chunk-4NSCLIES.js.map} +0 -0
- /package/dist/{chunk-7P24I5OL.js.map → chunk-4VCU3GFI.js.map} +0 -0
- /package/dist/{chunk-UPEMEBWH.js.map → chunk-55BM2IU2.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-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-BM6NGS3A.js.map → chunk-AE6LFFME.js.map} +0 -0
- /package/dist/{chunk-OPMMD25Z.js.map → chunk-ALNJV4XB.js.map} +0 -0
- /package/dist/{chunk-KTH3GWAL.js.map → chunk-AXHMQOIZ.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-BN4CKDFU.js.map → chunk-BDOG4YSM.js.map} +0 -0
- /package/dist/{chunk-6HGS5Z2Z.js.map → chunk-BRL2HMZJ.js.map} +0 -0
- /package/dist/{chunk-EY2PGOG3.js.map → chunk-BYFRDLDL.js.map} +0 -0
- /package/dist/{chunk-LVRULYU4.js.map → chunk-C2ICCCP5.js.map} +0 -0
- /package/dist/{chunk-VA2OONPE.js.map → chunk-C5QBV5RE.js.map} +0 -0
- /package/dist/{chunk-7WXDSTNR.js.map → chunk-CDMJSXCB.js.map} +0 -0
- /package/dist/{chunk-XMZ5LXL4.js.map → chunk-CEDK5GM2.js.map} +0 -0
- /package/dist/{chunk-DFYPQ52O.js.map → chunk-CEHCVDYR.js.map} +0 -0
- /package/dist/{chunk-A47AZPCL.js.map → chunk-CEQ3YKHR.js.map} +0 -0
- /package/dist/{chunk-EHGIW7GA.js.map → chunk-CMP4F537.js.map} +0 -0
- /package/dist/{chunk-YXHHUJOZ.js.map → chunk-CY5ISPFB.js.map} +0 -0
- /package/dist/{chunk-6OFWWIEG.js.map → chunk-D5INX2EF.js.map} +0 -0
- /package/dist/{chunk-3EKVSKGJ.js.map → chunk-DXC3DTCV.js.map} +0 -0
- /package/dist/{chunk-XZ23AFOP.js.map → chunk-E3GNYOLS.js.map} +0 -0
- /package/dist/{chunk-ZNFHDBUW.js.map → chunk-EBNPVPR7.js.map} +0 -0
- /package/dist/{chunk-4PITSMJ3.js.map → chunk-EJ3XWNY3.js.map} +0 -0
- /package/dist/{chunk-333EWYWL.js.map → chunk-ENL3CCZB.js.map} +0 -0
- /package/dist/{chunk-HVFYAQLK.js.map → chunk-ERTYAID6.js.map} +0 -0
- /package/dist/{chunk-B5QQLMEE.js.map → chunk-FG3PDWE3.js.map} +0 -0
- /package/dist/{chunk-7PS5MKVH.js.map → chunk-FLCQKC64.js.map} +0 -0
- /package/dist/{chunk-LMO3QK7Q.js.map → chunk-FXC64HLD.js.map} +0 -0
- /package/dist/{chunk-KUAVM54Y.js.map → chunk-FZEG2R3E.js.map} +0 -0
- /package/dist/{chunk-QGX37P5L.js.map → chunk-GMXSCEYN.js.map} +0 -0
- /package/dist/{chunk-FKUP7QRJ.js.map → chunk-GTBVTLZJ.js.map} +0 -0
- /package/dist/{chunk-4GQFIJAE.js.map → chunk-GTDCC4YX.js.map} +0 -0
- /package/dist/{chunk-XONGYCW3.js.map → chunk-GWHO5ACE.js.map} +0 -0
- /package/dist/{chunk-NTTSHOOK.js.map → chunk-HF6BGFUV.js.map} +0 -0
- /package/dist/{chunk-WTB4DDZP.js.map → chunk-HHZJALGA.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-4E73UAFA.js.map → chunk-HXQ4MDCH.js.map} +0 -0
- /package/dist/{chunk-XYACSO57.js.map → chunk-I3U52BDH.js.map} +0 -0
- /package/dist/{chunk-KZWC6JCI.js.map → chunk-IE5GWE72.js.map} +0 -0
- /package/dist/{chunk-RRZUMIYG.js.map → chunk-IIY5JRNW.js.map} +0 -0
- /package/dist/{chunk-UQHWOPUY.js.map → chunk-IVEDMK5U.js.map} +0 -0
- /package/dist/{chunk-35ZTVB35.js.map → chunk-JTY3REOB.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-OBEJUAN6.js.map → chunk-KBWHHAI3.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-3LWAAK3J.js.map → chunk-L6A3RXCU.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-OV4GQOLC.js.map → chunk-M2KNQZUL.js.map} +0 -0
- /package/dist/{chunk-WW3CD7AU.js.map → chunk-M5WPZXBA.js.map} +0 -0
- /package/dist/{chunk-FINAKMC6.js.map → chunk-MDQYRES4.js.map} +0 -0
- /package/dist/{chunk-XAFRTZQF.js.map → chunk-MJAIURHO.js.map} +0 -0
- /package/dist/{chunk-KWQ6HV5Z.js.map → chunk-MRBDJASL.js.map} +0 -0
- /package/dist/{chunk-NJAGSGPF.js.map → chunk-MY5H6D5Y.js.map} +0 -0
- /package/dist/{chunk-J2P4YZLC.js.map → chunk-NRPZ3BH4.js.map} +0 -0
- /package/dist/{chunk-YL7VBHPZ.js.map → chunk-NXCOVGDU.js.map} +0 -0
- /package/dist/{chunk-IGP5E4FC.js.map → chunk-NZUKZRT7.js.map} +0 -0
- /package/dist/{chunk-WX3LWMVU.js.map → chunk-O6V65J5J.js.map} +0 -0
- /package/dist/{chunk-PYPNGKRD.js.map → chunk-OGTILHKP.js.map} +0 -0
- /package/dist/{chunk-UXSV6RVS.js.map → chunk-OKY7ACZK.js.map} +0 -0
- /package/dist/{chunk-ULIDYFM7.js.map → chunk-OPBSVEMX.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-533R5EKD.js.map → chunk-PSXUEWUS.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-LOSXINSS.js.map → chunk-QLM3KTAQ.js.map} +0 -0
- /package/dist/{chunk-JGS2IHER.js.map → chunk-R27VUCWR.js.map} +0 -0
- /package/dist/{chunk-X6J4KKZZ.js.map → chunk-RFTC5UVB.js.map} +0 -0
- /package/dist/{chunk-LXW3GNF7.js.map → chunk-RHVYRQN4.js.map} +0 -0
- /package/dist/{chunk-VRIAWF3A.js.map → chunk-RIYDAMSQ.js.map} +0 -0
- /package/dist/{chunk-A43B4IT7.js.map → chunk-RYPK72YP.js.map} +0 -0
- /package/dist/{chunk-GRWGNWIJ.js.map → chunk-SCCBEFVK.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-EKY3A5LO.js.map → chunk-SLDJYJEG.js.map} +0 -0
- /package/dist/{chunk-YPLKH5H4.js.map → chunk-SSQG36MH.js.map} +0 -0
- /package/dist/{chunk-WCCCW4KD.js.map → chunk-SWQCCR6Q.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-W6HCXQBH.js.map → chunk-UG2T7LMX.js.map} +0 -0
- /package/dist/{chunk-JNWXHPZG.js.map → chunk-UPGIQXUY.js.map} +0 -0
- /package/dist/{chunk-QTIKGWU4.js.map → chunk-UQPW7INX.js.map} +0 -0
- /package/dist/{chunk-WZTFU6FJ.js.map → chunk-UUSOIPM2.js.map} +0 -0
- /package/dist/{chunk-FYCCNQXQ.js.map → chunk-V5QCJHDA.js.map} +0 -0
- /package/dist/{chunk-V4DDHF7S.js.map → chunk-V6U75PIG.js.map} +0 -0
- /package/dist/{chunk-ZXBUOHCR.js.map → chunk-VC4GKLZL.js.map} +0 -0
- /package/dist/{chunk-DT6RNLCP.js.map → chunk-W26KFY35.js.map} +0 -0
- /package/dist/{chunk-R7DDZIE3.js.map → chunk-W35X6J5P.js.map} +0 -0
- /package/dist/{chunk-ITFDGFOT.js.map → chunk-W7OIVERI.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-BLNXHETI.js.map → chunk-Y33ZFTMR.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-DCI6IOJX.js.map → chunk-ZALGMUSW.js.map} +0 -0
- /package/dist/{chunk-N44PNGDS.js.map → chunk-ZFMM2NLA.js.map} +0 -0
- /package/dist/{chunk-6OPDRLMU.js.map → chunk-ZRMF4YAS.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":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elabs-ai/components-ui",
|
|
3
|
-
"version": "5.
|
|
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.
|
|
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-
|
|
117
|
-
"@elabs-ai/components-
|
|
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
|
+
);
|
|
@@ -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
|