@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,29 @@
|
|
|
1
|
+
import { Card } from './chunk-F3FOFY2P.js';
|
|
2
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var ChartPanel = ({
|
|
6
|
+
title,
|
|
7
|
+
description,
|
|
8
|
+
titleAs = "h3",
|
|
9
|
+
toolbar,
|
|
10
|
+
footer,
|
|
11
|
+
className,
|
|
12
|
+
bordered = true,
|
|
13
|
+
children,
|
|
14
|
+
...rest
|
|
15
|
+
}) => /* @__PURE__ */ jsxs(Card, { bordered, className: cn("tw:gap-4", className), ...rest, children: [
|
|
16
|
+
/* @__PURE__ */ jsxs(Card.Header, { className: "tw:flex tw:items-start tw:justify-between tw:gap-4", children: [
|
|
17
|
+
/* @__PURE__ */ jsxs("div", { className: "tw:flex tw:flex-col tw:gap-1", children: [
|
|
18
|
+
/* @__PURE__ */ jsx(Card.Title, { as: titleAs, children: title }),
|
|
19
|
+
description ? /* @__PURE__ */ jsx("p", { className: "tw:m-0 tw:text-sm tw:text-muted-foreground", children: description }) : null
|
|
20
|
+
] }),
|
|
21
|
+
toolbar ? /* @__PURE__ */ jsx("div", { className: "tw:flex tw:shrink-0 tw:items-center tw:gap-2", children: toolbar }) : null
|
|
22
|
+
] }),
|
|
23
|
+
/* @__PURE__ */ jsx(Card.Content, { children }),
|
|
24
|
+
footer ? /* @__PURE__ */ jsx("div", { className: "tw:border-0 tw:border-t tw:border-solid tw:border-border tw:pt-3 tw:text-sm tw:text-muted-foreground", children: footer }) : null
|
|
25
|
+
] });
|
|
26
|
+
|
|
27
|
+
export { ChartPanel };
|
|
28
|
+
//# sourceMappingURL=chunk-ZBKFSPD3.js.map
|
|
29
|
+
//# sourceMappingURL=chunk-ZBKFSPD3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/ChartPanel/ChartPanel.tsx"],"names":[],"mappings":";;;;AA4BO,IAAM,aAAa,CAAC;AAAA,EACzB,KAAA;AAAA,EACA,WAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,OAAA;AAAA,EACA,MAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA,GAAW,IAAA;AAAA,EACX,QAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,IAAA,CAAC,QAAK,QAAA,EAAoB,SAAA,EAAW,GAAG,UAAA,EAAY,SAAS,CAAA,EAAI,GAAG,IAAA,EAClE,QAAA,EAAA;AAAA,kBAAA,IAAA,CAAC,IAAA,CAAK,MAAA,EAAL,EAAY,SAAA,EAAU,oDAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,KAAA,EAAA,EAAI,WAAU,8BAAA,EACb,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,IAAA,CAAK,KAAA,EAAL,EAAW,EAAA,EAAI,SAAU,QAAA,EAAA,KAAA,EAAM,CAAA;AAAA,MAC/B,8BACC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,4CAAA,EAA8C,uBAAY,CAAA,GACrE;AAAA,KAAA,EACN,CAAA;AAAA,IACC,0BACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,8CAAA,EAAgD,mBAAQ,CAAA,GACrE;AAAA,GAAA,EACN,CAAA;AAAA,kBACA,GAAA,CAAC,IAAA,CAAK,OAAA,EAAL,EAAc,QAAA,EAAS,CAAA;AAAA,EACvB,yBACC,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,sGAAA,EACZ,kBACH,CAAA,GACE;AAAA,CAAA,EACN","file":"chunk-ZBKFSPD3.js","sourcesContent":["import type { ComponentProps, ReactNode } from 'react';\n\nimport { Card } from '../../components/Card';\nimport { cn } from '../../utils';\n\ntype RootProps = Omit<ComponentProps<typeof Card>, 'title'> & {\n /** Panel heading. */\n title: ReactNode;\n /** Optional supporting line under the title. */\n description?: ReactNode;\n /** Heading level for the title — defaults to `h3`. Set to sit correctly under a page `h1`/`h2`. */\n titleAs?: ComponentProps<typeof Card.Title>['as'];\n /** Right-aligned header slot — range picker, legend toggle, menu, etc. */\n toolbar?: ReactNode;\n /** Optional footer row (e.g. a source note or an inline legend). */\n footer?: ReactNode;\n};\n\n/**\n * Signature chart panel — a `Card` shell with a title/description header, an optional toolbar,\n * a chart body, and an optional footer. Pass a `@keboola/design/charts` chart (`LineChart`,\n * `BarChart`, `AreaChart`, `PieChart`) as children; the panel owns the chrome, the chart owns\n * its own responsive container and themed palette.\n *\n * **When to use:** any framed data-viz block on a dashboard.\n * **When NOT to use:** for a KPI number use `StatCard`; for a raw unframed chart drop the chart\n * component directly. Charts follow the active brand's chart palette — never hardcode colours.\n */\nexport const ChartPanel = ({\n title,\n description,\n titleAs = 'h3',\n toolbar,\n footer,\n className,\n bordered = true,\n children,\n ...rest\n}: RootProps) => (\n <Card bordered={bordered} className={cn('tw:gap-4', className)} {...rest}>\n <Card.Header className=\"tw:flex tw:items-start tw:justify-between tw:gap-4\">\n <div className=\"tw:flex tw:flex-col tw:gap-1\">\n <Card.Title as={titleAs}>{title}</Card.Title>\n {description ? (\n <p className=\"tw:m-0 tw:text-sm tw:text-muted-foreground\">{description}</p>\n ) : null}\n </div>\n {toolbar ? (\n <div className=\"tw:flex tw:shrink-0 tw:items-center tw:gap-2\">{toolbar}</div>\n ) : null}\n </Card.Header>\n <Card.Content>{children}</Card.Content>\n {footer ? (\n <div className=\"tw:border-0 tw:border-t tw:border-solid tw:border-border tw:pt-3 tw:text-sm tw:text-muted-foreground\">\n {footer}\n </div>\n ) : null}\n </Card>\n);\n\nexport type { RootProps as ChartPanelProps };\n"]}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { Loader2, Microsoft } from './chunk-RQVK4IYC.js';
|
|
2
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
3
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
4
|
+
|
|
5
|
+
var LABELS = {
|
|
6
|
+
signin: "Sign in with Microsoft",
|
|
7
|
+
signup: "Sign up with Microsoft",
|
|
8
|
+
continue: "Continue with Microsoft"
|
|
9
|
+
};
|
|
10
|
+
var MICROSOFT_FONT_STACK = "'Segoe UI', 'Helvetica Neue', Arial, sans-serif";
|
|
11
|
+
var CLASSES = [
|
|
12
|
+
"tailwindcss-preflight",
|
|
13
|
+
"tw:inline-flex",
|
|
14
|
+
"tw:items-center",
|
|
15
|
+
"tw:justify-center",
|
|
16
|
+
"tw:gap-3",
|
|
17
|
+
"tw:h-[41px]",
|
|
18
|
+
"tw:px-3",
|
|
19
|
+
"tw:rounded-none",
|
|
20
|
+
"tw:border",
|
|
21
|
+
"tw:text-[15px]",
|
|
22
|
+
// Literal weight (Microsoft spec = 400). The `tw:font-*` scale is brand-overridable
|
|
23
|
+
// (`--font-weight-*`), and this button must stay brand-independent.
|
|
24
|
+
"tw:font-[400]",
|
|
25
|
+
"tw:leading-none",
|
|
26
|
+
"tw:whitespace-nowrap",
|
|
27
|
+
"tw:select-none",
|
|
28
|
+
"tw:cursor-pointer",
|
|
29
|
+
"tw:transition-colors",
|
|
30
|
+
"tw:[&_svg]:shrink-0",
|
|
31
|
+
// focus — Microsoft's brand blue ring, independent of the active brand.
|
|
32
|
+
"tw:focus-visible:outline-hidden",
|
|
33
|
+
"tw:focus-visible:ring-2",
|
|
34
|
+
"tw:focus-visible:ring-[#0067b8]/60",
|
|
35
|
+
// disabled
|
|
36
|
+
"tw:disabled:cursor-not-allowed",
|
|
37
|
+
"tw:disabled:opacity-60",
|
|
38
|
+
// light treatment — the base.
|
|
39
|
+
"tw:bg-white",
|
|
40
|
+
"tw:text-[#5e5e5e]",
|
|
41
|
+
"tw:border-[#8c8c8c]",
|
|
42
|
+
"tw:hover:not-disabled:bg-[#f3f3f3]",
|
|
43
|
+
// dark treatment — auto-applied under html[data-theme=dark] (the ancestor
|
|
44
|
+
// selector out-specifies the plain light classes above).
|
|
45
|
+
"tw:[[data-theme=dark]_&]:bg-[#2f2f2f]",
|
|
46
|
+
"tw:[[data-theme=dark]_&]:text-white",
|
|
47
|
+
"tw:[[data-theme=dark]_&]:border-[#2f2f2f]",
|
|
48
|
+
"tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#3b3b3b]"
|
|
49
|
+
];
|
|
50
|
+
var MicrosoftButton = ({
|
|
51
|
+
ref,
|
|
52
|
+
label = "signin",
|
|
53
|
+
isLoading = false,
|
|
54
|
+
disabled = false,
|
|
55
|
+
type = "button",
|
|
56
|
+
className,
|
|
57
|
+
children,
|
|
58
|
+
style,
|
|
59
|
+
...buttonProps
|
|
60
|
+
}) => /* @__PURE__ */ jsxs(
|
|
61
|
+
"button",
|
|
62
|
+
{
|
|
63
|
+
...buttonProps,
|
|
64
|
+
ref,
|
|
65
|
+
type,
|
|
66
|
+
disabled: disabled || isLoading,
|
|
67
|
+
"aria-disabled": disabled || isLoading,
|
|
68
|
+
style: { fontFamily: MICROSOFT_FONT_STACK, ...style },
|
|
69
|
+
className: cn(CLASSES, className),
|
|
70
|
+
children: [
|
|
71
|
+
isLoading ? /* @__PURE__ */ jsx(Loader2, { className: "tw:size-[21px] tw:shrink-0 tw:animate-spin", "aria-hidden": "true" }) : /* @__PURE__ */ jsx(Microsoft, { className: "tw:size-[21px]" }),
|
|
72
|
+
/* @__PURE__ */ jsx("span", { children: children ?? LABELS[label] })
|
|
73
|
+
]
|
|
74
|
+
}
|
|
75
|
+
);
|
|
76
|
+
|
|
77
|
+
export { MicrosoftButton };
|
|
78
|
+
//# sourceMappingURL=chunk-ZOERRQ6A.js.map
|
|
79
|
+
//# sourceMappingURL=chunk-ZOERRQ6A.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/blocks/MicrosoftButton/MicrosoftButton.tsx"],"names":[],"mappings":";;;;AAMA,IAAM,MAAA,GAAS;AAAA,EACb,MAAA,EAAQ,wBAAA;AAAA,EACR,MAAA,EAAQ,wBAAA;AAAA,EACR,QAAA,EAAU;AACZ,CAAA;AAGA,IAAM,oBAAA,GAAuB,iDAAA;AAE7B,IAAM,OAAA,GAAU;AAAA,EACd,uBAAA;AAAA,EACA,gBAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA;AAAA;AAAA,EAGA,eAAA;AAAA,EACA,iBAAA;AAAA,EACA,sBAAA;AAAA,EACA,gBAAA;AAAA,EACA,mBAAA;AAAA,EACA,sBAAA;AAAA,EACA,qBAAA;AAAA;AAAA,EAGA,iCAAA;AAAA,EACA,yBAAA;AAAA,EACA,oCAAA;AAAA;AAAA,EAGA,gCAAA;AAAA,EACA,wBAAA;AAAA;AAAA,EAGA,aAAA;AAAA,EACA,mBAAA;AAAA,EACA,qBAAA;AAAA,EACA,oCAAA;AAAA;AAAA;AAAA,EAIA,uCAAA;AAAA,EACA,qCAAA;AAAA,EACA,2CAAA;AAAA,EACA;AACF,CAAA;AAOO,IAAM,kBAAkB,CAAC;AAAA,EAC9B,GAAA;AAAA,EACA,KAAA,GAAQ,QAAA;AAAA,EACR,SAAA,GAAY,KAAA;AAAA,EACZ,QAAA,GAAW,KAAA;AAAA,EACX,IAAA,GAAO,QAAA;AAAA,EACP,SAAA;AAAA,EACA,QAAA;AAAA,EACA,KAAA;AAAA,EACA,GAAG;AACL,CAAA,qBACE,IAAA;AAAA,EAAC,QAAA;AAAA,EAAA;AAAA,IACE,GAAG,WAAA;AAAA,IACJ,GAAA;AAAA,IACA,IAAA;AAAA,IACA,UAAU,QAAA,IAAY,SAAA;AAAA,IACtB,iBAAe,QAAA,IAAY,SAAA;AAAA,IAC3B,KAAA,EAAO,EAAE,UAAA,EAAY,oBAAA,EAAsB,GAAG,KAAA,EAAM;AAAA,IACpD,SAAA,EAAW,EAAA,CAAG,OAAA,EAAS,SAAS,CAAA;AAAA,IAE/B,QAAA,EAAA;AAAA,MAAA,SAAA,mBACC,GAAA,CAAC,OAAA,EAAA,EAAQ,SAAA,EAAU,4CAAA,EAA6C,aAAA,EAAY,QAAO,CAAA,mBAEnF,GAAA,CAAC,SAAA,EAAA,EAAU,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,sBAExC,GAAA,CAAC,MAAA,EAAA,EAAM,QAAA,EAAA,QAAA,IAAY,MAAA,CAAO,KAAK,CAAA,EAAE;AAAA;AAAA;AACnC","file":"chunk-ZOERRQ6A.js","sourcesContent":["import type { ComponentPropsWithRef } from 'react';\n\nimport { Loader2, Microsoft } from '../../icons';\nimport { cn } from '../../utils';\n\n/** The same Microsoft mark supports these call-to-action wordings. */\nconst LABELS = {\n signin: 'Sign in with Microsoft',\n signup: 'Sign up with Microsoft',\n continue: 'Continue with Microsoft',\n} as const;\n\n/** Microsoft specifies the Segoe UI typeface; fall back gracefully when it isn't loaded. */\nconst MICROSOFT_FONT_STACK = \"'Segoe UI', 'Helvetica Neue', Arial, sans-serif\";\n\nconst CLASSES = [\n 'tailwindcss-preflight',\n 'tw:inline-flex',\n 'tw:items-center',\n 'tw:justify-center',\n 'tw:gap-3',\n 'tw:h-[41px]',\n 'tw:px-3',\n 'tw:rounded-none',\n 'tw:border',\n 'tw:text-[15px]',\n // Literal weight (Microsoft spec = 400). The `tw:font-*` scale is brand-overridable\n // (`--font-weight-*`), and this button must stay brand-independent.\n 'tw:font-[400]',\n 'tw:leading-none',\n 'tw:whitespace-nowrap',\n 'tw:select-none',\n 'tw:cursor-pointer',\n 'tw:transition-colors',\n 'tw:[&_svg]:shrink-0',\n\n // focus — Microsoft's brand blue ring, independent of the active brand.\n 'tw:focus-visible:outline-hidden',\n 'tw:focus-visible:ring-2',\n 'tw:focus-visible:ring-[#0067b8]/60',\n\n // disabled\n 'tw:disabled:cursor-not-allowed',\n 'tw:disabled:opacity-60',\n\n // light treatment — the base.\n 'tw:bg-white',\n 'tw:text-[#5e5e5e]',\n 'tw:border-[#8c8c8c]',\n 'tw:hover:not-disabled:bg-[#f3f3f3]',\n\n // dark treatment — auto-applied under html[data-theme=dark] (the ancestor\n // selector out-specifies the plain light classes above).\n 'tw:[[data-theme=dark]_&]:bg-[#2f2f2f]',\n 'tw:[[data-theme=dark]_&]:text-white',\n 'tw:[[data-theme=dark]_&]:border-[#2f2f2f]',\n 'tw:[[data-theme=dark]_&]:hover:not-disabled:bg-[#3b3b3b]',\n];\n\ntype Props = ComponentPropsWithRef<'button'> & {\n label?: keyof typeof LABELS;\n isLoading?: boolean;\n};\n\nexport const MicrosoftButton = ({\n ref,\n label = 'signin',\n isLoading = false,\n disabled = false,\n type = 'button',\n className,\n children,\n style,\n ...buttonProps\n}: Props) => (\n <button\n {...buttonProps}\n ref={ref}\n type={type}\n disabled={disabled || isLoading}\n aria-disabled={disabled || isLoading}\n style={{ fontFamily: MICROSOFT_FONT_STACK, ...style }}\n className={cn(CLASSES, className)}\n >\n {isLoading ? (\n <Loader2 className=\"tw:size-[21px] tw:shrink-0 tw:animate-spin\" aria-hidden=\"true\" />\n ) : (\n <Microsoft className=\"tw:size-[21px]\" />\n )}\n <span>{children ?? LABELS[label]}</span>\n </button>\n);\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
|
|
3
|
+
// src/components/EmptySearchContent.tsx
|
|
4
|
+
var EmptySearchContent = ({ children = "No results found." }) => {
|
|
5
|
+
return /* @__PURE__ */ jsx("div", { className: "tw:px-0 tw:py-[30px] tw:text-center tw:text-sm tw:text-muted-foreground", children });
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export { EmptySearchContent };
|
|
9
|
+
//# sourceMappingURL=chunk-ZSTGUKHU.js.map
|
|
10
|
+
//# sourceMappingURL=chunk-ZSTGUKHU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/EmptySearchContent.tsx"],"names":[],"mappings":";;;AAMO,IAAM,kBAAA,GAAqB,CAAC,EAAE,QAAA,GAAW,qBAAoB,KAAa;AAC/E,EAAA,uBACE,GAAA,CAAC,KAAA,EAAA,EAAI,SAAA,EAAU,yEAAA,EACZ,QAAA,EACH,CAAA;AAEJ","file":"chunk-ZSTGUKHU.js","sourcesContent":["import type { ReactNode } from 'react';\n\ntype Props = {\n children?: ReactNode;\n};\n\nexport const EmptySearchContent = ({ children = 'No results found.' }: Props) => {\n return (\n <div className=\"tw:px-0 tw:py-[30px] tw:text-center tw:text-sm tw:text-muted-foreground\">\n {children}\n </div>\n );\n};\n"]}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
2
|
+
import { Separator, Group } from 'react-resizable-panels';
|
|
3
|
+
export { Panel, useDefaultLayout } from 'react-resizable-panels';
|
|
4
|
+
import { cva } from 'class-variance-authority';
|
|
5
|
+
import { jsx } from 'react/jsx-runtime';
|
|
6
|
+
|
|
7
|
+
var resizableHandleVariants = cva([
|
|
8
|
+
// base styles
|
|
9
|
+
"tw:bg-border",
|
|
10
|
+
"tw:relative",
|
|
11
|
+
"tw:flex",
|
|
12
|
+
"tw:w-px",
|
|
13
|
+
"tw:items-center",
|
|
14
|
+
"tw:justify-center",
|
|
15
|
+
// focus styles
|
|
16
|
+
"tw:focus-visible:ring-ring",
|
|
17
|
+
"tw:focus-visible:ring-1",
|
|
18
|
+
"tw:focus-visible:ring-offset-1",
|
|
19
|
+
"tw:focus-visible:ring-offset-ring-offset",
|
|
20
|
+
"tw:focus-visible:outline-hidden",
|
|
21
|
+
// after pseudo-element for horizontal
|
|
22
|
+
"tw:after:absolute",
|
|
23
|
+
"tw:after:inset-y-0",
|
|
24
|
+
"tw:after:left-1/2",
|
|
25
|
+
"tw:after:w-1",
|
|
26
|
+
"tw:after:-translate-x-1/2",
|
|
27
|
+
// horizontal separator (vertical panel group): center a full-width 4px hit target;
|
|
28
|
+
// top-1/2 + bottom-auto override the base inset-y-0 so the height takes effect
|
|
29
|
+
"tw:aria-[orientation=horizontal]:h-px",
|
|
30
|
+
"tw:aria-[orientation=horizontal]:w-full",
|
|
31
|
+
"tw:aria-[orientation=horizontal]:after:left-0",
|
|
32
|
+
"tw:aria-[orientation=horizontal]:after:top-1/2",
|
|
33
|
+
"tw:aria-[orientation=horizontal]:after:bottom-auto",
|
|
34
|
+
"tw:aria-[orientation=horizontal]:after:h-1",
|
|
35
|
+
"tw:aria-[orientation=horizontal]:after:w-full",
|
|
36
|
+
"tw:aria-[orientation=horizontal]:after:translate-x-0",
|
|
37
|
+
"tw:aria-[orientation=horizontal]:after:-translate-y-1/2",
|
|
38
|
+
// handle icon rotation for horizontal separator
|
|
39
|
+
"tw:[&[aria-orientation=horizontal]>div]:rotate-90"
|
|
40
|
+
]);
|
|
41
|
+
var ResizableHandle = ({ className, ...props }) => {
|
|
42
|
+
return /* @__PURE__ */ jsx(Separator, { className: resizableHandleVariants({ className }), ...props });
|
|
43
|
+
};
|
|
44
|
+
var ResizablePanelGroup = ({
|
|
45
|
+
className,
|
|
46
|
+
orientation = "horizontal",
|
|
47
|
+
...props
|
|
48
|
+
}) => {
|
|
49
|
+
return /* @__PURE__ */ jsx(
|
|
50
|
+
Group,
|
|
51
|
+
{
|
|
52
|
+
orientation,
|
|
53
|
+
className: cn(
|
|
54
|
+
"tw:flex tw:h-full tw:w-full",
|
|
55
|
+
orientation === "vertical" && "tw:flex-col",
|
|
56
|
+
className
|
|
57
|
+
),
|
|
58
|
+
...props
|
|
59
|
+
}
|
|
60
|
+
);
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
export { ResizableHandle, ResizablePanelGroup };
|
|
64
|
+
//# sourceMappingURL=chunk-ZUEHDL27.js.map
|
|
65
|
+
//# sourceMappingURL=chunk-ZUEHDL27.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Resizable/ResizableHandle.tsx","../src/components/Resizable/ResizablePanelGroup.tsx"],"names":["jsx"],"mappings":";;;;;;AAMA,IAAM,0BAA0B,GAAA,CAAI;AAAA;AAAA,EAElC,cAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,iBAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAGA,4BAAA;AAAA,EACA,yBAAA;AAAA,EACA,gCAAA;AAAA,EACA,0CAAA;AAAA,EACA,iCAAA;AAAA;AAAA,EAGA,mBAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA,EACA,cAAA;AAAA,EACA,2BAAA;AAAA;AAAA;AAAA,EAIA,uCAAA;AAAA,EACA,yCAAA;AAAA,EACA,+CAAA;AAAA,EACA,gDAAA;AAAA,EACA,oDAAA;AAAA,EACA,4CAAA;AAAA,EACA,+CAAA;AAAA,EACA,sDAAA;AAAA,EACA,yDAAA;AAAA;AAAA,EAGA;AACF,CAAC,CAAA;AAEM,IAAM,kBAAkB,CAAC,EAAE,SAAA,EAAW,GAAG,OAAM,KAAwC;AAC5F,EAAA,uBAAO,GAAA,CAAC,aAAU,SAAA,EAAW,uBAAA,CAAwB,EAAE,SAAA,EAAW,CAAA,EAAI,GAAG,KAAA,EAAO,CAAA;AAClF;ACxCO,IAAM,sBAAsB,CAAC;AAAA,EAClC,SAAA;AAAA,EACA,WAAA,GAAc,YAAA;AAAA,EACd,GAAG;AACL,CAAA,KAAoC;AAClC,EAAA,uBACEA,GAAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAA;AAAA,MACA,SAAA,EAAW,EAAA;AAAA,QACT,6BAAA;AAAA,QACA,gBAAgB,UAAA,IAAc,aAAA;AAAA,QAC9B;AAAA,OACF;AAAA,MACC,GAAG;AAAA;AAAA,GACN;AAEJ","file":"chunk-ZUEHDL27.js","sourcesContent":["import type { ComponentProps } from 'react';\nimport { Separator } from 'react-resizable-panels';\nimport { cva } from 'class-variance-authority';\n\n// v4 renders the separator with `aria-orientation`: a separator between horizontally-arranged\n// panels is vertical (default here); one between vertically-stacked panels is horizontal.\nconst resizableHandleVariants = cva([\n // base styles\n 'tw:bg-border',\n 'tw:relative',\n 'tw:flex',\n 'tw:w-px',\n 'tw:items-center',\n 'tw:justify-center',\n\n // focus styles\n 'tw:focus-visible:ring-ring',\n 'tw:focus-visible:ring-1',\n 'tw:focus-visible:ring-offset-1',\n 'tw:focus-visible:ring-offset-ring-offset',\n 'tw:focus-visible:outline-hidden',\n\n // after pseudo-element for horizontal\n 'tw:after:absolute',\n 'tw:after:inset-y-0',\n 'tw:after:left-1/2',\n 'tw:after:w-1',\n 'tw:after:-translate-x-1/2',\n\n // horizontal separator (vertical panel group): center a full-width 4px hit target;\n // top-1/2 + bottom-auto override the base inset-y-0 so the height takes effect\n 'tw:aria-[orientation=horizontal]:h-px',\n 'tw:aria-[orientation=horizontal]:w-full',\n 'tw:aria-[orientation=horizontal]:after:left-0',\n 'tw:aria-[orientation=horizontal]:after:top-1/2',\n 'tw:aria-[orientation=horizontal]:after:bottom-auto',\n 'tw:aria-[orientation=horizontal]:after:h-1',\n 'tw:aria-[orientation=horizontal]:after:w-full',\n 'tw:aria-[orientation=horizontal]:after:translate-x-0',\n 'tw:aria-[orientation=horizontal]:after:-translate-y-1/2',\n\n // handle icon rotation for horizontal separator\n 'tw:[&[aria-orientation=horizontal]>div]:rotate-90',\n]);\n\nexport const ResizableHandle = ({ className, ...props }: ComponentProps<typeof Separator>) => {\n return <Separator className={resizableHandleVariants({ className })} {...props} />;\n};\n","import type { ComponentProps } from 'react';\nimport { Group } from 'react-resizable-panels';\n\nimport { cn } from '../../utils';\n\nexport { useDefaultLayout } from 'react-resizable-panels';\n\nexport const ResizablePanelGroup = ({\n className,\n orientation = 'horizontal',\n ...props\n}: ComponentProps<typeof Group>) => {\n return (\n <Group\n orientation={orientation}\n className={cn(\n 'tw:flex tw:h-full tw:w-full',\n orientation === 'vertical' && 'tw:flex-col',\n className,\n )}\n {...props}\n />\n );\n};\n"]}
|
package/dist/editors.js
CHANGED
|
@@ -1,13 +1,21 @@
|
|
|
1
|
-
import { LINE_HEIGHT_PX, PANE_HEADER_HEIGHT_PX, CHANGE_CLASS } from './chunk-
|
|
2
|
-
import { useThemedExtension,
|
|
3
|
-
export { CodeEditor, LANGUAGE_MODES, SqlEditor, isLanguageMode } from './chunk-
|
|
4
|
-
import { useStableCallback } from './chunk-
|
|
5
|
-
import './chunk-
|
|
6
|
-
import './chunk-
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import './chunk-
|
|
10
|
-
import {
|
|
1
|
+
import { LINE_HEIGHT_PX, PANE_HEADER_HEIGHT_PX, CHANGE_CLASS } from './chunk-OTL5WXIJ.js';
|
|
2
|
+
import { useThemedExtension, buildBasicSetup } from './chunk-YFZJ3ZLG.js';
|
|
3
|
+
export { CodeEditor, LANGUAGE_MODES, SqlEditor, isLanguageMode } from './chunk-YFZJ3ZLG.js';
|
|
4
|
+
import { useStableCallback } from './chunk-TV4WAP2R.js';
|
|
5
|
+
import './chunk-7GTI3PPI.js';
|
|
6
|
+
import { resolveToken } from './chunk-IIS7INHF.js';
|
|
7
|
+
import './chunk-FUFMVW7O.js';
|
|
8
|
+
import './chunk-7P6PLZ4B.js';
|
|
9
|
+
import './chunk-PROCA7K7.js';
|
|
10
|
+
import { Button } from './chunk-IXAYNBOY.js';
|
|
11
|
+
import { X, ChevronsRight, ChevronsLeft } from './chunk-RQVK4IYC.js';
|
|
12
|
+
import './chunk-KR7NXXHC.js';
|
|
13
|
+
import './chunk-SWQFYNYG.js';
|
|
14
|
+
import './chunk-3W27OLK5.js';
|
|
15
|
+
import './chunk-MODE4QIA.js';
|
|
16
|
+
import './chunk-WETKNYZX.js';
|
|
17
|
+
import { cn } from './chunk-LXLIQ2D6.js';
|
|
18
|
+
import './chunk-G3PMV62Z.js';
|
|
11
19
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
12
20
|
import { useRef, useCallback, useMemo, useEffect } from 'react';
|
|
13
21
|
import { Decoration, GutterMarker, EditorView, gutterLineClass } from '@codemirror/view';
|
|
@@ -109,8 +117,8 @@ var createDiffHighlightExtension = () => StateField.define({
|
|
|
109
117
|
});
|
|
110
118
|
var DARK_LINE_ALPHA = "29";
|
|
111
119
|
var DARK_GUTTER_ALPHA = "47";
|
|
112
|
-
var buildDiffHighlightTheme = () => {
|
|
113
|
-
const dark =
|
|
120
|
+
var buildDiffHighlightTheme = (scheme) => {
|
|
121
|
+
const dark = scheme === "dark";
|
|
114
122
|
const line = (hue, pastel) => dark ? `${hue}${DARK_LINE_ALPHA}` : pastel;
|
|
115
123
|
const gutter = (hue, pastel) => dark ? `${hue}${DARK_GUTTER_ALPHA}` : pastel;
|
|
116
124
|
const safeNumber = dark ? colors.green[300] : colors.green[900];
|
|
@@ -153,8 +161,8 @@ var MergePane = ({
|
|
|
153
161
|
}) => {
|
|
154
162
|
const editorRef = useRef(null);
|
|
155
163
|
const handleChange = useStableCallback((next) => onChange?.(next));
|
|
156
|
-
const themeExtension = useThemedExtension(`merge-pane:${deleted}`, () => {
|
|
157
|
-
const dark =
|
|
164
|
+
const themeExtension = useThemedExtension(`merge-pane:${deleted}`, (scheme) => {
|
|
165
|
+
const dark = scheme === "dark";
|
|
158
166
|
const deletedSurface = dark ? `${colors.error[500]}1f` : colors.error[100];
|
|
159
167
|
const deletedGutter = dark ? `${colors.error[500]}3d` : colors.error[200];
|
|
160
168
|
const deletedGutterText = dark ? colors.error[300] : colors.error[700];
|
package/dist/editors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/MergeEditor/AcceptControls/AcceptButton.tsx","../src/components/MergeEditor/AcceptControls/AcceptControls.tsx","../src/components/MergeEditor/decorations.ts","../src/components/MergeEditor/MergePane.tsx","../src/components/MergeEditor/useScrollSync.ts","../src/components/MergeEditor/MergeEditor.tsx"],"names":["jsx","colors","EditorView","jsxs","useRef","useCallback","EMPTY_LINES","EMPTY_CLASSIFICATION"],"mappings":"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","file":"editors.js","sourcesContent":["import { ChevronsLeft, ChevronsRight } from '../../../icons';\nimport { Button } from '../../Button';\n\ntype Props = {\n side: 'left' | 'right';\n onAccept: () => void;\n};\n\nexport const AcceptButton = ({ side, onAccept }: Props) => {\n const label = `Accept ${side === 'left' ? 'production' : 'branch'} version`;\n const Chevron = side === 'left' ? ChevronsRight : ChevronsLeft;\n return (\n <Button onClick={onAccept} variant=\"outline\" size=\"icon-sm\" title={label} aria-label={label}>\n <Chevron className=\"tw:size-5\" />\n </Button>\n );\n};\n","import type { RefCallback } from 'react';\n\nimport { X } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Button } from '../../Button';\nimport { LINE_HEIGHT_PX, type MergeConflict, PANE_HEADER_HEIGHT_PX } from '../constants';\n\nimport { AcceptButton } from './AcceptButton';\n\ntype Props = {\n conflicts: MergeConflict[];\n side: 'left' | 'right';\n onAccept: (conflict: MergeConflict) => void;\n onDismiss?: (conflict: MergeConflict) => void;\n contentRef?: RefCallback<HTMLDivElement>;\n};\n\n// 28px column when there are conflicts to render — wide enough to fit the\n// 24px icon-xs accept chevron + dismiss icon without overflowing into the\n// adjacent panes (which use `tw:overflow-hidden` and would clip absolutely-\n// positioned children that crossed the boundary). Collapses to 0 when idle\n// so empty merges don't reserve a sliver of layout. Inner wrapper allows\n// horizontal overflow so the icon buttons' focus-visible ring stays visible\n// past the column edge. Buttons stay aligned with their source-pane chunk\n// via the parent's `translateY(-scrollTop)` follower applied to `contentRef`.\nexport const AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }: Props) => (\n <div\n className={cn(\n 'tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center',\n conflicts.length > 0 ? 'tw:w-7' : 'tw:w-0',\n )}\n >\n {conflicts.length > 0 && (\n <>\n <div className=\"tw:shrink-0\" style={{ height: `${PANE_HEADER_HEIGHT_PX}px` }} />\n <div className=\"tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible\">\n <div ref={contentRef} className=\"tw:relative tw:size-full\">\n {conflicts.map((conflict) => {\n const topLine = side === 'left' ? conflict.oldStartLine : conflict.newStartLine;\n const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;\n\n return (\n <div\n key={conflict.id}\n className=\"tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5\"\n style={{ top: `${topOffset}px` }}\n >\n <AcceptButton side={side} onAccept={() => onAccept(conflict)} />\n {onDismiss && (\n <Button\n onClick={() => onDismiss(conflict)}\n variant=\"outline\"\n size=\"icon-sm\"\n title=\"Dismiss\"\n aria-label={`Dismiss ${side === 'left' ? 'production' : 'branch'} change`}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n </div>\n);\n","import {\n type Extension,\n RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n gutterLineClass,\n GutterMarker,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { isDarkScheme } from '../CodeEditor/tokenTheme';\n\nimport type { ChangeClassification } from './constants';\nimport { CHANGE_CLASS } from './constants';\n\ntype HighlightPayload = {\n lines: Set<number>;\n classification: Map<number, ChangeClassification>;\n};\n\nconst setHighlightedLines = StateEffect.define<HighlightPayload>();\n\nconst safeDecoration = Decoration.line({ class: 'cm-merge-safe-line' });\nconst conflictDecoration = Decoration.line({ class: 'cm-merge-conflict-line' });\n\nclass SafeGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-safe-gutter';\n}\n\nclass ConflictGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-conflict-gutter';\n}\n\nconst safeGutterMarker = new SafeGutterMarker();\nconst conflictGutterMarker = new ConflictGutterMarker();\n\ntype FieldValue = {\n decorations: DecorationSet;\n gutterMarkers: RangeSet<GutterMarker>;\n};\n\nexport const createDiffHighlightExtension = (): Extension =>\n StateField.define<FieldValue>({\n create: () => ({ decorations: Decoration.none, gutterMarkers: RangeSet.empty }),\n update(value, tr) {\n // Use the last effect if multiple are dispatched in a single transaction\n let payload: HighlightPayload | null = null;\n for (const effect of tr.effects) {\n if (effect.is(setHighlightedLines)) {\n payload = effect.value;\n }\n }\n\n if (!payload) {\n return {\n decorations: value.decorations.map(tr.changes),\n gutterMarkers: value.gutterMarkers.map(tr.changes),\n };\n }\n\n const decoBuilder = new RangeSetBuilder<Decoration>();\n const gutterBuilder = new RangeSetBuilder<GutterMarker>();\n const doc = tr.state.doc;\n const { lines, classification } = payload;\n\n // Iterate the (typically small) highlighted set instead of all doc lines.\n // RangeSetBuilder requires positions in order, so sort first.\n const sorted = [...lines].filter((l) => l >= 1 && l <= doc.lines).sort((a, b) => a - b);\n for (const i of sorted) {\n const cls = classification.get(i);\n if (!cls) continue;\n\n const isSafe = cls === CHANGE_CLASS.SAFE;\n const line = doc.line(i);\n decoBuilder.add(line.from, line.from, isSafe ? safeDecoration : conflictDecoration);\n gutterBuilder.add(line.from, line.from, isSafe ? safeGutterMarker : conflictGutterMarker);\n }\n\n return {\n decorations: decoBuilder.finish(),\n gutterMarkers: gutterBuilder.finish(),\n };\n },\n provide: (f) => [\n EditorView.decorations.from(f, (val) => val.decorations),\n gutterLineClass.from(f, (val: FieldValue) => val.gutterMarkers),\n ],\n });\n\n// Alpha suffixes for the dark-scheme tints — the line fill stays subtle enough\n// for the `foreground` text to read, the gutter sits a step stronger so the\n// scan-lane is still obvious next to it.\nconst DARK_LINE_ALPHA = '29'; /* 16% */\nconst DARK_GUTTER_ALPHA = '47'; /* 28% */\n\n/**\n * The highlight palette, split out of the StateField above so it can be built\n * through `useThemedExtension` — the field instance must stay stable across a\n * scheme change (a fresh one would drop the current highlights), the colours\n * must not.\n *\n * `!important` overrides CodeMirror's built-in active-line and selection\n * backgrounds. SAFE = change present on one side only (green). CONFLICT = both\n * sides edited this region (amber/warning — NOT red, since red reads as\n * \"deletion\" and the 3-pane editor only ever displays additions in each side\n * pane). The colored left border doubles as a scan-lane so changes are easy to\n * spot when zoomed out.\n *\n * Light mode paints an opaque pastel wash. Dark mode tints the same hue at low\n * alpha over the pane's token-driven surface instead — the pastel is opaque, so\n * it put the dark scheme's near-white line text and grey line numbers on a\n * light slab.\n */\nexport const buildDiffHighlightTheme = (): Extension => {\n const dark = isDarkScheme();\n const line = (hue: string, pastel: string) => (dark ? `${hue}${DARK_LINE_ALPHA}` : pastel);\n const gutter = (hue: string, pastel: string) => (dark ? `${hue}${DARK_GUTTER_ALPHA}` : pastel);\n\n // Line *content* keeps the pane's `foreground`, which clears AA on either\n // fill. The gutter's line numbers do not: `muted-foreground` on the tinted\n // gutter is 3.96:1 in light and 2.82:1 in dark, so the marker carries a\n // hue-matched number colour instead (≥6:1 in both).\n const safeNumber = dark ? colors.green[300] : colors.green[900];\n const conflictNumber = dark ? colors.warning[300] : colors.warning[800];\n\n return EditorView.theme({\n '.cm-merge-safe-line': {\n backgroundColor: `${line(colors.green[500], colors.green[100])} !important`,\n boxShadow: `inset 3px 0 0 ${colors.green[500]}`,\n },\n '.cm-merge-conflict-line': {\n backgroundColor: `${line(colors.warning[500], colors.warning[100])} !important`,\n boxShadow: `inset 3px 0 0 ${colors.warning[500]}`,\n },\n '.cm-merge-safe-gutter': {\n backgroundColor: `${gutter(colors.green[500], colors.green[200])} !important`,\n color: safeNumber,\n },\n '.cm-merge-conflict-gutter': {\n backgroundColor: `${gutter(colors.warning[500], colors.warning[200])} !important`,\n color: conflictNumber,\n },\n });\n};\n\nexport const updateHighlightedLines = (\n view: EditorView,\n lines: Set<number>,\n classification: Map<number, ChangeClassification>,\n) => {\n view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });\n};\n","import { type ReactNode, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror, { type ReactCodeMirrorRef } from '@uiw/react-codemirror';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { buildBasicSetup } from '../CodeEditor/helpers';\nimport { isDarkScheme, resolveToken, useThemedExtension } from '../CodeEditor/tokenTheme';\n\nimport { type ChangeClassification, LINE_HEIGHT_PX } from './constants';\nimport {\n buildDiffHighlightTheme,\n createDiffHighlightExtension,\n updateHighlightedLines,\n} from './decorations';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n value: string;\n highlightedLines: Set<number>;\n lineClassification: Map<number, ChangeClassification>;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n header?: ReactNode;\n headerClassName?: string;\n className?: string;\n onScrollDOMReady?: (el: HTMLElement | null) => void;\n /**\n * When true, the pane renders with the error palette to signal the side has\n * been deleted upstream. The CodeMirror editor is still mounted so the diff\n * remains visible — only the background, gutter, header, and border switch.\n */\n deleted?: boolean;\n};\n\nexport const MergePane = ({\n value,\n highlightedLines,\n lineClassification,\n readOnly = false,\n onChange,\n header,\n headerClassName,\n className,\n onScrollDOMReady,\n deleted = false,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Non-deleted pane chrome re-resolves its `--*` tokens on brand /\n // light-dark change. The deleted pane keeps the categorical error wash\n // (deletion is meaning-encoding, not chrome) — but the wash itself is a\n // light/dark pair: the opaque light-red slab left the dark scheme's\n // near-white text unreadable, so dark tints the same hue at low alpha over\n // the page instead and pins the token text colour on top of it.\n const themeExtension = useThemedExtension(`merge-pane:${deleted}`, () => {\n const dark = isDarkScheme();\n const deletedSurface = dark ? `${colors.error[500]}1f` : colors.error[100];\n const deletedGutter = dark ? `${colors.error[500]}3d` : colors.error[200];\n // CodeMirror's stock line-number grey is only 3.46:1 on the light wash, so\n // the deleted gutter carries a hue-matched number colour of its own.\n const deletedGutterText = dark ? colors.error[300] : colors.error[700];\n\n return EditorView.theme({\n '&.cm-editor': {\n height: '100%',\n backgroundColor: deleted ? deletedSurface : resolveToken('background', '249 250 251'),\n // Pair the token-driven surface with a token-driven text color so line\n // content stays readable when the pane's `--background` goes dark.\n color: resolveToken('foreground', '30 41 59'),\n outline: 'none',\n },\n '.cm-gutters': {\n backgroundColor: deleted ? deletedGutter : resolveToken('muted', '241 245 249'),\n color: deleted ? deletedGutterText : resolveToken('muted-foreground', '100 116 139'),\n },\n '*': { lineHeight: `${LINE_HEIGHT_PX}px` },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0 0 25px' },\n });\n });\n\n // Memoized independently of the theme so its `StateField` instance stays\n // stable when the editor reconfigures on brand / light-dark change. A fresh\n // extension would re-init the field and drop the current highlights.\n const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);\n\n // Its palette, by contrast, *must* rebuild on scheme change — see\n // `buildDiffHighlightTheme`.\n const diffHighlightTheme = useThemedExtension('merge-diff-highlight', buildDiffHighlightTheme);\n\n // Two of a merge view's three panes are read-only.\n const basicSetup = useMemo(\n () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),\n [readOnly],\n );\n\n const extensions = useMemo(\n (): Extension[] => [\n diffHighlightExtension,\n diffHighlightTheme,\n themeExtension,\n // Recalc viewport after every doc change so late-settling layouts (alerts\n // appearing above the editor) don't leave trailing lines blank.\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n requestAnimationFrame(() => update.view.dispatch({}));\n }\n }),\n ],\n [diffHighlightExtension, diffHighlightTheme, themeExtension],\n );\n\n // A deleted side is a file-level conflict, not a line-level one — suppress\n // per-line markers so the pane wears only the red wash. `deleted` stays in\n // the dep list so highlights switch between the empty and populated sets when\n // the side toggles.\n useEffect(() => {\n const view = editorRef.current?.view;\n if (!view) return;\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n }, [highlightedLines, lineClassification, deleted]);\n\n const handleCreateEditor = useCallback(\n (view: EditorView) => {\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n onScrollDOMReady?.(view.scrollDOM);\n },\n [highlightedLines, lineClassification, onScrollDOMReady, deleted],\n );\n\n useEffect(() => {\n return () => onScrollDOMReady?.(null);\n }, [onScrollDOMReady]);\n\n // Re-measure on wrapper resize — parent dimensions settle after CM mounts\n // (fullscreen modal, alerts appearing above the editor).\n useEffect(() => {\n const view = editorRef.current?.view;\n const wrapper = view?.dom.parentElement;\n if (!view || !wrapper) return;\n\n const observer = new ResizeObserver(() => view.dispatch({}));\n observer.observe(wrapper);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <div\n className={cn(\n 'tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden',\n className,\n deleted && 'tw:border-error-300 tw:[[data-theme=dark]_&]:border-error-500/50',\n )}\n >\n {header && (\n <div\n className={cn(\n 'tw:px-4 tw:py-3',\n // Same light/dark split as the editor wash below — `PaneHeader` pins\n // `text-foreground`, which goes near-white and vanishes on the\n // opaque light-red band.\n deleted\n ? 'tw:border-b tw:border-error-200 tw:bg-error-100 tw:[[data-theme=dark]_&]:border-error-500/30 tw:[[data-theme=dark]_&]:bg-error-500/15'\n : 'tw:bg-background',\n headerClassName,\n )}\n >\n {header}\n </div>\n )}\n <div className=\"tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full\">\n <CodeMirror\n ref={editorRef}\n height=\"100%\"\n value={value}\n onChange={handleChange}\n extensions={extensions}\n readOnly={readOnly}\n onCreateEditor={handleCreateEditor}\n basicSetup={basicSetup}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useRef } from 'react';\n\nexport const useScrollSync = () => {\n const scrollersRef = useRef<(HTMLElement | null)[]>([]);\n const followersRef = useRef<Map<string, { paneIndex: number; el: HTMLElement }>>(new Map());\n const isSyncingRef = useRef(false);\n const scrollerCallbacksRef = useRef<Map<number, (el: HTMLElement | null) => void>>(new Map());\n const followerCallbacksRef = useRef<Map<string, (el: HTMLElement | null) => void>>(new Map());\n\n const updateFollowers = useCallback(() => {\n for (const [, { paneIndex, el }] of followersRef.current) {\n const scroller = scrollersRef.current[paneIndex];\n if (!scroller) continue;\n el.style.transform = `translateY(-${scroller.scrollTop}px)`;\n }\n }, []);\n\n const handleScroll = useCallback(\n (e: Event) => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n\n // Px-aligned sync. All panes share LINE_HEIGHT_PX, so matching scrollTop is the same\n // as matching the line at the top of the viewport. Previous ratio-based sync drifted\n // badly when pane heights differed (e.g. 50 lines vs 500 — half-scrolling left snapped\n // right to its midpoint, not to the equivalent line). Clamp to each target's max so\n // the source can scroll past where shorter panes bottom out without errors.\n const sourceScrollTop = (e.target as HTMLElement).scrollTop;\n\n for (const scroller of scrollersRef.current) {\n if (!scroller || scroller === e.target) continue;\n const targetMax = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n scroller.scrollTop = Math.min(sourceScrollTop, targetMax);\n }\n\n updateFollowers();\n isSyncingRef.current = false;\n },\n [updateFollowers],\n );\n\n const registerScroller = useCallback(\n (index: number) => {\n const existing = scrollerCallbacksRef.current.get(index);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n const prev = scrollersRef.current[index];\n if (prev === el) return;\n\n prev?.removeEventListener('scroll', handleScroll);\n scrollersRef.current[index] = el;\n el?.addEventListener('scroll', handleScroll, { passive: true });\n };\n\n scrollerCallbacksRef.current.set(index, callback);\n return callback;\n },\n [handleScroll],\n );\n\n const registerFollower = useCallback((paneIndex: number, key: string) => {\n const existing = followerCallbacksRef.current.get(key);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n if (el) {\n followersRef.current.set(key, { paneIndex, el });\n } else {\n followersRef.current.delete(key);\n }\n };\n\n followerCallbacksRef.current.set(key, callback);\n return callback;\n }, []);\n\n return { registerScroller, registerFollower };\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { AcceptControls } from './AcceptControls/AcceptControls';\nimport type { ChangeClassification, MergeConflict } from './constants';\nimport { MergePane } from './MergePane';\nimport { useScrollSync } from './useScrollSync';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n mergeValue: string;\n handleMergeChange: (value: string) => void;\n leftText: string;\n rightText: string;\n leftConflicts: MergeConflict[];\n rightConflicts: MergeConflict[];\n leftHighlightedLines: Set<number>;\n rightHighlightedLines: Set<number>;\n leftClassification: Map<number, ChangeClassification>;\n rightClassification: Map<number, ChangeClassification>;\n mergeHighlightedLines: Set<number>;\n mergeClassification: Map<number, ChangeClassification>;\n acceptLeft: (conflict: MergeConflict) => void;\n acceptRight: (conflict: MergeConflict) => void;\n dismissLeft: (conflict: MergeConflict) => void;\n dismissRight: (conflict: MergeConflict) => void;\n leftHeader?: ReactNode;\n middleHeader?: ReactNode;\n middleHeaderClassName?: string;\n middleClassName?: string;\n rightHeader?: ReactNode;\n className?: string;\n /**\n * Paint the corresponding read-only pane with the error palette to signal the\n * side has been deleted upstream. The diff is still rendered so the user can\n * see what was lost; accept/dismiss controls for that side are suppressed.\n */\n leftDeleted?: boolean;\n rightDeleted?: boolean;\n};\n\nexport const MergeEditor = ({\n mergeValue,\n handleMergeChange,\n leftText,\n rightText,\n leftConflicts,\n rightConflicts,\n leftHighlightedLines,\n rightHighlightedLines,\n leftClassification,\n rightClassification,\n mergeHighlightedLines,\n mergeClassification,\n acceptLeft,\n acceptRight,\n dismissLeft,\n dismissRight,\n leftHeader,\n middleHeader,\n middleHeaderClassName,\n middleClassName,\n rightHeader,\n className,\n leftDeleted = false,\n rightDeleted = false,\n}: Props) => {\n const { registerScroller, registerFollower } = useScrollSync();\n\n // When either side is deleted the merge is a binary \"keep or drop the file\"\n // choice, not a line-level merge — suppress per-line markers in the middle\n // pane so the indicator/markers don't contradict the red deleted pane.\n const anySideDeleted = leftDeleted || rightDeleted;\n\n return (\n <div\n className={cn(\n 'tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3',\n className,\n )}\n >\n <MergePane\n value={leftText}\n highlightedLines={leftHighlightedLines}\n lineClassification={leftClassification}\n readOnly\n header={leftHeader}\n className=\"tw:rounded-r-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(0)}\n deleted={leftDeleted}\n />\n\n <AcceptControls\n conflicts={leftDeleted ? [] : leftConflicts}\n side=\"left\"\n onAccept={acceptLeft}\n onDismiss={dismissLeft}\n contentRef={registerFollower(0, 'left-controls')}\n />\n\n <MergePane\n value={mergeValue}\n highlightedLines={anySideDeleted ? EMPTY_LINES : mergeHighlightedLines}\n lineClassification={anySideDeleted ? EMPTY_CLASSIFICATION : mergeClassification}\n onChange={handleMergeChange}\n header={middleHeader}\n headerClassName={middleHeaderClassName}\n className={cn('tw:border tw:border-border tw:rounded-lg', middleClassName)}\n onScrollDOMReady={registerScroller(1)}\n />\n\n <AcceptControls\n conflicts={rightDeleted ? [] : rightConflicts}\n side=\"right\"\n onAccept={acceptRight}\n onDismiss={dismissRight}\n contentRef={registerFollower(2, 'right-controls')}\n />\n\n <MergePane\n value={rightText}\n highlightedLines={rightHighlightedLines}\n lineClassification={rightClassification}\n readOnly\n header={rightHeader}\n className=\"tw:rounded-l-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(2)}\n deleted={rightDeleted}\n />\n </div>\n );\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/MergeEditor/AcceptControls/AcceptButton.tsx","../src/components/MergeEditor/AcceptControls/AcceptControls.tsx","../src/components/MergeEditor/decorations.ts","../src/components/MergeEditor/MergePane.tsx","../src/components/MergeEditor/useScrollSync.ts","../src/components/MergeEditor/MergeEditor.tsx"],"names":["jsx","colors","EditorView","jsxs","useRef","useCallback","EMPTY_LINES","EMPTY_CLASSIFICATION"],"mappings":"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","file":"editors.js","sourcesContent":["import { ChevronsLeft, ChevronsRight } from '../../../icons';\nimport { Button } from '../../Button';\n\ntype Props = {\n side: 'left' | 'right';\n onAccept: () => void;\n};\n\nexport const AcceptButton = ({ side, onAccept }: Props) => {\n const label = `Accept ${side === 'left' ? 'production' : 'branch'} version`;\n const Chevron = side === 'left' ? ChevronsRight : ChevronsLeft;\n return (\n <Button onClick={onAccept} variant=\"outline\" size=\"icon-sm\" title={label} aria-label={label}>\n <Chevron className=\"tw:size-5\" />\n </Button>\n );\n};\n","import type { RefCallback } from 'react';\n\nimport { X } from '../../../icons';\nimport { cn } from '../../../utils';\nimport { Button } from '../../Button';\nimport { LINE_HEIGHT_PX, type MergeConflict, PANE_HEADER_HEIGHT_PX } from '../constants';\n\nimport { AcceptButton } from './AcceptButton';\n\ntype Props = {\n conflicts: MergeConflict[];\n side: 'left' | 'right';\n onAccept: (conflict: MergeConflict) => void;\n onDismiss?: (conflict: MergeConflict) => void;\n contentRef?: RefCallback<HTMLDivElement>;\n};\n\n// 28px column when there are conflicts to render — wide enough to fit the\n// 24px icon-xs accept chevron + dismiss icon without overflowing into the\n// adjacent panes (which use `tw:overflow-hidden` and would clip absolutely-\n// positioned children that crossed the boundary). Collapses to 0 when idle\n// so empty merges don't reserve a sliver of layout. Inner wrapper allows\n// horizontal overflow so the icon buttons' focus-visible ring stays visible\n// past the column edge. Buttons stay aligned with their source-pane chunk\n// via the parent's `translateY(-scrollTop)` follower applied to `contentRef`.\nexport const AcceptControls = ({ conflicts, side, onAccept, onDismiss, contentRef }: Props) => (\n <div\n className={cn(\n 'tw:z-10 tw:flex tw:shrink-0 tw:flex-col tw:items-center',\n conflicts.length > 0 ? 'tw:w-7' : 'tw:w-0',\n )}\n >\n {conflicts.length > 0 && (\n <>\n <div className=\"tw:shrink-0\" style={{ height: `${PANE_HEADER_HEIGHT_PX}px` }} />\n <div className=\"tw:relative tw:w-full tw:flex-1 tw:overflow-y-clip tw:overflow-x-visible\">\n <div ref={contentRef} className=\"tw:relative tw:size-full\">\n {conflicts.map((conflict) => {\n const topLine = side === 'left' ? conflict.oldStartLine : conflict.newStartLine;\n const topOffset = (topLine - 1) * LINE_HEIGHT_PX - 2;\n\n return (\n <div\n key={conflict.id}\n className=\"tw:absolute tw:inset-x-0 tw:flex tw:flex-col tw:items-center tw:gap-0.5\"\n style={{ top: `${topOffset}px` }}\n >\n <AcceptButton side={side} onAccept={() => onAccept(conflict)} />\n {onDismiss && (\n <Button\n onClick={() => onDismiss(conflict)}\n variant=\"outline\"\n size=\"icon-sm\"\n title=\"Dismiss\"\n aria-label={`Dismiss ${side === 'left' ? 'production' : 'branch'} change`}\n >\n <X className=\"tw:size-4\" />\n </Button>\n )}\n </div>\n );\n })}\n </div>\n </div>\n </>\n )}\n </div>\n);\n","import {\n type Extension,\n RangeSet,\n RangeSetBuilder,\n StateEffect,\n StateField,\n} from '@codemirror/state';\nimport {\n Decoration,\n type DecorationSet,\n EditorView,\n gutterLineClass,\n GutterMarker,\n} from '@codemirror/view';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport type { ResolvedColorScheme } from '../ThemeProvider/types';\n\nimport type { ChangeClassification } from './constants';\nimport { CHANGE_CLASS } from './constants';\n\ntype HighlightPayload = {\n lines: Set<number>;\n classification: Map<number, ChangeClassification>;\n};\n\nconst setHighlightedLines = StateEffect.define<HighlightPayload>();\n\nconst safeDecoration = Decoration.line({ class: 'cm-merge-safe-line' });\nconst conflictDecoration = Decoration.line({ class: 'cm-merge-conflict-line' });\n\nclass SafeGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-safe-gutter';\n}\n\nclass ConflictGutterMarker extends GutterMarker {\n override elementClass = 'cm-merge-conflict-gutter';\n}\n\nconst safeGutterMarker = new SafeGutterMarker();\nconst conflictGutterMarker = new ConflictGutterMarker();\n\ntype FieldValue = {\n decorations: DecorationSet;\n gutterMarkers: RangeSet<GutterMarker>;\n};\n\nexport const createDiffHighlightExtension = (): Extension =>\n StateField.define<FieldValue>({\n create: () => ({ decorations: Decoration.none, gutterMarkers: RangeSet.empty }),\n update(value, tr) {\n // Use the last effect if multiple are dispatched in a single transaction\n let payload: HighlightPayload | null = null;\n for (const effect of tr.effects) {\n if (effect.is(setHighlightedLines)) {\n payload = effect.value;\n }\n }\n\n if (!payload) {\n return {\n decorations: value.decorations.map(tr.changes),\n gutterMarkers: value.gutterMarkers.map(tr.changes),\n };\n }\n\n const decoBuilder = new RangeSetBuilder<Decoration>();\n const gutterBuilder = new RangeSetBuilder<GutterMarker>();\n const doc = tr.state.doc;\n const { lines, classification } = payload;\n\n // Iterate the (typically small) highlighted set instead of all doc lines.\n // RangeSetBuilder requires positions in order, so sort first.\n const sorted = [...lines].filter((l) => l >= 1 && l <= doc.lines).sort((a, b) => a - b);\n for (const i of sorted) {\n const cls = classification.get(i);\n if (!cls) continue;\n\n const isSafe = cls === CHANGE_CLASS.SAFE;\n const line = doc.line(i);\n decoBuilder.add(line.from, line.from, isSafe ? safeDecoration : conflictDecoration);\n gutterBuilder.add(line.from, line.from, isSafe ? safeGutterMarker : conflictGutterMarker);\n }\n\n return {\n decorations: decoBuilder.finish(),\n gutterMarkers: gutterBuilder.finish(),\n };\n },\n provide: (f) => [\n EditorView.decorations.from(f, (val) => val.decorations),\n gutterLineClass.from(f, (val: FieldValue) => val.gutterMarkers),\n ],\n });\n\n// Alpha suffixes for the dark-scheme tints — the line fill stays subtle enough\n// for the `foreground` text to read, the gutter sits a step stronger so the\n// scan-lane is still obvious next to it.\nconst DARK_LINE_ALPHA = '29'; /* 16% */\nconst DARK_GUTTER_ALPHA = '47'; /* 28% */\n\n/**\n * The highlight palette, split out of the StateField above so it can be built\n * through `useThemedExtension` — the field instance must stay stable across a\n * scheme change (a fresh one would drop the current highlights), the colours\n * must not.\n *\n * `!important` overrides CodeMirror's built-in active-line and selection\n * backgrounds. SAFE = change present on one side only (green). CONFLICT = both\n * sides edited this region (amber/warning — NOT red, since red reads as\n * \"deletion\" and the 3-pane editor only ever displays additions in each side\n * pane). The colored left border doubles as a scan-lane so changes are easy to\n * spot when zoomed out.\n *\n * Light mode paints an opaque pastel wash. Dark mode tints the same hue at low\n * alpha over the pane's token-driven surface instead — the pastel is opaque, so\n * it put the dark scheme's near-white line text and grey line numbers on a\n * light slab.\n *\n * A pure function of `scheme`, which `useThemedExtension` passes from the same\n * read that produced its cache key.\n */\nexport const buildDiffHighlightTheme = (scheme: ResolvedColorScheme): Extension => {\n const dark = scheme === 'dark';\n const line = (hue: string, pastel: string) => (dark ? `${hue}${DARK_LINE_ALPHA}` : pastel);\n const gutter = (hue: string, pastel: string) => (dark ? `${hue}${DARK_GUTTER_ALPHA}` : pastel);\n\n // Line *content* keeps the pane's `foreground`, which clears AA on either\n // fill. The gutter's line numbers do not: `muted-foreground` on the tinted\n // gutter is 3.96:1 in light and 2.82:1 in dark, so the marker carries a\n // hue-matched number colour instead (≥6:1 in both).\n const safeNumber = dark ? colors.green[300] : colors.green[900];\n const conflictNumber = dark ? colors.warning[300] : colors.warning[800];\n\n return EditorView.theme({\n '.cm-merge-safe-line': {\n backgroundColor: `${line(colors.green[500], colors.green[100])} !important`,\n boxShadow: `inset 3px 0 0 ${colors.green[500]}`,\n },\n '.cm-merge-conflict-line': {\n backgroundColor: `${line(colors.warning[500], colors.warning[100])} !important`,\n boxShadow: `inset 3px 0 0 ${colors.warning[500]}`,\n },\n '.cm-merge-safe-gutter': {\n backgroundColor: `${gutter(colors.green[500], colors.green[200])} !important`,\n color: safeNumber,\n },\n '.cm-merge-conflict-gutter': {\n backgroundColor: `${gutter(colors.warning[500], colors.warning[200])} !important`,\n color: conflictNumber,\n },\n });\n};\n\nexport const updateHighlightedLines = (\n view: EditorView,\n lines: Set<number>,\n classification: Map<number, ChangeClassification>,\n) => {\n view.dispatch({ effects: setHighlightedLines.of({ lines, classification }) });\n};\n","import { type ReactNode, useCallback, useEffect, useMemo, useRef } from 'react';\nimport { type Extension } from '@codemirror/state';\nimport { EditorView } from '@codemirror/view';\nimport CodeMirror, { type ReactCodeMirrorRef } from '@uiw/react-codemirror';\n\nimport colors from '@keboola/tailwind-config/colors';\n\nimport { useStableCallback } from '../../hooks/useStableCallback';\nimport { cn } from '../../utils';\nimport { resolveToken } from '../../utils/themeTokens';\nimport { buildBasicSetup } from '../CodeEditor/helpers';\nimport { useThemedExtension } from '../CodeEditor/tokenTheme';\n\nimport { type ChangeClassification, LINE_HEIGHT_PX } from './constants';\nimport {\n buildDiffHighlightTheme,\n createDiffHighlightExtension,\n updateHighlightedLines,\n} from './decorations';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n value: string;\n highlightedLines: Set<number>;\n lineClassification: Map<number, ChangeClassification>;\n readOnly?: boolean;\n onChange?: (value: string) => void;\n header?: ReactNode;\n headerClassName?: string;\n className?: string;\n onScrollDOMReady?: (el: HTMLElement | null) => void;\n /**\n * When true, the pane renders with the error palette to signal the side has\n * been deleted upstream. The CodeMirror editor is still mounted so the diff\n * remains visible — only the background, gutter, header, and border switch.\n */\n deleted?: boolean;\n};\n\nexport const MergePane = ({\n value,\n highlightedLines,\n lineClassification,\n readOnly = false,\n onChange,\n header,\n headerClassName,\n className,\n onScrollDOMReady,\n deleted = false,\n}: Props) => {\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n const handleChange = useStableCallback((next: string) => onChange?.(next));\n\n // Non-deleted pane chrome re-resolves its `--*` tokens on brand /\n // light-dark change. The deleted pane keeps the categorical error wash\n // (deletion is meaning-encoding, not chrome) — but the wash itself is a\n // light/dark pair: the opaque light-red slab left the dark scheme's\n // near-white text unreadable, so dark tints the same hue at low alpha over\n // the page instead and pins the token text colour on top of it.\n const themeExtension = useThemedExtension(`merge-pane:${deleted}`, (scheme) => {\n const dark = scheme === 'dark';\n const deletedSurface = dark ? `${colors.error[500]}1f` : colors.error[100];\n const deletedGutter = dark ? `${colors.error[500]}3d` : colors.error[200];\n // CodeMirror's stock line-number grey is only 3.46:1 on the light wash, so\n // the deleted gutter carries a hue-matched number colour of its own.\n const deletedGutterText = dark ? colors.error[300] : colors.error[700];\n\n return EditorView.theme({\n '&.cm-editor': {\n height: '100%',\n backgroundColor: deleted ? deletedSurface : resolveToken('background', '249 250 251'),\n // Pair the token-driven surface with a token-driven text color so line\n // content stays readable when the pane's `--background` goes dark.\n color: resolveToken('foreground', '30 41 59'),\n outline: 'none',\n },\n '.cm-gutters': {\n backgroundColor: deleted ? deletedGutter : resolveToken('muted', '241 245 249'),\n color: deleted ? deletedGutterText : resolveToken('muted-foreground', '100 116 139'),\n },\n '*': { lineHeight: `${LINE_HEIGHT_PX}px` },\n '.cm-lineNumbers .cm-gutterElement': { padding: '0 0 0 25px' },\n });\n });\n\n // Memoized independently of the theme so its `StateField` instance stays\n // stable when the editor reconfigures on brand / light-dark change. A fresh\n // extension would re-init the field and drop the current highlights.\n const diffHighlightExtension = useMemo(() => createDiffHighlightExtension(), []);\n\n // Its palette, by contrast, *must* rebuild on scheme change — see\n // `buildDiffHighlightTheme`.\n const diffHighlightTheme = useThemedExtension('merge-diff-highlight', buildDiffHighlightTheme);\n\n // Two of a merge view's three panes are read-only.\n const basicSetup = useMemo(\n () => ({ ...buildBasicSetup(readOnly), lineNumbers: true }),\n [readOnly],\n );\n\n const extensions = useMemo(\n (): Extension[] => [\n diffHighlightExtension,\n diffHighlightTheme,\n themeExtension,\n // Recalc viewport after every doc change so late-settling layouts (alerts\n // appearing above the editor) don't leave trailing lines blank.\n EditorView.updateListener.of((update) => {\n if (update.docChanged) {\n requestAnimationFrame(() => update.view.dispatch({}));\n }\n }),\n ],\n [diffHighlightExtension, diffHighlightTheme, themeExtension],\n );\n\n // A deleted side is a file-level conflict, not a line-level one — suppress\n // per-line markers so the pane wears only the red wash. `deleted` stays in\n // the dep list so highlights switch between the empty and populated sets when\n // the side toggles.\n useEffect(() => {\n const view = editorRef.current?.view;\n if (!view) return;\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n }, [highlightedLines, lineClassification, deleted]);\n\n const handleCreateEditor = useCallback(\n (view: EditorView) => {\n updateHighlightedLines(\n view,\n deleted ? EMPTY_LINES : highlightedLines,\n deleted ? EMPTY_CLASSIFICATION : lineClassification,\n );\n onScrollDOMReady?.(view.scrollDOM);\n },\n [highlightedLines, lineClassification, onScrollDOMReady, deleted],\n );\n\n useEffect(() => {\n return () => onScrollDOMReady?.(null);\n }, [onScrollDOMReady]);\n\n // Re-measure on wrapper resize — parent dimensions settle after CM mounts\n // (fullscreen modal, alerts appearing above the editor).\n useEffect(() => {\n const view = editorRef.current?.view;\n const wrapper = view?.dom.parentElement;\n if (!view || !wrapper) return;\n\n const observer = new ResizeObserver(() => view.dispatch({}));\n observer.observe(wrapper);\n\n return () => observer.disconnect();\n }, []);\n\n return (\n <div\n className={cn(\n 'tw:flex tw:min-w-0 tw:flex-1 tw:flex-col tw:overflow-hidden',\n className,\n deleted && 'tw:border-error-300 tw:[[data-theme=dark]_&]:border-error-500/50',\n )}\n >\n {header && (\n <div\n className={cn(\n 'tw:px-4 tw:py-3',\n // Same light/dark split as the editor wash below — `PaneHeader` pins\n // `text-foreground`, which goes near-white and vanishes on the\n // opaque light-red band.\n deleted\n ? 'tw:border-b tw:border-error-200 tw:bg-error-100 tw:[[data-theme=dark]_&]:border-error-500/30 tw:[[data-theme=dark]_&]:bg-error-500/15'\n : 'tw:bg-background',\n headerClassName,\n )}\n >\n {header}\n </div>\n )}\n <div className=\"tw:flex tw:h-0 tw:flex-1 tw:flex-col tw:[&_>div]:h-full\">\n <CodeMirror\n ref={editorRef}\n height=\"100%\"\n value={value}\n onChange={handleChange}\n extensions={extensions}\n readOnly={readOnly}\n onCreateEditor={handleCreateEditor}\n basicSetup={basicSetup}\n />\n </div>\n </div>\n );\n};\n","import { useCallback, useRef } from 'react';\n\nexport const useScrollSync = () => {\n const scrollersRef = useRef<(HTMLElement | null)[]>([]);\n const followersRef = useRef<Map<string, { paneIndex: number; el: HTMLElement }>>(new Map());\n const isSyncingRef = useRef(false);\n const scrollerCallbacksRef = useRef<Map<number, (el: HTMLElement | null) => void>>(new Map());\n const followerCallbacksRef = useRef<Map<string, (el: HTMLElement | null) => void>>(new Map());\n\n const updateFollowers = useCallback(() => {\n for (const [, { paneIndex, el }] of followersRef.current) {\n const scroller = scrollersRef.current[paneIndex];\n if (!scroller) continue;\n el.style.transform = `translateY(-${scroller.scrollTop}px)`;\n }\n }, []);\n\n const handleScroll = useCallback(\n (e: Event) => {\n if (isSyncingRef.current) return;\n isSyncingRef.current = true;\n\n // Px-aligned sync. All panes share LINE_HEIGHT_PX, so matching scrollTop is the same\n // as matching the line at the top of the viewport. Previous ratio-based sync drifted\n // badly when pane heights differed (e.g. 50 lines vs 500 — half-scrolling left snapped\n // right to its midpoint, not to the equivalent line). Clamp to each target's max so\n // the source can scroll past where shorter panes bottom out without errors.\n const sourceScrollTop = (e.target as HTMLElement).scrollTop;\n\n for (const scroller of scrollersRef.current) {\n if (!scroller || scroller === e.target) continue;\n const targetMax = Math.max(0, scroller.scrollHeight - scroller.clientHeight);\n scroller.scrollTop = Math.min(sourceScrollTop, targetMax);\n }\n\n updateFollowers();\n isSyncingRef.current = false;\n },\n [updateFollowers],\n );\n\n const registerScroller = useCallback(\n (index: number) => {\n const existing = scrollerCallbacksRef.current.get(index);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n const prev = scrollersRef.current[index];\n if (prev === el) return;\n\n prev?.removeEventListener('scroll', handleScroll);\n scrollersRef.current[index] = el;\n el?.addEventListener('scroll', handleScroll, { passive: true });\n };\n\n scrollerCallbacksRef.current.set(index, callback);\n return callback;\n },\n [handleScroll],\n );\n\n const registerFollower = useCallback((paneIndex: number, key: string) => {\n const existing = followerCallbacksRef.current.get(key);\n if (existing) return existing;\n\n const callback = (el: HTMLElement | null) => {\n if (el) {\n followersRef.current.set(key, { paneIndex, el });\n } else {\n followersRef.current.delete(key);\n }\n };\n\n followerCallbacksRef.current.set(key, callback);\n return callback;\n }, []);\n\n return { registerScroller, registerFollower };\n};\n","import type { ReactNode } from 'react';\n\nimport { cn } from '../../utils';\n\nimport { AcceptControls } from './AcceptControls/AcceptControls';\nimport type { ChangeClassification, MergeConflict } from './constants';\nimport { MergePane } from './MergePane';\nimport { useScrollSync } from './useScrollSync';\n\nconst EMPTY_LINES: Set<number> = new Set();\nconst EMPTY_CLASSIFICATION: Map<number, ChangeClassification> = new Map();\n\ntype Props = {\n mergeValue: string;\n handleMergeChange: (value: string) => void;\n leftText: string;\n rightText: string;\n leftConflicts: MergeConflict[];\n rightConflicts: MergeConflict[];\n leftHighlightedLines: Set<number>;\n rightHighlightedLines: Set<number>;\n leftClassification: Map<number, ChangeClassification>;\n rightClassification: Map<number, ChangeClassification>;\n mergeHighlightedLines: Set<number>;\n mergeClassification: Map<number, ChangeClassification>;\n acceptLeft: (conflict: MergeConflict) => void;\n acceptRight: (conflict: MergeConflict) => void;\n dismissLeft: (conflict: MergeConflict) => void;\n dismissRight: (conflict: MergeConflict) => void;\n leftHeader?: ReactNode;\n middleHeader?: ReactNode;\n middleHeaderClassName?: string;\n middleClassName?: string;\n rightHeader?: ReactNode;\n className?: string;\n /**\n * Paint the corresponding read-only pane with the error palette to signal the\n * side has been deleted upstream. The diff is still rendered so the user can\n * see what was lost; accept/dismiss controls for that side are suppressed.\n */\n leftDeleted?: boolean;\n rightDeleted?: boolean;\n};\n\nexport const MergeEditor = ({\n mergeValue,\n handleMergeChange,\n leftText,\n rightText,\n leftConflicts,\n rightConflicts,\n leftHighlightedLines,\n rightHighlightedLines,\n leftClassification,\n rightClassification,\n mergeHighlightedLines,\n mergeClassification,\n acceptLeft,\n acceptRight,\n dismissLeft,\n dismissRight,\n leftHeader,\n middleHeader,\n middleHeaderClassName,\n middleClassName,\n rightHeader,\n className,\n leftDeleted = false,\n rightDeleted = false,\n}: Props) => {\n const { registerScroller, registerFollower } = useScrollSync();\n\n // When either side is deleted the merge is a binary \"keep or drop the file\"\n // choice, not a line-level merge — suppress per-line markers in the middle\n // pane so the indicator/markers don't contradict the red deleted pane.\n const anySideDeleted = leftDeleted || rightDeleted;\n\n return (\n <div\n className={cn(\n 'tw:flex tw:h-full tw:min-h-0 tw:overflow-hidden tw:bg-background tw:gap-3',\n className,\n )}\n >\n <MergePane\n value={leftText}\n highlightedLines={leftHighlightedLines}\n lineClassification={leftClassification}\n readOnly\n header={leftHeader}\n className=\"tw:rounded-r-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(0)}\n deleted={leftDeleted}\n />\n\n <AcceptControls\n conflicts={leftDeleted ? [] : leftConflicts}\n side=\"left\"\n onAccept={acceptLeft}\n onDismiss={dismissLeft}\n contentRef={registerFollower(0, 'left-controls')}\n />\n\n <MergePane\n value={mergeValue}\n highlightedLines={anySideDeleted ? EMPTY_LINES : mergeHighlightedLines}\n lineClassification={anySideDeleted ? EMPTY_CLASSIFICATION : mergeClassification}\n onChange={handleMergeChange}\n header={middleHeader}\n headerClassName={middleHeaderClassName}\n className={cn('tw:border tw:border-border tw:rounded-lg', middleClassName)}\n onScrollDOMReady={registerScroller(1)}\n />\n\n <AcceptControls\n conflicts={rightDeleted ? [] : rightConflicts}\n side=\"right\"\n onAccept={acceptRight}\n onDismiss={dismissRight}\n contentRef={registerFollower(2, 'right-controls')}\n />\n\n <MergePane\n value={rightText}\n highlightedLines={rightHighlightedLines}\n lineClassification={rightClassification}\n readOnly\n header={rightHeader}\n className=\"tw:rounded-l-lg tw:border tw:border-border\"\n onScrollDOMReady={registerScroller(2)}\n deleted={rightDeleted}\n />\n </div>\n );\n};\n"]}
|