@leavepulse/ui 0.77.3 → 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-E8KtwU7-.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-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -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 +13 -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
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { useId, computed, provide,
|
|
1
|
+
import { useId, computed, provide, inject, useAttrs, onScopeDispose } from "vue";
|
|
2
|
+
import { isElement } from "./realm.js";
|
|
2
3
|
const LP_FIELD = /* @__PURE__ */ Symbol.for("lp-field");
|
|
3
4
|
function provideField(context) {
|
|
4
5
|
provide(LP_FIELD, context);
|
|
@@ -9,6 +10,13 @@ function useField() {
|
|
|
9
10
|
function fieldMessageId(id) {
|
|
10
11
|
return `${id}-message`;
|
|
11
12
|
}
|
|
13
|
+
function mergeDescribedBy(...ids) {
|
|
14
|
+
const all = ids.flatMap((id) => typeof id === "string" ? id.split(/\s+/) : []).filter(Boolean);
|
|
15
|
+
return [...new Set(all)].join(" ") || void 0;
|
|
16
|
+
}
|
|
17
|
+
function isAttrOn(value) {
|
|
18
|
+
return !!value || value === "";
|
|
19
|
+
}
|
|
12
20
|
function useFieldControl(own) {
|
|
13
21
|
const outer = useField();
|
|
14
22
|
const generated = useId();
|
|
@@ -41,7 +49,7 @@ function useFieldControl(own) {
|
|
|
41
49
|
}
|
|
42
50
|
function focusLeft(event) {
|
|
43
51
|
const next = event.relatedTarget;
|
|
44
|
-
return !(next
|
|
52
|
+
return !(isElement(next) && event.currentTarget?.contains(next));
|
|
45
53
|
}
|
|
46
54
|
function useFieldBlur(blur) {
|
|
47
55
|
const partId = `lp-field-${useId()}`;
|
|
@@ -62,11 +70,28 @@ function useFieldBlur(blur) {
|
|
|
62
70
|
onScopeDispose(() => cancelPending?.());
|
|
63
71
|
return { partId, onFocusOut };
|
|
64
72
|
}
|
|
73
|
+
function fieldWrapperBinds(wrapped, field, props, attrs) {
|
|
74
|
+
const { label, hint, error, required } = props;
|
|
75
|
+
return { wrapped, id: field.id, label, hint, error, required, class: attrs.class, style: attrs.style };
|
|
76
|
+
}
|
|
77
|
+
function useAttrsField(state) {
|
|
78
|
+
const attrs = useAttrs();
|
|
79
|
+
const field = useFieldControl(() => ({
|
|
80
|
+
wrapped: false,
|
|
81
|
+
id: typeof attrs.id === "string" ? attrs.id : void 0,
|
|
82
|
+
...state()
|
|
83
|
+
}));
|
|
84
|
+
return { attrs, field };
|
|
85
|
+
}
|
|
65
86
|
export {
|
|
66
87
|
LP_FIELD,
|
|
67
88
|
fieldMessageId,
|
|
89
|
+
fieldWrapperBinds,
|
|
68
90
|
focusLeft,
|
|
91
|
+
isAttrOn,
|
|
92
|
+
mergeDescribedBy,
|
|
69
93
|
provideField,
|
|
94
|
+
useAttrsField,
|
|
70
95
|
useField,
|
|
71
96
|
useFieldBlur,
|
|
72
97
|
useFieldControl
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
import { ref, onMounted, watch, onBeforeUnmount } from "vue";
|
|
2
3
|
function useFitScale(box, content, min = 0.6) {
|
|
3
4
|
const scale = ref(1);
|
|
@@ -15,7 +16,9 @@ function useFitScale(box, content, min = 0.6) {
|
|
|
15
16
|
function observe() {
|
|
16
17
|
observer?.disconnect();
|
|
17
18
|
if (typeof ResizeObserver === "undefined") return;
|
|
18
|
-
|
|
19
|
+
const el = box.value ?? content.value;
|
|
20
|
+
if (!el) return measure();
|
|
21
|
+
observer = new (nodeWindow(el)).ResizeObserver(measure);
|
|
19
22
|
if (box.value) observer.observe(box.value);
|
|
20
23
|
if (content.value) observer.observe(content.value);
|
|
21
24
|
measure();
|
|
@@ -22,6 +22,12 @@ export interface UseFormDraftOptions<T> {
|
|
|
22
22
|
maxAgeMs?: number;
|
|
23
23
|
/** Skip the write without tearing the composable out of the component. */
|
|
24
24
|
disabled?: MaybeRefOrGetter<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Accept a stored value or reject it. The envelope's version follows the
|
|
27
|
+
* kit, not this form: a draft written before the form changed shape needs
|
|
28
|
+
* this to be turned away. A rejected draft reads as no draft.
|
|
29
|
+
*/
|
|
30
|
+
validate?: (value: unknown) => value is T;
|
|
25
31
|
}
|
|
26
32
|
export interface UseFormDraft<T> {
|
|
27
33
|
/**
|
|
@@ -40,8 +46,13 @@ export interface UseFormDraft<T> {
|
|
|
40
46
|
* what to do with each field, because only it knows the form's shape.
|
|
41
47
|
*/
|
|
42
48
|
read: () => T | null;
|
|
43
|
-
/**
|
|
44
|
-
|
|
49
|
+
/**
|
|
50
|
+
* Forget the draft. Call after applying it, and after a successful save.
|
|
51
|
+
* With no argument it acts on the key as it is now; a callback that may
|
|
52
|
+
* outlive the subject (an awaited save) passes the key it started under, so
|
|
53
|
+
* it cannot delete the draft of whatever the form moved on to.
|
|
54
|
+
*/
|
|
55
|
+
discard: (key?: string) => void;
|
|
45
56
|
/** Write now, ignoring `dirty` and a pending draft. For "save and come back to this later". */
|
|
46
57
|
save: () => void;
|
|
47
58
|
}
|
|
@@ -7,13 +7,18 @@ function useFormDraft(options) {
|
|
|
7
7
|
const hasDraft = ref(false);
|
|
8
8
|
const savedAt = ref(null);
|
|
9
9
|
const maxAge = options.maxAgeMs ?? WEEK_MS;
|
|
10
|
+
function normalizeKey(key) {
|
|
11
|
+
return String(key || "").trim();
|
|
12
|
+
}
|
|
10
13
|
function currentKey() {
|
|
11
|
-
return
|
|
14
|
+
return normalizeKey(toValue(options.key));
|
|
12
15
|
}
|
|
13
16
|
function fresh(parsed) {
|
|
14
|
-
if (!parsed || parsed.version !== ENVELOPE_VERSION) return false;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
if (!parsed || parsed.version !== ENVELOPE_VERSION || !("value" in Object(parsed))) return false;
|
|
18
|
+
const stamp = typeof parsed.savedAt === "string" ? Date.parse(parsed.savedAt) : Number.NaN;
|
|
19
|
+
if (Number.isNaN(stamp)) return false;
|
|
20
|
+
if (options.validate && !options.validate(parsed.value)) return false;
|
|
21
|
+
return maxAge <= 0 || Math.abs(Date.now() - stamp) <= maxAge;
|
|
17
22
|
}
|
|
18
23
|
function read() {
|
|
19
24
|
const key = currentKey();
|
|
@@ -44,11 +49,14 @@ function useFormDraft(options) {
|
|
|
44
49
|
})
|
|
45
50
|
);
|
|
46
51
|
}
|
|
47
|
-
function discard() {
|
|
48
|
-
const
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
+
function discard(key) {
|
|
53
|
+
const current = currentKey();
|
|
54
|
+
const target = typeof key === "string" ? normalizeKey(key) : current;
|
|
55
|
+
if (target === current) {
|
|
56
|
+
hasDraft.value = false;
|
|
57
|
+
savedAt.value = null;
|
|
58
|
+
}
|
|
59
|
+
if (target) store.remove(target);
|
|
52
60
|
}
|
|
53
61
|
function save() {
|
|
54
62
|
write(toValue(options.value));
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { shallowRef, provide, onBeforeUnmount, reactive, computed, inject, watch } from "vue";
|
|
2
2
|
import { anyModalOpen } from "../components/modalDepth.js";
|
|
3
|
+
import { isTextEntry } from "./textEntry.js";
|
|
3
4
|
import { hints } from "./useHints.js";
|
|
4
5
|
const HINT_SIGNALS = {
|
|
5
6
|
/** A context menu was opened (right click or long press). */
|
|
@@ -154,8 +155,7 @@ function hintSummary(records, features, page) {
|
|
|
154
155
|
};
|
|
155
156
|
}
|
|
156
157
|
function typing() {
|
|
157
|
-
|
|
158
|
-
return el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLElement && el.isContentEditable;
|
|
158
|
+
return isTextEntry(document.activeElement, { inputType: () => true });
|
|
159
159
|
}
|
|
160
160
|
function createHintSystem(options) {
|
|
161
161
|
const timing = { ...DEFAULT_TIMING, ...options.timing };
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { shallowReactive, ref, computed, toValue, onMounted, getCurrentInstance, onBeforeUnmount } from "vue";
|
|
2
2
|
import { topModalElement } from "../components/modalDepth.js";
|
|
3
|
+
import { isDev } from "./devWarn.js";
|
|
4
|
+
import { isNode } from "./realm.js";
|
|
5
|
+
import { isTextEntry } from "./textEntry.js";
|
|
3
6
|
const isAppleKeyboard = typeof navigator !== "undefined" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || "");
|
|
4
7
|
function useAppleKeyboard() {
|
|
5
8
|
const apple = ref(false);
|
|
@@ -12,24 +15,6 @@ function appleModifierLabel(key, apple = isAppleKeyboard) {
|
|
|
12
15
|
if (key === "Alt") return "⌥";
|
|
13
16
|
return key;
|
|
14
17
|
}
|
|
15
|
-
const TEXT_INPUT_TYPES = /* @__PURE__ */ new Set([
|
|
16
|
-
"text",
|
|
17
|
-
"search",
|
|
18
|
-
"email",
|
|
19
|
-
"number",
|
|
20
|
-
"password",
|
|
21
|
-
"tel",
|
|
22
|
-
"url"
|
|
23
|
-
]);
|
|
24
|
-
function isTextEntry(target) {
|
|
25
|
-
if (!(target instanceof HTMLElement)) return false;
|
|
26
|
-
if (target.isContentEditable) return true;
|
|
27
|
-
if (target instanceof HTMLTextAreaElement) return true;
|
|
28
|
-
if (target instanceof HTMLInputElement) {
|
|
29
|
-
return TEXT_INPUT_TYPES.has(target.type);
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
32
|
-
}
|
|
33
18
|
const MODIFIER_KEYS = /* @__PURE__ */ new Set(["control", "meta", "shift", "alt"]);
|
|
34
19
|
function matchesHotkey(event, binding) {
|
|
35
20
|
if (binding.key === void 0) return false;
|
|
@@ -102,11 +87,11 @@ const mounted = state.mounted;
|
|
|
102
87
|
function inScope(target, scope) {
|
|
103
88
|
const el = toValue(scope);
|
|
104
89
|
if (!el) return true;
|
|
105
|
-
|
|
106
|
-
return !!node && (el === node || el.contains(node));
|
|
90
|
+
return isNode(target) && (el === target || el.contains(target));
|
|
107
91
|
}
|
|
108
|
-
function topLayer() {
|
|
109
|
-
const
|
|
92
|
+
function topLayer(origin) {
|
|
93
|
+
const doc = isNode(origin) ? origin.ownerDocument ?? document : document;
|
|
94
|
+
const layers = doc.querySelectorAll("[data-dismissable-layer]");
|
|
110
95
|
return layers[layers.length - 1] ?? null;
|
|
111
96
|
}
|
|
112
97
|
function insideOf(entry, layer) {
|
|
@@ -126,7 +111,7 @@ function snapshot(event) {
|
|
|
126
111
|
}
|
|
127
112
|
function eligible(event) {
|
|
128
113
|
const inTextEntry = isTextEntry(event.target);
|
|
129
|
-
const blocker = event.key === "Escape" ? topLayer() : topModalElement();
|
|
114
|
+
const blocker = event.key === "Escape" ? topLayer(event.target) : topModalElement();
|
|
130
115
|
const entries = [...mounted].sort(
|
|
131
116
|
(a, b) => Number(toValue(b.priority) || 0) - Number(toValue(a.priority) || 0) || b.order - a.order
|
|
132
117
|
);
|
|
@@ -165,6 +150,7 @@ function flushHeld() {
|
|
|
165
150
|
function onKeydown(event) {
|
|
166
151
|
if (event.isComposing || event.defaultPrevented) return;
|
|
167
152
|
if (pressed.length && MODIFIER_KEYS.has(event.key.toLowerCase())) return;
|
|
153
|
+
if (pressed.length && event.repeat) return;
|
|
168
154
|
if (pressed.length && event.key === "Escape") {
|
|
169
155
|
resetSequence();
|
|
170
156
|
}
|
|
@@ -216,7 +202,7 @@ function useHotkeys(bindings, options = {}) {
|
|
|
216
202
|
order: ++state.order,
|
|
217
203
|
host: () => {
|
|
218
204
|
const el = instance?.vnode.el;
|
|
219
|
-
return el
|
|
205
|
+
return isNode(el) ? el : null;
|
|
220
206
|
}
|
|
221
207
|
};
|
|
222
208
|
onMounted(() => {
|
|
@@ -230,11 +216,11 @@ function useHotkeys(bindings, options = {}) {
|
|
|
230
216
|
});
|
|
231
217
|
onBeforeUnmount(() => {
|
|
232
218
|
mounted.delete(entry);
|
|
219
|
+
resetSequence();
|
|
233
220
|
if (!mounted.size && state.listening) {
|
|
234
221
|
window.removeEventListener("keydown", onKeydown);
|
|
235
222
|
window.removeEventListener("blur", resetSequence);
|
|
236
223
|
state.listening = false;
|
|
237
|
-
resetSequence();
|
|
238
224
|
}
|
|
239
225
|
});
|
|
240
226
|
}
|
|
@@ -297,13 +283,6 @@ const hotkeyConflicts = computed(
|
|
|
297
283
|
)
|
|
298
284
|
);
|
|
299
285
|
const warned = /* @__PURE__ */ new Set();
|
|
300
|
-
function isDev() {
|
|
301
|
-
try {
|
|
302
|
-
return process.env.NODE_ENV !== "production";
|
|
303
|
-
} catch {
|
|
304
|
-
return false;
|
|
305
|
-
}
|
|
306
|
-
}
|
|
307
286
|
function warnConflicts() {
|
|
308
287
|
if (!isDev()) return;
|
|
309
288
|
for (const conflict of hotkeyConflicts.value) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
import { ref, watch, onBeforeUnmount } from "vue";
|
|
2
3
|
function useInView(options = {}) {
|
|
3
4
|
const el = ref(null);
|
|
@@ -17,7 +18,7 @@ function useInView(options = {}) {
|
|
|
17
18
|
observer?.disconnect();
|
|
18
19
|
observer = null;
|
|
19
20
|
if (!node || typeof IntersectionObserver === "undefined") return sync();
|
|
20
|
-
observer = new IntersectionObserver(
|
|
21
|
+
observer = new (nodeWindow(node)).IntersectionObserver(
|
|
21
22
|
(entries) => {
|
|
22
23
|
intersecting.value = entries.some((entry) => entry.isIntersecting);
|
|
23
24
|
sync();
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { computed, toValue } from "vue";
|
|
2
|
+
import { isElement } from "./realm.js";
|
|
2
3
|
function anchorPattern(p) {
|
|
3
4
|
if (p instanceof RegExp) return new RegExp(`^(?:${p.source})$`, p.flags.replace(/[gy]/g, ""));
|
|
4
5
|
return new RegExp(`^(?:${p})$`);
|
|
@@ -49,12 +50,13 @@ function useInputFilter(options = {}) {
|
|
|
49
50
|
function sanitize(target) {
|
|
50
51
|
const re = restrict.value;
|
|
51
52
|
if (!re) return false;
|
|
52
|
-
if (!(target
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
if (!isElement(target) || !["INPUT", "TEXTAREA"].includes(target.tagName)) return false;
|
|
54
|
+
const field = target;
|
|
55
|
+
const { text, caret } = stripDisallowed(field.value, re, field.selectionStart ?? field.value.length);
|
|
56
|
+
if (text === field.value) return false;
|
|
57
|
+
field.value = text;
|
|
56
58
|
try {
|
|
57
|
-
|
|
59
|
+
field.setSelectionRange(caret, caret);
|
|
58
60
|
} catch {
|
|
59
61
|
}
|
|
60
62
|
return true;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { computed, toValue } from "vue";
|
|
2
|
+
import { isElement } from "./realm.js";
|
|
2
3
|
const DEFAULT_MASK_TOKENS = {
|
|
3
4
|
"0": /\d/,
|
|
4
5
|
a: new RegExp("\\p{L}", "u"),
|
|
@@ -115,6 +116,7 @@ function maskDelete(value, caret, direction, options) {
|
|
|
115
116
|
chars.splice(index, 1);
|
|
116
117
|
return applyMask(chars.join(""), { ...options, caret: index, fromRaw: true });
|
|
117
118
|
}
|
|
119
|
+
const isInput = (target) => isElement(target) && target.tagName === "INPUT";
|
|
118
120
|
function useInputMask(options) {
|
|
119
121
|
const spec = computed(() => {
|
|
120
122
|
const mask = toValue(options.mask);
|
|
@@ -138,7 +140,7 @@ function useInputMask(options) {
|
|
|
138
140
|
function onBeforeInput(event) {
|
|
139
141
|
const s = spec.value;
|
|
140
142
|
const el = event.target;
|
|
141
|
-
if (!s || event.isComposing || !(el
|
|
143
|
+
if (!s || event.isComposing || !isInput(el)) return;
|
|
142
144
|
const backward = event.inputType === "deleteContentBackward";
|
|
143
145
|
if (!backward && event.inputType !== "deleteContentForward") return;
|
|
144
146
|
const start = el.selectionStart;
|
|
@@ -153,11 +155,11 @@ function useInputMask(options) {
|
|
|
153
155
|
commit(el, applyMask(el.value, { ...s, caret: el.selectionStart ?? el.value.length }));
|
|
154
156
|
}
|
|
155
157
|
function onInput(event) {
|
|
156
|
-
if (event.isComposing || !(event.target
|
|
158
|
+
if (event.isComposing || !isInput(event.target)) return;
|
|
157
159
|
reformat(event.target);
|
|
158
160
|
}
|
|
159
161
|
function onCompositionEnd(event) {
|
|
160
|
-
if (event.target
|
|
162
|
+
if (isInput(event.target)) reformat(event.target);
|
|
161
163
|
}
|
|
162
164
|
return { active: computed(() => !!spec.value), format, onBeforeInput, onInput, onCompositionEnd };
|
|
163
165
|
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref, type ShallowRef } from "vue";
|
|
2
|
+
import type { ChartAnnotation } from "../components/chart";
|
|
3
|
+
import type { ChartRange } from "../components/chartWindow";
|
|
4
|
+
import { type LogId, type LogTimeRange } from "../components/logTools";
|
|
5
|
+
import { type PipelineStep } from "../components/pipeline";
|
|
6
|
+
export type LinkedId = string | number;
|
|
7
|
+
export interface LinkedEntity {
|
|
8
|
+
id: LinkedId;
|
|
9
|
+
kind?: string;
|
|
10
|
+
}
|
|
11
|
+
/** A point of interest on the shared timeline, such as a log line. */
|
|
12
|
+
export interface LinkedMoment {
|
|
13
|
+
time: number | string;
|
|
14
|
+
label: string;
|
|
15
|
+
}
|
|
16
|
+
export interface LinkedView {
|
|
17
|
+
entity: ShallowRef<LinkedEntity | null>;
|
|
18
|
+
timeRange: ShallowRef<LogTimeRange | null>;
|
|
19
|
+
moment: ShallowRef<LinkedMoment | null>;
|
|
20
|
+
traceId: Ref<string | null>;
|
|
21
|
+
select(entity: LinkedEntity | null): void;
|
|
22
|
+
clear(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare function createLinkedView(): LinkedView;
|
|
25
|
+
/** Shares a view with everything below the calling component. */
|
|
26
|
+
export declare function provideLinkedView(view?: LinkedView): LinkedView;
|
|
27
|
+
/** The view provided above; a private one with none, so a panel works alone. */
|
|
28
|
+
export declare function useLinkedView(): LinkedView;
|
|
29
|
+
interface LinkOptions {
|
|
30
|
+
/** The sort of entity this component shows. Unset answers to any. */
|
|
31
|
+
kind?: string;
|
|
32
|
+
}
|
|
33
|
+
/** v-bind for LpTable: single selection, whatever the table's `selected` held before. */
|
|
34
|
+
export declare function linkTable(view: LinkedView, options?: LinkOptions): import("vue").ComputedRef<{
|
|
35
|
+
selected: LinkedId[];
|
|
36
|
+
"onUpdate:selected": (keys: LinkedId[]) => void;
|
|
37
|
+
}>;
|
|
38
|
+
/** What linkTopology drives: LpTopologyCanvas's exposed `focusNode`. */
|
|
39
|
+
export interface LinkedCanvas {
|
|
40
|
+
focusNode(id: string, options?: {
|
|
41
|
+
keepFocus?: boolean;
|
|
42
|
+
}): Promise<boolean>;
|
|
43
|
+
}
|
|
44
|
+
/** v-bind for LpTopologyCanvas; `canvas` is its template ref, focused on a selection from elsewhere. */
|
|
45
|
+
export declare function linkTopology(view: LinkedView, canvas: Ref<LinkedCanvas | null>, options?: LinkOptions): import("vue").ComputedRef<{
|
|
46
|
+
onNodeSelect: (id: string) => void;
|
|
47
|
+
}>;
|
|
48
|
+
export interface LinkLogOptions extends LinkOptions {
|
|
49
|
+
/** The log sources of an entity. Defaults to its id. */
|
|
50
|
+
sourcesOf?: (entity: LinkedEntity) => string[];
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* v-bind for LpLogViewer. The filters the selection and the trace set stay
|
|
54
|
+
* local, so the viewer's own chips and search box go on working; typing over a
|
|
55
|
+
* followed trace stops following it. Picking a line marks it on the timeline.
|
|
56
|
+
*/
|
|
57
|
+
export declare function linkLog(view: LinkedView, options?: LinkLogOptions): import("vue").ComputedRef<{
|
|
58
|
+
sources: string[];
|
|
59
|
+
search: string;
|
|
60
|
+
highlight: string;
|
|
61
|
+
filterMatches: boolean;
|
|
62
|
+
timeRange: LogTimeRange | undefined;
|
|
63
|
+
"onUpdate:sources": (next: string[]) => string[];
|
|
64
|
+
"onUpdate:search": (next: string) => void;
|
|
65
|
+
onSelect: ({ line }: {
|
|
66
|
+
line: {
|
|
67
|
+
time?: number | string;
|
|
68
|
+
message: string;
|
|
69
|
+
};
|
|
70
|
+
}) => void;
|
|
71
|
+
onIdClick: ({ value }: {
|
|
72
|
+
kind: LogId["kind"];
|
|
73
|
+
value: string;
|
|
74
|
+
}) => string;
|
|
75
|
+
}>;
|
|
76
|
+
export interface LinkChartOptions {
|
|
77
|
+
/** The time of each point, oldest first, in step with the chart's `labels`. */
|
|
78
|
+
times: MaybeRefOrGetter<readonly (number | string)[]>;
|
|
79
|
+
/** The chart's own annotations, kept beside the linked one. */
|
|
80
|
+
annotations?: MaybeRefOrGetter<readonly ChartAnnotation[] | undefined>;
|
|
81
|
+
}
|
|
82
|
+
/** v-bind for LpChart: the shared time range is its window, the marked moment an annotation. */
|
|
83
|
+
export declare function linkChart(view: LinkedView, options: LinkChartOptions): import("vue").ComputedRef<{
|
|
84
|
+
range: ChartRange | null;
|
|
85
|
+
annotations: ChartAnnotation[];
|
|
86
|
+
"onUpdate:range": (next: ChartRange | null) => void;
|
|
87
|
+
}>;
|
|
88
|
+
export interface LinkPipelineOptions extends LinkOptions {
|
|
89
|
+
/** The steps on show; a getter, as they usually follow the selection. */
|
|
90
|
+
steps: MaybeRefOrGetter<readonly PipelineStep[]>;
|
|
91
|
+
}
|
|
92
|
+
/** v-bind for LpPipeline: selecting opens what failed, and the rows stay the reader's to toggle. */
|
|
93
|
+
export declare function linkPipeline(view: LinkedView, options: LinkPipelineOptions): import("vue").ComputedRef<{
|
|
94
|
+
expanded: string[];
|
|
95
|
+
"onUpdate:expanded": (next: string[]) => string[];
|
|
96
|
+
}>;
|
|
97
|
+
export {};
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { shallowRef, ref, computed, toValue, watch, provide, inject } from "vue";
|
|
2
|
+
import { inTimeRange, nearestByTime } from "../components/logTools.js";
|
|
3
|
+
import { stepKey } from "../components/pipeline.js";
|
|
4
|
+
function createLinkedView() {
|
|
5
|
+
const entity = shallowRef(null);
|
|
6
|
+
const timeRange = shallowRef(null);
|
|
7
|
+
const moment = shallowRef(null);
|
|
8
|
+
const traceId = ref(null);
|
|
9
|
+
return {
|
|
10
|
+
entity,
|
|
11
|
+
timeRange,
|
|
12
|
+
moment,
|
|
13
|
+
traceId,
|
|
14
|
+
// The same thing again is no change, so a binder echoing a selection back
|
|
15
|
+
// (a focused node reports itself selected) cannot start a loop.
|
|
16
|
+
select(next) {
|
|
17
|
+
const now = entity.value;
|
|
18
|
+
if (next?.id !== now?.id || next?.kind !== now?.kind) entity.value = next;
|
|
19
|
+
},
|
|
20
|
+
clear() {
|
|
21
|
+
entity.value = null;
|
|
22
|
+
timeRange.value = null;
|
|
23
|
+
moment.value = null;
|
|
24
|
+
traceId.value = null;
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
const LP_LINKED_VIEW = /* @__PURE__ */ Symbol.for("lp-linked-view");
|
|
29
|
+
function provideLinkedView(view = createLinkedView()) {
|
|
30
|
+
provide(LP_LINKED_VIEW, view);
|
|
31
|
+
return view;
|
|
32
|
+
}
|
|
33
|
+
function useLinkedView() {
|
|
34
|
+
return inject(LP_LINKED_VIEW, null) ?? createLinkedView();
|
|
35
|
+
}
|
|
36
|
+
const answersTo = (entity, kind) => !!entity && (kind === void 0 || entity.kind === kind);
|
|
37
|
+
function linkTable(view, options = {}) {
|
|
38
|
+
return computed(() => {
|
|
39
|
+
const entity = view.entity.value;
|
|
40
|
+
const current = answersTo(entity, options.kind) ? entity.id : null;
|
|
41
|
+
return {
|
|
42
|
+
selected: current === null ? [] : [current],
|
|
43
|
+
"onUpdate:selected": (keys) => {
|
|
44
|
+
const picked = keys.find((key) => key !== current) ?? keys[0];
|
|
45
|
+
view.select(picked === void 0 ? null : { id: picked, kind: options.kind });
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
function linkTopology(view, canvas, options = {}) {
|
|
51
|
+
watch(
|
|
52
|
+
view.entity,
|
|
53
|
+
(entity) => {
|
|
54
|
+
if (answersTo(entity, options.kind)) void canvas.value?.focusNode(String(entity.id), { keepFocus: true });
|
|
55
|
+
},
|
|
56
|
+
{ flush: "post" }
|
|
57
|
+
);
|
|
58
|
+
return computed(() => ({
|
|
59
|
+
onNodeSelect: (id) => view.select({ id, kind: options.kind })
|
|
60
|
+
}));
|
|
61
|
+
}
|
|
62
|
+
function linkLog(view, options = {}) {
|
|
63
|
+
const sourcesOf = options.sourcesOf ?? ((entity) => [String(entity.id)]);
|
|
64
|
+
const sources = shallowRef([]);
|
|
65
|
+
const search = ref("");
|
|
66
|
+
watch(view.entity, (entity) => sources.value = answersTo(entity, options.kind) ? sourcesOf(entity) : []);
|
|
67
|
+
watch(view.traceId, (id, old) => {
|
|
68
|
+
if (id !== null) search.value = id;
|
|
69
|
+
else if (search.value === old) search.value = "";
|
|
70
|
+
});
|
|
71
|
+
return computed(() => ({
|
|
72
|
+
sources: sources.value,
|
|
73
|
+
search: search.value,
|
|
74
|
+
// A viewer with no toolbar reads its term from here instead.
|
|
75
|
+
highlight: search.value,
|
|
76
|
+
// A search only marks its hits; a followed trace is meant to leave just its lines.
|
|
77
|
+
filterMatches: view.traceId.value !== null,
|
|
78
|
+
timeRange: view.timeRange.value ?? void 0,
|
|
79
|
+
"onUpdate:sources": (next) => sources.value = next,
|
|
80
|
+
"onUpdate:search": (next) => {
|
|
81
|
+
search.value = next;
|
|
82
|
+
if (next !== view.traceId.value) view.traceId.value = null;
|
|
83
|
+
},
|
|
84
|
+
onSelect: ({ line }) => {
|
|
85
|
+
view.moment.value = line.time === void 0 ? null : { time: line.time, label: line.message };
|
|
86
|
+
},
|
|
87
|
+
onIdClick: ({ value }) => view.traceId.value = value
|
|
88
|
+
}));
|
|
89
|
+
}
|
|
90
|
+
function linkChart(view, options) {
|
|
91
|
+
const rows = computed(() => toValue(options.times).map((time) => ({ time })));
|
|
92
|
+
return computed(() => {
|
|
93
|
+
const times = toValue(options.times);
|
|
94
|
+
const last = times.length - 1;
|
|
95
|
+
const shared = view.timeRange.value;
|
|
96
|
+
const moment = view.moment.value;
|
|
97
|
+
const onChart = !!moment && last >= 0 && inTimeRange(moment.time, { from: times[0], to: times[last] });
|
|
98
|
+
const range = shared && last >= 0 ? {
|
|
99
|
+
start: shared.from === void 0 ? 0 : Math.max(0, nearestByTime(rows.value, shared.from)),
|
|
100
|
+
end: shared.to === void 0 ? last : Math.max(0, nearestByTime(rows.value, shared.to))
|
|
101
|
+
} : null;
|
|
102
|
+
return {
|
|
103
|
+
range,
|
|
104
|
+
annotations: [
|
|
105
|
+
...toValue(options.annotations) ?? [],
|
|
106
|
+
...onChart ? [{ at: nearestByTime(rows.value, moment.time), label: moment.label }] : []
|
|
107
|
+
],
|
|
108
|
+
"onUpdate:range": (next) => {
|
|
109
|
+
view.timeRange.value = next && { from: times[next.start], to: times[next.end] };
|
|
110
|
+
}
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
function linkPipeline(view, options) {
|
|
115
|
+
const expanded = shallowRef([]);
|
|
116
|
+
const failedKeys = () => toValue(options.steps).flatMap((step, index) => step.status === "failed" ? [stepKey(step, index)] : []);
|
|
117
|
+
watch(
|
|
118
|
+
[view.entity, () => failedKeys().join("\0")],
|
|
119
|
+
([entity]) => {
|
|
120
|
+
if (!answersTo(entity, options.kind)) return;
|
|
121
|
+
expanded.value = [.../* @__PURE__ */ new Set([...expanded.value, ...failedKeys()])];
|
|
122
|
+
},
|
|
123
|
+
{ flush: "post" }
|
|
124
|
+
);
|
|
125
|
+
return computed(() => ({
|
|
126
|
+
expanded: expanded.value,
|
|
127
|
+
"onUpdate:expanded": (next) => expanded.value = next
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
export {
|
|
131
|
+
createLinkedView,
|
|
132
|
+
linkChart,
|
|
133
|
+
linkLog,
|
|
134
|
+
linkPipeline,
|
|
135
|
+
linkTable,
|
|
136
|
+
linkTopology,
|
|
137
|
+
provideLinkedView,
|
|
138
|
+
useLinkedView
|
|
139
|
+
};
|
|
@@ -13,7 +13,9 @@ type ToggleEmit = {
|
|
|
13
13
|
* Shared by LpSwitch and LpCheckbox so a setting saved from either behaves
|
|
14
14
|
* the same.
|
|
15
15
|
*/
|
|
16
|
-
export declare function useOptimisticToggle(action: () => ((value: boolean) => unknown) | undefined, emit: ToggleEmit
|
|
16
|
+
export declare function useOptimisticToggle(action: () => ((value: boolean) => unknown) | undefined, emit: ToggleEmit,
|
|
17
|
+
/** Puts back what a boolean cannot say: a checkbox's mixed state. */
|
|
18
|
+
rolledBack?: () => void): {
|
|
17
19
|
pending: import("vue").Ref<boolean, boolean>;
|
|
18
20
|
set: (value: boolean) => Promise<void>;
|
|
19
21
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { getCurrentInstance, ref } from "vue";
|
|
2
2
|
import { useToast } from "./useToast.js";
|
|
3
|
-
function useOptimisticToggle(action, emit) {
|
|
3
|
+
function useOptimisticToggle(action, emit, rolledBack) {
|
|
4
4
|
const toast = useToast();
|
|
5
5
|
const instance = getCurrentInstance();
|
|
6
6
|
const pending = ref(false);
|
|
@@ -15,6 +15,7 @@ function useOptimisticToggle(action, emit) {
|
|
|
15
15
|
emit("done", value);
|
|
16
16
|
} catch (error) {
|
|
17
17
|
emit("update:modelValue", !value);
|
|
18
|
+
rolledBack?.();
|
|
18
19
|
if (instance?.vnode.props?.onError) emit("error", error);
|
|
19
20
|
else toast.error(error instanceof Error ? error : String(error));
|
|
20
21
|
} finally {
|
|
@@ -26,6 +26,13 @@ export interface OverlayHistoryOptions {
|
|
|
26
26
|
navigated: () => void;
|
|
27
27
|
}
|
|
28
28
|
/** Wire an overlay's `open` to a history entry. */
|
|
29
|
+
/** The wiring of an overlay driven by a v-model: closing asks its guard first. */
|
|
30
|
+
export declare function useModelOverlayHistory(options: {
|
|
31
|
+
mode: OverlayHistoryOptions["mode"];
|
|
32
|
+
open: () => boolean;
|
|
33
|
+
setOpen: (open: boolean) => void;
|
|
34
|
+
allowClose: () => Promise<boolean>;
|
|
35
|
+
}): void;
|
|
29
36
|
export declare function useOverlayHistory(options: OverlayHistoryOptions): void;
|
|
30
37
|
export interface StepHistoryOptions {
|
|
31
38
|
/** The component's own `history` prop; `undefined` follows the overlay it sits in. */
|
|
@@ -1,11 +1,24 @@
|
|
|
1
|
-
import { inject,
|
|
2
|
-
import { isLive,
|
|
1
|
+
import { inject, onBeforeUnmount, provide, computed, toValue, watch, nextTick } from "vue";
|
|
2
|
+
import { isLive, dropEntry, setHistoryRouter, pushEntry } from "./overlayHistory.js";
|
|
3
3
|
const MODE = /* @__PURE__ */ Symbol("lp-overlay-history");
|
|
4
4
|
const SCOPE = /* @__PURE__ */ Symbol("lp-overlay-history-scope");
|
|
5
5
|
function provideOverlayHistory(mode = true, options = {}) {
|
|
6
6
|
provide(MODE, mode);
|
|
7
7
|
if (options.router) setHistoryRouter(options.router);
|
|
8
8
|
}
|
|
9
|
+
function useModelOverlayHistory(options) {
|
|
10
|
+
useOverlayHistory({
|
|
11
|
+
mode: options.mode,
|
|
12
|
+
open: options.open,
|
|
13
|
+
close: async () => {
|
|
14
|
+
if (!await options.allowClose()) return false;
|
|
15
|
+
options.setOpen(false);
|
|
16
|
+
return true;
|
|
17
|
+
},
|
|
18
|
+
reopen: () => options.setOpen(true),
|
|
19
|
+
navigated: () => options.setOpen(false)
|
|
20
|
+
});
|
|
21
|
+
}
|
|
9
22
|
function useOverlayHistory(options) {
|
|
10
23
|
const inherited = inject(MODE, false);
|
|
11
24
|
const mode = computed(() => options.mode() ?? toValue(inherited));
|
|
@@ -79,6 +92,7 @@ function useStepHistory(options) {
|
|
|
79
92
|
}
|
|
80
93
|
export {
|
|
81
94
|
provideOverlayHistory,
|
|
95
|
+
useModelOverlayHistory,
|
|
82
96
|
useOverlayHistory,
|
|
83
97
|
useStepHistory
|
|
84
98
|
};
|