@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
|
@@ -81,3 +81,70 @@ export interface NodeStats {
|
|
|
81
81
|
export declare function computeStats(nodes: FileNode[], checked: ReadonlySet<string>): Map<string, NodeStats>;
|
|
82
82
|
/** Ids of every ancestor directory of `id`, so callers can reveal a deep node. */
|
|
83
83
|
export declare function ancestorIds(nodes: FileNode[], id: string): string[];
|
|
84
|
+
/** What narrows the tree. Every field is optional; all that are set must hold. */
|
|
85
|
+
export interface FileTreeFilter {
|
|
86
|
+
/** Case-insensitive, against the entry's name and its path from the root. */
|
|
87
|
+
query?: string;
|
|
88
|
+
kind?: FileNode["kind"];
|
|
89
|
+
/** File extensions without the dot. A directory never matches one. */
|
|
90
|
+
extensions?: string[];
|
|
91
|
+
/** Bytes, inclusive. An entry with no `size` does not match. */
|
|
92
|
+
minSize?: number;
|
|
93
|
+
maxSize?: number;
|
|
94
|
+
/** Inclusive. An entry with no readable `modified` does not match. */
|
|
95
|
+
modifiedFrom?: Date | number;
|
|
96
|
+
modifiedTo?: Date | number;
|
|
97
|
+
}
|
|
98
|
+
/** A file's extension, lowercase. A leading dot starts a name, not an extension. */
|
|
99
|
+
export declare function fileExtension(name: string): string;
|
|
100
|
+
/** True when no field of the filter would narrow anything. */
|
|
101
|
+
export declare function isFilterEmpty(filter: FileTreeFilter | undefined): boolean;
|
|
102
|
+
/** Whether one entry, at this path, passes the filter on its own. */
|
|
103
|
+
export declare function matchesFilter(node: FileNode, path: string, filter: FileTreeFilter): boolean;
|
|
104
|
+
export interface FilteredTree {
|
|
105
|
+
nodes: FileNode[];
|
|
106
|
+
/** Directories that hold a match: shown open while the filter is on. */
|
|
107
|
+
openIds: Set<string>;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* The tree with only the matches and the folders leading to them. A kept folder
|
|
111
|
+
* is a copy whose `children` are its kept entries, so what is ticked through it
|
|
112
|
+
* is what is shown. A folder that is not loaded keeps `children` undefined: only
|
|
113
|
+
* loaded entries can be searched.
|
|
114
|
+
*/
|
|
115
|
+
export declare function filterTree(nodes: FileNode[], filter: FileTreeFilter | undefined): FilteredTree;
|
|
116
|
+
/** The tree with children fetched by `load` put in place. The app's own `children` win. */
|
|
117
|
+
export declare function withLoadedChildren(nodes: FileNode[], loaded: ReadonlyMap<string, FileNode[]>): FileNode[];
|
|
118
|
+
/** One row of the flattened tree, with what a flat DOM cannot imply to assistive tech. */
|
|
119
|
+
export interface FlatRow {
|
|
120
|
+
node: FileNode;
|
|
121
|
+
depth: number;
|
|
122
|
+
/** Siblings at this level, and this row's 1-based place among them. */
|
|
123
|
+
setSize: number;
|
|
124
|
+
posInSet: number;
|
|
125
|
+
}
|
|
126
|
+
/** The visible rows in render order: open directories followed by their children. */
|
|
127
|
+
export declare function flattenVisible(nodes: FileNode[], open: ReadonlySet<string>, sort: boolean): FlatRow[];
|
|
128
|
+
export interface RowWindow {
|
|
129
|
+
/** First row to render, and one past the last. */
|
|
130
|
+
start: number;
|
|
131
|
+
end: number;
|
|
132
|
+
}
|
|
133
|
+
/** Which rows a scroll position shows, with `overscan` extra on each side. */
|
|
134
|
+
export declare function rowWindow(scrollTop: number, viewport: number, rowHeight: number, total: number, overscan: number): RowWindow;
|
|
135
|
+
/** Ids between two rows, inclusive, in row order; locked rows are left out. */
|
|
136
|
+
export declare function rangeIds(rows: readonly FileNode[], anchor: string | undefined, target: string): string[];
|
|
137
|
+
/** The chain from the root down to `id`, itself included. */
|
|
138
|
+
export declare function nodeTrail(id: string, byId: ReadonlyMap<string, FileNode>, parentOf: ReadonlyMap<string, string>): FileNode[];
|
|
139
|
+
/**
|
|
140
|
+
* Whether `sources` may land in `target`: a directory that is not one of them,
|
|
141
|
+
* not inside one of them, and not where all of them already are.
|
|
142
|
+
*/
|
|
143
|
+
export declare function canDrop(sources: readonly string[], target: FileNode, parentOf: ReadonlyMap<string, string>): boolean;
|
|
144
|
+
/** Those of `ids` no other of them contains: a moved folder carries what is inside it. */
|
|
145
|
+
export declare function topmostIds(ids: readonly string[], parentOf: ReadonlyMap<string, string>): string[];
|
|
146
|
+
export type RenameProblem = "empty" | "separator" | "duplicate";
|
|
147
|
+
/** Why a new name cannot stand, or null. An unchanged name is the caller's no-op. */
|
|
148
|
+
export declare function renameProblem(name: string, node: FileNode, siblings: readonly FileNode[]): RenameProblem | null;
|
|
149
|
+
/** How much of a name to select for renaming: the stem, so the extension survives typing. */
|
|
150
|
+
export declare function renameSelectionEnd(node: FileNode): number;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
import { formatBytes } from "./format.js";
|
|
2
3
|
const EXT_ICONS = {
|
|
3
4
|
json: "lucide:file-json",
|
|
@@ -211,15 +212,154 @@ function ancestorIds(nodes, id) {
|
|
|
211
212
|
walk(nodes, []);
|
|
212
213
|
return path;
|
|
213
214
|
}
|
|
215
|
+
const PATH_SEPARATOR = "/";
|
|
216
|
+
function fileExtension(name) {
|
|
217
|
+
const dot = name.lastIndexOf(".");
|
|
218
|
+
return dot > 0 ? name.slice(dot + 1).toLowerCase() : "";
|
|
219
|
+
}
|
|
220
|
+
function modifiedTime(value) {
|
|
221
|
+
if (value === void 0) return Number.NaN;
|
|
222
|
+
return value instanceof Date ? value.getTime() : typeof value === "number" ? value : Date.parse(value);
|
|
223
|
+
}
|
|
224
|
+
const timeOf = (value) => typeof value === "number" ? value : value.getTime();
|
|
225
|
+
function isFilterEmpty(filter) {
|
|
226
|
+
if (!filter) return true;
|
|
227
|
+
return !filter.query?.trim() && filter.kind === void 0 && !filter.extensions?.length && filter.minSize === void 0 && filter.maxSize === void 0 && filter.modifiedFrom === void 0 && filter.modifiedTo === void 0;
|
|
228
|
+
}
|
|
229
|
+
function matchesFilter(node, path, filter) {
|
|
230
|
+
const needle = filter.query?.trim().toLowerCase();
|
|
231
|
+
if (needle && !node.name.toLowerCase().includes(needle) && !path.toLowerCase().includes(needle)) return false;
|
|
232
|
+
if (filter.kind && node.kind !== filter.kind) return false;
|
|
233
|
+
if (filter.extensions?.length) {
|
|
234
|
+
if (node.kind !== "file") return false;
|
|
235
|
+
const wanted = filter.extensions.map((ext) => ext.replace(/^\./, "").toLowerCase());
|
|
236
|
+
if (!wanted.includes(fileExtension(node.name))) return false;
|
|
237
|
+
}
|
|
238
|
+
if (filter.minSize !== void 0 || filter.maxSize !== void 0) {
|
|
239
|
+
if (node.size === void 0) return false;
|
|
240
|
+
if (filter.minSize !== void 0 && node.size < filter.minSize) return false;
|
|
241
|
+
if (filter.maxSize !== void 0 && node.size > filter.maxSize) return false;
|
|
242
|
+
}
|
|
243
|
+
if (filter.modifiedFrom !== void 0 || filter.modifiedTo !== void 0) {
|
|
244
|
+
const time = modifiedTime(node.modified);
|
|
245
|
+
if (Number.isNaN(time)) return false;
|
|
246
|
+
if (filter.modifiedFrom !== void 0 && time < timeOf(filter.modifiedFrom)) return false;
|
|
247
|
+
if (filter.modifiedTo !== void 0 && time > timeOf(filter.modifiedTo)) return false;
|
|
248
|
+
}
|
|
249
|
+
return true;
|
|
250
|
+
}
|
|
251
|
+
function filterTree(nodes, filter) {
|
|
252
|
+
const openIds = /* @__PURE__ */ new Set();
|
|
253
|
+
if (!filter || isFilterEmpty(filter)) return { nodes, openIds };
|
|
254
|
+
const active = filter;
|
|
255
|
+
function walk(list, parentPath) {
|
|
256
|
+
const kept = [];
|
|
257
|
+
for (const node of list) {
|
|
258
|
+
const path = parentPath ? `${parentPath}${PATH_SEPARATOR}${node.name}` : node.name;
|
|
259
|
+
const children = node.children && walk(node.children, path);
|
|
260
|
+
if (children?.length) {
|
|
261
|
+
openIds.add(node.id);
|
|
262
|
+
kept.push({ ...node, children });
|
|
263
|
+
} else if (matchesFilter(node, path, active)) {
|
|
264
|
+
kept.push(children ? { ...node, children } : node);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return kept;
|
|
268
|
+
}
|
|
269
|
+
return { nodes: walk(nodes, ""), openIds };
|
|
270
|
+
}
|
|
271
|
+
function withLoadedChildren(nodes, loaded) {
|
|
272
|
+
if (!loaded.size) return nodes;
|
|
273
|
+
return nodes.map((node) => {
|
|
274
|
+
if (node.kind !== "dir") return node;
|
|
275
|
+
const children = node.children ?? loaded.get(node.id);
|
|
276
|
+
if (!children) return node;
|
|
277
|
+
return { ...node, children: withLoadedChildren(children, loaded) };
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
function flattenVisible(nodes, open, sort) {
|
|
281
|
+
const rows = [];
|
|
282
|
+
function walk(list, depth) {
|
|
283
|
+
const ordered = sort ? sortNodes(list) : list;
|
|
284
|
+
ordered.forEach((node, index) => {
|
|
285
|
+
rows.push({ node, depth, setSize: ordered.length, posInSet: index + 1 });
|
|
286
|
+
if (node.kind === "dir" && open.has(node.id) && node.children?.length) walk(node.children, depth + 1);
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
walk(nodes, 0);
|
|
290
|
+
return rows;
|
|
291
|
+
}
|
|
292
|
+
function rowWindow(scrollTop, viewport, rowHeight, total, overscan) {
|
|
293
|
+
const first = Math.floor(Math.max(0, scrollTop) / rowHeight);
|
|
294
|
+
const count = Math.ceil(Math.max(0, viewport) / rowHeight);
|
|
295
|
+
return {
|
|
296
|
+
start: clamp(first - overscan, 0, total),
|
|
297
|
+
end: Math.min(total, first + count + overscan)
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
function rangeIds(rows, anchor, target) {
|
|
301
|
+
const to = rows.findIndex((node) => node.id === target);
|
|
302
|
+
if (to < 0) return [];
|
|
303
|
+
const found = anchor === void 0 ? -1 : rows.findIndex((node) => node.id === anchor);
|
|
304
|
+
const from = found < 0 ? to : found;
|
|
305
|
+
return rows.slice(Math.min(from, to), Math.max(from, to) + 1).filter((node) => !node.disabled).map((node) => node.id);
|
|
306
|
+
}
|
|
307
|
+
function nodeTrail(id, byId, parentOf) {
|
|
308
|
+
const trail = [];
|
|
309
|
+
for (let at = id; at !== void 0; at = parentOf.get(at)) {
|
|
310
|
+
const node = byId.get(at);
|
|
311
|
+
if (node) trail.unshift(node);
|
|
312
|
+
}
|
|
313
|
+
return trail;
|
|
314
|
+
}
|
|
315
|
+
function canDrop(sources, target, parentOf) {
|
|
316
|
+
if (target.kind !== "dir" || target.disabled || !sources.length) return false;
|
|
317
|
+
for (let at = target.id; at !== void 0; at = parentOf.get(at)) {
|
|
318
|
+
if (sources.includes(at)) return false;
|
|
319
|
+
}
|
|
320
|
+
return sources.some((id) => parentOf.get(id) !== target.id);
|
|
321
|
+
}
|
|
322
|
+
function topmostIds(ids, parentOf) {
|
|
323
|
+
const all = new Set(ids);
|
|
324
|
+
return ids.filter((id) => {
|
|
325
|
+
for (let at = parentOf.get(id); at !== void 0; at = parentOf.get(at)) {
|
|
326
|
+
if (all.has(at)) return false;
|
|
327
|
+
}
|
|
328
|
+
return true;
|
|
329
|
+
});
|
|
330
|
+
}
|
|
331
|
+
function renameProblem(name, node, siblings) {
|
|
332
|
+
const next = name.trim();
|
|
333
|
+
if (!next) return "empty";
|
|
334
|
+
if (/[/\\\0]/.test(next)) return "separator";
|
|
335
|
+
return siblings.some((other) => other.id !== node.id && other.name === next) ? "duplicate" : null;
|
|
336
|
+
}
|
|
337
|
+
function renameSelectionEnd(node) {
|
|
338
|
+
const dot = node.name.lastIndexOf(".");
|
|
339
|
+
return node.kind === "file" && dot > 0 ? dot : node.name.length;
|
|
340
|
+
}
|
|
214
341
|
export {
|
|
215
342
|
ancestorIds,
|
|
343
|
+
canDrop,
|
|
216
344
|
checkStateOf,
|
|
217
345
|
checkedCount,
|
|
218
346
|
computeStats,
|
|
347
|
+
fileExtension,
|
|
219
348
|
fileIcon,
|
|
349
|
+
filterTree,
|
|
350
|
+
flattenVisible,
|
|
220
351
|
formatModified,
|
|
221
352
|
formatSize,
|
|
353
|
+
isFilterEmpty,
|
|
354
|
+
matchesFilter,
|
|
355
|
+
nodeTrail,
|
|
356
|
+
rangeIds,
|
|
357
|
+
renameProblem,
|
|
358
|
+
renameSelectionEnd,
|
|
359
|
+
rowWindow,
|
|
222
360
|
sortNodes,
|
|
223
361
|
subtreeIds,
|
|
224
|
-
subtreeSize
|
|
362
|
+
subtreeSize,
|
|
363
|
+
topmostIds,
|
|
364
|
+
withLoadedChildren
|
|
225
365
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
function hashString(seed) {
|
|
2
3
|
let h = 2166136261;
|
|
3
4
|
for (let i = 0; i < seed.length; i++) {
|
|
@@ -16,7 +17,7 @@ function generator(seed) {
|
|
|
16
17
|
};
|
|
17
18
|
}
|
|
18
19
|
function identicon(seed, options = {}) {
|
|
19
|
-
const size =
|
|
20
|
+
const size = clamp(Math.round(options.grid ?? 5), 3, 12);
|
|
20
21
|
const [sMin, sMax] = options.saturation ?? [55, 72];
|
|
21
22
|
const [lMin, lMax] = options.lightness ?? [48, 60];
|
|
22
23
|
const next = generator(hashString(seed));
|
|
@@ -70,7 +71,7 @@ function identiconRects(cells) {
|
|
|
70
71
|
function identiconSvg(seed, options = {}) {
|
|
71
72
|
const { cells, color } = identicon(seed, options);
|
|
72
73
|
const n = cells.length;
|
|
73
|
-
const pad = n *
|
|
74
|
+
const pad = n * clamp(options.padding ?? 0.12, 0, 0.4);
|
|
74
75
|
const view = n + pad * 2;
|
|
75
76
|
const px = options.size ?? 64;
|
|
76
77
|
const bg = options.background ? `<rect width="${view}" height="${view}" fill="${options.background}"/>` : "";
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
export declare const MAX_PATTERN_LENGTH = 200;
|
|
2
|
+
export declare const MAX_MATCH_INPUT = 2000;
|
|
3
|
+
export declare const MATCH_BUDGET_MS = 50;
|
|
4
|
+
export type PatternError = "too-long" | "unsafe" | "invalid";
|
|
5
|
+
export interface LogPattern {
|
|
6
|
+
test(text: string): boolean;
|
|
7
|
+
ranges(text: string): [number, number][];
|
|
8
|
+
}
|
|
9
|
+
export declare function compilePattern(source: string): {
|
|
10
|
+
pattern: LogPattern | null;
|
|
11
|
+
error: PatternError | null;
|
|
12
|
+
};
|
|
13
|
+
/** Positions of the rows the pattern finds, giving up once the budget is spent. */
|
|
14
|
+
export declare function patternPositions(rows: readonly {
|
|
15
|
+
message: string;
|
|
16
|
+
source?: string;
|
|
17
|
+
}[], pattern: LogPattern, now?: () => number): number[];
|
|
18
|
+
/** Every occurrence of a plain term, case-insensitive. */
|
|
19
|
+
export declare function termRanges(text: string, term: string): [number, number][];
|
|
20
|
+
/** A line's time as epoch ms; a pre-formatted label ("12:03:05") has none. */
|
|
21
|
+
export declare function timeMs(time: number | string | undefined): number | null;
|
|
22
|
+
export interface LogTimeRange {
|
|
23
|
+
from?: number | string;
|
|
24
|
+
to?: number | string;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Inclusive at both ends. A line with no readable time stays: most are the
|
|
28
|
+
* continuation of the entry above (a stack frame), and hiding them would cut
|
|
29
|
+
* the entries the range keeps in half.
|
|
30
|
+
*/
|
|
31
|
+
export declare function inTimeRange(time: number | string | undefined, range: LogTimeRange | undefined): boolean;
|
|
32
|
+
/** The position of the row closest in time, -1 when none has a readable time. */
|
|
33
|
+
export declare function nearestByTime(rows: readonly {
|
|
34
|
+
time?: number | string;
|
|
35
|
+
}[], target: number | string): number;
|
|
36
|
+
/** A message with its volatile parts (numbers, ids, hashes) blanked, so repeats compare equal. */
|
|
37
|
+
export declare function messageShape(message: string): string;
|
|
38
|
+
export interface RepeatRow<L> {
|
|
39
|
+
line: L;
|
|
40
|
+
n: number;
|
|
41
|
+
count: number;
|
|
42
|
+
}
|
|
43
|
+
/** Folds rows of the same level, source and shape into the first, wherever they sit. */
|
|
44
|
+
export declare function groupRepeats<L extends {
|
|
45
|
+
message: string;
|
|
46
|
+
level?: string;
|
|
47
|
+
source?: string;
|
|
48
|
+
}>(rows: readonly {
|
|
49
|
+
line: L;
|
|
50
|
+
n: number;
|
|
51
|
+
}[]): RepeatRow<L>[];
|
|
52
|
+
export type LogIdKind = "trace" | "request" | "span" | "correlation";
|
|
53
|
+
export interface LogId {
|
|
54
|
+
kind: LogIdKind;
|
|
55
|
+
value: string;
|
|
56
|
+
start: number;
|
|
57
|
+
end: number;
|
|
58
|
+
}
|
|
59
|
+
/** The correlation ids a message carries, as `trace_id=abc` or `"requestId": "abc"`. */
|
|
60
|
+
export declare function findIds(message: string): LogId[];
|
|
61
|
+
export interface MessagePart {
|
|
62
|
+
text: string;
|
|
63
|
+
hit: boolean;
|
|
64
|
+
id?: LogId;
|
|
65
|
+
}
|
|
66
|
+
/** A message cut around its search hits and ids. An id wins where the two overlap. */
|
|
67
|
+
export declare function messageParts(message: string, hits: readonly [number, number][], ids: readonly LogId[]): MessagePart[];
|
|
68
|
+
/** The object or array a message holds, whole or after a text prefix; null when it holds none. */
|
|
69
|
+
export declare function structuredPayload(message: string): object | null;
|
|
70
|
+
export interface JsonRow {
|
|
71
|
+
path: string;
|
|
72
|
+
depth: number;
|
|
73
|
+
label: string;
|
|
74
|
+
/** Rendered value; for an object or array its size, as `{3}` or `[3]`. */
|
|
75
|
+
value: string;
|
|
76
|
+
kind: "object" | "array" | "string" | "number" | "boolean" | "null";
|
|
77
|
+
expandable: boolean;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* A payload as flat rows, skipping what is collapsed. With `filter`, only the
|
|
81
|
+
* fields whose name or value hold it, plus the parents leading to them.
|
|
82
|
+
*/
|
|
83
|
+
export declare function jsonRows(root: object, collapsed: ReadonlySet<string>, filter?: string): JsonRow[];
|
|
84
|
+
/** Text split into lines, with a stack's frames marked; null when it holds no stack. */
|
|
85
|
+
export declare function stackLines(text: string): {
|
|
86
|
+
text: string;
|
|
87
|
+
frame: boolean;
|
|
88
|
+
}[] | null;
|
|
89
|
+
export type LogExportFormat = "text" | "ndjson";
|
|
90
|
+
/** Lines as a file: readable text, or one JSON object per line. */
|
|
91
|
+
export declare function exportLines<L>(lines: readonly L[], format: LogExportFormat, asText: (line: L) => string): string;
|
|
92
|
+
/** The inclusive run between two row numbers, whichever order they came in. */
|
|
93
|
+
export declare function rowSpan(from: number, to: number): [number, number];
|
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
const MAX_PATTERN_LENGTH = 200;
|
|
2
|
+
const MAX_MATCH_INPUT = 2e3;
|
|
3
|
+
const MATCH_BUDGET_MS = 50;
|
|
4
|
+
const NESTED_QUANTIFIER = /\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d+,\d*\})/;
|
|
5
|
+
function compilePattern(source) {
|
|
6
|
+
if (source.length > MAX_PATTERN_LENGTH) return { pattern: null, error: "too-long" };
|
|
7
|
+
if (NESTED_QUANTIFIER.test(source)) return { pattern: null, error: "unsafe" };
|
|
8
|
+
let regex;
|
|
9
|
+
try {
|
|
10
|
+
regex = new RegExp(source, "giu");
|
|
11
|
+
} catch {
|
|
12
|
+
return { pattern: null, error: "invalid" };
|
|
13
|
+
}
|
|
14
|
+
const capped = (text) => text.length > MAX_MATCH_INPUT ? text.slice(0, MAX_MATCH_INPUT) : text;
|
|
15
|
+
return {
|
|
16
|
+
error: null,
|
|
17
|
+
pattern: {
|
|
18
|
+
test(text) {
|
|
19
|
+
regex.lastIndex = 0;
|
|
20
|
+
return regex.test(capped(text));
|
|
21
|
+
},
|
|
22
|
+
ranges(text) {
|
|
23
|
+
const out = [];
|
|
24
|
+
regex.lastIndex = 0;
|
|
25
|
+
for (const match of capped(text).matchAll(regex)) {
|
|
26
|
+
if (match[0]) out.push([match.index, match.index + match[0].length]);
|
|
27
|
+
}
|
|
28
|
+
return out;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function patternPositions(rows, pattern, now = () => performance.now()) {
|
|
34
|
+
const out = [];
|
|
35
|
+
const deadline = now() + MATCH_BUDGET_MS;
|
|
36
|
+
for (let i = 0; i < rows.length; i++) {
|
|
37
|
+
if (now() > deadline) break;
|
|
38
|
+
const row = rows[i];
|
|
39
|
+
if (pattern.test(row.message) || row.source !== void 0 && pattern.test(row.source)) out.push(i);
|
|
40
|
+
}
|
|
41
|
+
return out;
|
|
42
|
+
}
|
|
43
|
+
function termRanges(text, term) {
|
|
44
|
+
const needle = term.toLowerCase();
|
|
45
|
+
if (!needle) return [];
|
|
46
|
+
const lower = text.toLowerCase();
|
|
47
|
+
const out = [];
|
|
48
|
+
for (let at = lower.indexOf(needle); at !== -1; at = lower.indexOf(needle, at + needle.length)) {
|
|
49
|
+
out.push([at, at + needle.length]);
|
|
50
|
+
}
|
|
51
|
+
return out;
|
|
52
|
+
}
|
|
53
|
+
function timeMs(time) {
|
|
54
|
+
if (time == null) return null;
|
|
55
|
+
if (typeof time === "number") return Number.isFinite(time) ? time : null;
|
|
56
|
+
if (/^\d+$/.test(time)) return Number(time);
|
|
57
|
+
const parsed = Date.parse(time);
|
|
58
|
+
return Number.isNaN(parsed) ? null : parsed;
|
|
59
|
+
}
|
|
60
|
+
function inTimeRange(time, range) {
|
|
61
|
+
if (!range) return true;
|
|
62
|
+
const at = timeMs(time);
|
|
63
|
+
if (at === null) return true;
|
|
64
|
+
const from = timeMs(range.from);
|
|
65
|
+
const to = timeMs(range.to);
|
|
66
|
+
return (from === null || at >= from) && (to === null || at <= to);
|
|
67
|
+
}
|
|
68
|
+
function nearestByTime(rows, target) {
|
|
69
|
+
const wanted = timeMs(target);
|
|
70
|
+
if (wanted === null) return -1;
|
|
71
|
+
let best = -1;
|
|
72
|
+
let distance = Infinity;
|
|
73
|
+
rows.forEach((row, i) => {
|
|
74
|
+
const at = timeMs(row.time);
|
|
75
|
+
if (at === null) return;
|
|
76
|
+
const gap = Math.abs(at - wanted);
|
|
77
|
+
if (gap < distance) {
|
|
78
|
+
best = i;
|
|
79
|
+
distance = gap;
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
return best;
|
|
83
|
+
}
|
|
84
|
+
const VOLATILE = /\b[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\b|\b0x[0-9a-f]+\b|\b[0-9a-f]{16,}\b|\d+(?:\.\d+)*/gi;
|
|
85
|
+
function messageShape(message) {
|
|
86
|
+
return message.replace(VOLATILE, "#");
|
|
87
|
+
}
|
|
88
|
+
function groupRepeats(rows) {
|
|
89
|
+
const groups = /* @__PURE__ */ new Map();
|
|
90
|
+
for (const { line, n } of rows) {
|
|
91
|
+
const key = [line.level ?? "", line.source ?? "", messageShape(line.message)].join("\0");
|
|
92
|
+
const group = groups.get(key);
|
|
93
|
+
if (group) group.count++;
|
|
94
|
+
else groups.set(key, { line, n, count: 1 });
|
|
95
|
+
}
|
|
96
|
+
return [...groups.values()];
|
|
97
|
+
}
|
|
98
|
+
const ID_PATTERN = /\b(trace|request|req|span|correlation|corr)[_-]?id["']?\s*[=:]\s*["']?([\w-]{6,})/gi;
|
|
99
|
+
const ID_KINDS = {
|
|
100
|
+
trace: "trace",
|
|
101
|
+
request: "request",
|
|
102
|
+
req: "request",
|
|
103
|
+
span: "span",
|
|
104
|
+
correlation: "correlation",
|
|
105
|
+
corr: "correlation"
|
|
106
|
+
};
|
|
107
|
+
function findIds(message) {
|
|
108
|
+
const out = [];
|
|
109
|
+
for (const match of message.matchAll(ID_PATTERN)) {
|
|
110
|
+
const value = match[2];
|
|
111
|
+
const start = match.index + match[0].length - value.length;
|
|
112
|
+
out.push({ kind: ID_KINDS[match[1].toLowerCase()], value, start, end: start + value.length });
|
|
113
|
+
}
|
|
114
|
+
return out;
|
|
115
|
+
}
|
|
116
|
+
function messageParts(message, hits, ids) {
|
|
117
|
+
const parts = [];
|
|
118
|
+
const plain = (from, to) => {
|
|
119
|
+
let at2 = from;
|
|
120
|
+
for (const [start, end] of hits) {
|
|
121
|
+
if (end <= at2 || start >= to) continue;
|
|
122
|
+
if (start > at2) parts.push({ text: message.slice(at2, start), hit: false });
|
|
123
|
+
const stop = Math.min(end, to);
|
|
124
|
+
parts.push({ text: message.slice(Math.max(start, at2), stop), hit: true });
|
|
125
|
+
at2 = stop;
|
|
126
|
+
}
|
|
127
|
+
if (at2 < to) parts.push({ text: message.slice(at2, to), hit: false });
|
|
128
|
+
};
|
|
129
|
+
let at = 0;
|
|
130
|
+
for (const id of ids) {
|
|
131
|
+
plain(at, id.start);
|
|
132
|
+
parts.push({ text: message.slice(id.start, id.end), hit: false, id });
|
|
133
|
+
at = id.end;
|
|
134
|
+
}
|
|
135
|
+
plain(at, message.length);
|
|
136
|
+
return parts.length ? parts : [{ text: message, hit: false }];
|
|
137
|
+
}
|
|
138
|
+
function structuredPayload(message) {
|
|
139
|
+
const start = message.search(/[{[]/);
|
|
140
|
+
if (start < 0) return null;
|
|
141
|
+
try {
|
|
142
|
+
const value = JSON.parse(message.slice(start));
|
|
143
|
+
return typeof value === "object" && value !== null ? value : null;
|
|
144
|
+
} catch {
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
function kindOf(value) {
|
|
149
|
+
if (value === null) return "null";
|
|
150
|
+
if (Array.isArray(value)) return "array";
|
|
151
|
+
const type = typeof value;
|
|
152
|
+
return type === "string" || type === "number" || type === "boolean" ? type : "object";
|
|
153
|
+
}
|
|
154
|
+
function holds(value, needle, label) {
|
|
155
|
+
if (label.toLowerCase().includes(needle)) return true;
|
|
156
|
+
if (value !== null && typeof value === "object") {
|
|
157
|
+
return Object.entries(value).some(([key, child]) => holds(child, needle, key));
|
|
158
|
+
}
|
|
159
|
+
return String(value).toLowerCase().includes(needle);
|
|
160
|
+
}
|
|
161
|
+
function jsonRows(root, collapsed, filter = "") {
|
|
162
|
+
const needle = filter.trim().toLowerCase();
|
|
163
|
+
const rows = [];
|
|
164
|
+
const walk = (value, parent, depth) => {
|
|
165
|
+
for (const [label, child] of Object.entries(value)) {
|
|
166
|
+
if (needle && !holds(child, needle, label)) continue;
|
|
167
|
+
const path = parent ? `${parent}.${label}` : label;
|
|
168
|
+
const kind = kindOf(child);
|
|
169
|
+
const nested = kind === "object" || kind === "array";
|
|
170
|
+
const size = nested ? Object.keys(child).length : 0;
|
|
171
|
+
const shown = kind === "array" ? `[${size}]` : kind === "object" ? `{${size}}` : kind === "string" ? child : String(child);
|
|
172
|
+
rows.push({ path, depth, label, value: shown, kind, expandable: nested && size > 0 });
|
|
173
|
+
if (nested && !collapsed.has(path)) walk(child, path, depth + 1);
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
walk(root, "", 0);
|
|
177
|
+
return rows;
|
|
178
|
+
}
|
|
179
|
+
const STACK_FRAME = /^\s*(?:at\s+\S|File ".+", line \d+|#\d+\s|\S+\.\w+:\d+)/;
|
|
180
|
+
function stackLines(text) {
|
|
181
|
+
const lines = text.split(/\r?\n/).map((line) => ({ text: line, frame: STACK_FRAME.test(line) }));
|
|
182
|
+
return lines.length > 1 && lines.some((line) => line.frame) ? lines : null;
|
|
183
|
+
}
|
|
184
|
+
function exportLines(lines, format, asText) {
|
|
185
|
+
const rows = format === "ndjson" ? lines.map((line) => JSON.stringify(line)) : lines.map(asText);
|
|
186
|
+
return rows.join("\n");
|
|
187
|
+
}
|
|
188
|
+
function rowSpan(from, to) {
|
|
189
|
+
return from <= to ? [from, to] : [to, from];
|
|
190
|
+
}
|
|
191
|
+
export {
|
|
192
|
+
MATCH_BUDGET_MS,
|
|
193
|
+
MAX_MATCH_INPUT,
|
|
194
|
+
MAX_PATTERN_LENGTH,
|
|
195
|
+
compilePattern,
|
|
196
|
+
exportLines,
|
|
197
|
+
findIds,
|
|
198
|
+
groupRepeats,
|
|
199
|
+
inTimeRange,
|
|
200
|
+
jsonRows,
|
|
201
|
+
messageParts,
|
|
202
|
+
messageShape,
|
|
203
|
+
nearestByTime,
|
|
204
|
+
patternPositions,
|
|
205
|
+
rowSpan,
|
|
206
|
+
stackLines,
|
|
207
|
+
structuredPayload,
|
|
208
|
+
termRanges,
|
|
209
|
+
timeMs
|
|
210
|
+
};
|
package/dist/components/meter.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
import { TONES, TONE_ALIASES } from "./tone.js";
|
|
2
3
|
const METER_TONES = ["ok", "warning", "danger", "brand", "neutral"];
|
|
3
4
|
const byMeterTone = (pick) => Object.fromEntries(METER_TONES.map((t) => [t, pick(TONES[TONE_ALIASES[t]])]));
|
|
@@ -6,7 +7,7 @@ const TONE_SOFT = byMeterTone((look) => look.soft);
|
|
|
6
7
|
function meterFraction(value, min, max) {
|
|
7
8
|
const span = max - min;
|
|
8
9
|
if (!(span > 0) || !Number.isFinite(value)) return 0;
|
|
9
|
-
return
|
|
10
|
+
return clamp((value - min) / span, 0, 1);
|
|
10
11
|
}
|
|
11
12
|
function capacityThresholds(min, max, warnAt = 0.8, dangerAt = 0.9) {
|
|
12
13
|
const span = max - min;
|
|
@@ -53,3 +53,5 @@ export declare function childProgress(step: PipelineStep): {
|
|
|
53
53
|
} | null;
|
|
54
54
|
/** The key a step is addressed by. */
|
|
55
55
|
export declare function stepKey(step: Pick<PipelineStep, "key">, index: number): string;
|
|
56
|
+
/** Keys used by more than one step, which would then share their open state. */
|
|
57
|
+
export declare function duplicateStepKeys(steps: readonly Pick<PipelineStep, "key">[]): string[];
|
|
@@ -40,10 +40,15 @@ function childProgress(step) {
|
|
|
40
40
|
function stepKey(step, index) {
|
|
41
41
|
return step.key ?? String(index);
|
|
42
42
|
}
|
|
43
|
+
function duplicateStepKeys(steps) {
|
|
44
|
+
const keys = steps.map(stepKey);
|
|
45
|
+
return [...new Set(keys.filter((key, i) => keys.indexOf(key) !== i))];
|
|
46
|
+
}
|
|
43
47
|
export {
|
|
44
48
|
childProgress,
|
|
45
49
|
connectorFilled,
|
|
46
50
|
currentStepIndex,
|
|
51
|
+
duplicateStepKeys,
|
|
47
52
|
isSettled,
|
|
48
53
|
overallStatus,
|
|
49
54
|
stepElapsed,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
import { toEpoch } from "./timeSpan.js";
|
|
2
3
|
const SECOND = 1e3;
|
|
3
4
|
const MINUTE = 60 * SECOND;
|
|
@@ -49,7 +50,7 @@ function formatRelativeTime(date, now = Date.now(), options = {}) {
|
|
|
49
50
|
return { text: fmt.format(value, step.unit), unit: step.unit, value, refreshIn: clampRefresh(refreshIn) };
|
|
50
51
|
}
|
|
51
52
|
function clampRefresh(ms) {
|
|
52
|
-
return Math.
|
|
53
|
+
return clamp(Math.ceil(ms), MIN_REFRESH, MAX_REFRESH);
|
|
53
54
|
}
|
|
54
55
|
export {
|
|
55
56
|
formatRelativeTime
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "../composables/clamp.js";
|
|
1
2
|
function revealFrom(preset, direction, distance) {
|
|
2
3
|
const offset = (d) => ({
|
|
3
4
|
up: `translate3d(0, ${d}px, 0)`,
|
|
@@ -23,7 +24,7 @@ function revealTo(from) {
|
|
|
23
24
|
return to;
|
|
24
25
|
}
|
|
25
26
|
function staggerDelay(index, delay, stagger, cap = 10) {
|
|
26
|
-
return delay +
|
|
27
|
+
return delay + clamp(index, 0, cap) * Math.max(0, stagger);
|
|
27
28
|
}
|
|
28
29
|
export {
|
|
29
30
|
revealFrom,
|
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Drop the oldest entries past `limit`, never one of `keep`. For a cache that
|
|
3
|
+
* must outlive the list it was read from, in a long session over a big catalog.
|
|
4
|
+
*/
|
|
5
|
+
export declare function evictOldest<K, V>(cache: Map<K, V>, keep: ReadonlySet<K>, limit: number): void;
|
|
1
6
|
/**
|
|
2
7
|
* How many chips of a multiple pick fit in one row before the rest collapse
|
|
3
8
|
* into a "+N" chip.
|
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
function evictOldest(cache, keep, limit) {
|
|
2
|
+
let excess = cache.size - limit;
|
|
3
|
+
for (const key of cache.keys()) {
|
|
4
|
+
if (excess <= 0) return;
|
|
5
|
+
if (keep.has(key)) continue;
|
|
6
|
+
cache.delete(key);
|
|
7
|
+
excess--;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
1
10
|
function fitChips(widths, available, gap, moreWidth) {
|
|
2
11
|
const n = widths.length;
|
|
3
12
|
if (n === 0) return 0;
|
|
@@ -19,6 +28,7 @@ function toggledValues(previous, next) {
|
|
|
19
28
|
return [...next.filter((v) => !before.has(v)), ...previous.filter((v) => !after.has(v))];
|
|
20
29
|
}
|
|
21
30
|
export {
|
|
31
|
+
evictOldest,
|
|
22
32
|
fitChips,
|
|
23
33
|
toggledValues
|
|
24
34
|
};
|
|
@@ -40,6 +40,7 @@ export interface SidebarItem {
|
|
|
40
40
|
* away without opening the section first. In a compact sidebar they open in
|
|
41
41
|
* a card beside the icon.
|
|
42
42
|
*/
|
|
43
|
+
/** One level: search, the active row and the rail stop at these pages, nothing under them is drawn. */
|
|
43
44
|
children?: SidebarItem[];
|
|
44
45
|
/** A dot instead of a count: something new here that has no number to it. */
|
|
45
46
|
dot?: boolean;
|