@leavepulse/ui 0.77.2 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
- package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
- package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
- package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
- package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
- package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
- package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
- package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
- package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
- package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
- package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
- package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
- package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
- package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
- package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
- package/dist/chunks/{LpAddressInput-sYMvYzcY.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
- package/dist/chunks/{LpAutocomplete-DOu7FN5P.js → LpAutocomplete-DkY6CSyD.js} +26 -42
- package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
- package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
- package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
- package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
- package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
- package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
- package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
- package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
- package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
- package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
- package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
- package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
- package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
- package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
- package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
- package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
- package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
- package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
- package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
- package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
- package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
- package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
- package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
- package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
- package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
- package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
- package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
- package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
- package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
- package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
- package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
- package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
- package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
- package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
- package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
- package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
- package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
- package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
- package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
- package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
- package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
- package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
- package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
- package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
- package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
- package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
- package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
- package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
- package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
- package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
- package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
- package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
- package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
- package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
- package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
- package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
- package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
- package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
- package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
- package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
- package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
- package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
- package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
- package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
- package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
- package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
- package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
- package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
- package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
- package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
- package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
- package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
- package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AppShellContextNav.vue.d.ts +13 -0
- package/dist/components/AppShellContextNav.vue.js +4 -0
- package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
- package/dist/components/ChartRangeSelector.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.js +1 -1
- package/dist/components/IconCloseButton.vue.d.ts +7 -0
- package/dist/components/IconCloseButton.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +110 -2
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBottomNav.vue.d.ts +5 -0
- package/dist/components/LpBottomNav.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +14 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +74 -2
- package/dist/components/LpChart.vue.js +326 -85
- package/dist/components/LpCheckbox.vue.d.ts +6 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.js +1 -1
- package/dist/components/LpCollapse.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +8 -0
- package/dist/components/LpCommandPalette.vue.js +107 -56
- package/dist/components/LpCommandScope.vue.js +1 -1
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpContextSwitcher.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpDataList.vue.d.ts +1 -1
- package/dist/components/LpDataList.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +3 -15
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.js +21 -18
- package/dist/components/LpDrawer.vue.d.ts +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +14 -11
- package/dist/components/LpEditable.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.d.ts +96 -6
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.js +1 -1
- package/dist/components/LpGauge.vue.d.ts +1 -1
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +2 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +7 -6
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +1 -1
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpInspector.vue.d.ts +87 -0
- package/dist/components/LpInspector.vue.js +4 -0
- package/dist/components/LpLightbox.vue.d.ts +8 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +1 -1
- package/dist/components/LpLoader.vue.js +1 -1
- package/dist/components/LpLogInspector.vue.d.ts +18 -0
- package/dist/components/LpLogInspector.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.d.ts +93 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +4 -2
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +5 -5
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +2 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPaletteTheme.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +2 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +4 -0
- package/dist/components/LpPipeline.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +7 -3
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +1 -1
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.js +1 -1
- package/dist/components/LpRepeater.vue.js +1 -1
- package/dist/components/LpRevealOnScroll.vue.js +1 -1
- package/dist/components/LpScramble.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSecretField.vue.js +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.js +1 -1
- package/dist/components/LpShift.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.d.ts +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -1
- package/dist/components/LpSpotlight.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.js +1 -1
- package/dist/components/LpStepMark.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTabFace.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +132 -0
- package/dist/components/LpTable.vue.js +547 -135
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +6 -5
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +2 -0
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.js +1 -1
- package/dist/components/LpTypewriter.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/LpWindow.vue.d.ts +99 -0
- package/dist/components/LpWindow.vue.js +4 -0
- package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
- package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.js +1 -1
- package/dist/components/PickerField.vue.d.ts +2 -2
- package/dist/components/PickerField.vue.js +1 -1
- package/dist/components/RevealToggle.vue.js +1 -1
- package/dist/components/SliderRail.vue.d.ts +3 -0
- package/dist/components/SliderRail.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/address.js +2 -1
- package/dist/components/appShell.d.ts +36 -0
- package/dist/components/appShell.js +30 -0
- package/dist/components/calendar.d.ts +12 -3
- package/dist/components/calendar.js +2 -5
- package/dist/components/chart.d.ts +21 -0
- package/dist/components/chart.js +4 -3
- package/dist/components/chartWindow.d.ts +57 -0
- package/dist/components/chartWindow.js +136 -0
- package/dist/components/color.js +1 -1
- package/dist/components/commandPalette.d.ts +16 -2
- package/dist/components/commandPalette.js +39 -4
- package/dist/components/controlSize.d.ts +5 -0
- package/dist/components/controlSize.js +8 -0
- package/dist/components/dropdown.d.ts +5 -0
- package/dist/components/dropdown.js +2 -0
- package/dist/components/exportData.d.ts +6 -1
- package/dist/components/exportData.js +25 -18
- package/dist/components/fileTree.d.ts +67 -0
- package/dist/components/fileTree.js +141 -1
- package/dist/components/identicon.js +3 -2
- package/dist/components/logTools.d.ts +93 -0
- package/dist/components/logTools.js +210 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.js +2 -1
- package/dist/components/pipeline.d.ts +2 -0
- package/dist/components/pipeline.js +5 -0
- package/dist/components/relativeTime.js +2 -1
- package/dist/components/reveal.js +2 -1
- package/dist/components/select.d.ts +5 -0
- package/dist/components/select.js +10 -0
- package/dist/components/sidebar.d.ts +1 -0
- package/dist/components/tableFeatures.d.ts +58 -0
- package/dist/components/tableFeatures.js +87 -0
- package/dist/components/topologyGraph.d.ts +164 -0
- package/dist/components/topologyGraph.js +416 -0
- package/dist/components/tour.js +5 -3
- package/dist/components/videoBackdrop.js +7 -6
- package/dist/composables/clamp.d.ts +2 -0
- package/dist/composables/clamp.js +4 -0
- package/dist/composables/devWarn.d.ts +3 -0
- package/dist/composables/devWarn.js +14 -0
- package/dist/composables/easing.d.ts +13 -4
- package/dist/composables/easing.js +16 -10
- package/dist/composables/overlayHistory.js +14 -1
- package/dist/composables/pointerDrag.d.ts +15 -0
- package/dist/composables/pointerDrag.js +40 -0
- package/dist/composables/propCheck.d.ts +10 -0
- package/dist/composables/propCheck.js +78 -0
- package/dist/composables/realm.d.ts +6 -0
- package/dist/composables/realm.js +23 -0
- package/dist/composables/scroll.js +4 -2
- package/dist/composables/scrollMemory.d.ts +12 -1
- package/dist/composables/scrollMemory.js +36 -12
- package/dist/composables/spatialNav.js +2 -1
- package/dist/composables/textEntry.d.ts +17 -0
- package/dist/composables/textEntry.js +19 -0
- package/dist/composables/useAsyncTask.d.ts +6 -0
- package/dist/composables/useChartSync.d.ts +5 -0
- package/dist/composables/useChartSync.js +33 -0
- package/dist/composables/useCloseGuard.d.ts +3 -1
- package/dist/composables/useCloseGuard.js +6 -3
- package/dist/composables/useCommands.d.ts +50 -0
- package/dist/composables/useCommands.js +66 -0
- package/dist/composables/useField.d.ts +37 -0
- package/dist/composables/useField.js +27 -2
- package/dist/composables/useFitScale.js +4 -1
- package/dist/composables/useFormDraft.d.ts +13 -2
- package/dist/composables/useFormDraft.js +17 -9
- package/dist/composables/useHintSystem.js +2 -2
- package/dist/composables/useHotkeys.js +11 -32
- package/dist/composables/useInView.js +2 -1
- package/dist/composables/useInputFilter.js +7 -5
- package/dist/composables/useInputMask.js +5 -3
- package/dist/composables/useLinkedView.d.ts +97 -0
- package/dist/composables/useLinkedView.js +139 -0
- package/dist/composables/useOptimisticToggle.d.ts +3 -1
- package/dist/composables/useOptimisticToggle.js +2 -1
- package/dist/composables/useOverlayHistory.d.ts +7 -0
- package/dist/composables/useOverlayHistory.js +16 -2
- package/dist/composables/usePaintSelect.js +18 -14
- package/dist/composables/usePaletteCommands.d.ts +7 -0
- package/dist/composables/usePaletteCommands.js +12 -1
- package/dist/composables/usePersisted.d.ts +10 -0
- package/dist/composables/usePersisted.js +1 -1
- package/dist/composables/usePillTransition.d.ts +2 -2
- package/dist/composables/usePillTransition.js +5 -5
- package/dist/composables/useResizeObserver.js +2 -1
- package/dist/composables/useReveal.js +2 -1
- package/dist/composables/useRovingFocus.d.ts +2 -2
- package/dist/composables/useRovingFocus.js +9 -11
- package/dist/composables/useScramble.js +7 -1
- package/dist/composables/useShift.js +8 -6
- package/dist/composables/useTilt.js +2 -1
- package/dist/composables/useTween.js +9 -5
- package/dist/composables/useView.d.ts +1 -0
- package/dist/composables/useView.js +14 -2
- package/dist/composables/useZoomPan.js +2 -4
- package/dist/composables/windowing.d.ts +40 -0
- package/dist/composables/windowing.js +118 -0
- package/dist/icons-all.js +1 -1
- package/dist/icons.d.ts +4 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.js +310 -264
- package/dist/layout/tree.js +19 -15
- package/dist/layout/useLayout.d.ts +2 -0
- package/dist/layout/useLayout.js +5 -1
- package/dist/layout/useWorkspaces.d.ts +52 -0
- package/dist/layout/useWorkspaces.js +140 -0
- package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
- package/dist/theme/config.js +25 -0
- package/dist/theme/define.js +61 -0
- package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
- package/dist/theme/presets.js +239 -0
- package/dist/theme/studio.js +134 -0
- package/dist/theme/tokens.js +63 -0
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.js +325 -0
- package/package.json +8 -1
- package/src/component-names.ts +5 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/IconCloseButton.vue +21 -0
- package/src/components/LayoutCanvas.vue +3 -0
- package/src/components/LayoutNode.vue +37 -38
- package/src/components/LpActivityLine.vue +4 -2
- package/src/components/LpAddressInput.vue +3 -3
- package/src/components/LpAppShell.vue +362 -24
- package/src/components/LpAutocomplete.vue +18 -30
- package/src/components/LpBottomNav.vue +9 -1
- package/src/components/LpBreadcrumbs.vue +2 -1
- package/src/components/LpButton.vue +11 -4
- package/src/components/LpChart.vue +336 -37
- package/src/components/LpCheckbox.vue +43 -9
- package/src/components/LpCodeBlock.vue +17 -23
- package/src/components/LpCollapse.vue +5 -4
- package/src/components/LpColorPicker.vue +8 -9
- package/src/components/LpCommandPalette.vue +133 -50
- package/src/components/LpContextMenu.vue +15 -13
- package/src/components/LpCountdown.vue +2 -1
- package/src/components/LpDataList.vue +13 -1
- package/src/components/LpDatePicker.vue +5 -17
- package/src/components/LpDateRangePicker.vue +5 -16
- package/src/components/LpDock.vue +25 -16
- package/src/components/LpDrawer.vue +70 -61
- package/src/components/LpDropdownMenu.vue +6 -10
- package/src/components/LpDropzone.vue +12 -7
- package/src/components/LpEditable.vue +6 -2
- package/src/components/LpFileTree.vue +507 -66
- package/src/components/LpFileTreeNode.vue +106 -5
- package/src/components/LpFormField.vue +1 -1
- package/src/components/LpFrame.vue +33 -13
- package/src/components/LpHoverCard.vue +30 -5
- package/src/components/LpIcon.vue +6 -2
- package/src/components/LpIdenticon.vue +2 -1
- package/src/components/LpImageEditor.vue +5 -2
- package/src/components/LpInput.vue +15 -23
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLightbox.vue +74 -29
- package/src/components/LpLogInspector.vue +85 -0
- package/src/components/LpLogViewer.vue +239 -29
- package/src/components/LpMapPicker.vue +2 -1
- package/src/components/LpMasonry.vue +8 -5
- package/src/components/LpModal.vue +12 -12
- package/src/components/LpModalNav.vue +2 -21
- package/src/components/LpNumberField.vue +6 -15
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPagination.vue +5 -3
- package/src/components/LpPhoneInput.vue +8 -19
- package/src/components/LpPie.vue +25 -23
- package/src/components/LpPipeline.vue +14 -1
- package/src/components/LpPopover.vue +23 -2
- package/src/components/LpProgress.vue +2 -1
- package/src/components/LpRadioGroup.vue +2 -2
- package/src/components/LpRangeSlider.vue +5 -6
- package/src/components/LpRevealOnScroll.vue +1 -1
- package/src/components/LpScrollArea.vue +28 -11
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpShaderBackdrop.vue +12 -9
- package/src/components/LpShift.vue +18 -15
- package/src/components/LpSidebar.vue +77 -74
- package/src/components/LpSidebarNav.vue +3 -2
- package/src/components/LpSidebarRow.vue +2 -1
- package/src/components/LpSlider.vue +5 -6
- package/src/components/LpSpotlight.vue +2 -1
- package/src/components/LpSwitch.vue +5 -3
- package/src/components/LpTable.vue +609 -93
- package/src/components/LpTableFilter.vue +1 -1
- package/src/components/LpTableOfContents.vue +16 -9
- package/src/components/LpTabs.vue +2 -1
- package/src/components/LpTagsInput.vue +12 -19
- package/src/components/LpTextarea.vue +5 -11
- package/src/components/LpThemeProvider.vue +29 -13
- package/src/components/LpTimeField.vue +4 -7
- package/src/components/LpToaster.vue +7 -6
- package/src/components/LpTooltip.vue +62 -18
- package/src/components/LpTopologyCanvas.vue +567 -42
- package/src/components/LpTour.vue +7 -5
- package/src/components/LpTruncate.vue +4 -3
- package/src/components/LpTypewriter.vue +2 -1
- package/src/components/LpVideoBackdrop.vue +11 -13
- package/src/components/LpWindow.vue +373 -0
- package/src/components/LpWorkspaceSwitcher.vue +116 -0
- package/src/components/PickerField.vue +2 -2
- package/src/components/SliderRail.vue +10 -0
- package/src/components/address.ts +3 -1
- package/src/components/appShell.ts +74 -0
- package/src/components/calendar.ts +12 -5
- package/src/components/chart.ts +27 -3
- package/src/components/chartWindow.ts +198 -0
- package/src/components/color.ts +2 -1
- package/src/components/commandPalette.ts +66 -5
- package/src/components/controlSize.ts +6 -0
- package/src/components/dropdown.ts +3 -0
- package/src/components/exportData.ts +33 -18
- package/src/components/fileTree.ts +215 -0
- package/src/components/identicon.ts +4 -2
- package/src/components/logTools.ts +298 -0
- package/src/components/meter.ts +2 -1
- package/src/components/pipeline.ts +6 -0
- package/src/components/relativeTime.ts +2 -1
- package/src/components/reveal.ts +3 -1
- package/src/components/select.ts +14 -0
- package/src/components/sidebar.ts +1 -0
- package/src/components/tableFeatures.ts +149 -0
- package/src/components/topologyGraph.ts +655 -0
- package/src/components/tour.ts +5 -3
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/clamp.ts +2 -0
- package/src/composables/devWarn.ts +19 -0
- package/src/composables/easing.ts +37 -12
- package/src/composables/overlayHistory.ts +24 -0
- package/src/composables/pointerDrag.ts +54 -0
- package/src/composables/propCheck.ts +90 -0
- package/src/composables/realm.ts +25 -0
- package/src/composables/scroll.ts +4 -2
- package/src/composables/scrollMemory.ts +56 -14
- package/src/composables/spatialNav.ts +2 -1
- package/src/composables/textEntry.ts +33 -0
- package/src/composables/useAsyncTask.ts +6 -0
- package/src/composables/useChartSync.ts +52 -0
- package/src/composables/useCloseGuard.ts +22 -10
- package/src/composables/useCommands.ts +123 -0
- package/src/composables/useField.ts +41 -2
- package/src/composables/useFitScale.ts +4 -1
- package/src/composables/useFormDraft.ts +38 -14
- package/src/composables/useHintSystem.ts +2 -2
- package/src/composables/useHotkeys.ts +19 -48
- package/src/composables/useInView.ts +2 -1
- package/src/composables/useInputFilter.ts +8 -5
- package/src/composables/useInputMask.ts +8 -3
- package/src/composables/useLinkedView.ts +222 -0
- package/src/composables/useOptimisticToggle.ts +7 -1
- package/src/composables/useOverlayHistory.ts +20 -0
- package/src/composables/usePaintSelect.ts +20 -14
- package/src/composables/usePaletteCommands.ts +13 -0
- package/src/composables/usePersisted.ts +10 -0
- package/src/composables/usePillTransition.ts +9 -6
- package/src/composables/useResizeObserver.ts +2 -1
- package/src/composables/useReveal.ts +2 -1
- package/src/composables/useRovingFocus.ts +11 -14
- package/src/composables/useScramble.ts +12 -1
- package/src/composables/useShift.ts +8 -6
- package/src/composables/useTilt.ts +2 -1
- package/src/composables/useTween.ts +10 -5
- package/src/composables/useView.ts +17 -3
- package/src/composables/useZoomPan.ts +2 -5
- package/src/composables/windowing.ts +190 -0
- package/src/icons.ts +27 -6
- package/src/index.ts +41 -4
- package/src/kit-icons.ts +1 -1
- package/src/layout/tree.ts +31 -16
- package/src/layout/useLayout.ts +6 -0
- package/src/layout/useWorkspaces.ts +234 -0
- package/src/nuxt.ts +9 -1
- package/src/runtime/propCheck.plugin.ts +10 -0
- package/src/theme/studio.ts +7 -5
- package/src/theme/useTheme.ts +89 -15
- package/src/tokens/tokens.css +8 -1
- package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
- package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
- package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
- package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
- package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
const NAV_BREAKPOINT_PX = { sm: 640, md: 768, lg: 1024, xl: 1280, "2xl": 1536 };
|
|
2
|
+
const DENSITY_CLASS = {
|
|
3
|
+
comfortable: "px-4 py-6 md:px-6",
|
|
4
|
+
compact: "px-2 py-3 md:px-3",
|
|
5
|
+
auto: "px-2 py-3 sm:px-4 sm:py-4 md:px-6 md:py-6"
|
|
6
|
+
};
|
|
7
|
+
function resolveNavMode(atLeast, options) {
|
|
8
|
+
if (!atLeast(options.mobileBreakpoint)) return options.bottomNav ? "bottom" : "drawer";
|
|
9
|
+
return options.compactBelow && !atLeast(options.compactBelow) ? "compact" : "rail";
|
|
10
|
+
}
|
|
11
|
+
const SHELL_HEADER_PX = 64;
|
|
12
|
+
const SCROLL_SLOP_PX = 8;
|
|
13
|
+
function headerCollapsedAfter(collapsed, from, to, maxTop, slop = SCROLL_SLOP_PX) {
|
|
14
|
+
if (to <= SHELL_HEADER_PX) return false;
|
|
15
|
+
if (to >= maxTop - SHELL_HEADER_PX) return collapsed;
|
|
16
|
+
if (to - from > slop) return true;
|
|
17
|
+
if (from - to > slop) return false;
|
|
18
|
+
return collapsed;
|
|
19
|
+
}
|
|
20
|
+
function contextNavItems(items, isActive) {
|
|
21
|
+
return items.find((item) => item.children?.length && (isActive(item) || item.children.some(isActive)))?.children ?? [];
|
|
22
|
+
}
|
|
23
|
+
export {
|
|
24
|
+
DENSITY_CLASS,
|
|
25
|
+
NAV_BREAKPOINT_PX,
|
|
26
|
+
SHELL_HEADER_PX,
|
|
27
|
+
contextNavItems,
|
|
28
|
+
headerCollapsedAfter,
|
|
29
|
+
resolveNavMode
|
|
30
|
+
};
|
|
@@ -9,12 +9,21 @@ export declare const CALENDAR_NAV = "flex size-8 items-center justify-center rou
|
|
|
9
9
|
/** The field a picker shows before it opens. */
|
|
10
10
|
export declare const PICKER_TRIGGER = "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-left text-ink outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:border-brand disabled:cursor-not-allowed disabled:opacity-55";
|
|
11
11
|
export declare const PICKER_SIZE: {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
sm: string;
|
|
13
|
+
md: string;
|
|
14
|
+
lg: string;
|
|
15
15
|
};
|
|
16
16
|
export declare function pickerTone(invalid: boolean): string;
|
|
17
17
|
export declare const PICKER_CLEAR = "absolute top-1/2 right-[calc(0.75rem+15px+0.5rem)] flex -translate-y-1/2 items-center rounded-sm text-muted outline-none transition-colors hover:text-ink focus-visible:ring-2 focus-visible:ring-ring";
|
|
18
18
|
/** Presets: a scrolling row over the calendar on a phone, a column beside it from `sm`. */
|
|
19
19
|
export declare const PICKER_PRESETS = "flex gap-1 overflow-x-auto border-b border-line p-2 sm:flex-col sm:overflow-visible sm:border-r sm:border-b-0";
|
|
20
20
|
export declare const PICKER_PRESET = "shrink-0 rounded-control px-2.5 py-1.5 text-left text-sm whitespace-nowrap text-muted outline-none transition-colors duration-[var(--duration-fast)] hover:bg-surface-soft hover:text-ink focus-visible:ring-2 focus-visible:ring-ring disabled:pointer-events-none disabled:opacity-40 aria-pressed:bg-brand-soft aria-pressed:text-ink";
|
|
21
|
+
/** The props the two pickers share. */
|
|
22
|
+
export interface PickerFieldProps {
|
|
23
|
+
clearable?: boolean;
|
|
24
|
+
disabled?: boolean;
|
|
25
|
+
invalid?: boolean;
|
|
26
|
+
size?: "sm" | "md" | "lg";
|
|
27
|
+
/** Locale of the shown date and the calendar; defaults to reka's ConfigProvider, then the browser. */
|
|
28
|
+
locale?: string;
|
|
29
|
+
}
|
|
@@ -1,12 +1,9 @@
|
|
|
1
|
+
import { CONTROL_SIZE } from "./controlSize.js";
|
|
1
2
|
const CALENDAR_LABELS = { previous: "Previous month", next: "Next month" };
|
|
2
3
|
const CALENDAR_FRAME = "inline-block rounded-card border border-line bg-surface-raised p-3";
|
|
3
4
|
const CALENDAR_NAV = "flex size-8 items-center justify-center rounded-control text-muted outline-none transition-[color,background-color,scale] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] hover:bg-surface-soft hover:text-ink active:scale-90 motion-reduce:active:scale-100 focus-visible:ring-2 focus-visible:ring-ring";
|
|
4
5
|
const PICKER_TRIGGER = "group flex w-full items-center gap-2 rounded-control border bg-surface-soft px-3 text-left text-ink outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-ring data-[state=open]:border-brand disabled:cursor-not-allowed disabled:opacity-55";
|
|
5
|
-
const PICKER_SIZE =
|
|
6
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
7
|
-
md: "h-(--size-control-md) text-sm",
|
|
8
|
-
lg: "h-(--size-control-lg) text-sm"
|
|
9
|
-
};
|
|
6
|
+
const PICKER_SIZE = CONTROL_SIZE;
|
|
10
7
|
function pickerTone(invalid) {
|
|
11
8
|
return invalid ? "border-danger focus-visible:ring-danger-soft" : "border-line focus-visible:border-brand";
|
|
12
9
|
}
|
|
@@ -52,6 +52,27 @@ export interface ChartMarker {
|
|
|
52
52
|
label?: string;
|
|
53
53
|
color?: string;
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* A stretch of the x axis: a maintenance window, an incident, off hours. `from`
|
|
57
|
+
* and `to` are point indices or x labels. Drawn under the data.
|
|
58
|
+
*/
|
|
59
|
+
export interface ChartBand {
|
|
60
|
+
from: number | string;
|
|
61
|
+
to: number | string;
|
|
62
|
+
label?: string;
|
|
63
|
+
color?: string;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* A note pinned to one reading. `at` is a point index or an x label; `value`
|
|
67
|
+
* places it on the y axis and defaults to the first visible series there.
|
|
68
|
+
*/
|
|
69
|
+
export interface ChartAnnotation {
|
|
70
|
+
at: number | string;
|
|
71
|
+
value?: number;
|
|
72
|
+
label: string;
|
|
73
|
+
color?: string;
|
|
74
|
+
axis?: ChartAxis;
|
|
75
|
+
}
|
|
55
76
|
/**
|
|
56
77
|
* Which x labels to print with every `stride`-th one shown. The last point is
|
|
57
78
|
* always labelled (it is usually "now"), and when it lands within half a
|
package/dist/components/chart.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
import { compactNumber } from "./format.js";
|
|
2
3
|
function xLabelIndices(count, stride) {
|
|
3
4
|
if (count <= 0) return [];
|
|
@@ -142,8 +143,8 @@ const smoothSegment = (pts, tension) => {
|
|
|
142
143
|
let c2y = p2.y - (p3.y - p1.y) / 6 * tension;
|
|
143
144
|
const lo = Math.min(p1.y, p2.y);
|
|
144
145
|
const hi = Math.max(p1.y, p2.y);
|
|
145
|
-
c1y =
|
|
146
|
-
c2y =
|
|
146
|
+
c1y = clamp(c1y, lo, hi);
|
|
147
|
+
c2y = clamp(c2y, lo, hi);
|
|
147
148
|
d += `C${c1x},${c1y} ${c2x},${c2y} ${p2.x},${p2.y}`;
|
|
148
149
|
}
|
|
149
150
|
return d;
|
|
@@ -159,7 +160,7 @@ const segmentPath = (idx, values, s, smooth) => {
|
|
|
159
160
|
};
|
|
160
161
|
const linePath = (values, s, smooth) => runs(values, s.count).map((idx) => segmentPath(idx, values, s, smooth)).join(" ");
|
|
161
162
|
const areaPath = (values, s, smooth) => {
|
|
162
|
-
const base = yAt(
|
|
163
|
+
const base = yAt(clamp(0, s.min, s.max), s.min, s.max, s.box);
|
|
163
164
|
return runs(values, s.count).map((idx) => {
|
|
164
165
|
const d = segmentPath(idx, values, s, smooth);
|
|
165
166
|
const x0 = xAt(idx[0], s.count, s.box, s.banded);
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/** A window into the data: indices of its first and last point, both included. */
|
|
2
|
+
export interface ChartRange {
|
|
3
|
+
start: number;
|
|
4
|
+
end: number;
|
|
5
|
+
}
|
|
6
|
+
/** How a series longer than the plot is thinned. */
|
|
7
|
+
export type ChartDownsample = "minmax" | "lttb";
|
|
8
|
+
/** What the chart draws: per series values, each slot traced back to its source. */
|
|
9
|
+
export interface ChartView {
|
|
10
|
+
values: (number | null)[][];
|
|
11
|
+
start: number;
|
|
12
|
+
end: number;
|
|
13
|
+
/** Source index of every slot; null while the slots are contiguous from `start`. */
|
|
14
|
+
indices: number[] | null;
|
|
15
|
+
}
|
|
16
|
+
type Values = (number | null)[];
|
|
17
|
+
export declare const MIN_RANGE_POINTS = 2;
|
|
18
|
+
export declare const ZOOM_STEP = 0.8;
|
|
19
|
+
/**
|
|
20
|
+
* A range fit to the data: in bounds, ordered, at least `MIN_RANGE_POINTS` wide.
|
|
21
|
+
* Null when there is nothing to narrow, so the whole series stays the plain case.
|
|
22
|
+
*/
|
|
23
|
+
export declare function clampRange(range: ChartRange | null | undefined, count: number): ChartRange | null;
|
|
24
|
+
/** The range after a zoom by `factor` (below 1 is in), keeping `anchor` (0–1 across it) in place. */
|
|
25
|
+
export declare function zoomRange(range: ChartRange | null, count: number, anchor: number, factor: number): ChartRange | null;
|
|
26
|
+
/** The range moved by `delta` points, keeping its width at the ends of the data. */
|
|
27
|
+
export declare function panRange(range: ChartRange, count: number, delta: number): ChartRange | null;
|
|
28
|
+
/**
|
|
29
|
+
* Keeps each bucket's lowest and highest reading, per series. Slots stay shared
|
|
30
|
+
* across series, so a bucket is two x positions and each series fills them with
|
|
31
|
+
* its own extremes. A monitoring chart must not lose a one-point spike: thinning
|
|
32
|
+
* by average or by every n-th point does exactly that.
|
|
33
|
+
*/
|
|
34
|
+
export declare function minMaxBuckets(series: Values[], slots: number): {
|
|
35
|
+
values: Values[];
|
|
36
|
+
indices: number[];
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Largest-Triangle-Three-Buckets: the indices of `target` points that keep a
|
|
40
|
+
* line's shape, one a bucket, always with its first and last. It reads better
|
|
41
|
+
* than min/max on a smooth curve and can drop a short spike, so it is the
|
|
42
|
+
* option rather than the default.
|
|
43
|
+
*/
|
|
44
|
+
export declare function lttbIndices(values: Values, target: number): number[];
|
|
45
|
+
/**
|
|
46
|
+
* The series as drawn. Without a range or a thinning it hands the input back, so
|
|
47
|
+
* a chart using neither does no work and draws what it always drew.
|
|
48
|
+
*
|
|
49
|
+
* LTTB picks by the first series that has data and the others follow those
|
|
50
|
+
* points, because slots are shared across series.
|
|
51
|
+
*/
|
|
52
|
+
export declare function chartView(series: Values[], count: number, range: ChartRange | null, mode: ChartDownsample | false | undefined, slots: number): ChartView;
|
|
53
|
+
/** The slot at or before a source index, or -1 when the window does not hold it. */
|
|
54
|
+
export declare function slotOf(view: ChartView, source: number): number;
|
|
55
|
+
/** The source index behind a slot. */
|
|
56
|
+
export declare const sourceOf: (view: ChartView, slot: number) => number;
|
|
57
|
+
export {};
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
2
|
+
const MIN_RANGE_POINTS = 2;
|
|
3
|
+
const SLOTS_PER_BUCKET = 2;
|
|
4
|
+
const LTTB_MIN_TARGET = 3;
|
|
5
|
+
const ZOOM_STEP = 0.8;
|
|
6
|
+
function clampRange(range, count) {
|
|
7
|
+
if (!range || count <= MIN_RANGE_POINTS || !Number.isFinite(range.start) || !Number.isFinite(range.end)) return null;
|
|
8
|
+
const last = count - 1;
|
|
9
|
+
let start = Math.max(0, Math.min(last, Math.round(Math.min(range.start, range.end))));
|
|
10
|
+
let end = Math.max(0, Math.min(last, Math.round(Math.max(range.start, range.end))));
|
|
11
|
+
if (end - start + 1 < MIN_RANGE_POINTS) {
|
|
12
|
+
end = Math.min(last, start + MIN_RANGE_POINTS - 1);
|
|
13
|
+
start = Math.max(0, end - MIN_RANGE_POINTS + 1);
|
|
14
|
+
}
|
|
15
|
+
return start === 0 && end === last ? null : { start, end };
|
|
16
|
+
}
|
|
17
|
+
function zoomRange(range, count, anchor, factor) {
|
|
18
|
+
const from = range ?? { start: 0, end: count - 1 };
|
|
19
|
+
const span = from.end - from.start;
|
|
20
|
+
const next = Math.max(MIN_RANGE_POINTS - 1, span * factor);
|
|
21
|
+
const at = from.start + span * clamp(anchor, 0, 1);
|
|
22
|
+
const start = at - (at - from.start) * (next / (span || 1));
|
|
23
|
+
return clampRange({ start, end: start + next }, count);
|
|
24
|
+
}
|
|
25
|
+
function panRange(range, count, delta) {
|
|
26
|
+
const span = range.end - range.start;
|
|
27
|
+
const start = Math.max(0, Math.min(count - 1 - span, range.start + delta));
|
|
28
|
+
return clampRange({ start, end: start + span }, count);
|
|
29
|
+
}
|
|
30
|
+
function minMaxBuckets(series, slots) {
|
|
31
|
+
const count = series.reduce((n, values2) => Math.max(n, values2.length), 0);
|
|
32
|
+
const buckets = Math.floor(slots / SLOTS_PER_BUCKET);
|
|
33
|
+
if (count === 0 || buckets < 1) return { values: series.map(() => []), indices: [] };
|
|
34
|
+
const indices = [];
|
|
35
|
+
const values = series.map(() => []);
|
|
36
|
+
for (let bucket = 0; bucket < buckets; bucket++) {
|
|
37
|
+
const from = Math.floor(bucket * count / buckets);
|
|
38
|
+
const to = Math.floor((bucket + 1) * count / buckets);
|
|
39
|
+
if (to <= from) continue;
|
|
40
|
+
indices.push(from, Math.max(from, to - 1));
|
|
41
|
+
series.forEach((data, s) => {
|
|
42
|
+
let low = -1;
|
|
43
|
+
let high = -1;
|
|
44
|
+
for (let i = from; i < to && i < data.length; i++) {
|
|
45
|
+
const v = data[i];
|
|
46
|
+
if (v == null) continue;
|
|
47
|
+
if (low < 0 || v < data[low]) low = i;
|
|
48
|
+
if (high < 0 || v > data[high]) high = i;
|
|
49
|
+
}
|
|
50
|
+
if (low < 0) values[s].push(null, null);
|
|
51
|
+
else values[s].push(data[Math.min(low, high)], data[Math.max(low, high)]);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
return { values, indices };
|
|
55
|
+
}
|
|
56
|
+
function lttbIndices(values, target) {
|
|
57
|
+
const present = values.flatMap((v, i) => v == null ? [] : [i]);
|
|
58
|
+
if (target >= present.length || target < LTTB_MIN_TARGET) return present;
|
|
59
|
+
const y = (at) => values[present[at]];
|
|
60
|
+
const x = (at) => present[at];
|
|
61
|
+
const step = (present.length - 2) / (target - 2);
|
|
62
|
+
const kept = [0];
|
|
63
|
+
let previous = 0;
|
|
64
|
+
for (let bucket = 0; bucket < target - 2; bucket++) {
|
|
65
|
+
const from = Math.floor(bucket * step) + 1;
|
|
66
|
+
const to = Math.floor((bucket + 1) * step) + 1;
|
|
67
|
+
const nextEnd = Math.min(present.length, Math.floor((bucket + 2) * step) + 1);
|
|
68
|
+
let meanX = 0;
|
|
69
|
+
let meanY = 0;
|
|
70
|
+
for (let i = to; i < nextEnd; i++) {
|
|
71
|
+
meanX += x(i);
|
|
72
|
+
meanY += y(i);
|
|
73
|
+
}
|
|
74
|
+
const size = Math.max(1, nextEnd - to);
|
|
75
|
+
meanX /= size;
|
|
76
|
+
meanY /= size;
|
|
77
|
+
let best = from;
|
|
78
|
+
let largest = -1;
|
|
79
|
+
for (let i = from; i < to; i++) {
|
|
80
|
+
const area = Math.abs((x(previous) - meanX) * (y(i) - y(previous)) - (x(previous) - x(i)) * (meanY - y(previous)));
|
|
81
|
+
if (area > largest) {
|
|
82
|
+
largest = area;
|
|
83
|
+
best = i;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
kept.push(best);
|
|
87
|
+
previous = best;
|
|
88
|
+
}
|
|
89
|
+
kept.push(present.length - 1);
|
|
90
|
+
return kept.map((at) => present[at]);
|
|
91
|
+
}
|
|
92
|
+
const contiguous = (series, range) => series.map((values) => values.slice(range.start, range.end + 1));
|
|
93
|
+
function chartView(series, count, range, mode, slots) {
|
|
94
|
+
const start = range?.start ?? 0;
|
|
95
|
+
const end = range?.end ?? Math.max(0, count - 1);
|
|
96
|
+
const windowed = range ? contiguous(series, range) : series;
|
|
97
|
+
const shown = end - start + 1;
|
|
98
|
+
if (!mode || slots <= 0 || shown <= slots) return { values: windowed, start, end, indices: null };
|
|
99
|
+
if (mode === "minmax") {
|
|
100
|
+
const { values, indices } = minMaxBuckets(windowed, slots);
|
|
101
|
+
return { values, start, end, indices: indices.map((i) => i + start) };
|
|
102
|
+
}
|
|
103
|
+
const lead = windowed.find((values) => values.some((v) => v != null)) ?? [];
|
|
104
|
+
const picked = lttbIndices(lead, slots);
|
|
105
|
+
return {
|
|
106
|
+
values: windowed.map((values) => picked.map((i) => values[i] ?? null)),
|
|
107
|
+
start,
|
|
108
|
+
end,
|
|
109
|
+
indices: picked.map((i) => i + start)
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
function slotOf(view, source) {
|
|
113
|
+
if (source < view.start || source > view.end) return -1;
|
|
114
|
+
if (!view.indices) return source - view.start;
|
|
115
|
+
let low = 0;
|
|
116
|
+
let high = view.indices.length - 1;
|
|
117
|
+
while (low < high) {
|
|
118
|
+
const middle = Math.ceil((low + high) / 2);
|
|
119
|
+
if (view.indices[middle] <= source) low = middle;
|
|
120
|
+
else high = middle - 1;
|
|
121
|
+
}
|
|
122
|
+
return high < 0 ? -1 : low;
|
|
123
|
+
}
|
|
124
|
+
const sourceOf = (view, slot) => view.indices ? view.indices[slot] ?? -1 : slot + view.start;
|
|
125
|
+
export {
|
|
126
|
+
MIN_RANGE_POINTS,
|
|
127
|
+
ZOOM_STEP,
|
|
128
|
+
chartView,
|
|
129
|
+
clampRange,
|
|
130
|
+
lttbIndices,
|
|
131
|
+
minMaxBuckets,
|
|
132
|
+
panRange,
|
|
133
|
+
slotOf,
|
|
134
|
+
sourceOf,
|
|
135
|
+
zoomRange
|
|
136
|
+
};
|
package/dist/components/color.js
CHANGED
|
@@ -145,14 +145,28 @@ export interface RecentSource {
|
|
|
145
145
|
disabled?: boolean;
|
|
146
146
|
children?: unknown;
|
|
147
147
|
}
|
|
148
|
+
export declare function isSafeHref(href: string): boolean;
|
|
149
|
+
/** The link as it would be pasted elsewhere: absolute, or as given if it cannot be read. */
|
|
150
|
+
export declare function absoluteHref(href: string, base: string): string;
|
|
151
|
+
/** The row that unfolds a group; the NUL keeps it out of any id an app would write. */
|
|
152
|
+
export declare function moreRowId(group: string): string;
|
|
148
153
|
/** Stored history, with anything malformed dropped rather than trusted. */
|
|
149
154
|
export declare function readRecent(stored: unknown): RecentItem[];
|
|
155
|
+
/**
|
|
156
|
+
* What makes a command itself: the same id may live in two modes
|
|
157
|
+
* (`services/restart`, `deploy/restart`). A root command's key is its bare id,
|
|
158
|
+
* so a stored id and a stored entry at the root count as one.
|
|
159
|
+
*/
|
|
160
|
+
export declare function commandKey(id: string, path?: readonly string[]): string;
|
|
161
|
+
export declare function recentKey(item: RecentItem): string;
|
|
150
162
|
/**
|
|
151
163
|
* The history item for a pick. A root pick stays a bare id, the format older
|
|
152
164
|
* versions wrote and still read; anything deeper becomes an entry with only
|
|
153
|
-
* the fields that survive JSON.
|
|
165
|
+
* the fields that survive JSON. So does a `fetched` pick at the root: its id
|
|
166
|
+
* stands for nothing among the root commands, and only an entry reaches
|
|
167
|
+
* `resolveRecent` with what is needed to find it again.
|
|
154
168
|
*/
|
|
155
|
-
export declare function toRecentItem(command: RecentSource, path: readonly string[]): RecentItem;
|
|
169
|
+
export declare function toRecentItem(command: RecentSource, path: readonly string[], fetched?: boolean): RecentItem;
|
|
156
170
|
/** The history with `item` first and any earlier copy of it dropped. */
|
|
157
171
|
export declare function pushRecent(list: readonly RecentItem[], item: RecentItem, keep: number): RecentItem[];
|
|
158
172
|
/**
|
|
@@ -41,20 +41,50 @@ function fallbackRows(items, raw) {
|
|
|
41
41
|
parsed
|
|
42
42
|
).map((command) => ({ command, label: command.label.split("{query}").join(parsed.text) }));
|
|
43
43
|
}
|
|
44
|
+
const SAFE_LINK_SCHEMES = /* @__PURE__ */ new Set(["http:", "https:", "mailto:", "tel:"]);
|
|
45
|
+
const RELATIVE_BASE = "http://relative.invalid/";
|
|
46
|
+
function isSafeHref(href) {
|
|
47
|
+
try {
|
|
48
|
+
return SAFE_LINK_SCHEMES.has(new URL(href, RELATIVE_BASE).protocol);
|
|
49
|
+
} catch {
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function absoluteHref(href, base) {
|
|
54
|
+
try {
|
|
55
|
+
return new URL(href, base).href;
|
|
56
|
+
} catch {
|
|
57
|
+
return href;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
function moreRowId(group) {
|
|
61
|
+
return `\0lp-cmd-more\0${group}`;
|
|
62
|
+
}
|
|
63
|
+
const IMAGE_SHAPES = ["circle", "soft", "square"];
|
|
64
|
+
const isOptionalString = (value) => value === void 0 || typeof value === "string";
|
|
65
|
+
function isStoredImage(value) {
|
|
66
|
+
if (value === void 0 || typeof value === "string") return true;
|
|
67
|
+
if (!value || typeof value !== "object") return false;
|
|
68
|
+
const { src, alt, fallback, icon, shape } = value;
|
|
69
|
+
return (src === null || isOptionalString(src)) && isOptionalString(alt) && isOptionalString(fallback) && isOptionalString(icon) && (shape === void 0 || IMAGE_SHAPES.includes(shape));
|
|
70
|
+
}
|
|
44
71
|
function isEntry(value) {
|
|
45
72
|
if (!value || typeof value !== "object") return false;
|
|
46
73
|
const v = value;
|
|
47
|
-
return typeof v.id === "string" && typeof v.label === "string" && Array.isArray(v.path) && v.path.every((step) => typeof step === "string");
|
|
74
|
+
return typeof v.id === "string" && typeof v.label === "string" && Array.isArray(v.path) && v.path.every((step) => typeof step === "string") && isOptionalString(v.description) && isOptionalString(v.icon) && isStoredImage(v.image) && (v.href === void 0 || typeof v.href === "string" && isSafeHref(v.href));
|
|
48
75
|
}
|
|
49
76
|
function readRecent(stored) {
|
|
50
77
|
if (!Array.isArray(stored)) return [];
|
|
51
78
|
return stored.filter((v) => typeof v === "string" || isEntry(v));
|
|
52
79
|
}
|
|
80
|
+
function commandKey(id, path = []) {
|
|
81
|
+
return [...path, id].join("\0");
|
|
82
|
+
}
|
|
53
83
|
function recentKey(item) {
|
|
54
|
-
return typeof item === "string" ? item :
|
|
84
|
+
return typeof item === "string" ? item : commandKey(item.id, item.path);
|
|
55
85
|
}
|
|
56
|
-
function toRecentItem(command, path) {
|
|
57
|
-
if (!path.length) return command.id;
|
|
86
|
+
function toRecentItem(command, path, fetched = false) {
|
|
87
|
+
if (!path.length && !fetched) return command.id;
|
|
58
88
|
const entry = { id: command.id, label: command.label, path: [...path] };
|
|
59
89
|
if (command.description) entry.description = command.description;
|
|
60
90
|
if (command.icon) entry.icon = command.icon;
|
|
@@ -110,13 +140,18 @@ function modeChipLabel(command) {
|
|
|
110
140
|
}
|
|
111
141
|
export {
|
|
112
142
|
PALETTE_MODES,
|
|
143
|
+
absoluteHref,
|
|
113
144
|
commandHasPreview,
|
|
145
|
+
commandKey,
|
|
114
146
|
fallbackRows,
|
|
147
|
+
isSafeHref,
|
|
115
148
|
matchModePrefix,
|
|
116
149
|
menuPaletteCommands,
|
|
117
150
|
modeChipLabel,
|
|
151
|
+
moreRowId,
|
|
118
152
|
pushRecent,
|
|
119
153
|
readRecent,
|
|
154
|
+
recentKey,
|
|
120
155
|
recentVisible,
|
|
121
156
|
resolveRecentItems,
|
|
122
157
|
toRecentItem
|
|
@@ -35,4 +35,9 @@ export declare const optionStagger: (index: number) => {
|
|
|
35
35
|
* dip on press. Put on the <LpIcon>, with `group` on its button. Shared by
|
|
36
36
|
* Modal, Drawer, Toaster and the Autocomplete clear button.
|
|
37
37
|
*/
|
|
38
|
+
export declare const COMBOBOX_PANEL: {
|
|
39
|
+
readonly collisionPadding: 8;
|
|
40
|
+
readonly position: "popper";
|
|
41
|
+
readonly sideOffset: 6;
|
|
42
|
+
};
|
|
38
43
|
export declare const CLOSE_ICON: string;
|
|
@@ -7,9 +7,11 @@ const OPTION_ITEM = "flex cursor-pointer items-center gap-2 rounded-inner px-2.5
|
|
|
7
7
|
const optionStagger = (index) => ({
|
|
8
8
|
animationDelay: `${staggerDelay(index, 0, 22, 12)}ms`
|
|
9
9
|
});
|
|
10
|
+
const COMBOBOX_PANEL = { collisionPadding: 8, position: "popper", sideOffset: 6 };
|
|
10
11
|
const CLOSE_ICON = "transition-transform duration-medium ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0";
|
|
11
12
|
export {
|
|
12
13
|
CLOSE_ICON,
|
|
14
|
+
COMBOBOX_PANEL,
|
|
13
15
|
OPTION_ITEM,
|
|
14
16
|
PANEL_SURFACE,
|
|
15
17
|
POPOVER_ANIM,
|
|
@@ -27,7 +27,12 @@ export declare function toCsv<Row>(rows: readonly Row[], columns: readonly CsvCo
|
|
|
27
27
|
* Hand the viewer a file to save. Does nothing outside a browser, so a call
|
|
28
28
|
* that runs during SSR is harmless.
|
|
29
29
|
*/
|
|
30
|
-
export declare function downloadFile(name: string, data: Blob | string, type?: string): void;
|
|
30
|
+
export declare function downloadFile(name: string, data: Blob | string, type?: string, doc?: Document | undefined): void;
|
|
31
|
+
/**
|
|
32
|
+
* Follow a link the way a click on it would, from the document it should open
|
|
33
|
+
* in: an LpFrame's, inside one.
|
|
34
|
+
*/
|
|
35
|
+
export declare function clickLink(doc: Document, attributes: Partial<Pick<HTMLAnchorElement, "href" | "download" | "target" | "rel">>): void;
|
|
31
36
|
/**
|
|
32
37
|
* A standalone copy of a live SVG: every element carries its computed paint as
|
|
33
38
|
* an inline style, so CSS custom properties and classes from the page's
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import "vue";
|
|
2
|
+
import { nodeWindow, isElement } from "../composables/realm.js";
|
|
1
3
|
const FORMULA_START = /^[=+\-@\t\r]/;
|
|
2
4
|
function cellText(value) {
|
|
3
5
|
if (value == null) return "";
|
|
@@ -26,19 +28,20 @@ function toCsv(rows, columns, options = {}) {
|
|
|
26
28
|
}
|
|
27
29
|
return (options.bom ? "\uFEFF" : "") + out.join(newline) + newline;
|
|
28
30
|
}
|
|
29
|
-
function downloadFile(name, data, type = "text/plain;charset=utf-8") {
|
|
30
|
-
if (
|
|
31
|
+
function downloadFile(name, data, type = "text/plain;charset=utf-8", doc = typeof document === "undefined" ? void 0 : document) {
|
|
32
|
+
if (!doc || typeof URL === "undefined") return;
|
|
31
33
|
const blob = typeof data === "string" ? new Blob([data], { type }) : data;
|
|
32
34
|
const url = URL.createObjectURL(blob);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
clickLink(doc, { href: url, download: name, rel: "noopener" });
|
|
36
|
+
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
37
|
+
}
|
|
38
|
+
function clickLink(doc, attributes) {
|
|
39
|
+
const a = doc.createElement("a");
|
|
40
|
+
Object.assign(a, attributes);
|
|
37
41
|
a.style.display = "none";
|
|
38
|
-
|
|
42
|
+
doc.body.append(a);
|
|
39
43
|
a.click();
|
|
40
44
|
a.remove();
|
|
41
|
-
setTimeout(() => URL.revokeObjectURL(url), 0);
|
|
42
45
|
}
|
|
43
46
|
const PAINT_PROPS = [
|
|
44
47
|
"fill",
|
|
@@ -65,18 +68,19 @@ const PAINT_PROPS = [
|
|
|
65
68
|
"display"
|
|
66
69
|
];
|
|
67
70
|
function inlineSvg(svg) {
|
|
71
|
+
const view = nodeWindow(svg);
|
|
68
72
|
const clone = svg.cloneNode(true);
|
|
69
73
|
const source = [svg, ...svg.querySelectorAll("*")];
|
|
70
74
|
const target = [clone, ...clone.querySelectorAll("*")];
|
|
71
75
|
source.forEach((el, i) => {
|
|
72
76
|
const copy = target[i];
|
|
73
|
-
if (!(copy
|
|
74
|
-
const computed = getComputedStyle(el);
|
|
77
|
+
if (!isElement(copy)) return;
|
|
78
|
+
const computed = view.getComputedStyle(el);
|
|
75
79
|
const style = PAINT_PROPS.map((p) => `${p}:${computed.getPropertyValue(p)}`).filter((d) => !d.endsWith(":")).join(";");
|
|
76
80
|
copy.setAttribute("style", style);
|
|
77
81
|
copy.removeAttribute("class");
|
|
78
82
|
});
|
|
79
|
-
const comments = document.createTreeWalker(clone, NodeFilter.SHOW_COMMENT);
|
|
83
|
+
const comments = view.document.createTreeWalker(clone, view.NodeFilter.SHOW_COMMENT);
|
|
80
84
|
const dead = [];
|
|
81
85
|
while (comments.nextNode()) dead.push(comments.currentNode);
|
|
82
86
|
for (const node of dead) node.parentNode?.removeChild(node);
|
|
@@ -94,13 +98,14 @@ function inlineSvg(svg) {
|
|
|
94
98
|
return clone;
|
|
95
99
|
}
|
|
96
100
|
async function svgToPng(svg, options = {}) {
|
|
101
|
+
const view = nodeWindow(svg);
|
|
97
102
|
const copy = inlineSvg(svg);
|
|
98
103
|
const width = Number(copy.getAttribute("width"));
|
|
99
104
|
const height = Number(copy.getAttribute("height"));
|
|
100
105
|
const markup = new XMLSerializer().serializeToString(copy);
|
|
101
106
|
const url = URL.createObjectURL(new Blob([markup], { type: "image/svg+xml;charset=utf-8" }));
|
|
102
107
|
try {
|
|
103
|
-
const img = new Image();
|
|
108
|
+
const img = new view.Image();
|
|
104
109
|
img.decoding = "async";
|
|
105
110
|
const loaded = new Promise((resolve, reject) => {
|
|
106
111
|
img.onload = () => resolve();
|
|
@@ -108,11 +113,11 @@ async function svgToPng(svg, options = {}) {
|
|
|
108
113
|
});
|
|
109
114
|
img.src = url;
|
|
110
115
|
await loaded;
|
|
111
|
-
const scale = options.scale ?? Math.max(2,
|
|
116
|
+
const scale = options.scale ?? Math.max(2, view.devicePixelRatio || 1);
|
|
112
117
|
const pad = options.padding ?? 0;
|
|
113
|
-
const measure = document.createElement("canvas").getContext("2d");
|
|
118
|
+
const measure = view.document.createElement("canvas").getContext("2d");
|
|
114
119
|
const headerHeight = measure && options.header ? options.header(measure, width) : 0;
|
|
115
|
-
const canvas = document.createElement("canvas");
|
|
120
|
+
const canvas = view.document.createElement("canvas");
|
|
116
121
|
canvas.width = Math.ceil((width + pad * 2) * scale);
|
|
117
122
|
canvas.height = Math.ceil((height + headerHeight + pad * 2) * scale);
|
|
118
123
|
const ctx = canvas.getContext("2d");
|
|
@@ -134,18 +139,19 @@ async function svgToPng(svg, options = {}) {
|
|
|
134
139
|
}
|
|
135
140
|
function backgroundOf(el) {
|
|
136
141
|
for (let node = el; node; node = node.parentElement) {
|
|
137
|
-
const bg = getComputedStyle(node).backgroundColor;
|
|
142
|
+
const bg = nodeWindow(node).getComputedStyle(node).backgroundColor;
|
|
138
143
|
if (bg && bg !== "transparent" && !/rgba\([^)]*,\s*0\)$/.test(bg)) return bg;
|
|
139
144
|
}
|
|
140
145
|
return void 0;
|
|
141
146
|
}
|
|
142
147
|
function resolveCssColor(value, within) {
|
|
143
148
|
if (!value.includes("var(") && !value.toLowerCase().includes("currentcolor")) return value;
|
|
144
|
-
const
|
|
149
|
+
const view = nodeWindow(within);
|
|
150
|
+
const probe = view.document.createElement("span");
|
|
145
151
|
probe.style.color = value;
|
|
146
152
|
probe.style.display = "none";
|
|
147
153
|
within.append(probe);
|
|
148
|
-
const resolved = getComputedStyle(probe).color;
|
|
154
|
+
const resolved = view.getComputedStyle(probe).color;
|
|
149
155
|
probe.remove();
|
|
150
156
|
return resolved || value;
|
|
151
157
|
}
|
|
@@ -155,6 +161,7 @@ function fileStem(title, fallback) {
|
|
|
155
161
|
}
|
|
156
162
|
export {
|
|
157
163
|
backgroundOf,
|
|
164
|
+
clickLink,
|
|
158
165
|
csvField,
|
|
159
166
|
downloadFile,
|
|
160
167
|
fileStem,
|