@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,72 @@
|
|
|
1
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
2
|
+
import * as ScrollAreaPrimitive2 from '@radix-ui/react-scroll-area';
|
|
3
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ScrollBar = ({ className, orientation = "vertical", ...props }) => /* @__PURE__ */ jsx(
|
|
6
|
+
ScrollAreaPrimitive2.ScrollAreaScrollbar,
|
|
7
|
+
{
|
|
8
|
+
orientation,
|
|
9
|
+
className: cn(
|
|
10
|
+
"tw:flex tw:touch-none tw:select-none tw:transition-color",
|
|
11
|
+
{
|
|
12
|
+
"tw:h-full tw:w-2.5 tw:p-px": orientation === "vertical",
|
|
13
|
+
"tw:h-2.5 tw:flex-col tw:p-px": orientation === "horizontal"
|
|
14
|
+
},
|
|
15
|
+
className
|
|
16
|
+
),
|
|
17
|
+
...props,
|
|
18
|
+
children: /* @__PURE__ */ jsx(
|
|
19
|
+
ScrollAreaPrimitive2.ScrollAreaThumb,
|
|
20
|
+
{
|
|
21
|
+
className: cn(
|
|
22
|
+
"tw:relative",
|
|
23
|
+
"tw:flex-1",
|
|
24
|
+
"tw:rounded-full",
|
|
25
|
+
"tw:bg-border",
|
|
26
|
+
"tw:hover:bg-muted-foreground"
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
)
|
|
30
|
+
}
|
|
31
|
+
);
|
|
32
|
+
var ScrollArea = ({
|
|
33
|
+
ref,
|
|
34
|
+
className,
|
|
35
|
+
children,
|
|
36
|
+
viewPortClassName,
|
|
37
|
+
orientation,
|
|
38
|
+
scrollBarClassName,
|
|
39
|
+
...props
|
|
40
|
+
}) => /* @__PURE__ */ jsxs(
|
|
41
|
+
ScrollAreaPrimitive2.Root,
|
|
42
|
+
{
|
|
43
|
+
"data-slot": "scroll-area",
|
|
44
|
+
className: cn(
|
|
45
|
+
"tw:peer/scroll-area tw:relative tw:overflow-hidden tw:focus-visible:outline-hidden",
|
|
46
|
+
className
|
|
47
|
+
),
|
|
48
|
+
...props,
|
|
49
|
+
children: [
|
|
50
|
+
/* @__PURE__ */ jsx(
|
|
51
|
+
ScrollAreaPrimitive2.Viewport,
|
|
52
|
+
{
|
|
53
|
+
ref,
|
|
54
|
+
className: cn(
|
|
55
|
+
"tw:h-full tw:w-full tw:rounded-[inherit] tw:focus-visible:outline-hidden",
|
|
56
|
+
viewPortClassName
|
|
57
|
+
),
|
|
58
|
+
children
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
orientation ? /* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation }) : /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
62
|
+
/* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation: "vertical" }),
|
|
63
|
+
/* @__PURE__ */ jsx(ScrollBar, { className: scrollBarClassName, orientation: "horizontal" })
|
|
64
|
+
] }),
|
|
65
|
+
/* @__PURE__ */ jsx(ScrollAreaPrimitive2.Corner, {})
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
|
|
70
|
+
export { ScrollArea, ScrollBar };
|
|
71
|
+
//# sourceMappingURL=chunk-THHB4EWS.js.map
|
|
72
|
+
//# sourceMappingURL=chunk-THHB4EWS.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/ScrollArea/ScrollBar.tsx","../src/components/ScrollArea/ScrollArea.tsx"],"names":["ScrollAreaPrimitive","jsx"],"mappings":";;;;AAOO,IAAM,SAAA,GAAY,CAAC,EAAE,SAAA,EAAW,cAAc,UAAA,EAAY,GAAG,OAAM,qBACxE,GAAA;AAAA,EAAqBA,oBAAA,CAAA,mBAAA;AAAA,EAApB;AAAA,IACC,WAAA;AAAA,IACA,SAAA,EAAW,EAAA;AAAA,MACT,0DAAA;AAAA,MACA;AAAA,QACE,8BAA8B,WAAA,KAAgB,UAAA;AAAA,QAC9C,gCAAgC,WAAA,KAAgB;AAAA,OAClD;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,kBAAA,GAAA;AAAA,MAAqBA,oBAAA,CAAA,eAAA;AAAA,MAApB;AAAA,QACC,SAAA,EAAW,EAAA;AAAA,UACT,aAAA;AAAA,UACA,WAAA;AAAA,UACA,iBAAA;AAAA,UACA,cAAA;AAAA,UACA;AAAA;AACF;AAAA;AACF;AACF;AChBK,IAAM,aAAa,CAAC;AAAA,EACzB,GAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,kBAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,IAAA;AAAA,EAAqB,oBAAA,CAAA,IAAA;AAAA,EAApB;AAAA,IACC,WAAA,EAAU,aAAA;AAAA,IACV,SAAA,EAAW,EAAA;AAAA,MACT,oFAAA;AAAA,MACA;AAAA,KACF;AAAA,IACC,GAAG,KAAA;AAAA,IAEJ,QAAA,EAAA;AAAA,sBAAAC,GAAAA;AAAA,QAAqB,oBAAA,CAAA,QAAA;AAAA,QAApB;AAAA,UACC,GAAA;AAAA,UACA,SAAA,EAAW,EAAA;AAAA,YACT,0EAAA;AAAA,YACA;AAAA,WACF;AAAA,UAEC;AAAA;AAAA,OACH;AAAA,MACC,WAAA,mBACCA,GAAAA,CAAC,SAAA,EAAA,EAAU,WAAW,kBAAA,EAAoB,WAAA,EAA0B,oBAEpE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAAA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,kBAAA,EAAoB,aAAY,UAAA,EAAW,CAAA;AAAA,wBACjEA,GAAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAW,kBAAA,EAAoB,aAAY,YAAA,EAAa;AAAA,OAAA,EACrE,CAAA;AAAA,sBAEFA,GAAAA,CAAqB,oBAAA,CAAA,MAAA,EAApB,EAA2B;AAAA;AAAA;AAC9B","file":"chunk-THHB4EWS.js","sourcesContent":["import type { ComponentProps } from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\n\nimport { cn } from '../../utils';\n\ntype Props = ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>;\n\nexport const ScrollBar = ({ className, orientation = 'vertical', ...props }: Props) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n orientation={orientation}\n className={cn(\n 'tw:flex tw:touch-none tw:select-none tw:transition-color',\n {\n 'tw:h-full tw:w-2.5 tw:p-px': orientation === 'vertical',\n 'tw:h-2.5 tw:flex-col tw:p-px': orientation === 'horizontal',\n },\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n className={cn(\n 'tw:relative',\n 'tw:flex-1',\n 'tw:rounded-full',\n 'tw:bg-border',\n 'tw:hover:bg-muted-foreground',\n )}\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n);\n","import type { ComponentProps } from 'react';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\n\nimport { cn } from '../../utils';\n\nimport { ScrollBar } from './ScrollBar';\n\ntype Props = ComponentProps<typeof ScrollAreaPrimitive.Root> & {\n viewPortClassName?: string;\n scrollBarClassName?: string;\n orientation?: ComponentProps<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>['orientation'];\n};\n\nexport const ScrollArea = ({\n ref,\n className,\n children,\n viewPortClassName,\n orientation,\n scrollBarClassName,\n ...props\n}: Props) => (\n <ScrollAreaPrimitive.Root\n data-slot=\"scroll-area\"\n className={cn(\n 'tw:peer/scroll-area tw:relative tw:overflow-hidden tw:focus-visible:outline-hidden',\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={ref}\n className={cn(\n 'tw:h-full tw:w-full tw:rounded-[inherit] tw:focus-visible:outline-hidden',\n viewPortClassName,\n )}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n {orientation ? (\n <ScrollBar className={scrollBarClassName} orientation={orientation} />\n ) : (\n <>\n <ScrollBar className={scrollBarClassName} orientation=\"vertical\" />\n <ScrollBar className={scrollBarClassName} orientation=\"horizontal\" />\n </>\n )}\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n);\n"]}
|
|
@@ -0,0 +1,246 @@
|
|
|
1
|
+
import { Sparkles, Search, X } from './chunk-RQVK4IYC.js';
|
|
2
|
+
import { noop, debounce, createPrefixedString } from './chunk-SWQFYNYG.js';
|
|
3
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
4
|
+
import { useState, useMemo, useEffect } from 'react';
|
|
5
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
6
|
+
import { cva } from 'class-variance-authority';
|
|
7
|
+
|
|
8
|
+
var ClearButton = ({ onClick, testId }) => {
|
|
9
|
+
const handleMouseDown = (event) => {
|
|
10
|
+
event.preventDefault();
|
|
11
|
+
};
|
|
12
|
+
return /* @__PURE__ */ jsx(
|
|
13
|
+
"button",
|
|
14
|
+
{
|
|
15
|
+
type: "button",
|
|
16
|
+
onClick,
|
|
17
|
+
tabIndex: -1,
|
|
18
|
+
onMouseDown: handleMouseDown,
|
|
19
|
+
className: cn(
|
|
20
|
+
// reset
|
|
21
|
+
"tw:border-none",
|
|
22
|
+
"tw:bg-transparent",
|
|
23
|
+
"tw:p-0",
|
|
24
|
+
// positioning
|
|
25
|
+
"tw:flex",
|
|
26
|
+
"tw:items-center",
|
|
27
|
+
"tw:cursor-pointer",
|
|
28
|
+
"tw:text-muted-foreground",
|
|
29
|
+
"tw:hover:text-foreground"
|
|
30
|
+
),
|
|
31
|
+
"data-testid": testId,
|
|
32
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
};
|
|
36
|
+
var searchWrapperVariants = cva(
|
|
37
|
+
[
|
|
38
|
+
// positioning
|
|
39
|
+
"tw:flex",
|
|
40
|
+
"tw:items-center",
|
|
41
|
+
"tw:gap-2.5",
|
|
42
|
+
// base
|
|
43
|
+
"tw:text-card-foreground",
|
|
44
|
+
"tw:transition-all",
|
|
45
|
+
"tw:font-sans",
|
|
46
|
+
// readonly — `secondary` over `muted`, which is too close to the `card` fill to
|
|
47
|
+
// read as non-editable in either scheme
|
|
48
|
+
"tw:has-[input[readonly]]:bg-secondary",
|
|
49
|
+
"tw:has-[input[readonly]]:focus-within:ring-0",
|
|
50
|
+
"tw:has-[input[readonly]]:outline-0",
|
|
51
|
+
// disabled
|
|
52
|
+
"tw:disabled:opacity-40",
|
|
53
|
+
// default input padding (was sizing.default)
|
|
54
|
+
"tw:[&>input]:py-[15px]"
|
|
55
|
+
],
|
|
56
|
+
{
|
|
57
|
+
defaultVariants: {
|
|
58
|
+
variant: "default"
|
|
59
|
+
},
|
|
60
|
+
variants: {
|
|
61
|
+
variant: {
|
|
62
|
+
default: [
|
|
63
|
+
"tw:rounded-lg",
|
|
64
|
+
"tw:px-5",
|
|
65
|
+
"tw:bg-card",
|
|
66
|
+
"tw:shadow-raised",
|
|
67
|
+
// outline
|
|
68
|
+
"tw:outline",
|
|
69
|
+
"tw:outline-1",
|
|
70
|
+
"tw:outline-transparent",
|
|
71
|
+
// focus
|
|
72
|
+
"tw:has-[input:focus]:outline-1",
|
|
73
|
+
"tw:has-[input:focus]:ring-4",
|
|
74
|
+
"tw:has-[input:focus]:outline-ring",
|
|
75
|
+
"tw:has-[input:focus]:ring-ring/30"
|
|
76
|
+
],
|
|
77
|
+
ai: [
|
|
78
|
+
"tailwindcss-preflight",
|
|
79
|
+
"tw:relative",
|
|
80
|
+
"tw:rounded-card",
|
|
81
|
+
"tw:px-4",
|
|
82
|
+
"tw:cursor-text",
|
|
83
|
+
"tw:border-2",
|
|
84
|
+
"tw:border-transparent",
|
|
85
|
+
"tw:bg-gradient-to-br",
|
|
86
|
+
"tw:from-secondary-600",
|
|
87
|
+
"tw:to-purple-600",
|
|
88
|
+
"tw:bg-origin-border",
|
|
89
|
+
// Floods the interior so the gradient shows only in the 2px border box.
|
|
90
|
+
"tw:shadow-[inset_0_100vw_rgb(var(--card))]",
|
|
91
|
+
// focus
|
|
92
|
+
"tw:has-[input:focus]:ring-4",
|
|
93
|
+
"tw:has-[input:focus]:ring-ring/30"
|
|
94
|
+
]
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
);
|
|
99
|
+
var searchInputClassnames = [
|
|
100
|
+
// reset
|
|
101
|
+
"tw:border-none",
|
|
102
|
+
"tw:bg-transparent",
|
|
103
|
+
"tw:outline-hidden",
|
|
104
|
+
"tw:w-full",
|
|
105
|
+
"tw:p-0",
|
|
106
|
+
// base
|
|
107
|
+
"tw:text-base",
|
|
108
|
+
"tw:leading-6",
|
|
109
|
+
"tw:font-normal",
|
|
110
|
+
"tw:font-sans",
|
|
111
|
+
// placeholder
|
|
112
|
+
"tw:placeholder:text-muted-foreground",
|
|
113
|
+
// disabled
|
|
114
|
+
"tw:disabled:cursor-not-allowed"
|
|
115
|
+
].join(" ");
|
|
116
|
+
|
|
117
|
+
// src/components/Search/utils.ts
|
|
118
|
+
var genSearchTestId = (prefix = "") => {
|
|
119
|
+
const ps = createPrefixedString(prefix);
|
|
120
|
+
return {
|
|
121
|
+
toString: () => prefix,
|
|
122
|
+
wrapper: ps`search-wrapper`,
|
|
123
|
+
input: ps`search-input`,
|
|
124
|
+
clearButton: ps`search-clear-button`
|
|
125
|
+
};
|
|
126
|
+
};
|
|
127
|
+
var Search2 = ({
|
|
128
|
+
ref,
|
|
129
|
+
suffix,
|
|
130
|
+
className,
|
|
131
|
+
onBlur,
|
|
132
|
+
onChange = noop,
|
|
133
|
+
disabled = false,
|
|
134
|
+
readOnly = false,
|
|
135
|
+
disableDebounce = false,
|
|
136
|
+
debounceDelay = 300,
|
|
137
|
+
value: externalValue,
|
|
138
|
+
defaultValue,
|
|
139
|
+
testId: prefixTestId = "",
|
|
140
|
+
placeholder = "Search",
|
|
141
|
+
onClear,
|
|
142
|
+
variant = "default",
|
|
143
|
+
...rest
|
|
144
|
+
}) => {
|
|
145
|
+
const [internalValue, setInternalValue] = useState(
|
|
146
|
+
() => externalValue != null ? externalValue : defaultValue
|
|
147
|
+
);
|
|
148
|
+
const hasValue = internalValue !== "";
|
|
149
|
+
const isClearButtonVisible = hasValue && !disabled && !readOnly;
|
|
150
|
+
const testId = genSearchTestId(prefixTestId);
|
|
151
|
+
const debouncedOnChange = useMemo(
|
|
152
|
+
() => disableDebounce ? onChange : debounce(onChange, debounceDelay),
|
|
153
|
+
[disableDebounce, debounceDelay, onChange]
|
|
154
|
+
);
|
|
155
|
+
useEffect(() => {
|
|
156
|
+
if (externalValue == null) return;
|
|
157
|
+
setInternalValue(externalValue);
|
|
158
|
+
}, [externalValue]);
|
|
159
|
+
const handleChange = (event) => {
|
|
160
|
+
const currentValue = event.target.value;
|
|
161
|
+
setInternalValue(currentValue);
|
|
162
|
+
debouncedOnChange(currentValue, event);
|
|
163
|
+
};
|
|
164
|
+
const handleBlur = (event) => {
|
|
165
|
+
const currentValue = event.target.value;
|
|
166
|
+
setInternalValue(currentValue);
|
|
167
|
+
onBlur?.(currentValue, event);
|
|
168
|
+
};
|
|
169
|
+
const handleClear = (event) => {
|
|
170
|
+
setInternalValue("");
|
|
171
|
+
onChange?.("", event);
|
|
172
|
+
onClear?.();
|
|
173
|
+
};
|
|
174
|
+
const handleWrapperMouseDown = (event) => {
|
|
175
|
+
if (disabled || readOnly) return;
|
|
176
|
+
if (event.target.closest('button, a, input, textarea, [role="button"]')) {
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
event.preventDefault();
|
|
180
|
+
event.currentTarget.querySelector("input")?.focus();
|
|
181
|
+
};
|
|
182
|
+
return (
|
|
183
|
+
// Mouse-only convenience: clicking the chrome focuses the input. The input itself is the
|
|
184
|
+
// real interactive/focusable target, so no extra role or key handler is needed here.
|
|
185
|
+
// oxlint-disable-next-line jsx-a11y/no-static-element-interactions
|
|
186
|
+
/* @__PURE__ */ jsxs(
|
|
187
|
+
"div",
|
|
188
|
+
{
|
|
189
|
+
className: cn(
|
|
190
|
+
searchWrapperVariants({ variant }),
|
|
191
|
+
{
|
|
192
|
+
"tw:cursor-not-allowed tw:opacity-40": disabled
|
|
193
|
+
},
|
|
194
|
+
className
|
|
195
|
+
),
|
|
196
|
+
"data-testid": testId.wrapper,
|
|
197
|
+
onMouseDown: handleWrapperMouseDown,
|
|
198
|
+
children: [
|
|
199
|
+
variant === "ai" ? /* @__PURE__ */ jsx(Sparkles, { className: "tw:size-4 tw:shrink-0 tw:[&_*]:stroke-aigradient-600" }) : /* @__PURE__ */ jsx(Search, { className: "tw:size-4 tw:shrink-0 tw:text-neutral-400" }),
|
|
200
|
+
/* @__PURE__ */ jsx(
|
|
201
|
+
"input",
|
|
202
|
+
{
|
|
203
|
+
...rest,
|
|
204
|
+
ref,
|
|
205
|
+
placeholder,
|
|
206
|
+
"data-testid": testId.input,
|
|
207
|
+
type: "text",
|
|
208
|
+
value: internalValue ?? "",
|
|
209
|
+
onChange: handleChange,
|
|
210
|
+
onBlur: handleBlur,
|
|
211
|
+
className: searchInputClassnames,
|
|
212
|
+
disabled,
|
|
213
|
+
readOnly
|
|
214
|
+
}
|
|
215
|
+
),
|
|
216
|
+
isClearButtonVisible && /* @__PURE__ */ jsx(ClearButton, { onClick: handleClear, testId: testId.clearButton }),
|
|
217
|
+
suffix
|
|
218
|
+
]
|
|
219
|
+
}
|
|
220
|
+
)
|
|
221
|
+
);
|
|
222
|
+
};
|
|
223
|
+
var SearchForm = ({ ref, onSubmit, name = "search-field", ...props }) => {
|
|
224
|
+
const handleSubmit = (event) => {
|
|
225
|
+
event.preventDefault();
|
|
226
|
+
const searchEl = event.currentTarget.elements.namedItem(name);
|
|
227
|
+
onSubmit(searchEl.value);
|
|
228
|
+
};
|
|
229
|
+
const onClear = () => {
|
|
230
|
+
onSubmit("");
|
|
231
|
+
};
|
|
232
|
+
return /* @__PURE__ */ jsx("form", { onSubmit: handleSubmit, children: /* @__PURE__ */ jsx(
|
|
233
|
+
Search2,
|
|
234
|
+
{
|
|
235
|
+
...props,
|
|
236
|
+
ref,
|
|
237
|
+
onClear,
|
|
238
|
+
name,
|
|
239
|
+
disableDebounce: true
|
|
240
|
+
}
|
|
241
|
+
) });
|
|
242
|
+
};
|
|
243
|
+
|
|
244
|
+
export { Search2 as Search, SearchForm };
|
|
245
|
+
//# sourceMappingURL=chunk-TUCDD33E.js.map
|
|
246
|
+
//# sourceMappingURL=chunk-TUCDD33E.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Search/ClearButton.tsx","../src/components/Search/styles.ts","../src/components/Search/utils.ts","../src/components/Search/Search.tsx","../src/components/Search/SearchForm.tsx"],"names":["Search","jsx"],"mappings":"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","file":"chunk-TUCDD33E.js","sourcesContent":["import type { MouseEventHandler } from 'react';\n\nimport { X } from '../../icons';\nimport { cn } from '../../utils';\n\ntype Props = {\n onClick: MouseEventHandler<HTMLButtonElement>;\n testId?: string;\n};\n\nexport const ClearButton = ({ onClick, testId }: Props) => {\n // Prevent default, as we do not want to lose input focus.\n const handleMouseDown: MouseEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n };\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n tabIndex={-1} // clear button should not be focusable\n onMouseDown={handleMouseDown}\n className={cn(\n // reset\n 'tw:border-none',\n 'tw:bg-transparent',\n 'tw:p-0',\n\n // positioning\n 'tw:flex',\n 'tw:items-center',\n\n 'tw:cursor-pointer',\n 'tw:text-muted-foreground',\n 'tw:hover:text-foreground',\n )}\n data-testid={testId}\n >\n <X className=\"tw:size-4\" />\n </button>\n );\n};\n","import { cva } from 'class-variance-authority';\n\nexport const searchWrapperVariants = cva(\n [\n // positioning\n 'tw:flex',\n 'tw:items-center',\n 'tw:gap-2.5',\n\n // base\n 'tw:text-card-foreground',\n 'tw:transition-all',\n 'tw:font-sans',\n\n // readonly — `secondary` over `muted`, which is too close to the `card` fill to\n // read as non-editable in either scheme\n 'tw:has-[input[readonly]]:bg-secondary',\n 'tw:has-[input[readonly]]:focus-within:ring-0',\n 'tw:has-[input[readonly]]:outline-0',\n\n // disabled\n 'tw:disabled:opacity-40',\n\n // default input padding (was sizing.default)\n 'tw:[&>input]:py-[15px]',\n ],\n {\n defaultVariants: {\n variant: 'default',\n },\n variants: {\n variant: {\n default: [\n 'tw:rounded-lg',\n 'tw:px-5',\n 'tw:bg-card',\n 'tw:shadow-raised',\n // outline\n 'tw:outline',\n 'tw:outline-1',\n 'tw:outline-transparent',\n // focus\n 'tw:has-[input:focus]:outline-1',\n 'tw:has-[input:focus]:ring-4',\n 'tw:has-[input:focus]:outline-ring',\n 'tw:has-[input:focus]:ring-ring/30',\n ],\n ai: [\n 'tailwindcss-preflight',\n 'tw:relative',\n 'tw:rounded-card',\n 'tw:px-4',\n 'tw:cursor-text',\n 'tw:border-2',\n 'tw:border-transparent',\n 'tw:bg-gradient-to-br',\n 'tw:from-secondary-600',\n 'tw:to-purple-600',\n 'tw:bg-origin-border',\n // Floods the interior so the gradient shows only in the 2px border box.\n 'tw:shadow-[inset_0_100vw_rgb(var(--card))]',\n // focus\n 'tw:has-[input:focus]:ring-4',\n 'tw:has-[input:focus]:ring-ring/30',\n ],\n },\n },\n },\n);\n\nexport const searchInputClassnames = [\n // reset\n 'tw:border-none',\n 'tw:bg-transparent',\n 'tw:outline-hidden',\n 'tw:w-full',\n 'tw:p-0',\n\n // base\n 'tw:text-base',\n 'tw:leading-6',\n 'tw:font-normal',\n 'tw:font-sans',\n\n // placeholder\n 'tw:placeholder:text-muted-foreground',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n].join(' ');\n","import { createPrefixedString } from '../../utils';\n\nexport const genSearchTestId = (prefix: string = '') => {\n const ps = createPrefixedString(prefix);\n return {\n toString: () => prefix,\n wrapper: ps`search-wrapper`,\n input: ps`search-input`,\n clearButton: ps`search-clear-button`,\n };\n};\n","import { useEffect, useMemo, useState } from 'react';\nimport type {\n ChangeEvent,\n ChangeEventHandler,\n ComponentProps,\n FocusEvent,\n FocusEventHandler,\n MouseEvent,\n MouseEventHandler,\n ReactNode,\n} from 'react';\n\nimport { Search as SearchIcon, Sparkles } from '../../icons';\nimport { cn, debounce, noop } from '../../utils';\n\nimport { ClearButton } from './ClearButton';\nimport { searchInputClassnames, searchWrapperVariants } from './styles';\nimport { genSearchTestId } from './utils';\n\ntype SearchChangeEventHandler = (\n value: string,\n event: ChangeEvent<HTMLInputElement> | MouseEvent<HTMLButtonElement>,\n) => void;\n\ntype SearchBlurEventHandler = (value: string, event: FocusEvent<HTMLInputElement, Element>) => void;\n\ntype Props = {\n suffix?: ReactNode;\n disableDebounce?: boolean;\n debounceDelay?: number;\n onChange?: SearchChangeEventHandler;\n onBlur?: SearchBlurEventHandler;\n value?: string | null;\n defaultValue?: string | null;\n testId?: string;\n onClear?: () => void;\n variant?: 'default' | 'ai';\n} & Omit<\n ComponentProps<'input'>,\n 'type' | 'onBlur' | 'onChange' | 'value' | 'defaultValue' | 'prefix' | 'suffix'\n>;\n\n/**\n * @deprecated Use `SearchInput` instead. `Search` is kept only for the legacy (non-sidebar) layout.\n */\nexport const Search = ({\n ref,\n suffix,\n className,\n onBlur,\n onChange = noop,\n disabled = false,\n readOnly = false,\n disableDebounce = false,\n debounceDelay = 300,\n value: externalValue,\n defaultValue,\n testId: prefixTestId = '',\n placeholder = 'Search',\n onClear,\n variant = 'default',\n ...rest\n}: Props) => {\n const [internalValue, setInternalValue] = useState(() =>\n externalValue != null ? externalValue : defaultValue,\n );\n const hasValue = internalValue !== '';\n\n const isClearButtonVisible = hasValue && !disabled && !readOnly;\n const testId = genSearchTestId(prefixTestId);\n\n const debouncedOnChange = useMemo(\n () => (disableDebounce ? onChange : debounce(onChange, debounceDelay)),\n [disableDebounce, debounceDelay, onChange],\n );\n\n useEffect(() => {\n if (externalValue == null) return; // uncontrolled state\n // oxlint-disable-next-line react-x/set-state-in-effect\n setInternalValue(externalValue);\n }, [externalValue]);\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n const currentValue = event.target.value;\n setInternalValue(currentValue);\n debouncedOnChange(currentValue, event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n const currentValue = event.target.value;\n setInternalValue(currentValue);\n onBlur?.(currentValue, event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = (event) => {\n setInternalValue('');\n onChange?.('', event);\n onClear?.();\n };\n\n // Clicking anywhere in the field that isn't an interactive control (the leading icon,\n // the empty chrome) focuses the input — the whole pill acts as one click target.\n const handleWrapperMouseDown: MouseEventHandler<HTMLDivElement> = (event) => {\n if (disabled || readOnly) return;\n if ((event.target as HTMLElement).closest('button, a, input, textarea, [role=\"button\"]')) {\n return;\n }\n event.preventDefault();\n event.currentTarget.querySelector('input')?.focus();\n };\n\n return (\n // Mouse-only convenience: clicking the chrome focuses the input. The input itself is the\n // real interactive/focusable target, so no extra role or key handler is needed here.\n // oxlint-disable-next-line jsx-a11y/no-static-element-interactions\n <div\n className={cn(\n searchWrapperVariants({ variant }),\n {\n 'tw:cursor-not-allowed tw:opacity-40': disabled,\n },\n className,\n )}\n data-testid={testId.wrapper}\n onMouseDown={handleWrapperMouseDown}\n >\n {variant === 'ai' ? (\n <Sparkles className=\"tw:size-4 tw:shrink-0 tw:[&_*]:stroke-aigradient-600\" />\n ) : (\n <SearchIcon className=\"tw:size-4 tw:shrink-0 tw:text-neutral-400\" />\n )}\n\n <input\n {...rest}\n ref={ref}\n placeholder={placeholder}\n data-testid={testId.input}\n type=\"text\"\n value={internalValue ?? ''}\n onChange={handleChange}\n onBlur={handleBlur}\n className={searchInputClassnames}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {isClearButtonVisible && <ClearButton onClick={handleClear} testId={testId.clearButton} />}\n\n {suffix}\n </div>\n );\n};\n","import type { ComponentProps, FormEventHandler } from 'react';\n\nimport { Search } from './Search';\n\ntype Props = {\n onSubmit: (value: string) => void;\n} & Omit<ComponentProps<typeof Search>, 'onClear' | 'onBlur' | 'onSubmit'>;\n\nexport const SearchForm = ({ ref, onSubmit, name = 'search-field', ...props }: Props) => {\n const handleSubmit: FormEventHandler<HTMLFormElement> = (event) => {\n event.preventDefault();\n const searchEl = event.currentTarget.elements.namedItem(name) as HTMLInputElement;\n onSubmit(searchEl.value);\n };\n\n const onClear = () => {\n onSubmit('');\n };\n\n return (\n <form onSubmit={handleSubmit}>\n <Search\n {...props}\n ref={ref}\n onClear={onClear}\n name={name}\n // Debounce has no meaning when we use submit, which is triggered by pressing enter.\n disableDebounce\n />\n </form>\n );\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { useRef, useLayoutEffect, useCallback } from 'react';
|
|
2
|
+
|
|
3
|
+
// src/hooks/useStableCallback.ts
|
|
4
|
+
var useStableCallback = (callback) => {
|
|
5
|
+
const latestRef = useRef(callback);
|
|
6
|
+
useLayoutEffect(() => {
|
|
7
|
+
latestRef.current = callback;
|
|
8
|
+
}, [callback]);
|
|
9
|
+
return useCallback((...args) => latestRef.current(...args), []);
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
export { useStableCallback };
|
|
13
|
+
//# sourceMappingURL=chunk-TV4WAP2R.js.map
|
|
14
|
+
//# sourceMappingURL=chunk-TV4WAP2R.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hooks/useStableCallback.ts"],"names":[],"mappings":";;;AAkBO,IAAM,iBAAA,GAAoB,CAC/B,QAAA,KACgC;AAChC,EAAA,MAAM,SAAA,GAAY,OAAO,QAAQ,CAAA;AAEjC,EAAA,eAAA,CAAgB,MAAM;AACpB,IAAA,SAAA,CAAU,OAAA,GAAU,QAAA;AAAA,EACtB,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,OAAO,WAAA,CAAY,IAAI,IAAA,KAAe,SAAA,CAAU,QAAQ,GAAG,IAAI,CAAA,EAAG,EAAE,CAAA;AACtE","file":"chunk-TV4WAP2R.js","sourcesContent":["import { useCallback, useLayoutEffect, useRef } from 'react';\n\n/**\n * A callback with a permanently stable identity that always sees the latest\n * render's values — for any consumer that keys off the handler's identity: a\n * third-party component that redoes expensive work when it changes, or a\n * memoized context value.\n *\n * React 19.2's `useEffectEvent` does this in one line, but it is scoped to\n * Effects and explicitly not to be passed to another component, which is the\n * whole point here.\n *\n * The swap is a layout effect rather than a passive one so it lands before the\n * browser can paint and accept input against the previous render's handler. It\n * is still an effect, and a child's runs before its parent's — so a consumer\n * calling the returned function from its own layout effect can still see the\n * previous render's closure.\n */\nexport const useStableCallback = <Args extends unknown[], Result>(\n callback: (...args: Args) => Result,\n): ((...args: Args) => Result) => {\n const latestRef = useRef(callback);\n\n useLayoutEffect(() => {\n latestRef.current = callback;\n }, [callback]);\n\n return useCallback((...args: Args) => latestRef.current(...args), []);\n};\n"]}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { useControllableState } from './chunk-WKAUEL6I.js';
|
|
2
|
+
import { InputGroup } from './chunk-SC275NHZ.js';
|
|
3
|
+
import { ArrowBigUpDash, X, EyeOff, Eye } from './chunk-RQVK4IYC.js';
|
|
4
|
+
import { createChangeInputEvent } from './chunk-SWQFYNYG.js';
|
|
5
|
+
import { mergeRefs } from './chunk-3W27OLK5.js';
|
|
6
|
+
import { useRef, useState } from 'react';
|
|
7
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
8
|
+
|
|
9
|
+
var PasswordInput = ({
|
|
10
|
+
ref,
|
|
11
|
+
// group props
|
|
12
|
+
state,
|
|
13
|
+
variant,
|
|
14
|
+
focusVariant,
|
|
15
|
+
sizing,
|
|
16
|
+
className,
|
|
17
|
+
// own props
|
|
18
|
+
value: valueProp,
|
|
19
|
+
defaultValue,
|
|
20
|
+
onValueChange,
|
|
21
|
+
onValueBlur,
|
|
22
|
+
onChange,
|
|
23
|
+
onBlur,
|
|
24
|
+
onKeyDown,
|
|
25
|
+
onKeyUp,
|
|
26
|
+
onMouseDown,
|
|
27
|
+
allowClear = false,
|
|
28
|
+
allowPasswordToggle = false,
|
|
29
|
+
passwordToggleLabel,
|
|
30
|
+
autoComplete = "new-password",
|
|
31
|
+
defaultPasswordVisibility = false,
|
|
32
|
+
// input props
|
|
33
|
+
disabled,
|
|
34
|
+
readOnly,
|
|
35
|
+
...restInputProps
|
|
36
|
+
}) => {
|
|
37
|
+
const inputRef = useRef(null);
|
|
38
|
+
const [value, setValue] = useControllableState({
|
|
39
|
+
// A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.
|
|
40
|
+
prop: valueProp === null ? "" : valueProp,
|
|
41
|
+
defaultProp: defaultValue ?? "",
|
|
42
|
+
onChange: onValueChange
|
|
43
|
+
});
|
|
44
|
+
const [capsLock, setCapsLock] = useState(false);
|
|
45
|
+
const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);
|
|
46
|
+
const canClear = allowClear && !!value && !disabled && !readOnly;
|
|
47
|
+
const handleChange = (event) => {
|
|
48
|
+
setValue(event.target.value);
|
|
49
|
+
onChange?.(event);
|
|
50
|
+
};
|
|
51
|
+
const handleBlur = (event) => {
|
|
52
|
+
if (capsLock) setCapsLock(false);
|
|
53
|
+
onValueBlur?.(event.target.value);
|
|
54
|
+
onBlur?.(event);
|
|
55
|
+
};
|
|
56
|
+
const handleKeyDown = (event) => {
|
|
57
|
+
const isOn = event.getModifierState("CapsLock");
|
|
58
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
59
|
+
onKeyDown?.(event);
|
|
60
|
+
};
|
|
61
|
+
const handleKeyUp = (event) => {
|
|
62
|
+
const isOn = event.getModifierState("CapsLock");
|
|
63
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
64
|
+
onKeyUp?.(event);
|
|
65
|
+
};
|
|
66
|
+
const handleMouseDown = (event) => {
|
|
67
|
+
const isOn = event.getModifierState("CapsLock");
|
|
68
|
+
if (isOn !== capsLock) setCapsLock(isOn);
|
|
69
|
+
onMouseDown?.(event);
|
|
70
|
+
};
|
|
71
|
+
const handleClear = () => {
|
|
72
|
+
if (!inputRef.current) return;
|
|
73
|
+
inputRef.current.value = "";
|
|
74
|
+
setValue("");
|
|
75
|
+
onChange?.(createChangeInputEvent(inputRef.current));
|
|
76
|
+
};
|
|
77
|
+
const handleTogglePasswordVisibility = () => {
|
|
78
|
+
setIsPasswordVisible((prev) => !prev);
|
|
79
|
+
};
|
|
80
|
+
return /* @__PURE__ */ jsxs(
|
|
81
|
+
InputGroup,
|
|
82
|
+
{
|
|
83
|
+
state,
|
|
84
|
+
variant,
|
|
85
|
+
sizing,
|
|
86
|
+
focusVariant,
|
|
87
|
+
className,
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ jsx(
|
|
90
|
+
InputGroup.Input,
|
|
91
|
+
{
|
|
92
|
+
...restInputProps,
|
|
93
|
+
ref: mergeRefs(ref ?? null, inputRef),
|
|
94
|
+
type: isPasswordVisible ? "text" : "password",
|
|
95
|
+
autoComplete,
|
|
96
|
+
value,
|
|
97
|
+
onChange: handleChange,
|
|
98
|
+
onBlur: handleBlur,
|
|
99
|
+
onKeyDown: handleKeyDown,
|
|
100
|
+
onKeyUp: handleKeyUp,
|
|
101
|
+
onMouseDown: handleMouseDown,
|
|
102
|
+
disabled,
|
|
103
|
+
readOnly
|
|
104
|
+
}
|
|
105
|
+
),
|
|
106
|
+
(capsLock || canClear || allowPasswordToggle) && /* @__PURE__ */ jsxs(InputGroup.Addon, { align: "inline-end", children: [
|
|
107
|
+
capsLock && /* @__PURE__ */ jsx(ArrowBigUpDash, { className: "tw:size-4 tw:text-primary", children: /* @__PURE__ */ jsx("title", { children: "Caps Lock is on" }) }),
|
|
108
|
+
canClear && /* @__PURE__ */ jsx(
|
|
109
|
+
InputGroup.Button,
|
|
110
|
+
{
|
|
111
|
+
"aria-label": "Clear password",
|
|
112
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
113
|
+
onClick: handleClear,
|
|
114
|
+
children: /* @__PURE__ */ jsx(X, { className: "tw:size-4" })
|
|
115
|
+
}
|
|
116
|
+
),
|
|
117
|
+
allowPasswordToggle && /* @__PURE__ */ jsx(
|
|
118
|
+
InputGroup.Button,
|
|
119
|
+
{
|
|
120
|
+
"aria-label": `${isPasswordVisible ? "Hide password" : "Show password"}${passwordToggleLabel ? `: ${passwordToggleLabel}` : ""}`,
|
|
121
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
122
|
+
onClick: handleTogglePasswordVisibility,
|
|
123
|
+
children: isPasswordVisible ? /* @__PURE__ */ jsx(EyeOff, { className: "tw:size-4" }) : /* @__PURE__ */ jsx(Eye, { className: "tw:size-4" })
|
|
124
|
+
}
|
|
125
|
+
)
|
|
126
|
+
] })
|
|
127
|
+
]
|
|
128
|
+
}
|
|
129
|
+
);
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
export { PasswordInput };
|
|
133
|
+
//# sourceMappingURL=chunk-U3A6YBTZ.js.map
|
|
134
|
+
//# sourceMappingURL=chunk-U3A6YBTZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/PasswordInput/PasswordInput.tsx"],"names":[],"mappings":";;;;;;;;AA4CO,IAAM,gBAAgB,CAAC;AAAA,EAC5B,GAAA;AAAA;AAAA,EAGA,KAAA;AAAA,EACA,OAAA;AAAA,EACA,YAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA;AAAA,EAGA,KAAA,EAAO,SAAA;AAAA,EACP,YAAA;AAAA,EACA,aAAA;AAAA,EACA,WAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EACA,WAAA;AAAA,EACA,UAAA,GAAa,KAAA;AAAA,EACb,mBAAA,GAAsB,KAAA;AAAA,EACtB,mBAAA;AAAA,EACA,YAAA,GAAe,cAAA;AAAA,EACf,yBAAA,GAA4B,KAAA;AAAA;AAAA,EAG5B,QAAA;AAAA,EACA,QAAA;AAAA,EACA,GAAG;AACL,CAAA,KAAa;AACX,EAAA,MAAM,QAAA,GAAW,OAA8B,IAAI,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,oBAAA,CAA6B;AAAA;AAAA,IAErD,IAAA,EAAM,SAAA,KAAc,IAAA,GAAO,EAAA,GAAK,SAAA;AAAA,IAChC,aAAa,YAAA,IAAgB,EAAA;AAAA,IAC7B,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,SAAS,KAAK,CAAA;AAC9C,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,yBAAyB,CAAA;AAEpF,EAAA,MAAM,WAAW,UAAA,IAAc,CAAC,CAAC,KAAA,IAAS,CAAC,YAAY,CAAC,QAAA;AAExD,EAAA,MAAM,YAAA,GAAqD,CAAC,KAAA,KAAU;AACpE,IAAA,QAAA,CAAS,KAAA,CAAM,OAAO,KAAK,CAAA;AAC3B,IAAA,QAAA,GAAW,KAAK,CAAA;AAAA,EAClB,CAAA;AAEA,EAAA,MAAM,UAAA,GAAkD,CAAC,KAAA,KAAU;AACjE,IAAA,IAAI,QAAA,cAAsB,KAAK,CAAA;AAC/B,IAAA,WAAA,GAAc,KAAA,CAAM,OAAO,KAAK,CAAA;AAChC,IAAA,MAAA,GAAS,KAAK,CAAA;AAAA,EAChB,CAAA;AAKA,EAAA,MAAM,aAAA,GAAwD,CAAC,KAAA,KAAU;AACvE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,SAAA,GAAY,KAAK,CAAA;AAAA,EACnB,CAAA;AAEA,EAAA,MAAM,WAAA,GAAsD,CAAC,KAAA,KAAU;AACrE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,OAAA,GAAU,KAAK,CAAA;AAAA,EACjB,CAAA;AAIA,EAAA,MAAM,eAAA,GAAuD,CAAC,KAAA,KAAU;AACtE,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,gBAAA,CAAiB,UAAU,CAAA;AAC9C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,WAAA,CAAY,IAAI,CAAA;AACvC,IAAA,WAAA,GAAc,KAAK,CAAA;AAAA,EACrB,CAAA;AAEA,EAAA,MAAM,cAAoD,MAAM;AAC9D,IAAA,IAAI,CAAC,SAAS,OAAA,EAAS;AACvB,IAAA,QAAA,CAAS,QAAQ,KAAA,GAAQ,EAAA;AACzB,IAAA,QAAA,CAAS,EAAE,CAAA;AACX,IAAA,QAAA,GAAW,sBAAA,CAAuB,QAAA,CAAS,OAAO,CAAC,CAAA;AAAA,EACrD,CAAA;AAEA,EAAA,MAAM,iCAAiC,MAAM;AAC3C,IAAA,oBAAA,CAAqB,CAAC,IAAA,KAAS,CAAC,IAAI,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,uBACE,IAAA;AAAA,IAAC,UAAA;AAAA,IAAA;AAAA,MACC,KAAA;AAAA,MACA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,UAAA,CAAW,KAAA;AAAA,UAAX;AAAA,YACE,GAAG,cAAA;AAAA,YACJ,GAAA,EAAK,SAAA,CAAU,GAAA,IAAO,IAAA,EAAM,QAAQ,CAAA;AAAA,YACpC,IAAA,EAAM,oBAAoB,MAAA,GAAS,UAAA;AAAA,YACnC,YAAA;AAAA,YACA,KAAA;AAAA,YACA,QAAA,EAAU,YAAA;AAAA,YACV,MAAA,EAAQ,UAAA;AAAA,YACR,SAAA,EAAW,aAAA;AAAA,YACX,OAAA,EAAS,WAAA;AAAA,YACT,WAAA,EAAa,eAAA;AAAA,YACb,QAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,QAAA,CAEE,QAAA,IAAY,YAAY,mBAAA,qBACxB,IAAA,CAAC,WAAW,KAAA,EAAX,EAAiB,OAAM,YAAA,EACrB,QAAA,EAAA;AAAA,UAAA,QAAA,wBACE,cAAA,EAAA,EAAe,SAAA,EAAU,6BACxB,QAAA,kBAAA,GAAA,CAAC,OAAA,EAAA,EAAM,6BAAe,CAAA,EACxB,CAAA;AAAA,UAED,QAAA,oBACC,GAAA;AAAA,YAAC,UAAA,CAAW,MAAA;AAAA,YAAX;AAAA,cACC,YAAA,EAAW,gBAAA;AAAA,cACX,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,cAC7C,OAAA,EAAS,WAAA;AAAA,cAET,QAAA,kBAAA,GAAA,CAAC,CAAA,EAAA,EAAE,SAAA,EAAU,WAAA,EAAY;AAAA;AAAA,WAC3B;AAAA,UAED,mBAAA,oBACC,GAAA;AAAA,YAAC,UAAA,CAAW,MAAA;AAAA,YAAX;AAAA,cACC,YAAA,EAAY,CAAA,EAAG,iBAAA,GAAoB,eAAA,GAAkB,eAAe,GAClE,mBAAA,GAAsB,CAAA,EAAA,EAAK,mBAAmB,CAAA,CAAA,GAAK,EACrD,CAAA,CAAA;AAAA,cACA,WAAA,EAAa,CAAC,KAAA,KAAU,KAAA,CAAM,cAAA,EAAe;AAAA,cAC7C,OAAA,EAAS,8BAAA;AAAA,cAER,QAAA,EAAA,iBAAA,uBAAqB,MAAA,EAAA,EAAO,SAAA,EAAU,aAAY,CAAA,mBAAK,GAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAU,WAAA,EAAY;AAAA;AAAA;AACrF,SAAA,EAEJ;AAAA;AAAA;AAAA,GAEJ;AAEJ","file":"chunk-U3A6YBTZ.js","sourcesContent":["import { useRef, useState } from 'react';\nimport type {\n ChangeEventHandler,\n ComponentProps,\n ComponentRef,\n FocusEventHandler,\n KeyboardEventHandler,\n MouseEventHandler,\n} from 'react';\n\nimport { InputGroup } from '../../components/InputGroup';\nimport { useControllableState } from '../../hooks/useControllableState';\nimport { ArrowBigUpDash, Eye, EyeOff, X } from '../../icons';\nimport { createChangeInputEvent, mergeRefs } from '../../utils';\n\ntype InputGroupProps = Pick<\n ComponentProps<typeof InputGroup>,\n 'variant' | 'focusVariant' | 'state' | 'sizing'\n>;\n\ntype InputGroupInputProps = Omit<\n ComponentProps<typeof InputGroup.Input>,\n 'value' | 'defaultValue' | 'type' | 'autoComplete'\n>;\n\ntype Props = InputGroupProps &\n InputGroupInputProps & {\n value?: string | null;\n defaultValue?: string | null;\n onValueChange?: (value: string) => void;\n onValueBlur?: (value: string) => void;\n allowClear?: boolean;\n allowPasswordToggle?: boolean;\n /**\n * Suffix appended to the reveal button's accessible name, e.g. the field\n * title. Use it to disambiguate multiple password fields on one form —\n * \"Show password: API token\" / \"Hide password: API token\". Omit for a\n * single field.\n */\n passwordToggleLabel?: string;\n autoComplete?: 'new-password' | 'current-password' | 'off';\n defaultPasswordVisibility?: boolean;\n };\n\nexport const PasswordInput = ({\n ref,\n\n // group props\n state,\n variant,\n focusVariant,\n sizing,\n className,\n\n // own props\n value: valueProp,\n defaultValue,\n onValueChange,\n onValueBlur,\n onChange,\n onBlur,\n onKeyDown,\n onKeyUp,\n onMouseDown,\n allowClear = false,\n allowPasswordToggle = false,\n passwordToggleLabel,\n autoComplete = 'new-password',\n defaultPasswordVisibility = false,\n\n // input props\n disabled,\n readOnly,\n ...restInputProps\n}: Props) => {\n const inputRef = useRef<ComponentRef<'input'>>(null);\n\n const [value, setValue] = useControllableState<string>({\n // A `null` controlled value stays controlled (coerced to ''); `undefined` is uncontrolled.\n prop: valueProp === null ? '' : valueProp,\n defaultProp: defaultValue ?? '',\n onChange: onValueChange,\n });\n\n const [capsLock, setCapsLock] = useState(false);\n const [isPasswordVisible, setIsPasswordVisible] = useState(defaultPasswordVisibility);\n\n const canClear = allowClear && !!value && !disabled && !readOnly;\n\n const handleChange: ChangeEventHandler<HTMLInputElement> = (event) => {\n setValue(event.target.value);\n onChange?.(event);\n };\n\n const handleBlur: FocusEventHandler<HTMLInputElement> = (event) => {\n if (capsLock) setCapsLock(false);\n onValueBlur?.(event.target.value);\n onBlur?.(event);\n };\n\n // Both keyDown and keyUp are needed: pressing the Caps Lock key itself\n // reports the *old* state on keyDown and the *new* state on keyUp, so\n // toggling Caps Lock off mid-typing is only caught on keyUp.\n const handleKeyDown: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyDown?.(event);\n };\n\n const handleKeyUp: KeyboardEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onKeyUp?.(event);\n };\n\n // Catches the case where the user clicks into the field with Caps Lock\n // already on. Tab-focus / autofocus have no API to query modifier state.\n const handleMouseDown: MouseEventHandler<HTMLInputElement> = (event) => {\n const isOn = event.getModifierState('CapsLock');\n if (isOn !== capsLock) setCapsLock(isOn);\n onMouseDown?.(event);\n };\n\n const handleClear: MouseEventHandler<HTMLButtonElement> = () => {\n if (!inputRef.current) return;\n inputRef.current.value = '';\n setValue('');\n onChange?.(createChangeInputEvent(inputRef.current));\n };\n\n const handleTogglePasswordVisibility = () => {\n setIsPasswordVisible((prev) => !prev);\n };\n\n return (\n <InputGroup\n state={state}\n variant={variant}\n sizing={sizing}\n focusVariant={focusVariant}\n className={className}\n >\n <InputGroup.Input\n {...restInputProps}\n ref={mergeRefs(ref ?? null, inputRef)}\n type={isPasswordVisible ? 'text' : 'password'}\n autoComplete={autoComplete}\n value={value}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={handleKeyDown}\n onKeyUp={handleKeyUp}\n onMouseDown={handleMouseDown}\n disabled={disabled}\n readOnly={readOnly}\n />\n\n {(capsLock || canClear || allowPasswordToggle) && (\n <InputGroup.Addon align=\"inline-end\">\n {capsLock && (\n <ArrowBigUpDash className=\"tw:size-4 tw:text-primary\">\n <title>Caps Lock is on</title>\n </ArrowBigUpDash>\n )}\n {canClear && (\n <InputGroup.Button\n aria-label=\"Clear password\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleClear}\n >\n <X className=\"tw:size-4\" />\n </InputGroup.Button>\n )}\n {allowPasswordToggle && (\n <InputGroup.Button\n aria-label={`${isPasswordVisible ? 'Hide password' : 'Show password'}${\n passwordToggleLabel ? `: ${passwordToggleLabel}` : ''\n }`}\n onMouseDown={(event) => event.preventDefault()}\n onClick={handleTogglePasswordVisibility}\n >\n {isPasswordVisible ? <EyeOff className=\"tw:size-4\" /> : <Eye className=\"tw:size-4\" />}\n </InputGroup.Button>\n )}\n </InputGroup.Addon>\n )}\n </InputGroup>\n );\n};\n"]}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { Textarea } from './chunk-EEK5NGZF.js';
|
|
2
|
+
import { Loader2, CircleCheck } from './chunk-RQVK4IYC.js';
|
|
3
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
4
|
+
import { useState } from 'react';
|
|
5
|
+
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var AutoSaveTextarea = ({
|
|
8
|
+
savedValue,
|
|
9
|
+
onSave,
|
|
10
|
+
placeholder,
|
|
11
|
+
disabled,
|
|
12
|
+
grow = false,
|
|
13
|
+
...textareaProps
|
|
14
|
+
}) => {
|
|
15
|
+
const { maxLength, ...restTextareaProps } = textareaProps;
|
|
16
|
+
const [value, setValue] = useState(null);
|
|
17
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
18
|
+
const currentValue = value ?? savedValue ?? "";
|
|
19
|
+
const isOverLimit = maxLength != null && currentValue.length > maxLength;
|
|
20
|
+
const isChanged = value !== null && savedValue !== value.trim();
|
|
21
|
+
const onSaveHandler = (blurValue = "") => {
|
|
22
|
+
if (!isChanged || isOverLimit) return;
|
|
23
|
+
setIsSaving(true);
|
|
24
|
+
onSave(blurValue.trim()).catch(() => {
|
|
25
|
+
}).finally(() => {
|
|
26
|
+
setIsSaving(false);
|
|
27
|
+
});
|
|
28
|
+
};
|
|
29
|
+
return /* @__PURE__ */ jsxs(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
className: cn(
|
|
33
|
+
"tw:relative",
|
|
34
|
+
// `-mx-1 + px-3` gives the focus ring 4px of horizontal breathing room inside
|
|
35
|
+
// ancestors that clip with `overflow: hidden` and no horizontal padding (e.g. the
|
|
36
|
+
// Kai sidebar's TabsContent). `-my-1 + py-1` keeps the original zero vertical inset.
|
|
37
|
+
grow && "tw:-m-1 tw:flex tw:min-h-0 tw:flex-1 tw:flex-col tw:overflow-hidden tw:px-3 tw:py-1"
|
|
38
|
+
),
|
|
39
|
+
children: [
|
|
40
|
+
/* @__PURE__ */ jsx(
|
|
41
|
+
Textarea,
|
|
42
|
+
{
|
|
43
|
+
...restTextareaProps,
|
|
44
|
+
containerClassName: cn(
|
|
45
|
+
// Descendant selectors match InputGroup's `tw:[&>textarea]:!min-h-[…]` specificity
|
|
46
|
+
// so the textarea fills the wrapper instead of being pinned to the sizing min-height.
|
|
47
|
+
grow && "tw:min-h-0 tw:flex-1 tw:overflow-hidden tw:[&>textarea]:!min-h-full tw:[&>textarea]:!max-h-full tw:[&>textarea]:overflow-y-auto",
|
|
48
|
+
restTextareaProps.containerClassName
|
|
49
|
+
),
|
|
50
|
+
state: isOverLimit ? "error" : void 0,
|
|
51
|
+
value: currentValue,
|
|
52
|
+
onValueChange: setValue,
|
|
53
|
+
onValueBlur: () => onSaveHandler(value ?? ""),
|
|
54
|
+
placeholder,
|
|
55
|
+
disabled: disabled || isSaving,
|
|
56
|
+
disableResize: grow,
|
|
57
|
+
maxRows: grow ? "unlimited" : restTextareaProps.maxRows
|
|
58
|
+
}
|
|
59
|
+
),
|
|
60
|
+
/* @__PURE__ */ jsxs(
|
|
61
|
+
"div",
|
|
62
|
+
{
|
|
63
|
+
className: cn(
|
|
64
|
+
"tw:mt-1 tw:flex tw:items-center tw:text-xs",
|
|
65
|
+
maxLength != null ? "tw:justify-between" : "tw:justify-end"
|
|
66
|
+
),
|
|
67
|
+
children: [
|
|
68
|
+
maxLength != null && /* @__PURE__ */ jsxs("span", { className: cn(isOverLimit ? "tw:text-error-500" : "tw:text-neutral-400"), children: [
|
|
69
|
+
currentValue.length,
|
|
70
|
+
" / ",
|
|
71
|
+
maxLength
|
|
72
|
+
] }),
|
|
73
|
+
/* @__PURE__ */ jsxs("span", { className: "tw:flex tw:items-center tw:gap-1 tw:text-neutral-400", children: [
|
|
74
|
+
isOverLimit && "Character limit exceeded",
|
|
75
|
+
!isOverLimit && isChanged && !isSaving && "Unsaved",
|
|
76
|
+
!isOverLimit && isChanged && isSaving && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
77
|
+
/* @__PURE__ */ jsx(Loader2, { className: "tw:size-4 tw:animate-spin" }),
|
|
78
|
+
" Saving"
|
|
79
|
+
] }),
|
|
80
|
+
!isOverLimit && value !== null && !isChanged && !isSaving && /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
81
|
+
/* @__PURE__ */ jsx(CircleCheck, { className: "tw:size-4 tw:text-green-500" }),
|
|
82
|
+
" Saved"
|
|
83
|
+
] })
|
|
84
|
+
] })
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
]
|
|
89
|
+
}
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
export { AutoSaveTextarea };
|
|
94
|
+
//# sourceMappingURL=chunk-UGT6DKWM.js.map
|
|
95
|
+
//# sourceMappingURL=chunk-UGT6DKWM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/AutoSaveTextarea/AutoSaveTextarea.tsx"],"names":[],"mappings":"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","file":"chunk-UGT6DKWM.js","sourcesContent":["import { type ComponentProps, useState } from 'react';\n\nimport { CircleCheck, Loader2 } from '../../icons';\nimport { cn } from '../../utils';\nimport { Textarea } from '../Textarea';\n\ntype AutoSaveTextareaProps = {\n savedValue?: string;\n onSave: (value: string) => Promise<void>;\n placeholder?: string;\n disabled?: boolean;\n grow?: boolean;\n} & Pick<\n ComponentProps<typeof Textarea>,\n 'variant' | 'minRows' | 'maxRows' | 'className' | 'containerClassName' | 'maxLength'\n>;\n\nexport const AutoSaveTextarea = ({\n savedValue,\n onSave,\n placeholder,\n disabled,\n grow = false,\n ...textareaProps\n}: AutoSaveTextareaProps) => {\n const { maxLength, ...restTextareaProps } = textareaProps;\n const [value, setValue] = useState<string | null>(null);\n const [isSaving, setIsSaving] = useState(false);\n\n const currentValue = value ?? savedValue ?? '';\n const isOverLimit = maxLength != null && currentValue.length > maxLength;\n const isChanged = value !== null && savedValue !== value.trim();\n\n const onSaveHandler = (blurValue = '') => {\n if (!isChanged || isOverLimit) return;\n\n setIsSaving(true);\n onSave(blurValue.trim())\n .catch(() => {})\n .finally(() => {\n setIsSaving(false);\n });\n };\n\n return (\n <div\n className={cn(\n 'tw:relative',\n // `-mx-1 + px-3` gives the focus ring 4px of horizontal breathing room inside\n // ancestors that clip with `overflow: hidden` and no horizontal padding (e.g. the\n // Kai sidebar's TabsContent). `-my-1 + py-1` keeps the original zero vertical inset.\n grow &&\n 'tw:-m-1 tw:flex tw:min-h-0 tw:flex-1 tw:flex-col tw:overflow-hidden tw:px-3 tw:py-1',\n )}\n >\n <Textarea\n {...restTextareaProps}\n containerClassName={cn(\n // Descendant selectors match InputGroup's `tw:[&>textarea]:!min-h-[…]` specificity\n // so the textarea fills the wrapper instead of being pinned to the sizing min-height.\n grow &&\n 'tw:min-h-0 tw:flex-1 tw:overflow-hidden tw:[&>textarea]:!min-h-full tw:[&>textarea]:!max-h-full tw:[&>textarea]:overflow-y-auto',\n restTextareaProps.containerClassName,\n )}\n state={isOverLimit ? 'error' : undefined}\n value={currentValue}\n onValueChange={setValue}\n onValueBlur={() => onSaveHandler(value ?? '')}\n placeholder={placeholder}\n disabled={disabled || isSaving}\n disableResize={grow}\n // `grow` fills the container regardless of content length; skip the 4-row cap.\n maxRows={grow ? 'unlimited' : restTextareaProps.maxRows}\n />\n <div\n className={cn(\n 'tw:mt-1 tw:flex tw:items-center tw:text-xs',\n maxLength != null ? 'tw:justify-between' : 'tw:justify-end',\n )}\n >\n {maxLength != null && (\n <span className={cn(isOverLimit ? 'tw:text-error-500' : 'tw:text-neutral-400')}>\n {currentValue.length} / {maxLength}\n </span>\n )}\n <span className=\"tw:flex tw:items-center tw:gap-1 tw:text-neutral-400\">\n {isOverLimit && 'Character limit exceeded'}\n {!isOverLimit && isChanged && !isSaving && 'Unsaved'}\n {!isOverLimit && isChanged && isSaving && (\n <>\n <Loader2 className=\"tw:size-4 tw:animate-spin\" /> Saving\n </>\n )}\n {!isOverLimit && value !== null && !isChanged && !isSaving && (\n <>\n <CircleCheck className=\"tw:size-4 tw:text-green-500\" /> Saved\n </>\n )}\n </span>\n </div>\n </div>\n );\n};\n"]}
|