@keboola/design 10.1.0 → 11.0.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/AGENTS.md +2 -0
- package/dist/MermaidDiagram-ZU5KAVRT.js +18 -0
- package/dist/{MermaidDiagram-EOKJHQQV.js.map → MermaidDiagram-ZU5KAVRT.js.map} +1 -1
- package/dist/charts.d.ts +14 -8
- package/dist/charts.js +6 -1
- package/dist/charts.js.map +1 -1
- package/dist/chunk-2YYJDKSP.js +51 -0
- package/dist/chunk-2YYJDKSP.js.map +1 -0
- package/dist/chunk-3P5UUCFI.js +385 -0
- package/dist/chunk-3P5UUCFI.js.map +1 -0
- package/dist/chunk-3QDFDDWZ.js +99 -0
- package/dist/chunk-3QDFDDWZ.js.map +1 -0
- package/dist/chunk-3W27OLK5.js +15 -0
- package/dist/chunk-3W27OLK5.js.map +1 -0
- package/dist/chunk-4FIZZONW.js +40 -0
- package/dist/chunk-4FIZZONW.js.map +1 -0
- package/dist/chunk-4GIAXOJG.js +133 -0
- package/dist/chunk-4GIAXOJG.js.map +1 -0
- package/dist/chunk-52NDNMK7.js +99 -0
- package/dist/chunk-52NDNMK7.js.map +1 -0
- package/dist/chunk-576G5OES.js +201 -0
- package/dist/chunk-576G5OES.js.map +1 -0
- package/dist/chunk-5AIE6SET.js +659 -0
- package/dist/chunk-5AIE6SET.js.map +1 -0
- package/dist/chunk-5FTNAZRW.js +327 -0
- package/dist/chunk-5FTNAZRW.js.map +1 -0
- package/dist/chunk-5IG2S7ZY.js +70 -0
- package/dist/chunk-5IG2S7ZY.js.map +1 -0
- package/dist/chunk-5QCXHNCW.js +404 -0
- package/dist/chunk-5QCXHNCW.js.map +1 -0
- package/dist/chunk-6DUMGC7Y.js +105 -0
- package/dist/chunk-6DUMGC7Y.js.map +1 -0
- package/dist/chunk-6J25CVST.js +174 -0
- package/dist/chunk-6J25CVST.js.map +1 -0
- package/dist/chunk-6NN35XOP.js +120 -0
- package/dist/chunk-6NN35XOP.js.map +1 -0
- package/dist/chunk-6NZBVA4T.js +24 -0
- package/dist/chunk-6NZBVA4T.js.map +1 -0
- package/dist/chunk-6W5BHRCL.js +295 -0
- package/dist/chunk-6W5BHRCL.js.map +1 -0
- package/dist/chunk-72BKRCEG.js +409 -0
- package/dist/chunk-72BKRCEG.js.map +1 -0
- package/dist/{chunk-Q7NWXLCT.js → chunk-7GTI3PPI.js} +53 -48
- package/dist/chunk-7GTI3PPI.js.map +1 -0
- package/dist/chunk-7P6PLZ4B.js +74 -0
- package/dist/chunk-7P6PLZ4B.js.map +1 -0
- package/dist/chunk-7WZWY5IA.js +46 -0
- package/dist/chunk-7WZWY5IA.js.map +1 -0
- package/dist/chunk-AIYO2632.js +489 -0
- package/dist/chunk-AIYO2632.js.map +1 -0
- package/dist/chunk-ANFZWPNE.js +112 -0
- package/dist/chunk-ANFZWPNE.js.map +1 -0
- package/dist/chunk-ANZTVAJU.js +73 -0
- package/dist/chunk-ANZTVAJU.js.map +1 -0
- package/dist/chunk-BD5BTJKX.js +166 -0
- package/dist/chunk-BD5BTJKX.js.map +1 -0
- package/dist/chunk-BHGIDSRJ.js +140 -0
- package/dist/chunk-BHGIDSRJ.js.map +1 -0
- package/dist/chunk-BSQWZITZ.js +507 -0
- package/dist/chunk-BSQWZITZ.js.map +1 -0
- package/dist/chunk-D3LAIK62.js +23 -0
- package/dist/chunk-D3LAIK62.js.map +1 -0
- package/dist/chunk-DODCR43C.js +155 -0
- package/dist/chunk-DODCR43C.js.map +1 -0
- package/dist/chunk-EEK5NGZF.js +40 -0
- package/dist/chunk-EEK5NGZF.js.map +1 -0
- package/dist/chunk-ENRG7TXA.js +11 -0
- package/dist/chunk-ENRG7TXA.js.map +1 -0
- package/dist/chunk-EQRMGIGY.js +239 -0
- package/dist/chunk-EQRMGIGY.js.map +1 -0
- package/dist/{chunk-XV3UUOYF.js → chunk-ERAHK5YQ.js} +9 -359
- package/dist/chunk-ERAHK5YQ.js.map +1 -0
- package/dist/chunk-F3FOFY2P.js +124 -0
- package/dist/chunk-F3FOFY2P.js.map +1 -0
- package/dist/chunk-F6BTWFOC.js +507 -0
- package/dist/chunk-F6BTWFOC.js.map +1 -0
- package/dist/chunk-F6J6NNAL.js +34 -0
- package/dist/chunk-F6J6NNAL.js.map +1 -0
- package/dist/chunk-FCHJ7D5O.js +59 -0
- package/dist/chunk-FCHJ7D5O.js.map +1 -0
- package/dist/chunk-FFJTEQCC.js +80 -0
- package/dist/chunk-FFJTEQCC.js.map +1 -0
- package/dist/chunk-FUFMVW7O.js +64 -0
- package/dist/chunk-FUFMVW7O.js.map +1 -0
- package/dist/chunk-FVPGQ6UE.js +25 -0
- package/dist/chunk-FVPGQ6UE.js.map +1 -0
- package/dist/{chunk-JP7PNHLH.js → chunk-G3PMV62Z.js} +3 -10
- package/dist/chunk-G3PMV62Z.js.map +1 -0
- package/dist/chunk-GACFOW3E.js +51 -0
- package/dist/chunk-GACFOW3E.js.map +1 -0
- package/dist/chunk-GDT6HQMK.js +42 -0
- package/dist/chunk-GDT6HQMK.js.map +1 -0
- package/dist/chunk-HLGU22C6.js +2589 -0
- package/dist/chunk-HLGU22C6.js.map +1 -0
- package/dist/chunk-HPMYYGP7.js +134 -0
- package/dist/chunk-HPMYYGP7.js.map +1 -0
- package/dist/chunk-I2UCOD45.js +197 -0
- package/dist/chunk-I2UCOD45.js.map +1 -0
- package/dist/chunk-IEGDZUVM.js +75 -0
- package/dist/chunk-IEGDZUVM.js.map +1 -0
- package/dist/chunk-IIS7INHF.js +47 -0
- package/dist/chunk-IIS7INHF.js.map +1 -0
- package/dist/chunk-ITELSEFU.js +256 -0
- package/dist/chunk-ITELSEFU.js.map +1 -0
- package/dist/{chunk-CTCFYWJC.js → chunk-IXAYNBOY.js} +6 -6
- package/dist/{chunk-CTCFYWJC.js.map → chunk-IXAYNBOY.js.map} +1 -1
- package/dist/chunk-JUW2ETEI.js +191 -0
- package/dist/chunk-JUW2ETEI.js.map +1 -0
- package/dist/chunk-K65C7CVE.js +127 -0
- package/dist/chunk-K65C7CVE.js.map +1 -0
- package/dist/chunk-KDI64MCY.js +189 -0
- package/dist/chunk-KDI64MCY.js.map +1 -0
- package/dist/chunk-KN4ASMH5.js +160 -0
- package/dist/chunk-KN4ASMH5.js.map +1 -0
- package/dist/chunk-KQW7QNTU.js +1549 -0
- package/dist/chunk-KQW7QNTU.js.map +1 -0
- package/dist/chunk-KR7NXXHC.js +66 -0
- package/dist/chunk-KR7NXXHC.js.map +1 -0
- package/dist/chunk-KRZKIVMA.js +142 -0
- package/dist/chunk-KRZKIVMA.js.map +1 -0
- package/dist/{chunk-C3L3TBBT.js → chunk-KTTLLKGQ.js} +6 -63
- package/dist/chunk-KTTLLKGQ.js.map +1 -0
- package/dist/chunk-KWKSHPDP.js +234 -0
- package/dist/chunk-KWKSHPDP.js.map +1 -0
- package/dist/chunk-KZVC7OYG.js +57 -0
- package/dist/chunk-KZVC7OYG.js.map +1 -0
- package/dist/chunk-L5DHUN2V.js +204 -0
- package/dist/chunk-L5DHUN2V.js.map +1 -0
- package/dist/chunk-LCTGEH57.js +1376 -0
- package/dist/chunk-LCTGEH57.js.map +1 -0
- package/dist/chunk-LXLIQ2D6.js +12 -0
- package/dist/chunk-LXLIQ2D6.js.map +1 -0
- package/dist/chunk-M4CTURKX.js +84 -0
- package/dist/chunk-M4CTURKX.js.map +1 -0
- package/dist/chunk-M6LTUPVP.js +301 -0
- package/dist/chunk-M6LTUPVP.js.map +1 -0
- package/dist/chunk-MA6RRHDT.js +291 -0
- package/dist/chunk-MA6RRHDT.js.map +1 -0
- package/dist/chunk-MODE4QIA.js +6 -0
- package/dist/chunk-MODE4QIA.js.map +1 -0
- package/dist/chunk-MVILMVGG.js +118 -0
- package/dist/chunk-MVILMVGG.js.map +1 -0
- package/dist/chunk-MWS4VCLV.js +17 -0
- package/dist/chunk-MWS4VCLV.js.map +1 -0
- package/dist/chunk-NEUX74SO.js +315 -0
- package/dist/chunk-NEUX74SO.js.map +1 -0
- package/dist/chunk-NFHKYBRD.js +156 -0
- package/dist/chunk-NFHKYBRD.js.map +1 -0
- package/dist/chunk-NHJNNXD3.js +89 -0
- package/dist/chunk-NHJNNXD3.js.map +1 -0
- package/dist/chunk-O2BF3HZL.js +33 -0
- package/dist/chunk-O2BF3HZL.js.map +1 -0
- package/dist/chunk-OANXCZYD.js +212 -0
- package/dist/chunk-OANXCZYD.js.map +1 -0
- package/dist/chunk-ODJF7YIP.js +230 -0
- package/dist/chunk-ODJF7YIP.js.map +1 -0
- package/dist/chunk-ON4BJTHI.js +101 -0
- package/dist/chunk-ON4BJTHI.js.map +1 -0
- package/dist/{chunk-VMFSRV5H.js → chunk-OTL5WXIJ.js} +2 -2
- package/dist/{chunk-VMFSRV5H.js.map → chunk-OTL5WXIJ.js.map} +1 -1
- package/dist/{chunk-VPPM7UUQ.js → chunk-PACNBKJV.js} +3 -3
- package/dist/{chunk-VPPM7UUQ.js.map → chunk-PACNBKJV.js.map} +1 -1
- package/dist/{chunk-ESBL3IPF.js → chunk-PROCA7K7.js} +2 -2
- package/dist/{chunk-ESBL3IPF.js.map → chunk-PROCA7K7.js.map} +1 -1
- package/dist/chunk-QGMIPA67.js +85 -0
- package/dist/chunk-QGMIPA67.js.map +1 -0
- package/dist/chunk-QQA37LFB.js +190 -0
- package/dist/chunk-QQA37LFB.js.map +1 -0
- package/dist/chunk-QZAWRSEB.js +61 -0
- package/dist/chunk-QZAWRSEB.js.map +1 -0
- package/dist/chunk-R74KGWNS.js +699 -0
- package/dist/chunk-R74KGWNS.js.map +1 -0
- package/dist/chunk-RFDLHMKL.js +110 -0
- package/dist/chunk-RFDLHMKL.js.map +1 -0
- package/dist/chunk-RL64HN7S.js +40 -0
- package/dist/chunk-RL64HN7S.js.map +1 -0
- package/dist/chunk-RMRQKPL7.js +115 -0
- package/dist/chunk-RMRQKPL7.js.map +1 -0
- package/dist/{chunk-BOHNXTMM.js → chunk-RQVK4IYC.js} +3 -3
- package/dist/{chunk-BOHNXTMM.js.map → chunk-RQVK4IYC.js.map} +1 -1
- package/dist/chunk-RTW56PWZ.js +59 -0
- package/dist/chunk-RTW56PWZ.js.map +1 -0
- package/dist/chunk-RUTPQNLR.js +266 -0
- package/dist/chunk-RUTPQNLR.js.map +1 -0
- package/dist/chunk-S6TAF63G.js +25 -0
- package/dist/chunk-S6TAF63G.js.map +1 -0
- package/dist/chunk-SBGAUGXY.js +224 -0
- package/dist/chunk-SBGAUGXY.js.map +1 -0
- package/dist/chunk-SC275NHZ.js +407 -0
- package/dist/chunk-SC275NHZ.js.map +1 -0
- package/dist/chunk-SCQPU4UE.js +97 -0
- package/dist/chunk-SCQPU4UE.js.map +1 -0
- package/dist/chunk-SFFF2WQP.js +8 -0
- package/dist/chunk-SFFF2WQP.js.map +1 -0
- package/dist/chunk-SJYMHZKA.js +36 -0
- package/dist/chunk-SJYMHZKA.js.map +1 -0
- package/dist/chunk-SLCCUJVN.js +125 -0
- package/dist/chunk-SLCCUJVN.js.map +1 -0
- package/dist/{chunk-IJTHFNNJ.js → chunk-SVBSNSD4.js} +10 -12
- package/dist/chunk-SVBSNSD4.js.map +1 -0
- package/dist/chunk-SVPLTL35.js +62 -0
- package/dist/chunk-SVPLTL35.js.map +1 -0
- package/dist/{chunk-63NSN2VL.js → chunk-SWQFYNYG.js} +115 -51
- package/dist/chunk-SWQFYNYG.js.map +1 -0
- package/dist/chunk-THHB4EWS.js +72 -0
- package/dist/chunk-THHB4EWS.js.map +1 -0
- package/dist/chunk-TUCDD33E.js +246 -0
- package/dist/chunk-TUCDD33E.js.map +1 -0
- package/dist/chunk-TV4WAP2R.js +14 -0
- package/dist/chunk-TV4WAP2R.js.map +1 -0
- package/dist/chunk-U3A6YBTZ.js +134 -0
- package/dist/chunk-U3A6YBTZ.js.map +1 -0
- package/dist/chunk-UGT6DKWM.js +95 -0
- package/dist/chunk-UGT6DKWM.js.map +1 -0
- package/dist/chunk-VSERHUWD.js +212 -0
- package/dist/chunk-VSERHUWD.js.map +1 -0
- package/dist/chunk-VYG7BDXC.js +49 -0
- package/dist/chunk-VYG7BDXC.js.map +1 -0
- package/dist/chunk-WETKNYZX.js +52 -0
- package/dist/chunk-WETKNYZX.js.map +1 -0
- package/dist/chunk-WGG4AML3.js +216 -0
- package/dist/chunk-WGG4AML3.js.map +1 -0
- package/dist/chunk-WKAUEL6I.js +30 -0
- package/dist/chunk-WKAUEL6I.js.map +1 -0
- package/dist/chunk-WPOLA5CG.js +81 -0
- package/dist/chunk-WPOLA5CG.js.map +1 -0
- package/dist/chunk-WPVETCGJ.js +254 -0
- package/dist/chunk-WPVETCGJ.js.map +1 -0
- package/dist/chunk-WTSM3A7E.js +13 -0
- package/dist/chunk-WTSM3A7E.js.map +1 -0
- package/dist/chunk-WU3F2K3T.js +148 -0
- package/dist/chunk-WU3F2K3T.js.map +1 -0
- package/dist/chunk-WZZK2DTZ.js +39 -0
- package/dist/chunk-WZZK2DTZ.js.map +1 -0
- package/dist/chunk-X4IHLKRD.js +42 -0
- package/dist/chunk-X4IHLKRD.js.map +1 -0
- package/dist/chunk-XAHEXZJC.js +80 -0
- package/dist/chunk-XAHEXZJC.js.map +1 -0
- package/dist/chunk-XCYGJDUX.js +31 -0
- package/dist/chunk-XCYGJDUX.js.map +1 -0
- package/dist/chunk-Y4W3JORC.js +104 -0
- package/dist/chunk-Y4W3JORC.js.map +1 -0
- package/dist/{chunk-7PUUHEJQ.js → chunk-YFZJ3ZLG.js} +26 -42
- package/dist/chunk-YFZJ3ZLG.js.map +1 -0
- package/dist/{chunk-6FPEI4EM.js → chunk-YI3WLXEN.js} +27 -2323
- package/dist/chunk-YI3WLXEN.js.map +1 -0
- package/dist/chunk-ZBKFSPD3.js +29 -0
- package/dist/chunk-ZBKFSPD3.js.map +1 -0
- package/dist/chunk-ZOERRQ6A.js +79 -0
- package/dist/chunk-ZOERRQ6A.js.map +1 -0
- package/dist/chunk-ZSTGUKHU.js +10 -0
- package/dist/chunk-ZSTGUKHU.js.map +1 -0
- package/dist/chunk-ZUEHDL27.js +65 -0
- package/dist/chunk-ZUEHDL27.js.map +1 -0
- package/dist/editors.js +22 -14
- package/dist/editors.js.map +1 -1
- package/dist/icons.js +7 -2
- package/dist/index.d.ts +8 -18
- package/dist/index.js +121 -15800
- package/dist/index.js.map +1 -1
- package/dist/internal/blocks/AIKit.js +30 -0
- package/dist/internal/blocks/AIKit.js.map +1 -0
- package/dist/internal/blocks/AppShell.js +11 -0
- package/dist/internal/blocks/AppShell.js.map +1 -0
- package/dist/internal/blocks/AutoSaveTextarea.js +14 -0
- package/dist/internal/blocks/AutoSaveTextarea.js.map +1 -0
- package/dist/internal/blocks/BrandEditor.js +23 -0
- package/dist/internal/blocks/BrandEditor.js.map +1 -0
- package/dist/internal/blocks/ChartPanel.js +10 -0
- package/dist/internal/blocks/ChartPanel.js.map +1 -0
- package/dist/internal/blocks/ClipboardButton.js +12 -0
- package/dist/internal/blocks/ClipboardButton.js.map +1 -0
- package/dist/internal/blocks/ColorInput.js +13 -0
- package/dist/internal/blocks/ColorInput.js.map +1 -0
- package/dist/internal/blocks/ColorModeSwitch.js +13 -0
- package/dist/internal/blocks/ColorModeSwitch.js.map +1 -0
- package/dist/internal/blocks/Command.js +15 -0
- package/dist/internal/blocks/Command.js.map +1 -0
- package/dist/internal/blocks/CopyField.js +11 -0
- package/dist/internal/blocks/CopyField.js.map +1 -0
- package/dist/internal/blocks/DashboardHero.js +9 -0
- package/dist/internal/blocks/DashboardHero.js.map +1 -0
- package/dist/internal/blocks/DateInput.js +16 -0
- package/dist/internal/blocks/DateInput.js.map +1 -0
- package/dist/internal/blocks/DateRangeInput.js +16 -0
- package/dist/internal/blocks/DateRangeInput.js.map +1 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js +10 -0
- package/dist/internal/blocks/EmptyConfigurationActionCard.js.map +1 -0
- package/dist/internal/blocks/EmptyState.js +4 -0
- package/dist/internal/blocks/EmptyState.js.map +1 -0
- package/dist/internal/blocks/ErrorState.js +5 -0
- package/dist/internal/blocks/ErrorState.js.map +1 -0
- package/dist/internal/blocks/ExportMenu.js +13 -0
- package/dist/internal/blocks/ExportMenu.js.map +1 -0
- package/dist/internal/blocks/Form.js +29 -0
- package/dist/internal/blocks/Form.js.map +1 -0
- package/dist/internal/blocks/FormGroup.js +18 -0
- package/dist/internal/blocks/FormGroup.js.map +1 -0
- package/dist/internal/blocks/GoogleButton.js +10 -0
- package/dist/internal/blocks/GoogleButton.js.map +1 -0
- package/dist/internal/blocks/MicrosoftButton.js +10 -0
- package/dist/internal/blocks/MicrosoftButton.js.map +1 -0
- package/dist/internal/blocks/MultiActionButtonGroup.js +12 -0
- package/dist/internal/blocks/MultiActionButtonGroup.js.map +1 -0
- package/dist/internal/blocks/MultiCombobox.js +14 -0
- package/dist/internal/blocks/MultiCombobox.js.map +1 -0
- package/dist/internal/blocks/NumberInput.js +12 -0
- package/dist/internal/blocks/NumberInput.js.map +1 -0
- package/dist/internal/blocks/OtpInput.js +10 -0
- package/dist/internal/blocks/OtpInput.js.map +1 -0
- package/dist/internal/blocks/PageHeader.js +9 -0
- package/dist/internal/blocks/PageHeader.js.map +1 -0
- package/dist/internal/blocks/PageLayout.js +9 -0
- package/dist/internal/blocks/PageLayout.js.map +1 -0
- package/dist/internal/blocks/PageToolbar.js +13 -0
- package/dist/internal/blocks/PageToolbar.js.map +1 -0
- package/dist/internal/blocks/PasswordInput.js +13 -0
- package/dist/internal/blocks/PasswordInput.js.map +1 -0
- package/dist/internal/blocks/SearchInput.js +12 -0
- package/dist/internal/blocks/SearchInput.js.map +1 -0
- package/dist/internal/blocks/SearchInputWithNavigation.js +16 -0
- package/dist/internal/blocks/SearchInputWithNavigation.js.map +1 -0
- package/dist/internal/blocks/SectionNav.js +15 -0
- package/dist/internal/blocks/SectionNav.js.map +1 -0
- package/dist/internal/blocks/SplitButton.js +14 -0
- package/dist/internal/blocks/SplitButton.js.map +1 -0
- package/dist/internal/blocks/StatCard.js +10 -0
- package/dist/internal/blocks/StatCard.js.map +1 -0
- package/dist/internal/blocks/TextInput.js +13 -0
- package/dist/internal/blocks/TextInput.js.map +1 -0
- package/dist/internal/blocks/Textarea.js +13 -0
- package/dist/internal/blocks/Textarea.js.map +1 -0
- package/dist/internal/blocks/TimeInput.js +17 -0
- package/dist/internal/blocks/TimeInput.js.map +1 -0
- package/dist/internal/components/Alert.js +11 -0
- package/dist/internal/components/Alert.js.map +1 -0
- package/dist/internal/components/AlertModal.js +11 -0
- package/dist/internal/components/AlertModal.js.map +1 -0
- package/dist/internal/components/Avatar.js +9 -0
- package/dist/internal/components/Avatar.js.map +1 -0
- package/dist/internal/components/Badge.js +9 -0
- package/dist/internal/components/Badge.js.map +1 -0
- package/dist/internal/components/BrandLogo.js +11 -0
- package/dist/internal/components/BrandLogo.js.map +1 -0
- package/dist/internal/components/Breadcrumb.js +14 -0
- package/dist/internal/components/Breadcrumb.js.map +1 -0
- package/dist/internal/components/Button.js +10 -0
- package/dist/internal/components/Button.js.map +1 -0
- package/dist/internal/components/ButtonGroup.js +9 -0
- package/dist/internal/components/ButtonGroup.js.map +1 -0
- package/dist/internal/components/Calendar.js +9 -0
- package/dist/internal/components/Calendar.js.map +1 -0
- package/dist/internal/components/Card.js +9 -0
- package/dist/internal/components/Card.js.map +1 -0
- package/dist/internal/components/Checkbox.js +11 -0
- package/dist/internal/components/Checkbox.js.map +1 -0
- package/dist/internal/components/Clipboard.js +9 -0
- package/dist/internal/components/Clipboard.js.map +1 -0
- package/dist/internal/components/Collapsible.js +9 -0
- package/dist/internal/components/Collapsible.js.map +1 -0
- package/dist/internal/components/CollapsiblePanel.js +11 -0
- package/dist/internal/components/CollapsiblePanel.js.map +1 -0
- package/dist/internal/components/Combobox.js +13 -0
- package/dist/internal/components/Combobox.js.map +1 -0
- package/dist/internal/components/DatePicker.js +11 -0
- package/dist/internal/components/DatePicker.js.map +1 -0
- package/dist/internal/components/DateRangePicker.js +17 -0
- package/dist/internal/components/DateRangePicker.js.map +1 -0
- package/dist/internal/components/DiffView.js +9 -0
- package/dist/internal/components/DiffView.js.map +1 -0
- package/dist/internal/components/DotsLoader.js +5 -0
- package/dist/internal/components/DotsLoader.js.map +1 -0
- package/dist/internal/components/DropdownMenu.js +11 -0
- package/dist/internal/components/DropdownMenu.js.map +1 -0
- package/dist/internal/components/EmptySearchContent.js +4 -0
- package/dist/internal/components/EmptySearchContent.js.map +1 -0
- package/dist/internal/components/FileUpload.js +11 -0
- package/dist/internal/components/FileUpload.js.map +1 -0
- package/dist/internal/components/FullScreenModal.js +12 -0
- package/dist/internal/components/FullScreenModal.js.map +1 -0
- package/dist/internal/components/HelpBlock.js +4 -0
- package/dist/internal/components/HelpBlock.js.map +1 -0
- package/dist/internal/components/HoverCard.js +9 -0
- package/dist/internal/components/HoverCard.js.map +1 -0
- package/dist/internal/components/InputGroup.js +11 -0
- package/dist/internal/components/InputGroup.js.map +1 -0
- package/dist/internal/components/Kbd.js +9 -0
- package/dist/internal/components/Kbd.js.map +1 -0
- package/dist/internal/components/Label.js +9 -0
- package/dist/internal/components/Label.js.map +1 -0
- package/dist/internal/components/Link.js +9 -0
- package/dist/internal/components/Link.js.map +1 -0
- package/dist/internal/components/MarkedText.js +5 -0
- package/dist/internal/components/MarkedText.js.map +1 -0
- package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js +10 -0
- package/dist/internal/components/MergeEditor/ConflictStatus/ConflictStatusIndicator.js.map +1 -0
- package/dist/internal/components/MergeEditor/PaneHeader.js +4 -0
- package/dist/internal/components/MergeEditor/PaneHeader.js.map +1 -0
- package/dist/internal/components/MergeEditor/constants.js +4 -0
- package/dist/internal/components/MergeEditor/constants.js.map +1 -0
- package/dist/internal/components/MergeEditor/useMergeDiff.js +5 -0
- package/dist/internal/components/MergeEditor/useMergeDiff.js.map +1 -0
- package/dist/internal/components/Modal.js +13 -0
- package/dist/internal/components/Modal.js.map +1 -0
- package/dist/internal/components/Navbar.js +14 -0
- package/dist/internal/components/Navbar.js.map +1 -0
- package/dist/internal/components/Pagination.js +11 -0
- package/dist/internal/components/Pagination.js.map +1 -0
- package/dist/internal/components/PanelWithDetails.js +11 -0
- package/dist/internal/components/PanelWithDetails.js.map +1 -0
- package/dist/internal/components/Popconfirm.js +12 -0
- package/dist/internal/components/Popconfirm.js.map +1 -0
- package/dist/internal/components/Popover.js +9 -0
- package/dist/internal/components/Popover.js.map +1 -0
- package/dist/internal/components/Progress.js +9 -0
- package/dist/internal/components/Progress.js.map +1 -0
- package/dist/internal/components/RadioGroup.js +12 -0
- package/dist/internal/components/RadioGroup.js.map +1 -0
- package/dist/internal/components/Resizable.js +9 -0
- package/dist/internal/components/Resizable.js.map +1 -0
- package/dist/internal/components/ScrollArea.js +9 -0
- package/dist/internal/components/ScrollArea.js.map +1 -0
- package/dist/internal/components/Search.js +10 -0
- package/dist/internal/components/Search.js.map +1 -0
- package/dist/internal/components/Select.js +12 -0
- package/dist/internal/components/Select.js.map +1 -0
- package/dist/internal/components/Separator.js +9 -0
- package/dist/internal/components/Separator.js.map +1 -0
- package/dist/internal/components/Sheet.js +12 -0
- package/dist/internal/components/Sheet.js.map +1 -0
- package/dist/internal/components/Sidebar.js +20 -0
- package/dist/internal/components/Sidebar.js.map +1 -0
- package/dist/internal/components/Skeleton/Skeleton.js +9 -0
- package/dist/internal/components/Skeleton/Skeleton.js.map +1 -0
- package/dist/internal/components/Skeleton/SkeletonList.js +10 -0
- package/dist/internal/components/Skeleton/SkeletonList.js.map +1 -0
- package/dist/internal/components/Slider.js +11 -0
- package/dist/internal/components/Slider.js.map +1 -0
- package/dist/internal/components/SpotlightBackdrop.js +9 -0
- package/dist/internal/components/SpotlightBackdrop.js.map +1 -0
- package/dist/internal/components/Stepper.js +10 -0
- package/dist/internal/components/Stepper.js.map +1 -0
- package/dist/internal/components/Switch.js +10 -0
- package/dist/internal/components/Switch.js.map +1 -0
- package/dist/internal/components/Table.js +10 -0
- package/dist/internal/components/Table.js.map +1 -0
- package/dist/internal/components/Tabs.js +12 -0
- package/dist/internal/components/Tabs.js.map +1 -0
- package/dist/internal/components/ThemeProvider.js +10 -0
- package/dist/internal/components/ThemeProvider.js.map +1 -0
- package/dist/internal/components/TimePicker.js +12 -0
- package/dist/internal/components/TimePicker.js.map +1 -0
- package/dist/internal/components/Timeline.js +10 -0
- package/dist/internal/components/Timeline.js.map +1 -0
- package/dist/internal/components/Toast.js +11 -0
- package/dist/internal/components/Toast.js.map +1 -0
- package/dist/internal/components/Toggle.js +9 -0
- package/dist/internal/components/Toggle.js.map +1 -0
- package/dist/internal/components/ToggleGroup.js +9 -0
- package/dist/internal/components/ToggleGroup.js.map +1 -0
- package/dist/internal/components/Tooltip.js +8 -0
- package/dist/internal/components/Tooltip.js.map +1 -0
- package/dist/internal/components/Truncated.js +9 -0
- package/dist/internal/components/Truncated.js.map +1 -0
- package/dist/internal/components/Workbench.js +11 -0
- package/dist/internal/components/Workbench.js.map +1 -0
- package/dist/internal/components/ZoomableSvg.js +13 -0
- package/dist/internal/components/ZoomableSvg.js.map +1 -0
- package/dist/internal/hooks/useAutosizeInput.js +4 -0
- package/dist/internal/hooks/useAutosizeInput.js.map +1 -0
- package/dist/internal/hooks/useScrollbarPosition.js +5 -0
- package/dist/internal/hooks/useScrollbarPosition.js.map +1 -0
- package/dist/internal/hooks/useStableCallback.js +4 -0
- package/dist/internal/hooks/useStableCallback.js.map +1 -0
- package/dist/internal/utils/mergeRefs.js +4 -0
- package/dist/internal/utils/mergeRefs.js.map +1 -0
- package/dist/internal/utils.js +8 -0
- package/dist/internal/utils.js.map +1 -0
- package/dist/markdown-editor.js +23 -9
- package/dist/markdown-editor.js.map +1 -1
- package/dist/mermaid.js +16 -8
- package/dist/rjsf.js +102 -29
- package/dist/rjsf.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/testing.js +8 -3
- package/dist/testing.js.map +1 -1
- package/package.json +9 -8
- package/src/styles.css +35 -7
- package/src/theme.css +64 -0
- package/dist/MermaidDiagram-EOKJHQQV.js +0 -10
- package/dist/chunk-63NSN2VL.js.map +0 -1
- package/dist/chunk-6FPEI4EM.js.map +0 -1
- package/dist/chunk-7PUUHEJQ.js.map +0 -1
- package/dist/chunk-C3L3TBBT.js.map +0 -1
- package/dist/chunk-IJTHFNNJ.js.map +0 -1
- package/dist/chunk-JP7PNHLH.js.map +0 -1
- package/dist/chunk-KPNAW5MU.js +0 -229
- package/dist/chunk-KPNAW5MU.js.map +0 -1
- package/dist/chunk-L37JJ6MR.js +0 -152
- package/dist/chunk-L37JJ6MR.js.map +0 -1
- package/dist/chunk-Q7NWXLCT.js.map +0 -1
- package/dist/chunk-SYIEF644.js +0 -1016
- package/dist/chunk-SYIEF644.js.map +0 -1
- package/dist/chunk-XV3UUOYF.js.map +0 -1
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { Label } from './chunk-S6TAF63G.js';
|
|
2
|
+
import { Check, Copy, Eye, EyeOff } from './chunk-RQVK4IYC.js';
|
|
3
|
+
import { Tooltip, copyToClipboard } from './chunk-SWQFYNYG.js';
|
|
4
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
5
|
+
import { createContext, useEffect, useState, useRef, useId, useCallback, useMemo, use } from 'react';
|
|
6
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
7
|
+
|
|
8
|
+
var CopyContext = createContext(null);
|
|
9
|
+
var useCopyContext = () => {
|
|
10
|
+
const ctx = use(CopyContext);
|
|
11
|
+
if (!ctx) throw new Error("CopyField.* components must be used within a CopyField.Root");
|
|
12
|
+
return ctx;
|
|
13
|
+
};
|
|
14
|
+
var LINE_HEIGHT_REM = 1.25;
|
|
15
|
+
var VERTICAL_PADDING_REM = 1.25;
|
|
16
|
+
var COPY_HINT_DELAY_MS = 2e3;
|
|
17
|
+
var CopyBox = ({ className, children }) => {
|
|
18
|
+
const { copied, handleCopy, mono, minLines, maxLines, boxId, labelId, hasLabel, hoverHint } = useCopyContext();
|
|
19
|
+
const multiline = maxLines > 1;
|
|
20
|
+
const multilineStyle = multiline ? {
|
|
21
|
+
minHeight: `${minLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`,
|
|
22
|
+
maxHeight: `${maxLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`
|
|
23
|
+
} : void 0;
|
|
24
|
+
const handleKeyDown = (event) => {
|
|
25
|
+
if (event.target !== event.currentTarget) return;
|
|
26
|
+
if (event.key !== "Enter" && event.key !== " ") return;
|
|
27
|
+
event.preventDefault();
|
|
28
|
+
handleCopy();
|
|
29
|
+
};
|
|
30
|
+
return /* @__PURE__ */ jsx(
|
|
31
|
+
Tooltip,
|
|
32
|
+
{
|
|
33
|
+
triggerAsChild: true,
|
|
34
|
+
placement: "top",
|
|
35
|
+
tooltip: copied ? "Copied" : hoverHint ? "Copy" : null,
|
|
36
|
+
forceShow: copied,
|
|
37
|
+
delayDuration: COPY_HINT_DELAY_MS,
|
|
38
|
+
children: /* @__PURE__ */ jsx(
|
|
39
|
+
"div",
|
|
40
|
+
{
|
|
41
|
+
role: "button",
|
|
42
|
+
tabIndex: 0,
|
|
43
|
+
id: boxId,
|
|
44
|
+
"aria-labelledby": hasLabel ? labelId : void 0,
|
|
45
|
+
onClick: handleCopy,
|
|
46
|
+
onKeyDown: handleKeyDown,
|
|
47
|
+
style: multilineStyle,
|
|
48
|
+
className: cn(
|
|
49
|
+
"tw:group tw:relative tw:flex tw:w-fit tw:max-w-full tw:cursor-pointer tw:gap-2 tw:rounded-2xl tw:[corner-shape:superellipse(2)] tw:border tw:border-border tw:bg-card tw:px-3 tw:py-2.5 tw:text-left tw:shadow-sm tw:transition-colors tw:hover:bg-muted",
|
|
50
|
+
multiline ? "tw:items-start tw:overflow-auto" : "tw:items-center tw:overflow-hidden",
|
|
51
|
+
mono && "tw:font-mono tw:text-[13px]",
|
|
52
|
+
className
|
|
53
|
+
),
|
|
54
|
+
children
|
|
55
|
+
}
|
|
56
|
+
)
|
|
57
|
+
}
|
|
58
|
+
);
|
|
59
|
+
};
|
|
60
|
+
var CopyButton = ({ className }) => {
|
|
61
|
+
const { copied, maxLines } = useCopyContext();
|
|
62
|
+
return /* @__PURE__ */ jsx(
|
|
63
|
+
"span",
|
|
64
|
+
{
|
|
65
|
+
"aria-hidden": true,
|
|
66
|
+
className: cn(
|
|
67
|
+
"tw:pointer-events-none tw:flex tw:shrink-0 tw:items-center tw:text-muted-foreground tw:group-hover:text-foreground",
|
|
68
|
+
maxLines > 1 && "tw:self-start tw:pt-0.5",
|
|
69
|
+
className
|
|
70
|
+
),
|
|
71
|
+
children: copied ? /* @__PURE__ */ jsx(Check, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Copy, { className: "tw:size-4" })
|
|
72
|
+
}
|
|
73
|
+
);
|
|
74
|
+
};
|
|
75
|
+
var CopyChildren = ({ children, className }) => {
|
|
76
|
+
const { maxLines } = useCopyContext();
|
|
77
|
+
const multiline = maxLines > 1;
|
|
78
|
+
return /* @__PURE__ */ jsx(
|
|
79
|
+
"span",
|
|
80
|
+
{
|
|
81
|
+
className: cn(
|
|
82
|
+
"tw:min-w-0 tw:flex-1 tw:select-text tw:text-card-foreground",
|
|
83
|
+
multiline ? "tw:whitespace-pre-wrap tw:break-words" : "tw:truncate",
|
|
84
|
+
className
|
|
85
|
+
),
|
|
86
|
+
children
|
|
87
|
+
}
|
|
88
|
+
);
|
|
89
|
+
};
|
|
90
|
+
var CopyFooter = ({ children, className }) => {
|
|
91
|
+
if (!children) return null;
|
|
92
|
+
return /* @__PURE__ */ jsx("p", { className: cn("tw:m-0 tw:text-xs tw:text-muted-foreground", className), children });
|
|
93
|
+
};
|
|
94
|
+
var MASK = "*".repeat(12);
|
|
95
|
+
var CopyHidden = ({ children, revealable = true, className }) => {
|
|
96
|
+
const { hidden, registerRevealable } = useCopyContext();
|
|
97
|
+
useEffect(() => {
|
|
98
|
+
if (!revealable) return void 0;
|
|
99
|
+
return registerRevealable();
|
|
100
|
+
}, [revealable, registerRevealable]);
|
|
101
|
+
const masked = revealable ? hidden : true;
|
|
102
|
+
return /* @__PURE__ */ jsx("span", { className: cn("tw:select-none", className), children: masked ? MASK : children });
|
|
103
|
+
};
|
|
104
|
+
var CopyLabel = ({ children, leading, trailing, className }) => {
|
|
105
|
+
const { labelId, registerLabel } = useCopyContext();
|
|
106
|
+
useEffect(() => registerLabel(), [registerLabel]);
|
|
107
|
+
return /* @__PURE__ */ jsxs("div", { className: cn("tw:flex tw:items-center tw:gap-1", className), children: [
|
|
108
|
+
/* @__PURE__ */ jsx(Label, { id: labelId, children }),
|
|
109
|
+
leading,
|
|
110
|
+
trailing != null && /* @__PURE__ */ jsx("span", { className: "tw:ml-auto tw:flex tw:items-center", children: trailing })
|
|
111
|
+
] });
|
|
112
|
+
};
|
|
113
|
+
var CopyPrefix = ({ children, className }) => /* @__PURE__ */ jsx(
|
|
114
|
+
"span",
|
|
115
|
+
{
|
|
116
|
+
"aria-hidden": true,
|
|
117
|
+
className: cn(
|
|
118
|
+
"tw:shrink-0 tw:select-none tw:self-stretch tw:border-r tw:border-border tw:pr-2 tw:text-muted-foreground",
|
|
119
|
+
className
|
|
120
|
+
),
|
|
121
|
+
children
|
|
122
|
+
}
|
|
123
|
+
);
|
|
124
|
+
var CopyReveal = ({ className }) => {
|
|
125
|
+
const { hidden, toggleHidden, hasRevealable, maxLines } = useCopyContext();
|
|
126
|
+
if (!hasRevealable) return null;
|
|
127
|
+
const handleClick = (event) => {
|
|
128
|
+
event.stopPropagation();
|
|
129
|
+
toggleHidden();
|
|
130
|
+
};
|
|
131
|
+
return /* @__PURE__ */ jsx(
|
|
132
|
+
"button",
|
|
133
|
+
{
|
|
134
|
+
type: "button",
|
|
135
|
+
onClick: handleClick,
|
|
136
|
+
"aria-label": hidden ? "Show value" : "Hide value",
|
|
137
|
+
className: cn(
|
|
138
|
+
"tw:flex tw:shrink-0 tw:items-center tw:text-muted-foreground tw:hover:text-foreground",
|
|
139
|
+
maxLines > 1 && "tw:self-start tw:pt-0.5",
|
|
140
|
+
className
|
|
141
|
+
),
|
|
142
|
+
children: hidden ? /* @__PURE__ */ jsx(Eye, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(EyeOff, { className: "tw:size-4" })
|
|
143
|
+
}
|
|
144
|
+
);
|
|
145
|
+
};
|
|
146
|
+
var CopyRoot = ({
|
|
147
|
+
value,
|
|
148
|
+
mono = false,
|
|
149
|
+
onCopy,
|
|
150
|
+
hiddenByDefault = false,
|
|
151
|
+
minLines = 1,
|
|
152
|
+
maxLines,
|
|
153
|
+
hoverHint = true,
|
|
154
|
+
className,
|
|
155
|
+
children
|
|
156
|
+
}) => {
|
|
157
|
+
const [copied, setCopied] = useState(false);
|
|
158
|
+
const [hidden, setHidden] = useState(hiddenByDefault);
|
|
159
|
+
const [revealableCount, setRevealableCount] = useState(0);
|
|
160
|
+
const [labelCount, setLabelCount] = useState(0);
|
|
161
|
+
const resetTimerRef = useRef(void 0);
|
|
162
|
+
const generatedId = useId();
|
|
163
|
+
const labelId = `${generatedId}-label`;
|
|
164
|
+
const boxId = `${generatedId}-box`;
|
|
165
|
+
useEffect(() => () => clearTimeout(resetTimerRef.current), []);
|
|
166
|
+
const handleCopy = useCallback(() => {
|
|
167
|
+
const selection = window.getSelection();
|
|
168
|
+
const boxEl = document.getElementById(boxId);
|
|
169
|
+
if (selection && !selection.isCollapsed && selection.anchorNode && boxEl?.contains(selection.anchorNode)) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
copyToClipboard(value).then(() => {
|
|
173
|
+
onCopy?.();
|
|
174
|
+
setCopied(true);
|
|
175
|
+
clearTimeout(resetTimerRef.current);
|
|
176
|
+
resetTimerRef.current = setTimeout(() => setCopied(false), 1500);
|
|
177
|
+
}).catch((error) => {
|
|
178
|
+
console.error("Copy to clipboard failed", error);
|
|
179
|
+
});
|
|
180
|
+
}, [value, onCopy, boxId]);
|
|
181
|
+
const toggleHidden = useCallback(() => setHidden((prev) => !prev), []);
|
|
182
|
+
const registerRevealable = useCallback(() => {
|
|
183
|
+
setRevealableCount((count) => count + 1);
|
|
184
|
+
return () => setRevealableCount((count) => count - 1);
|
|
185
|
+
}, []);
|
|
186
|
+
const registerLabel = useCallback(() => {
|
|
187
|
+
setLabelCount((count) => count + 1);
|
|
188
|
+
return () => setLabelCount((count) => count - 1);
|
|
189
|
+
}, []);
|
|
190
|
+
const contextValue = useMemo(
|
|
191
|
+
() => ({
|
|
192
|
+
copied,
|
|
193
|
+
handleCopy,
|
|
194
|
+
value,
|
|
195
|
+
mono,
|
|
196
|
+
hidden,
|
|
197
|
+
toggleHidden,
|
|
198
|
+
registerRevealable,
|
|
199
|
+
hasRevealable: revealableCount > 0,
|
|
200
|
+
registerLabel,
|
|
201
|
+
hasLabel: labelCount > 0,
|
|
202
|
+
minLines,
|
|
203
|
+
maxLines: maxLines ?? minLines,
|
|
204
|
+
hoverHint,
|
|
205
|
+
labelId,
|
|
206
|
+
boxId
|
|
207
|
+
}),
|
|
208
|
+
[
|
|
209
|
+
copied,
|
|
210
|
+
handleCopy,
|
|
211
|
+
value,
|
|
212
|
+
mono,
|
|
213
|
+
hidden,
|
|
214
|
+
toggleHidden,
|
|
215
|
+
registerRevealable,
|
|
216
|
+
revealableCount,
|
|
217
|
+
registerLabel,
|
|
218
|
+
labelCount,
|
|
219
|
+
minLines,
|
|
220
|
+
maxLines,
|
|
221
|
+
hoverHint,
|
|
222
|
+
labelId,
|
|
223
|
+
boxId
|
|
224
|
+
]
|
|
225
|
+
);
|
|
226
|
+
return /* @__PURE__ */ jsx(CopyContext, { value: contextValue, children: /* @__PURE__ */ jsx("div", { className: cn("tw:flex tw:w-fit tw:max-w-full tw:flex-col tw:gap-1", className), children }) });
|
|
227
|
+
};
|
|
228
|
+
var CopySuffix = ({ children, className }) => /* @__PURE__ */ jsx(
|
|
229
|
+
"span",
|
|
230
|
+
{
|
|
231
|
+
"aria-hidden": true,
|
|
232
|
+
className: cn(
|
|
233
|
+
"tw:shrink-0 tw:select-none tw:self-stretch tw:border-l tw:border-border tw:pl-2 tw:text-muted-foreground",
|
|
234
|
+
className
|
|
235
|
+
),
|
|
236
|
+
children
|
|
237
|
+
}
|
|
238
|
+
);
|
|
239
|
+
|
|
240
|
+
// src/blocks/CopyField/CopyField.tsx
|
|
241
|
+
var CopyField = {
|
|
242
|
+
/** Container. Owns the copied `value`, mask state, and copy context. */
|
|
243
|
+
Root: CopyRoot,
|
|
244
|
+
/** Visible label above the box, with optional `leading`/`trailing` slots. */
|
|
245
|
+
Label: CopyLabel,
|
|
246
|
+
/** The clickable copy target row. */
|
|
247
|
+
Box: CopyBox,
|
|
248
|
+
/** Muted, non-selectable prefix addon (not copied). */
|
|
249
|
+
Prefix: CopyPrefix,
|
|
250
|
+
/** Displayed value (truncates single-line, wraps multi-line). */
|
|
251
|
+
Children: CopyChildren,
|
|
252
|
+
/** Muted, non-selectable suffix addon (not copied). */
|
|
253
|
+
Suffix: CopySuffix,
|
|
254
|
+
/** Masks its children with dots; copy still copies the real value. */
|
|
255
|
+
Hidden: CopyHidden,
|
|
256
|
+
/** Eye toggle that reveals/masks revealable `CopyField.Hidden` content. */
|
|
257
|
+
Reveal: CopyReveal,
|
|
258
|
+
/** Copy affordance icon — shows Copy/Check with feedback. */
|
|
259
|
+
Button: CopyButton,
|
|
260
|
+
/** Small helper text below the box. */
|
|
261
|
+
Footer: CopyFooter
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
export { CopyField };
|
|
265
|
+
//# sourceMappingURL=chunk-RUTPQNLR.js.map
|
|
266
|
+
//# sourceMappingURL=chunk-RUTPQNLR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/CopyField/CopyContext.tsx","../src/blocks/CopyField/CopyBox.tsx","../src/blocks/CopyField/CopyButton.tsx","../src/blocks/CopyField/CopyChildren.tsx","../src/blocks/CopyField/CopyFooter.tsx","../src/blocks/CopyField/CopyHidden.tsx","../src/blocks/CopyField/CopyLabel.tsx","../src/blocks/CopyField/CopyPrefix.tsx","../src/blocks/CopyField/CopyReveal.tsx","../src/blocks/CopyField/CopyRoot.tsx","../src/blocks/CopyField/CopySuffix.tsx","../src/blocks/CopyField/CopyField.tsx"],"names":["jsx","useEffect"],"mappings":";;;;;;;AAyCO,IAAM,WAAA,GAAc,cAAuC,IAAI,CAAA;AAE/D,IAAM,iBAAiB,MAAM;AAClC,EAAA,MAAM,GAAA,GAAM,IAAI,WAAW,CAAA;AAC3B,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,6DAA6D,CAAA;AACvF,EAAA,OAAO,GAAA;AACT,CAAA;AClCA,IAAM,eAAA,GAAkB,IAAA;AACxB,IAAM,oBAAA,GAAuB,IAAA;AAG7B,IAAM,kBAAA,GAAqB,GAAA;AASpB,IAAM,OAAA,GAAU,CAAC,EAAE,SAAA,EAAW,UAAS,KAAoB;AAChE,EAAA,MAAM,EAAE,MAAA,EAAQ,UAAA,EAAY,IAAA,EAAM,QAAA,EAAU,QAAA,EAAU,KAAA,EAAO,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,GACxF,cAAA,EAAe;AAEjB,EAAA,MAAM,YAAY,QAAA,GAAW,CAAA;AAC7B,EAAA,MAAM,iBAA4C,SAAA,GAC9C;AAAA,IACE,SAAA,EAAW,CAAA,EAAG,QAAA,GAAW,eAAA,GAAkB,oBAAoB,CAAA,GAAA,CAAA;AAAA,IAC/D,SAAA,EAAW,CAAA,EAAG,QAAA,GAAW,eAAA,GAAkB,oBAAoB,CAAA,GAAA;AAAA,GACjE,GACA,MAAA;AAEJ,EAAA,MAAM,aAAA,GAAgB,CAAC,KAAA,KAAyC;AAC9D,IAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAM,aAAA,EAAe;AAC1C,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,OAAA,IAAW,KAAA,CAAM,QAAQ,GAAA,EAAK;AAChD,IAAA,KAAA,CAAM,cAAA,EAAe;AACrB,IAAA,UAAA,EAAW;AAAA,EACb,CAAA;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MACC,cAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,MAAA,GAAS,QAAA,GAAW,SAAA,GAAY,MAAA,GAAS,IAAA;AAAA,MAClD,SAAA,EAAW,MAAA;AAAA,MACX,aAAA,EAAe,kBAAA;AAAA,MAEf,QAAA,kBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,IAAA,EAAK,QAAA;AAAA,UACL,QAAA,EAAU,CAAA;AAAA,UACV,EAAA,EAAI,KAAA;AAAA,UACJ,iBAAA,EAAiB,WAAW,OAAA,GAAU,MAAA;AAAA,UACtC,OAAA,EAAS,UAAA;AAAA,UACT,SAAA,EAAW,aAAA;AAAA,UACX,KAAA,EAAO,cAAA;AAAA,UACP,SAAA,EAAW,EAAA;AAAA,YACT,0PAAA;AAAA,YACA,YAAY,iCAAA,GAAoC,oCAAA;AAAA,YAChD,IAAA,IAAQ,6BAAA;AAAA,YACR;AAAA,WACF;AAAA,UAEC;AAAA;AAAA;AACH;AAAA,GACF;AAEJ,CAAA;AC9DO,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,EAAU,KAAuB;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAA,EAAS,GAAI,cAAA,EAAe;AAE5C,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,aAAA,EAAW,IAAA;AAAA,MACX,SAAA,EAAW,EAAA;AAAA,QACT,oHAAA;AAAA,QACA,WAAW,CAAA,IAAK,yBAAA;AAAA,QAChB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,MAAA,mBAASA,GAAAA,CAAC,KAAA,EAAA,EAAM,SAAA,EAAU,WAAA,EAAY,CAAA,mBAAKA,GAAAA,CAAC,IAAA,EAAA,EAAS,SAAA,EAAU,WAAA,EAAY;AAAA;AAAA,GAC9E;AAEJ,CAAA;ACbO,IAAM,YAAA,GAAe,CAAC,EAAE,QAAA,EAAU,WAAU,KAAyB;AAC1E,EAAA,MAAM,EAAE,QAAA,EAAS,GAAI,cAAA,EAAe;AACpC,EAAA,MAAM,YAAY,QAAA,GAAW,CAAA;AAE7B,EAAA,uBACEA,GAAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,EAAA;AAAA,QACT,6DAAA;AAAA,QACA,YAAY,uCAAA,GAA0C,aAAA;AAAA,QACtD;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ,CAAA;ACjBO,IAAM,UAAA,GAAa,CAAC,EAAE,QAAA,EAAU,WAAU,KAAuB;AACtE,EAAA,IAAI,CAAC,UAAU,OAAO,IAAA;AAEtB,EAAA,uBAAOA,IAAC,GAAA,EAAA,EAAE,SAAA,EAAW,GAAG,4CAAA,EAA8C,SAAS,GAAI,QAAA,EAAS,CAAA;AAC9F,CAAA;ACGA,IAAM,IAAA,GAAO,GAAA,CAAI,MAAA,CAAO,EAAE,CAAA;AAMnB,IAAM,aAAa,CAAC,EAAE,UAAU,UAAA,GAAa,IAAA,EAAM,WAAU,KAAuB;AACzF,EAAA,MAAM,EAAE,MAAA,EAAQ,kBAAA,EAAmB,GAAI,cAAA,EAAe;AAEtD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,YAAY,OAAO,MAAA;AACxB,IAAA,OAAO,kBAAA,EAAmB;AAAA,EAC5B,CAAA,EAAG,CAAC,UAAA,EAAY,kBAAkB,CAAC,CAAA;AAEnC,EAAA,MAAM,MAAA,GAAS,aAAa,MAAA,GAAS,IAAA;AAErC,EAAA,uBAAOA,GAAAA,CAAC,MAAA,EAAA,EAAK,SAAA,EAAW,EAAA,CAAG,kBAAkB,SAAS,CAAA,EAAI,QAAA,EAAA,MAAA,GAAS,IAAA,GAAO,QAAA,EAAS,CAAA;AACrF,CAAA;ACVO,IAAM,YAAY,CAAC,EAAE,UAAU,OAAA,EAAS,QAAA,EAAU,WAAU,KAAsB;AACvF,EAAA,MAAM,EAAE,OAAA,EAAS,aAAA,EAAc,GAAI,cAAA,EAAe;AAElD,EAAAC,UAAU,MAAM,aAAA,EAAc,EAAG,CAAC,aAAa,CAAC,CAAA;AAEhD,EAAA,4BACG,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,kCAAA,EAAoC,SAAS,CAAA,EAC9D,QAAA,EAAA;AAAA,oBAAAD,GAAAA,CAAC,KAAA,EAAA,EAAM,EAAA,EAAI,OAAA,EAAU,QAAA,EAAS,CAAA;AAAA,IAC7B,OAAA;AAAA,IACA,YAAY,IAAA,oBAAQA,IAAC,MAAA,EAAA,EAAK,SAAA,EAAU,sCAAsC,QAAA,EAAA,QAAA,EAAS;AAAA,GAAA,EACtF,CAAA;AAEJ,CAAA;AC1BO,IAAM,aAAa,CAAC,EAAE,QAAA,EAAU,SAAA,uBACrCA,GAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,aAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,EAAA;AAAA,MACT,0GAAA;AAAA,MACA;AAAA,KACF;AAAA,IAEC;AAAA;AACH,CAAA;ACPK,IAAM,UAAA,GAAa,CAAC,EAAE,SAAA,EAAU,KAAuB;AAC5D,EAAA,MAAM,EAAE,MAAA,EAAQ,YAAA,EAAc,aAAA,EAAe,QAAA,KAAa,cAAA,EAAe;AAEzE,EAAA,IAAI,CAAC,eAAe,OAAO,IAAA;AAE3B,EAAA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAyC;AAC5D,IAAA,KAAA,CAAM,eAAA,EAAgB;AACtB,IAAA,YAAA,EAAa;AAAA,EACf,CAAA;AAEA,EAAA,uBACEA,GAAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,QAAA;AAAA,MACL,OAAA,EAAS,WAAA;AAAA,MACT,YAAA,EAAY,SAAS,YAAA,GAAe,YAAA;AAAA,MACpC,SAAA,EAAW,EAAA;AAAA,QACT,uFAAA;AAAA,QACA,WAAW,CAAA,IAAK,yBAAA;AAAA,QAChB;AAAA,OACF;AAAA,MAEC,QAAA,EAAA,MAAA,mBAASA,GAAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY,CAAA,mBAAKA,GAAAA,CAAC,MAAA,EAAA,EAAO,SAAA,EAAU,WAAA,EAAY;AAAA;AAAA,GAC1E;AAEJ,CAAA;ACLO,IAAM,WAAW,CAAC;AAAA,EACvB,KAAA;AAAA,EACA,IAAA,GAAO,KAAA;AAAA,EACP,MAAA;AAAA,EACA,eAAA,GAAkB,KAAA;AAAA,EAClB,QAAA,GAAW,CAAA;AAAA,EACX,QAAA;AAAA,EACA,SAAA,GAAY,IAAA;AAAA,EACZ,SAAA;AAAA,EACA;AACF,CAAA,KAAqB;AACnB,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,KAAK,CAAA;AAC1C,EAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAS,eAAe,CAAA;AACpD,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,CAAC,CAAA;AACxD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,CAAC,CAAA;AAC9C,EAAA,MAAM,aAAA,GAAgB,OAAkD,MAAS,CAAA;AAEjF,EAAA,MAAM,cAAc,KAAA,EAAM;AAC1B,EAAA,MAAM,OAAA,GAAU,GAAG,WAAW,CAAA,MAAA,CAAA;AAC9B,EAAA,MAAM,KAAA,GAAQ,GAAG,WAAW,CAAA,IAAA,CAAA;AAE5B,EAAAC,SAAAA,CAAU,MAAM,MAAM,YAAA,CAAa,cAAc,OAAO,CAAA,EAAG,EAAE,CAAA;AAE7D,EAAA,MAAM,UAAA,GAAa,YAAY,MAAM;AACnC,IAAA,MAAM,SAAA,GAAY,OAAO,YAAA,EAAa;AACtC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,cAAA,CAAe,KAAK,CAAA;AAC3C,IAAA,IACE,SAAA,IACA,CAAC,SAAA,CAAU,WAAA,IACX,SAAA,CAAU,cACV,KAAA,EAAO,QAAA,CAAS,SAAA,CAAU,UAAU,CAAA,EACpC;AACA,MAAA;AAAA,IACF;AAEA,IAAA,eAAA,CAAgB,KAAK,CAAA,CAClB,IAAA,CAAK,MAAM;AACV,MAAA,MAAA,IAAS;AACT,MAAA,SAAA,CAAU,IAAI,CAAA;AACd,MAAA,YAAA,CAAa,cAAc,OAAO,CAAA;AAClC,MAAA,aAAA,CAAc,UAAU,UAAA,CAAW,MAAM,SAAA,CAAU,KAAK,GAAG,IAAI,CAAA;AAAA,IACjE,CAAC,CAAA,CACA,KAAA,CAAM,CAAC,KAAA,KAAmB;AAEzB,MAAA,OAAA,CAAQ,KAAA,CAAM,4BAA4B,KAAK,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACL,CAAA,EAAG,CAAC,KAAA,EAAO,MAAA,EAAQ,KAAK,CAAC,CAAA;AAEzB,EAAA,MAAM,YAAA,GAAe,WAAA,CAAY,MAAM,SAAA,CAAU,CAAC,SAAS,CAAC,IAAI,CAAA,EAAG,EAAE,CAAA;AAErE,EAAA,MAAM,kBAAA,GAAqB,YAAY,MAAM;AAC3C,IAAA,kBAAA,CAAmB,CAAC,KAAA,KAAU,KAAA,GAAQ,CAAC,CAAA;AACvC,IAAA,OAAO,MAAM,kBAAA,CAAmB,CAAC,KAAA,KAAU,QAAQ,CAAC,CAAA;AAAA,EACtD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,aAAA,CAAc,CAAC,KAAA,KAAU,KAAA,GAAQ,CAAC,CAAA;AAClC,IAAA,OAAO,MAAM,aAAA,CAAc,CAAC,KAAA,KAAU,QAAQ,CAAC,CAAA;AAAA,EACjD,CAAA,EAAG,EAAE,CAAA;AAEL,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,OAAO;AAAA,MACL,MAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAe,eAAA,GAAkB,CAAA;AAAA,MACjC,aAAA;AAAA,MACA,UAAU,UAAA,GAAa,CAAA;AAAA,MACvB,QAAA;AAAA,MACA,UAAU,QAAA,IAAY,QAAA;AAAA,MACtB,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF,CAAA;AAAA,IACA;AAAA,MACE,MAAA;AAAA,MACA,UAAA;AAAA,MACA,KAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,QAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA;AACF,GACF;AAEA,EAAA,uBACED,GAAAA,CAAC,WAAA,EAAA,EAAY,KAAA,EAAO,cAClB,QAAA,kBAAAA,GAAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAW,EAAA,CAAG,qDAAA,EAAuD,SAAS,CAAA,EAChF,UACH,CAAA,EACF,CAAA;AAEJ,CAAA;AC7HO,IAAM,aAAa,CAAC,EAAE,QAAA,EAAU,SAAA,uBACrCA,GAAAA;AAAA,EAAC,MAAA;AAAA,EAAA;AAAA,IACC,aAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW,EAAA;AAAA,MACT,0GAAA;AAAA,MACA;AAAA,KACF;AAAA,IAEC;AAAA;AACH,CAAA;;;ACmCK,IAAM,SAAA,GAAY;AAAA;AAAA,EAEvB,IAAA,EAAM,QAAA;AAAA;AAAA,EAEN,KAAA,EAAO,SAAA;AAAA;AAAA,EAEP,GAAA,EAAK,OAAA;AAAA;AAAA,EAEL,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,QAAA,EAAU,YAAA;AAAA;AAAA,EAEV,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,MAAA,EAAQ,UAAA;AAAA;AAAA,EAER,MAAA,EAAQ;AACV","file":"chunk-RUTPQNLR.js","sourcesContent":["import { createContext, use } from 'react';\n\ntype CopyContextValue = {\n /** Whether a copy just happened (drives the Copy → Check feedback for ~1.5s). */\n copied: boolean;\n /** Copies the real `value` to the clipboard, guarded against drag-select. */\n handleCopy: () => void;\n /** The real value copied to the clipboard, regardless of masking. */\n value: string;\n /** Render displayed content in monospace/code style. */\n mono: boolean;\n /** Whether to show the \"Copy\" hint tooltip on hover (else only \"Copied\" on copy). */\n hoverHint: boolean;\n /** Whether revealable `CopyField.Hidden` content is currently masked. */\n hidden: boolean;\n /** Toggles the masked ↔ revealed state. */\n toggleHidden: () => void;\n /**\n * Registers a revealable `CopyField.Hidden` so `CopyField.Reveal` knows to render.\n * Returns a cleanup that unregisters on unmount.\n */\n registerRevealable: () => () => void;\n /** True once at least one revealable `CopyField.Hidden` is mounted. */\n hasRevealable: boolean;\n /**\n * Registers the visible `CopyField.Label` so `CopyField.Box` only points `aria-labelledby`\n * at it when a label actually exists. Returns a cleanup that unregisters on unmount.\n */\n registerLabel: () => () => void;\n /** True once a `CopyField.Label` is mounted. */\n hasLabel: boolean;\n /** Minimum number of visible text lines for a multi-line box. */\n minLines: number;\n /** Maximum number of visible text lines before the box scrolls. */\n maxLines: number;\n /** Stable id of the visible label element (for `aria-labelledby`). */\n labelId: string;\n /** Stable id of the clickable box element. */\n boxId: string;\n};\n\nexport const CopyContext = createContext<CopyContextValue | null>(null);\n\nexport const useCopyContext = () => {\n const ctx = use(CopyContext);\n if (!ctx) throw new Error('CopyField.* components must be used within a CopyField.Root');\n return ctx;\n};\n","import type { CSSProperties, KeyboardEvent, ReactNode } from 'react';\n\nimport { Tooltip } from '../../components/Tooltip';\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyBoxProps = {\n /** Additional CSS classes on the box. */\n className?: string;\n children: ReactNode;\n};\n\nconst LINE_HEIGHT_REM = 1.25;\nconst VERTICAL_PADDING_REM = 1.25;\n\n// Long delay — the hover \"Copy\" hint doesn't really help UX, it just pulls focus.\nconst COPY_HINT_DELAY_MS = 2000;\n\n/**\n * The clickable copy target. Click anywhere to copy; text stays drag-selectable.\n *\n * Rendered as a `role=\"button\"` div (not a native `<button>`) so it can host\n * genuinely interactive children like `CopyField.Reveal` — nesting a `<button>`\n * inside a `<button>` is invalid HTML.\n */\nexport const CopyBox = ({ className, children }: CopyBoxProps) => {\n const { copied, handleCopy, mono, minLines, maxLines, boxId, labelId, hasLabel, hoverHint } =\n useCopyContext();\n\n const multiline = maxLines > 1;\n const multilineStyle: CSSProperties | undefined = multiline\n ? {\n minHeight: `${minLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`,\n maxHeight: `${maxLines * LINE_HEIGHT_REM + VERTICAL_PADDING_REM}rem`,\n }\n : undefined;\n\n const handleKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (event.target !== event.currentTarget) return;\n if (event.key !== 'Enter' && event.key !== ' ') return;\n event.preventDefault();\n handleCopy();\n };\n\n return (\n <Tooltip\n triggerAsChild\n placement=\"top\"\n tooltip={copied ? 'Copied' : hoverHint ? 'Copy' : null}\n forceShow={copied}\n delayDuration={COPY_HINT_DELAY_MS}\n >\n <div\n role=\"button\"\n tabIndex={0}\n id={boxId}\n aria-labelledby={hasLabel ? labelId : undefined}\n onClick={handleCopy}\n onKeyDown={handleKeyDown}\n style={multilineStyle}\n className={cn(\n 'tw:group tw:relative tw:flex tw:w-fit tw:max-w-full tw:cursor-pointer tw:gap-2 tw:rounded-2xl tw:[corner-shape:superellipse(2)] tw:border tw:border-border tw:bg-card tw:px-3 tw:py-2.5 tw:text-left tw:shadow-sm tw:transition-colors tw:hover:bg-muted',\n multiline ? 'tw:items-start tw:overflow-auto' : 'tw:items-center tw:overflow-hidden',\n mono && 'tw:font-mono tw:text-[13px]',\n className,\n )}\n >\n {children}\n </div>\n </Tooltip>\n );\n};\n","import { Check, Copy as CopyIcon } from '../../icons';\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyButtonProps = {\n className?: string;\n};\n\n/** Copy affordance icon — shows Copy/Check with feedback. */\nexport const CopyButton = ({ className }: CopyButtonProps) => {\n const { copied, maxLines } = useCopyContext();\n\n return (\n <span\n aria-hidden\n className={cn(\n 'tw:pointer-events-none tw:flex tw:shrink-0 tw:items-center tw:text-muted-foreground tw:group-hover:text-foreground',\n maxLines > 1 && 'tw:self-start tw:pt-0.5',\n className,\n )}\n >\n {copied ? <Check className=\"tw:size-4\" /> : <CopyIcon className=\"tw:size-4\" />}\n </span>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyChildrenProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** The displayed value. Truncates on a single line, wraps when multi-line. */\nexport const CopyChildren = ({ children, className }: CopyChildrenProps) => {\n const { maxLines } = useCopyContext();\n const multiline = maxLines > 1;\n\n return (\n <span\n className={cn(\n 'tw:min-w-0 tw:flex-1 tw:select-text tw:text-card-foreground',\n multiline ? 'tw:whitespace-pre-wrap tw:break-words' : 'tw:truncate',\n className,\n )}\n >\n {children}\n </span>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype CopyFooterProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Small helper text below the box (mirrors `FormGroup.Help` / `HelpBlock` styling). */\nexport const CopyFooter = ({ children, className }: CopyFooterProps) => {\n if (!children) return null;\n\n return <p className={cn('tw:m-0 tw:text-xs tw:text-muted-foreground', className)}>{children}</p>;\n};\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyHiddenProps = {\n children: ReactNode;\n /**\n * When true (default), `CopyField.Reveal` can unmask this content. When false the\n * content is always masked (e.g. an implicit token inside a longer string).\n */\n revealable?: boolean;\n className?: string;\n};\n\nconst MASK = '*'.repeat(12);\n\n/**\n * Masks its children with asterisks. The real value still lives on `CopyField.Root`,\n * so copy always copies the real value regardless of mask state.\n */\nexport const CopyHidden = ({ children, revealable = true, className }: CopyHiddenProps) => {\n const { hidden, registerRevealable } = useCopyContext();\n\n useEffect(() => {\n if (!revealable) return undefined;\n return registerRevealable();\n }, [revealable, registerRevealable]);\n\n const masked = revealable ? hidden : true;\n\n return <span className={cn('tw:select-none', className)}>{masked ? MASK : children}</span>;\n};\n","import { useEffect } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { Label } from '../../components/Label';\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyLabelProps = {\n children: ReactNode;\n /** Content rendered right after the label text (e.g. an Info tooltip button). */\n leading?: ReactNode;\n /** Content pushed to the trailing edge of the row (e.g. a Switch). */\n trailing?: ReactNode;\n className?: string;\n};\n\n/**\n * Visible label above the box. The label carries an id and the box is wired via\n * `aria-labelledby` (not `htmlFor`, which would turn label clicks into a copy).\n *\n * Row layout: label text, then `leading` (gap), then `trailing` pushed to the far\n * edge with the space between them growing.\n */\nexport const CopyLabel = ({ children, leading, trailing, className }: CopyLabelProps) => {\n const { labelId, registerLabel } = useCopyContext();\n\n useEffect(() => registerLabel(), [registerLabel]);\n\n return (\n <div className={cn('tw:flex tw:items-center tw:gap-1', className)}>\n <Label id={labelId}>{children}</Label>\n {leading}\n {trailing != null && <span className=\"tw:ml-auto tw:flex tw:items-center\">{trailing}</span>}\n </div>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype CopyAddonProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Muted, non-selectable prefix addon with a trailing divider (not part of the copied value). */\nexport const CopyPrefix = ({ children, className }: CopyAddonProps) => (\n <span\n aria-hidden\n className={cn(\n 'tw:shrink-0 tw:select-none tw:self-stretch tw:border-r tw:border-border tw:pr-2 tw:text-muted-foreground',\n className,\n )}\n >\n {children}\n </span>\n);\n","import type { MouseEvent } from 'react';\n\nimport { Eye, EyeOff } from '../../icons';\nimport { cn } from '../../utils';\n\nimport { useCopyContext } from './CopyContext';\n\ntype CopyRevealProps = {\n className?: string;\n};\n\n/** Eye toggle that reveals/masks `CopyField.Hidden` content. Renders nothing without revealable content. */\nexport const CopyReveal = ({ className }: CopyRevealProps) => {\n const { hidden, toggleHidden, hasRevealable, maxLines } = useCopyContext();\n\n if (!hasRevealable) return null;\n\n const handleClick = (event: MouseEvent<HTMLButtonElement>) => {\n event.stopPropagation();\n toggleHidden();\n };\n\n return (\n <button\n type=\"button\"\n onClick={handleClick}\n aria-label={hidden ? 'Show value' : 'Hide value'}\n className={cn(\n 'tw:flex tw:shrink-0 tw:items-center tw:text-muted-foreground tw:hover:text-foreground',\n maxLines > 1 && 'tw:self-start tw:pt-0.5',\n className,\n )}\n >\n {hidden ? <Eye className=\"tw:size-4\" /> : <EyeOff className=\"tw:size-4\" />}\n </button>\n );\n};\n","import { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { ReactNode } from 'react';\n\nimport { cn, copyToClipboard } from '../../utils';\n\nimport { CopyContext } from './CopyContext';\n\ntype CopyRootProps = {\n /** The value copied to the clipboard on click. */\n value: string;\n /** Render displayed content in monospace/code style. */\n mono?: boolean;\n /** Callback fired after a successful copy. */\n onCopy?: () => void;\n /** Start with revealable `CopyField.Hidden` content masked. */\n hiddenByDefault?: boolean;\n /** Minimum number of visible text lines for a multi-line box. */\n minLines?: number;\n /** Maximum number of visible text lines before the box scrolls. */\n maxLines?: number;\n /** Show the \"Copy\" hover hint (set `false` to only show \"Copied\" on copy). Defaults to `true`. */\n hoverHint?: boolean;\n /** Additional CSS classes on the outer container. */\n className?: string;\n children: ReactNode;\n};\n\n/**\n * Container for the Copy block. Owns the copied `value`, copy/mask state, and the\n * shared context consumed by `CopyField.Box`, `CopyField.Reveal`, `CopyField.Button`, etc.\n */\nexport const CopyRoot = ({\n value,\n mono = false,\n onCopy,\n hiddenByDefault = false,\n minLines = 1,\n maxLines,\n hoverHint = true,\n className,\n children,\n}: CopyRootProps) => {\n const [copied, setCopied] = useState(false);\n const [hidden, setHidden] = useState(hiddenByDefault);\n const [revealableCount, setRevealableCount] = useState(0);\n const [labelCount, setLabelCount] = useState(0);\n const resetTimerRef = useRef<ReturnType<typeof setTimeout> | undefined>(undefined);\n\n const generatedId = useId();\n const labelId = `${generatedId}-label`;\n const boxId = `${generatedId}-box`;\n\n useEffect(() => () => clearTimeout(resetTimerRef.current), []);\n\n const handleCopy = useCallback(() => {\n const selection = window.getSelection();\n const boxEl = document.getElementById(boxId);\n if (\n selection &&\n !selection.isCollapsed &&\n selection.anchorNode &&\n boxEl?.contains(selection.anchorNode)\n ) {\n return;\n }\n\n copyToClipboard(value)\n .then(() => {\n onCopy?.();\n setCopied(true);\n clearTimeout(resetTimerRef.current);\n resetTimerRef.current = setTimeout(() => setCopied(false), 1500);\n })\n .catch((error: unknown) => {\n // eslint-disable-next-line no-console\n console.error('Copy to clipboard failed', error);\n });\n }, [value, onCopy, boxId]);\n\n const toggleHidden = useCallback(() => setHidden((prev) => !prev), []);\n\n const registerRevealable = useCallback(() => {\n setRevealableCount((count) => count + 1);\n return () => setRevealableCount((count) => count - 1);\n }, []);\n\n const registerLabel = useCallback(() => {\n setLabelCount((count) => count + 1);\n return () => setLabelCount((count) => count - 1);\n }, []);\n\n const contextValue = useMemo(\n () => ({\n copied,\n handleCopy,\n value,\n mono,\n hidden,\n toggleHidden,\n registerRevealable,\n hasRevealable: revealableCount > 0,\n registerLabel,\n hasLabel: labelCount > 0,\n minLines,\n maxLines: maxLines ?? minLines,\n hoverHint,\n labelId,\n boxId,\n }),\n [\n copied,\n handleCopy,\n value,\n mono,\n hidden,\n toggleHidden,\n registerRevealable,\n revealableCount,\n registerLabel,\n labelCount,\n minLines,\n maxLines,\n hoverHint,\n labelId,\n boxId,\n ],\n );\n\n return (\n <CopyContext value={contextValue}>\n <div className={cn('tw:flex tw:w-fit tw:max-w-full tw:flex-col tw:gap-1', className)}>\n {children}\n </div>\n </CopyContext>\n );\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\ntype CopyAddonProps = {\n children: ReactNode;\n className?: string;\n};\n\n/** Muted, non-selectable suffix addon with a leading divider (not part of the copied value). */\nexport const CopySuffix = ({ children, className }: CopyAddonProps) => (\n <span\n aria-hidden\n className={cn(\n 'tw:shrink-0 tw:select-none tw:self-stretch tw:border-l tw:border-border tw:pl-2 tw:text-muted-foreground',\n className,\n )}\n >\n {children}\n </span>\n);\n","import { CopyBox } from './CopyBox';\nimport { CopyButton } from './CopyButton';\nimport { CopyChildren } from './CopyChildren';\nimport { CopyFooter } from './CopyFooter';\nimport { CopyHidden } from './CopyHidden';\nimport { CopyLabel } from './CopyLabel';\nimport { CopyPrefix } from './CopyPrefix';\nimport { CopyReveal } from './CopyReveal';\nimport { CopyRoot } from './CopyRoot';\nimport { CopySuffix } from './CopySuffix';\n\n/**\n * Compound component for readonly value/command boxes with inline copy.\n *\n * `CopyField.Root` owns the `value` and copy/mask state; `CopyField.Box` is the clickable\n * copy target. Clicking anywhere in the box copies the real `value` to the\n * clipboard (guarded by text-selection so drag-select does NOT trigger a copy),\n * with a Copy → Check feedback for ~1.5s.\n *\n * Shapes:\n * - **Single-line value row** — default proportional font, value truncates.\n * - **Monospace command box** — `mono` on `CopyField.Root`.\n * - **Multi-line** — `maxLines > 1`; content wraps and scrolls between\n * `minLines` and `maxLines` tall.\n *\n * Masking: wrap sensitive content in `CopyField.Hidden`. Revealable hidden content is\n * toggled by `CopyField.Reveal` (an eye button); copy still copies the real value.\n *\n * @example Monospace command\n * ```tsx\n * <CopyField.Root value={installCommand} mono>\n * <CopyField.Label>Install the Keboola CLI</CopyField.Label>\n * <CopyField.Box>\n * <CopyField.Children>{installCommand}</CopyField.Children>\n * <CopyField.Button />\n * </CopyField.Box>\n * </CopyField.Root>\n * ```\n *\n * @example Masked token with reveal + prefix/suffix\n * ```tsx\n * <CopyField.Root value={dataAppUrl} hiddenByDefault>\n * <CopyField.Label leading={<InfoButton />} trailing={<Switch />}>Data app URL</CopyField.Label>\n * <CopyField.Box>\n * <CopyField.Prefix>https://</CopyField.Prefix>\n * <CopyField.Children><CopyField.Hidden>{slug}</CopyField.Hidden></CopyField.Children>\n * <CopyField.Suffix>.keboola.com</CopyField.Suffix>\n * <CopyField.Reveal />\n * <CopyField.Button />\n * </CopyField.Box>\n * <CopyField.Footer>Click to copy</CopyField.Footer>\n * </CopyField.Root>\n * ```\n */\nexport const CopyField = {\n /** Container. Owns the copied `value`, mask state, and copy context. */\n Root: CopyRoot,\n /** Visible label above the box, with optional `leading`/`trailing` slots. */\n Label: CopyLabel,\n /** The clickable copy target row. */\n Box: CopyBox,\n /** Muted, non-selectable prefix addon (not copied). */\n Prefix: CopyPrefix,\n /** Displayed value (truncates single-line, wraps multi-line). */\n Children: CopyChildren,\n /** Muted, non-selectable suffix addon (not copied). */\n Suffix: CopySuffix,\n /** Masks its children with dots; copy still copies the real value. */\n Hidden: CopyHidden,\n /** Eye toggle that reveals/masks revealable `CopyField.Hidden` content. */\n Reveal: CopyReveal,\n /** Copy affordance icon — shows Copy/Check with feedback. */\n Button: CopyButton,\n /** Small helper text below the box. */\n Footer: CopyFooter,\n};\n"]}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
2
|
+
import * as RLabel from '@radix-ui/react-label';
|
|
3
|
+
import { jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var Optional = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-muted-foreground", className), children: "(optional)" });
|
|
6
|
+
var Required = ({ className, ...props }) => /* @__PURE__ */ jsx("span", { ...props, "aria-hidden": true, className: cn("tw:ml-0.5", "tw:text-primary", className), children: "*" });
|
|
7
|
+
var Label = ({ className, children, id, htmlFor, ...rest }) => /* @__PURE__ */ jsx(
|
|
8
|
+
RLabel.Root,
|
|
9
|
+
{
|
|
10
|
+
...rest,
|
|
11
|
+
id: id?.toString(),
|
|
12
|
+
htmlFor: htmlFor?.toString(),
|
|
13
|
+
className: cn(
|
|
14
|
+
"tw:m-0 tw:text-foreground tw:font-normal tw:peer-disabled:opacity-50",
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
children
|
|
18
|
+
}
|
|
19
|
+
);
|
|
20
|
+
Label.Optional = Optional;
|
|
21
|
+
Label.Required = Required;
|
|
22
|
+
|
|
23
|
+
export { Label };
|
|
24
|
+
//# sourceMappingURL=chunk-S6TAF63G.js.map
|
|
25
|
+
//# sourceMappingURL=chunk-S6TAF63G.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Label/Label.tsx"],"names":[],"mappings":";;;;AAgBA,IAAM,WAAW,CAAC,EAAE,WAAW,GAAG,KAAA,uBAChC,GAAA,CAAC,MAAA,EAAA,EAAM,GAAG,KAAA,EAAO,aAAA,EAAW,MAAC,SAAA,EAAW,EAAA,CAAG,aAAa,0BAAA,EAA4B,SAAS,GAAG,QAAA,EAAA,YAAA,EAEhG,CAAA;AAQF,IAAM,WAAW,CAAC,EAAE,WAAW,GAAG,KAAA,uBAChC,GAAA,CAAC,MAAA,EAAA,EAAM,GAAG,KAAA,EAAO,aAAA,EAAW,MAAC,SAAA,EAAW,EAAA,CAAG,aAAa,iBAAA,EAAmB,SAAS,GAAG,QAAA,EAAA,GAAA,EAEvF,CAAA;AAGK,IAAM,KAAA,GAAQ,CAAC,EAAE,SAAA,EAAW,UAAU,EAAA,EAAI,OAAA,EAAS,GAAG,IAAA,EAAK,qBAChE,GAAA;AAAA,EAAQ,MAAA,CAAA,IAAA;AAAA,EAAP;AAAA,IACE,GAAG,IAAA;AAAA,IACJ,EAAA,EAAI,IAAI,QAAA,EAAS;AAAA,IACjB,OAAA,EAAS,SAAS,QAAA,EAAS;AAAA,IAC3B,SAAA,EAAW,EAAA;AAAA,MACT,sEAAA;AAAA,MACA;AAAA,KACF;AAAA,IAEC;AAAA;AACH;AAGF,KAAA,CAAM,QAAA,GAAW,QAAA;AACjB,KAAA,CAAM,QAAA,GAAW,QAAA","file":"chunk-S6TAF63G.js","sourcesContent":["import type { ComponentPropsWithRef } from 'react';\nimport type { LabelProps } from '@radix-ui/react-label';\nimport * as RLabel from '@radix-ui/react-label';\n\nimport { cn } from '../../utils';\n\ntype Props = { id?: string | number; htmlFor?: string | number } & Omit<\n LabelProps,\n 'id' | 'htmlFor'\n>;\n\n/**\n * Decorative optional marker (`(optional)`). Like `Label.Required` it is `aria-hidden`, so it is\n * purely visual — optionality is conveyed by the *absence* of `aria-required`/`required` on the\n * associated control, not by this text.\n */\nconst Optional = ({ className, ...props }: ComponentPropsWithRef<'span'>) => (\n <span {...props} aria-hidden className={cn('tw:ml-0.5', 'tw:text-muted-foreground', className)}>\n (optional)\n </span>\n);\n\n/**\n * Decorative required marker (the `*`). It is `aria-hidden`, so it is purely visual and is **not**\n * announced by assistive tech — conveying the requirement is the caller's responsibility: set\n * `aria-required` (or `required`) on the associated control.\n */\nconst Required = ({ className, ...props }: ComponentPropsWithRef<'span'>) => (\n <span {...props} aria-hidden className={cn('tw:ml-0.5', 'tw:text-primary', className)}>\n *\n </span>\n);\n\nexport const Label = ({ className, children, id, htmlFor, ...rest }: Props) => (\n <RLabel.Root\n {...rest}\n id={id?.toString()}\n htmlFor={htmlFor?.toString()}\n className={cn(\n 'tw:m-0 tw:text-foreground tw:font-normal tw:peer-disabled:opacity-50',\n className,\n )}\n >\n {children}\n </RLabel.Root>\n);\n\nLabel.Optional = Optional;\nLabel.Required = Required;\n"]}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
2
|
+
import { cva } from 'class-variance-authority';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
import { Slot } from '@radix-ui/react-slot';
|
|
5
|
+
|
|
6
|
+
var addonVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"tw:flex",
|
|
9
|
+
"tw:items-center",
|
|
10
|
+
"tw:shrink-0",
|
|
11
|
+
"tw:bg-inherit",
|
|
12
|
+
"tw:self-stretch",
|
|
13
|
+
"tw:px-1",
|
|
14
|
+
"tw:has-[button]:px-0",
|
|
15
|
+
'tw:[&_svg:not([class*="tw:size-"])]:size-3'
|
|
16
|
+
],
|
|
17
|
+
{
|
|
18
|
+
defaultVariants: {
|
|
19
|
+
align: "inline-end",
|
|
20
|
+
variant: "inline"
|
|
21
|
+
},
|
|
22
|
+
variants: {
|
|
23
|
+
align: {
|
|
24
|
+
"inline-start": ["tw:order-first"],
|
|
25
|
+
"inline-end": ["tw:order-last"]
|
|
26
|
+
},
|
|
27
|
+
variant: {
|
|
28
|
+
inline: [],
|
|
29
|
+
floating: [
|
|
30
|
+
"tw:hidden",
|
|
31
|
+
"tw:group-hover/badge:flex",
|
|
32
|
+
"tw:absolute",
|
|
33
|
+
"tw:top-0",
|
|
34
|
+
"tw:bottom-0",
|
|
35
|
+
"tw:focus-within:flex"
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
},
|
|
39
|
+
compoundVariants: [
|
|
40
|
+
{ variant: "floating", align: "inline-end", className: ["tw:right-0"] },
|
|
41
|
+
{ variant: "floating", align: "inline-start", className: ["tw:left-0"] }
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
);
|
|
45
|
+
var BadgeAddon = ({
|
|
46
|
+
ref,
|
|
47
|
+
align = "inline-end",
|
|
48
|
+
variant = "inline",
|
|
49
|
+
className,
|
|
50
|
+
...rest
|
|
51
|
+
}) => /* @__PURE__ */ jsx(
|
|
52
|
+
"div",
|
|
53
|
+
{
|
|
54
|
+
...rest,
|
|
55
|
+
ref,
|
|
56
|
+
"data-align": align,
|
|
57
|
+
"data-variant": variant,
|
|
58
|
+
className: cn(addonVariants({ align, variant, className }))
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
var BadgeButton = ({ ref, className, type = "button", children, ...rest }) => /* @__PURE__ */ jsx(
|
|
62
|
+
"button",
|
|
63
|
+
{
|
|
64
|
+
...rest,
|
|
65
|
+
ref,
|
|
66
|
+
type,
|
|
67
|
+
className: cn(
|
|
68
|
+
"tailwindcss-preflight",
|
|
69
|
+
"tw:inline-flex",
|
|
70
|
+
"tw:items-center",
|
|
71
|
+
"tw:justify-center",
|
|
72
|
+
"tw:cursor-pointer",
|
|
73
|
+
"tw:bg-inherit",
|
|
74
|
+
"tw:text-inherit",
|
|
75
|
+
"tw:hover:brightness-95",
|
|
76
|
+
"tw:px-1",
|
|
77
|
+
// Default sizing for Lucide-icon children (which ship at 24×24); keeps
|
|
78
|
+
// the visual baseline aligned with the previous FA-icon API and other
|
|
79
|
+
// icon-wrapper components (ItemIcon, SidebarMenuIcon).
|
|
80
|
+
'tw:[&_svg:not([class*="tw:size-"])]:size-3',
|
|
81
|
+
className
|
|
82
|
+
),
|
|
83
|
+
children
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
var BadgeLabel = ({ ref, className, asChild = false, ...rest }) => {
|
|
87
|
+
const Comp = asChild ? Slot : "span";
|
|
88
|
+
return /* @__PURE__ */ jsx(
|
|
89
|
+
Comp,
|
|
90
|
+
{
|
|
91
|
+
...rest,
|
|
92
|
+
ref,
|
|
93
|
+
"data-slot": "badge-label",
|
|
94
|
+
className: cn(
|
|
95
|
+
"tw:max-w-56",
|
|
96
|
+
"tw:truncate",
|
|
97
|
+
"tw:px-2",
|
|
98
|
+
"tw:py-0.5",
|
|
99
|
+
// Drop side padding only when an *inline* addon is present —
|
|
100
|
+
// floating addons overlay the label without taking layout space,
|
|
101
|
+
// so the label still needs full padding behind them.
|
|
102
|
+
"tw:group-has-[[data-align=inline-start][data-variant=inline]:not(:empty)]/badge:pl-0",
|
|
103
|
+
"tw:group-has-[[data-align=inline-end][data-variant=inline]:not(:empty)]/badge:pr-0",
|
|
104
|
+
className
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
);
|
|
108
|
+
};
|
|
109
|
+
var badgeColors = {
|
|
110
|
+
gray: "tw:bg-neutral-400 tw:text-white tw:decoration-neutral-400",
|
|
111
|
+
"gray-darker": "tw:bg-neutral-500 tw:text-white tw:decoration-neutral-500",
|
|
112
|
+
"gray-inverse": "tw:bg-neutral-100 tw:text-neutral-500 tw:decoration-neutral-100 tw:[[data-theme=dark]_&]:bg-neutral-700 tw:[[data-theme=dark]_&]:text-neutral-300 tw:[[data-theme=dark]_&]:decoration-neutral-700",
|
|
113
|
+
green: "tw:bg-green-500 tw:text-white tw:decoration-green-500",
|
|
114
|
+
"green-darker": "tw:bg-green-600 tw:text-white tw:decoration-green-600",
|
|
115
|
+
"green-inverse": "tw:bg-green-100 tw:text-green-900 tw:decoration-green-100 tw:[[data-theme=dark]_&]:bg-green-900 tw:[[data-theme=dark]_&]:text-green-200 tw:[[data-theme=dark]_&]:decoration-green-900",
|
|
116
|
+
blue: "tw:bg-blue-500 tw:text-white tw:decoration-blue-500",
|
|
117
|
+
"blue-inverse": "tw:bg-blue-100 tw:text-blue-800 tw:decoration-blue-100 tw:[[data-theme=dark]_&]:bg-blue-900 tw:[[data-theme=dark]_&]:text-blue-200 tw:[[data-theme=dark]_&]:decoration-blue-900",
|
|
118
|
+
red: "tw:bg-error-500 tw:text-white tw:decoration-error-500",
|
|
119
|
+
orange: "tw:bg-warning-500 tw:text-white tw:decoration-warning-500",
|
|
120
|
+
"orange-inverse": "tw:bg-warning-100 tw:text-warning-800 tw:decoration-warning-100 tw:[[data-theme=dark]_&]:bg-warning-900 tw:[[data-theme=dark]_&]:text-warning-200 tw:[[data-theme=dark]_&]:decoration-warning-900",
|
|
121
|
+
amber: "tw:bg-warning-300 tw:text-warning-800 tw:decoration-warning-300",
|
|
122
|
+
// One rung deeper than `orange-inverse` on both ends of the ramp, which is what
|
|
123
|
+
// keeps caution and warning telling apart — the two share the `warning` hue.
|
|
124
|
+
"amber-inverse": "tw:bg-warning-200 tw:text-warning-800 tw:decoration-warning-200 tw:[[data-theme=dark]_&]:bg-warning-800 tw:[[data-theme=dark]_&]:text-warning-200 tw:[[data-theme=dark]_&]:decoration-warning-800",
|
|
125
|
+
teal: "tw:bg-teal-500 tw:text-white tw:decoration-teal-500",
|
|
126
|
+
"teal-inverse": "tw:bg-teal-100 tw:text-teal-800 tw:decoration-teal-100 tw:[[data-theme=dark]_&]:bg-teal-900 tw:[[data-theme=dark]_&]:text-teal-200 tw:[[data-theme=dark]_&]:decoration-teal-900",
|
|
127
|
+
purple: "tw:bg-purple-500 tw:text-white tw:decoration-purple-500",
|
|
128
|
+
"purple-inverse": "tw:bg-purple-100 tw:text-purple-800 tw:decoration-purple-100 tw:[[data-theme=dark]_&]:bg-purple-900 tw:[[data-theme=dark]_&]:text-purple-200 tw:[[data-theme=dark]_&]:decoration-purple-900",
|
|
129
|
+
cyan: "tw:bg-cyan-500 tw:text-white tw:decoration-cyan-500",
|
|
130
|
+
"cyan-inverse": "tw:bg-cyan-100 tw:text-cyan-800 tw:decoration-cyan-100 tw:[[data-theme=dark]_&]:bg-cyan-900 tw:[[data-theme=dark]_&]:text-cyan-200 tw:[[data-theme=dark]_&]:decoration-cyan-900",
|
|
131
|
+
"sidebar-primary": "tw:bg-sidebar-primary tw:text-white tw:decoration-sidebar-primary",
|
|
132
|
+
white: "tw:bg-white/90 tw:text-neutral-600 tw:decoration-white/90"
|
|
133
|
+
};
|
|
134
|
+
var badgeRootVariants = cva(
|
|
135
|
+
[
|
|
136
|
+
"tailwindcss-preflight",
|
|
137
|
+
"tw:group/badge",
|
|
138
|
+
// display
|
|
139
|
+
"tw:relative",
|
|
140
|
+
"tw:inline-flex",
|
|
141
|
+
"tw:justify-center",
|
|
142
|
+
"tw:items-center",
|
|
143
|
+
"tw:min-h-5",
|
|
144
|
+
"tw:h-fit",
|
|
145
|
+
"tw:shrink-0",
|
|
146
|
+
"tw:overflow-hidden",
|
|
147
|
+
// text — chrome weight/tracking are brand-overridable tokens
|
|
148
|
+
// (`--font-weight-medium` / `--letter-spacing-chrome`); casing lives on the
|
|
149
|
+
// `default` variant below via `tw:uppercase`.
|
|
150
|
+
"tw:whitespace-pre-wrap",
|
|
151
|
+
"tw:break-normal",
|
|
152
|
+
"tw:text-xs",
|
|
153
|
+
"tw:font-medium",
|
|
154
|
+
"tw:tracking-chrome",
|
|
155
|
+
"tw:text-center",
|
|
156
|
+
"tw:underline",
|
|
157
|
+
// content
|
|
158
|
+
"tw:border-none",
|
|
159
|
+
"tw:[&>svg]:self-center",
|
|
160
|
+
"tw:[button&]:cursor-pointer",
|
|
161
|
+
// focus
|
|
162
|
+
"tw:focus-visible:outline-hidden",
|
|
163
|
+
"tw:focus-visible:ring-2",
|
|
164
|
+
"tw:focus-visible:ring-inset",
|
|
165
|
+
"tw:focus-visible:ring-ring"
|
|
166
|
+
],
|
|
167
|
+
{
|
|
168
|
+
defaultVariants: {
|
|
169
|
+
color: "gray",
|
|
170
|
+
variant: "default"
|
|
171
|
+
},
|
|
172
|
+
variants: {
|
|
173
|
+
variant: {
|
|
174
|
+
// Legacy chrome uppercases the default badge; the Keboola V2 brand
|
|
175
|
+
// (`data-brand="keboola"`) renders it in standard case instead.
|
|
176
|
+
default: [
|
|
177
|
+
"tw:rounded tw:uppercase",
|
|
178
|
+
"tw:[[data-brand=keboola]_&]:normal-case tw:[[data-brand=keboola]_&]:tracking-normal"
|
|
179
|
+
],
|
|
180
|
+
tag: ["tw:rounded tw:normal-case"],
|
|
181
|
+
pill: ["tw:min-w-5 tw:rounded-full tw:normal-case tw:tracking-normal"]
|
|
182
|
+
},
|
|
183
|
+
color: badgeColors
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
);
|
|
187
|
+
var BadgeRoot = ({ ref, variant, color, className, children, ...rest }) => /* @__PURE__ */ jsx(
|
|
188
|
+
"div",
|
|
189
|
+
{
|
|
190
|
+
...rest,
|
|
191
|
+
ref,
|
|
192
|
+
"data-slot": "badge",
|
|
193
|
+
className: cn(badgeRootVariants({ variant, color, className })),
|
|
194
|
+
children
|
|
195
|
+
}
|
|
196
|
+
);
|
|
197
|
+
var BadgeInner = ({
|
|
198
|
+
ref,
|
|
199
|
+
// root props
|
|
200
|
+
variant,
|
|
201
|
+
color,
|
|
202
|
+
// custom props
|
|
203
|
+
prefix,
|
|
204
|
+
prefixVariant = "inline",
|
|
205
|
+
suffix,
|
|
206
|
+
suffixVariant = "inline",
|
|
207
|
+
className,
|
|
208
|
+
labelClassName,
|
|
209
|
+
...labelProps
|
|
210
|
+
}) => /* @__PURE__ */ jsxs(BadgeRoot, { className, variant, color, children: [
|
|
211
|
+
prefix && /* @__PURE__ */ jsx(BadgeAddon, { align: "inline-start", variant: prefixVariant, children: prefix }),
|
|
212
|
+
/* @__PURE__ */ jsx(BadgeLabel, { ...labelProps, ref, className: labelClassName }),
|
|
213
|
+
suffix && /* @__PURE__ */ jsx(BadgeAddon, { align: "inline-end", variant: suffixVariant, children: suffix })
|
|
214
|
+
] });
|
|
215
|
+
var Badge = Object.assign(BadgeInner, {
|
|
216
|
+
Root: BadgeRoot,
|
|
217
|
+
Button: BadgeButton,
|
|
218
|
+
Label: BadgeLabel,
|
|
219
|
+
Addon: BadgeAddon
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
export { Badge };
|
|
223
|
+
//# sourceMappingURL=chunk-SBGAUGXY.js.map
|
|
224
|
+
//# sourceMappingURL=chunk-SBGAUGXY.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Badge/BadgeAddon.tsx","../src/components/Badge/BadgeButton.tsx","../src/components/Badge/BadgeLabel.tsx","../src/components/Badge/styles.ts","../src/components/Badge/BadgeRoot.tsx","../src/components/Badge/Badge.tsx"],"names":["jsx","cva"],"mappings":"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","file":"chunk-SBGAUGXY.js","sourcesContent":["import type { ComponentProps } from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\nconst addonVariants = cva(\n [\n 'tw:flex',\n 'tw:items-center',\n 'tw:shrink-0',\n 'tw:bg-inherit',\n 'tw:self-stretch',\n 'tw:px-1',\n 'tw:has-[button]:px-0',\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n ],\n {\n defaultVariants: {\n align: 'inline-end',\n variant: 'inline',\n },\n variants: {\n align: {\n 'inline-start': ['tw:order-first'],\n 'inline-end': ['tw:order-last'],\n },\n variant: {\n inline: [],\n floating: [\n 'tw:hidden',\n 'tw:group-hover/badge:flex',\n\n 'tw:absolute',\n 'tw:top-0',\n 'tw:bottom-0',\n 'tw:focus-within:flex',\n ],\n },\n },\n compoundVariants: [\n { variant: 'floating', align: 'inline-end', className: ['tw:right-0'] },\n { variant: 'floating', align: 'inline-start', className: ['tw:left-0'] },\n ],\n },\n);\n\ntype Props = ComponentProps<'div'> & VariantProps<typeof addonVariants>;\n\nexport const BadgeAddon = ({\n ref,\n align = 'inline-end',\n variant = 'inline',\n className,\n ...rest\n}: Props) => (\n <div\n {...rest}\n ref={ref}\n data-align={align}\n data-variant={variant}\n className={cn(addonVariants({ align, variant, className }))}\n />\n);\n","import type { ComponentProps } from 'react';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'button'>;\n\nexport const BadgeButton = ({ ref, className, type = 'button', children, ...rest }: Props) => (\n <button\n {...rest}\n ref={ref}\n type={type}\n className={cn(\n 'tailwindcss-preflight',\n\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:cursor-pointer',\n\n 'tw:bg-inherit',\n 'tw:text-inherit',\n\n 'tw:hover:brightness-95',\n 'tw:px-1',\n // Default sizing for Lucide-icon children (which ship at 24×24); keeps\n // the visual baseline aligned with the previous FA-icon API and other\n // icon-wrapper components (ItemIcon, SidebarMenuIcon).\n 'tw:[&_svg:not([class*=\"tw:size-\"])]:size-3',\n className,\n )}\n >\n {children}\n </button>\n);\n","import type { ComponentProps } from 'react';\nimport { Slot } from '@radix-ui/react-slot';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<'span'> & {\n asChild?: boolean;\n};\n\nexport const BadgeLabel = ({ ref, className, asChild = false, ...rest }: Props) => {\n const Comp = asChild ? Slot : 'span';\n return (\n <Comp\n {...rest}\n ref={ref}\n data-slot=\"badge-label\"\n className={cn(\n 'tw:max-w-56',\n 'tw:truncate',\n 'tw:px-2',\n 'tw:py-0.5',\n\n // Drop side padding only when an *inline* addon is present —\n // floating addons overlay the label without taking layout space,\n // so the label still needs full padding behind them.\n 'tw:group-has-[[data-align=inline-start][data-variant=inline]:not(:empty)]/badge:pl-0',\n 'tw:group-has-[[data-align=inline-end][data-variant=inline]:not(:empty)]/badge:pr-0',\n className,\n )}\n />\n );\n};\n","import { cva } from 'class-variance-authority';\n\n/**\n * Badge's `color` variants: a fill class, a foreground class, and a matching\n * `decoration-*` so an underlined badge underlines in its own fill colour.\n *\n * - Tinted (`-inverse`) variants each carry a `[data-theme=dark]` override, so the\n * chip inverts with the page instead of staying a light slab on a dark surface.\n * - Solid fills are fixed across schemes.\n * - Exported for `scripts/contrast-audit.ts` and the contrast story tests, which\n * measure each pairing rather than restating this map.\n */\nexport const badgeColors = {\n gray: 'tw:bg-neutral-400 tw:text-white tw:decoration-neutral-400',\n 'gray-darker': 'tw:bg-neutral-500 tw:text-white tw:decoration-neutral-500',\n 'gray-inverse':\n 'tw:bg-neutral-100 tw:text-neutral-500 tw:decoration-neutral-100 tw:[[data-theme=dark]_&]:bg-neutral-700 tw:[[data-theme=dark]_&]:text-neutral-300 tw:[[data-theme=dark]_&]:decoration-neutral-700',\n green: 'tw:bg-green-500 tw:text-white tw:decoration-green-500',\n 'green-darker': 'tw:bg-green-600 tw:text-white tw:decoration-green-600',\n 'green-inverse':\n 'tw:bg-green-100 tw:text-green-900 tw:decoration-green-100 tw:[[data-theme=dark]_&]:bg-green-900 tw:[[data-theme=dark]_&]:text-green-200 tw:[[data-theme=dark]_&]:decoration-green-900',\n blue: 'tw:bg-blue-500 tw:text-white tw:decoration-blue-500',\n 'blue-inverse':\n 'tw:bg-blue-100 tw:text-blue-800 tw:decoration-blue-100 tw:[[data-theme=dark]_&]:bg-blue-900 tw:[[data-theme=dark]_&]:text-blue-200 tw:[[data-theme=dark]_&]:decoration-blue-900',\n red: 'tw:bg-error-500 tw:text-white tw:decoration-error-500',\n orange: 'tw:bg-warning-500 tw:text-white tw:decoration-warning-500',\n 'orange-inverse':\n 'tw:bg-warning-100 tw:text-warning-800 tw:decoration-warning-100 tw:[[data-theme=dark]_&]:bg-warning-900 tw:[[data-theme=dark]_&]:text-warning-200 tw:[[data-theme=dark]_&]:decoration-warning-900',\n amber: 'tw:bg-warning-300 tw:text-warning-800 tw:decoration-warning-300',\n // One rung deeper than `orange-inverse` on both ends of the ramp, which is what\n // keeps caution and warning telling apart — the two share the `warning` hue.\n 'amber-inverse':\n 'tw:bg-warning-200 tw:text-warning-800 tw:decoration-warning-200 tw:[[data-theme=dark]_&]:bg-warning-800 tw:[[data-theme=dark]_&]:text-warning-200 tw:[[data-theme=dark]_&]:decoration-warning-800',\n teal: 'tw:bg-teal-500 tw:text-white tw:decoration-teal-500',\n 'teal-inverse':\n 'tw:bg-teal-100 tw:text-teal-800 tw:decoration-teal-100 tw:[[data-theme=dark]_&]:bg-teal-900 tw:[[data-theme=dark]_&]:text-teal-200 tw:[[data-theme=dark]_&]:decoration-teal-900',\n purple: 'tw:bg-purple-500 tw:text-white tw:decoration-purple-500',\n 'purple-inverse':\n 'tw:bg-purple-100 tw:text-purple-800 tw:decoration-purple-100 tw:[[data-theme=dark]_&]:bg-purple-900 tw:[[data-theme=dark]_&]:text-purple-200 tw:[[data-theme=dark]_&]:decoration-purple-900',\n cyan: 'tw:bg-cyan-500 tw:text-white tw:decoration-cyan-500',\n 'cyan-inverse':\n 'tw:bg-cyan-100 tw:text-cyan-800 tw:decoration-cyan-100 tw:[[data-theme=dark]_&]:bg-cyan-900 tw:[[data-theme=dark]_&]:text-cyan-200 tw:[[data-theme=dark]_&]:decoration-cyan-900',\n 'sidebar-primary': 'tw:bg-sidebar-primary tw:text-white tw:decoration-sidebar-primary',\n white: 'tw:bg-white/90 tw:text-neutral-600 tw:decoration-white/90',\n} as const;\n\n/** A `Badge` `color` value. */\nexport type BadgeColor = keyof typeof badgeColors;\n\n/**\n * Whether a variant paints text on its own tint rather than on a solid fill.\n *\n * - Tinted variants are the ones held to WCAG-AA per `AGENTS.md`; solid `-500`\n * fills are pinned across brands, so their contrast is recorded, not asserted.\n */\nexport const isTintedBadgeColor = (color: string): boolean => color.endsWith('-inverse');\n\nexport const badgeRootVariants = cva(\n [\n 'tailwindcss-preflight',\n 'tw:group/badge',\n\n // display\n 'tw:relative',\n 'tw:inline-flex',\n 'tw:justify-center',\n 'tw:items-center',\n 'tw:min-h-5',\n 'tw:h-fit',\n 'tw:shrink-0',\n 'tw:overflow-hidden',\n\n // text — chrome weight/tracking are brand-overridable tokens\n // (`--font-weight-medium` / `--letter-spacing-chrome`); casing lives on the\n // `default` variant below via `tw:uppercase`.\n 'tw:whitespace-pre-wrap',\n 'tw:break-normal',\n 'tw:text-xs',\n 'tw:font-medium',\n 'tw:tracking-chrome',\n 'tw:text-center',\n 'tw:underline',\n\n // content\n 'tw:border-none',\n 'tw:[&>svg]:self-center',\n 'tw:[button&]:cursor-pointer',\n\n // focus\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-inset',\n 'tw:focus-visible:ring-ring',\n ],\n {\n defaultVariants: {\n color: 'gray',\n variant: 'default',\n },\n variants: {\n variant: {\n // Legacy chrome uppercases the default badge; the Keboola V2 brand\n // (`data-brand=\"keboola\"`) renders it in standard case instead.\n default: [\n 'tw:rounded tw:uppercase',\n 'tw:[[data-brand=keboola]_&]:normal-case tw:[[data-brand=keboola]_&]:tracking-normal',\n ],\n tag: ['tw:rounded tw:normal-case'],\n pill: ['tw:min-w-5 tw:rounded-full tw:normal-case tw:tracking-normal'],\n },\n color: badgeColors,\n },\n },\n);\n","import type { ComponentProps } from 'react';\nimport { type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../utils';\n\nimport { badgeRootVariants } from './styles';\n\ntype Props = ComponentProps<'div'> & VariantProps<typeof badgeRootVariants>;\n\nexport const BadgeRoot = ({ ref, variant, color, className, children, ...rest }: Props) => (\n <div\n {...rest}\n ref={ref}\n data-slot=\"badge\"\n className={cn(badgeRootVariants({ variant, color, className }))}\n >\n {children}\n </div>\n);\n","import type { ComponentProps, ReactNode } from 'react';\n\nimport { BadgeAddon } from './BadgeAddon';\nimport { BadgeButton } from './BadgeButton';\nimport { BadgeLabel } from './BadgeLabel';\nimport { BadgeRoot } from './BadgeRoot';\n\ntype AddonVariant = ComponentProps<typeof BadgeAddon>['variant'];\ntype BadgeRootProps = ComponentProps<typeof BadgeRoot>;\ntype BadgeLabelProps = ComponentProps<typeof BadgeLabel>;\n\n/**\n * Props for `Badge`. `color` is a categorical contract (`green` = success, `red` = error, `orange` = warning,\n * `amber` = caution, `purple/cyan/teal/blue/gray` for decorative tags) — colours stay fixed across brand themes.\n * Pass `prefix` / `suffix` for icon-style addons.\n */\ntype Props = Pick<BadgeRootProps, 'variant' | 'color'> &\n Omit<BadgeLabelProps, 'prefix'> & {\n prefix?: ReactNode;\n prefixVariant?: AddonVariant;\n suffix?: ReactNode;\n suffixVariant?: AddonVariant;\n labelClassName?: string;\n };\n\n/**\n * Compact status / category label rendered as an inline pill.\n *\n * **When to use:** encoding status (active, deprecated, beta), counts, or decorative tags next to a title\n * or in a table cell. The `color` prop is a semantic contract — `green` means success, `red` means error\n * etc., and colours are intentionally stable across customer brand themes.\n * **When NOT to use:** for an inline action use `Button` / `ButtonInline`; for a persistent contextual\n * banner use `Alert`; for a counter-only chip prefer `Badge` with just a numeric label.\n * **Composition:** drop into `PageHeader.Detail` `badges` slot, `Table.Cell`, or alongside titles in cards.\n * Use `Badge.Button` for an interactive (clickable) badge variant.\n */\nconst BadgeInner = ({\n ref,\n // root props\n variant,\n color,\n // custom props\n prefix,\n prefixVariant = 'inline',\n suffix,\n suffixVariant = 'inline',\n className,\n labelClassName,\n ...labelProps\n}: Props) => (\n <BadgeRoot className={className} variant={variant} color={color}>\n {prefix && (\n <BadgeAddon align=\"inline-start\" variant={prefixVariant}>\n {prefix}\n </BadgeAddon>\n )}\n <BadgeLabel {...labelProps} ref={ref} className={labelClassName} />\n {suffix && (\n <BadgeAddon align=\"inline-end\" variant={suffixVariant}>\n {suffix}\n </BadgeAddon>\n )}\n </BadgeRoot>\n);\n\nexport const Badge = Object.assign(BadgeInner, {\n Root: BadgeRoot,\n Button: BadgeButton,\n Label: BadgeLabel,\n Addon: BadgeAddon,\n});\n"]}
|