@leavepulse/ui 0.77.2 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
- package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
- package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
- package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
- package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
- package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
- package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
- package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
- package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
- package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
- package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
- package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
- package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
- package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
- package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
- package/dist/chunks/{LpAddressInput-sYMvYzcY.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
- package/dist/chunks/{LpAutocomplete-DOu7FN5P.js → LpAutocomplete-DkY6CSyD.js} +26 -42
- package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
- package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
- package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
- package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
- package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
- package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
- package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
- package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
- package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
- package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
- package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
- package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
- package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
- package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
- package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
- package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
- package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
- package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
- package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
- package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
- package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
- package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
- package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
- package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
- package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
- package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
- package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
- package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
- package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
- package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
- package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
- package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
- package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
- package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
- package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
- package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
- package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
- package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
- package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
- package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
- package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
- package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
- package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
- package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
- package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
- package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
- package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
- package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
- package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
- package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
- package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
- package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
- package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
- package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
- package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
- package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
- package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
- package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
- package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
- package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
- package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
- package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
- package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
- package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
- package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
- package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
- package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
- package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
- package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
- package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
- package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
- package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
- package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AppShellContextNav.vue.d.ts +13 -0
- package/dist/components/AppShellContextNav.vue.js +4 -0
- package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
- package/dist/components/ChartRangeSelector.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.js +1 -1
- package/dist/components/IconCloseButton.vue.d.ts +7 -0
- package/dist/components/IconCloseButton.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +110 -2
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBottomNav.vue.d.ts +5 -0
- package/dist/components/LpBottomNav.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +14 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +74 -2
- package/dist/components/LpChart.vue.js +326 -85
- package/dist/components/LpCheckbox.vue.d.ts +6 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.js +1 -1
- package/dist/components/LpCollapse.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +8 -0
- package/dist/components/LpCommandPalette.vue.js +107 -56
- package/dist/components/LpCommandScope.vue.js +1 -1
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpContextSwitcher.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpDataList.vue.d.ts +1 -1
- package/dist/components/LpDataList.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +3 -15
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.js +21 -18
- package/dist/components/LpDrawer.vue.d.ts +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +14 -11
- package/dist/components/LpEditable.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.d.ts +96 -6
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.js +1 -1
- package/dist/components/LpGauge.vue.d.ts +1 -1
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +2 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +7 -6
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +1 -1
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpInspector.vue.d.ts +87 -0
- package/dist/components/LpInspector.vue.js +4 -0
- package/dist/components/LpLightbox.vue.d.ts +8 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +1 -1
- package/dist/components/LpLoader.vue.js +1 -1
- package/dist/components/LpLogInspector.vue.d.ts +18 -0
- package/dist/components/LpLogInspector.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.d.ts +93 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +4 -2
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +5 -5
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +2 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPaletteTheme.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +2 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +4 -0
- package/dist/components/LpPipeline.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +7 -3
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +1 -1
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.js +1 -1
- package/dist/components/LpRepeater.vue.js +1 -1
- package/dist/components/LpRevealOnScroll.vue.js +1 -1
- package/dist/components/LpScramble.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSecretField.vue.js +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.js +1 -1
- package/dist/components/LpShift.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.d.ts +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -1
- package/dist/components/LpSpotlight.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.js +1 -1
- package/dist/components/LpStepMark.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTabFace.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +132 -0
- package/dist/components/LpTable.vue.js +547 -135
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +6 -5
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +2 -0
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.js +1 -1
- package/dist/components/LpTypewriter.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/LpWindow.vue.d.ts +99 -0
- package/dist/components/LpWindow.vue.js +4 -0
- package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
- package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.js +1 -1
- package/dist/components/PickerField.vue.d.ts +2 -2
- package/dist/components/PickerField.vue.js +1 -1
- package/dist/components/RevealToggle.vue.js +1 -1
- package/dist/components/SliderRail.vue.d.ts +3 -0
- package/dist/components/SliderRail.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/address.js +2 -1
- package/dist/components/appShell.d.ts +36 -0
- package/dist/components/appShell.js +30 -0
- package/dist/components/calendar.d.ts +12 -3
- package/dist/components/calendar.js +2 -5
- package/dist/components/chart.d.ts +21 -0
- package/dist/components/chart.js +4 -3
- package/dist/components/chartWindow.d.ts +57 -0
- package/dist/components/chartWindow.js +136 -0
- package/dist/components/color.js +1 -1
- package/dist/components/commandPalette.d.ts +16 -2
- package/dist/components/commandPalette.js +39 -4
- package/dist/components/controlSize.d.ts +5 -0
- package/dist/components/controlSize.js +8 -0
- package/dist/components/dropdown.d.ts +5 -0
- package/dist/components/dropdown.js +2 -0
- package/dist/components/exportData.d.ts +6 -1
- package/dist/components/exportData.js +25 -18
- package/dist/components/fileTree.d.ts +67 -0
- package/dist/components/fileTree.js +141 -1
- package/dist/components/identicon.js +3 -2
- package/dist/components/logTools.d.ts +93 -0
- package/dist/components/logTools.js +210 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.js +2 -1
- package/dist/components/pipeline.d.ts +2 -0
- package/dist/components/pipeline.js +5 -0
- package/dist/components/relativeTime.js +2 -1
- package/dist/components/reveal.js +2 -1
- package/dist/components/select.d.ts +5 -0
- package/dist/components/select.js +10 -0
- package/dist/components/sidebar.d.ts +1 -0
- package/dist/components/tableFeatures.d.ts +58 -0
- package/dist/components/tableFeatures.js +87 -0
- package/dist/components/topologyGraph.d.ts +164 -0
- package/dist/components/topologyGraph.js +416 -0
- package/dist/components/tour.js +5 -3
- package/dist/components/videoBackdrop.js +7 -6
- package/dist/composables/clamp.d.ts +2 -0
- package/dist/composables/clamp.js +4 -0
- package/dist/composables/devWarn.d.ts +3 -0
- package/dist/composables/devWarn.js +14 -0
- package/dist/composables/easing.d.ts +13 -4
- package/dist/composables/easing.js +16 -10
- package/dist/composables/overlayHistory.js +14 -1
- package/dist/composables/pointerDrag.d.ts +15 -0
- package/dist/composables/pointerDrag.js +40 -0
- package/dist/composables/propCheck.d.ts +10 -0
- package/dist/composables/propCheck.js +78 -0
- package/dist/composables/realm.d.ts +6 -0
- package/dist/composables/realm.js +23 -0
- package/dist/composables/scroll.js +4 -2
- package/dist/composables/scrollMemory.d.ts +12 -1
- package/dist/composables/scrollMemory.js +36 -12
- package/dist/composables/spatialNav.js +2 -1
- package/dist/composables/textEntry.d.ts +17 -0
- package/dist/composables/textEntry.js +19 -0
- package/dist/composables/useAsyncTask.d.ts +6 -0
- package/dist/composables/useChartSync.d.ts +5 -0
- package/dist/composables/useChartSync.js +33 -0
- package/dist/composables/useCloseGuard.d.ts +3 -1
- package/dist/composables/useCloseGuard.js +6 -3
- package/dist/composables/useCommands.d.ts +50 -0
- package/dist/composables/useCommands.js +66 -0
- package/dist/composables/useField.d.ts +37 -0
- package/dist/composables/useField.js +27 -2
- package/dist/composables/useFitScale.js +4 -1
- package/dist/composables/useFormDraft.d.ts +13 -2
- package/dist/composables/useFormDraft.js +17 -9
- package/dist/composables/useHintSystem.js +2 -2
- package/dist/composables/useHotkeys.js +11 -32
- package/dist/composables/useInView.js +2 -1
- package/dist/composables/useInputFilter.js +7 -5
- package/dist/composables/useInputMask.js +5 -3
- package/dist/composables/useLinkedView.d.ts +97 -0
- package/dist/composables/useLinkedView.js +139 -0
- package/dist/composables/useOptimisticToggle.d.ts +3 -1
- package/dist/composables/useOptimisticToggle.js +2 -1
- package/dist/composables/useOverlayHistory.d.ts +7 -0
- package/dist/composables/useOverlayHistory.js +16 -2
- package/dist/composables/usePaintSelect.js +18 -14
- package/dist/composables/usePaletteCommands.d.ts +7 -0
- package/dist/composables/usePaletteCommands.js +12 -1
- package/dist/composables/usePersisted.d.ts +10 -0
- package/dist/composables/usePersisted.js +1 -1
- package/dist/composables/usePillTransition.d.ts +2 -2
- package/dist/composables/usePillTransition.js +5 -5
- package/dist/composables/useResizeObserver.js +2 -1
- package/dist/composables/useReveal.js +2 -1
- package/dist/composables/useRovingFocus.d.ts +2 -2
- package/dist/composables/useRovingFocus.js +9 -11
- package/dist/composables/useScramble.js +7 -1
- package/dist/composables/useShift.js +8 -6
- package/dist/composables/useTilt.js +2 -1
- package/dist/composables/useTween.js +9 -5
- package/dist/composables/useView.d.ts +1 -0
- package/dist/composables/useView.js +14 -2
- package/dist/composables/useZoomPan.js +2 -4
- package/dist/composables/windowing.d.ts +40 -0
- package/dist/composables/windowing.js +118 -0
- package/dist/icons-all.js +1 -1
- package/dist/icons.d.ts +4 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.js +310 -264
- package/dist/layout/tree.js +19 -15
- package/dist/layout/useLayout.d.ts +2 -0
- package/dist/layout/useLayout.js +5 -1
- package/dist/layout/useWorkspaces.d.ts +52 -0
- package/dist/layout/useWorkspaces.js +140 -0
- package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
- package/dist/theme/config.js +25 -0
- package/dist/theme/define.js +61 -0
- package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
- package/dist/theme/presets.js +239 -0
- package/dist/theme/studio.js +134 -0
- package/dist/theme/tokens.js +63 -0
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.js +325 -0
- package/package.json +8 -1
- package/src/component-names.ts +5 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/IconCloseButton.vue +21 -0
- package/src/components/LayoutCanvas.vue +3 -0
- package/src/components/LayoutNode.vue +37 -38
- package/src/components/LpActivityLine.vue +4 -2
- package/src/components/LpAddressInput.vue +3 -3
- package/src/components/LpAppShell.vue +362 -24
- package/src/components/LpAutocomplete.vue +18 -30
- package/src/components/LpBottomNav.vue +9 -1
- package/src/components/LpBreadcrumbs.vue +2 -1
- package/src/components/LpButton.vue +11 -4
- package/src/components/LpChart.vue +336 -37
- package/src/components/LpCheckbox.vue +43 -9
- package/src/components/LpCodeBlock.vue +17 -23
- package/src/components/LpCollapse.vue +5 -4
- package/src/components/LpColorPicker.vue +8 -9
- package/src/components/LpCommandPalette.vue +133 -50
- package/src/components/LpContextMenu.vue +15 -13
- package/src/components/LpCountdown.vue +2 -1
- package/src/components/LpDataList.vue +13 -1
- package/src/components/LpDatePicker.vue +5 -17
- package/src/components/LpDateRangePicker.vue +5 -16
- package/src/components/LpDock.vue +25 -16
- package/src/components/LpDrawer.vue +70 -61
- package/src/components/LpDropdownMenu.vue +6 -10
- package/src/components/LpDropzone.vue +12 -7
- package/src/components/LpEditable.vue +6 -2
- package/src/components/LpFileTree.vue +507 -66
- package/src/components/LpFileTreeNode.vue +106 -5
- package/src/components/LpFormField.vue +1 -1
- package/src/components/LpFrame.vue +33 -13
- package/src/components/LpHoverCard.vue +30 -5
- package/src/components/LpIcon.vue +6 -2
- package/src/components/LpIdenticon.vue +2 -1
- package/src/components/LpImageEditor.vue +5 -2
- package/src/components/LpInput.vue +15 -23
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLightbox.vue +74 -29
- package/src/components/LpLogInspector.vue +85 -0
- package/src/components/LpLogViewer.vue +239 -29
- package/src/components/LpMapPicker.vue +2 -1
- package/src/components/LpMasonry.vue +8 -5
- package/src/components/LpModal.vue +12 -12
- package/src/components/LpModalNav.vue +2 -21
- package/src/components/LpNumberField.vue +6 -15
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPagination.vue +5 -3
- package/src/components/LpPhoneInput.vue +8 -19
- package/src/components/LpPie.vue +25 -23
- package/src/components/LpPipeline.vue +14 -1
- package/src/components/LpPopover.vue +23 -2
- package/src/components/LpProgress.vue +2 -1
- package/src/components/LpRadioGroup.vue +2 -2
- package/src/components/LpRangeSlider.vue +5 -6
- package/src/components/LpRevealOnScroll.vue +1 -1
- package/src/components/LpScrollArea.vue +28 -11
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpShaderBackdrop.vue +12 -9
- package/src/components/LpShift.vue +18 -15
- package/src/components/LpSidebar.vue +77 -74
- package/src/components/LpSidebarNav.vue +3 -2
- package/src/components/LpSidebarRow.vue +2 -1
- package/src/components/LpSlider.vue +5 -6
- package/src/components/LpSpotlight.vue +2 -1
- package/src/components/LpSwitch.vue +5 -3
- package/src/components/LpTable.vue +609 -93
- package/src/components/LpTableFilter.vue +1 -1
- package/src/components/LpTableOfContents.vue +16 -9
- package/src/components/LpTabs.vue +2 -1
- package/src/components/LpTagsInput.vue +12 -19
- package/src/components/LpTextarea.vue +5 -11
- package/src/components/LpThemeProvider.vue +29 -13
- package/src/components/LpTimeField.vue +4 -7
- package/src/components/LpToaster.vue +7 -6
- package/src/components/LpTooltip.vue +62 -18
- package/src/components/LpTopologyCanvas.vue +567 -42
- package/src/components/LpTour.vue +7 -5
- package/src/components/LpTruncate.vue +4 -3
- package/src/components/LpTypewriter.vue +2 -1
- package/src/components/LpVideoBackdrop.vue +11 -13
- package/src/components/LpWindow.vue +373 -0
- package/src/components/LpWorkspaceSwitcher.vue +116 -0
- package/src/components/PickerField.vue +2 -2
- package/src/components/SliderRail.vue +10 -0
- package/src/components/address.ts +3 -1
- package/src/components/appShell.ts +74 -0
- package/src/components/calendar.ts +12 -5
- package/src/components/chart.ts +27 -3
- package/src/components/chartWindow.ts +198 -0
- package/src/components/color.ts +2 -1
- package/src/components/commandPalette.ts +66 -5
- package/src/components/controlSize.ts +6 -0
- package/src/components/dropdown.ts +3 -0
- package/src/components/exportData.ts +33 -18
- package/src/components/fileTree.ts +215 -0
- package/src/components/identicon.ts +4 -2
- package/src/components/logTools.ts +298 -0
- package/src/components/meter.ts +2 -1
- package/src/components/pipeline.ts +6 -0
- package/src/components/relativeTime.ts +2 -1
- package/src/components/reveal.ts +3 -1
- package/src/components/select.ts +14 -0
- package/src/components/sidebar.ts +1 -0
- package/src/components/tableFeatures.ts +149 -0
- package/src/components/topologyGraph.ts +655 -0
- package/src/components/tour.ts +5 -3
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/clamp.ts +2 -0
- package/src/composables/devWarn.ts +19 -0
- package/src/composables/easing.ts +37 -12
- package/src/composables/overlayHistory.ts +24 -0
- package/src/composables/pointerDrag.ts +54 -0
- package/src/composables/propCheck.ts +90 -0
- package/src/composables/realm.ts +25 -0
- package/src/composables/scroll.ts +4 -2
- package/src/composables/scrollMemory.ts +56 -14
- package/src/composables/spatialNav.ts +2 -1
- package/src/composables/textEntry.ts +33 -0
- package/src/composables/useAsyncTask.ts +6 -0
- package/src/composables/useChartSync.ts +52 -0
- package/src/composables/useCloseGuard.ts +22 -10
- package/src/composables/useCommands.ts +123 -0
- package/src/composables/useField.ts +41 -2
- package/src/composables/useFitScale.ts +4 -1
- package/src/composables/useFormDraft.ts +38 -14
- package/src/composables/useHintSystem.ts +2 -2
- package/src/composables/useHotkeys.ts +19 -48
- package/src/composables/useInView.ts +2 -1
- package/src/composables/useInputFilter.ts +8 -5
- package/src/composables/useInputMask.ts +8 -3
- package/src/composables/useLinkedView.ts +222 -0
- package/src/composables/useOptimisticToggle.ts +7 -1
- package/src/composables/useOverlayHistory.ts +20 -0
- package/src/composables/usePaintSelect.ts +20 -14
- package/src/composables/usePaletteCommands.ts +13 -0
- package/src/composables/usePersisted.ts +10 -0
- package/src/composables/usePillTransition.ts +9 -6
- package/src/composables/useResizeObserver.ts +2 -1
- package/src/composables/useReveal.ts +2 -1
- package/src/composables/useRovingFocus.ts +11 -14
- package/src/composables/useScramble.ts +12 -1
- package/src/composables/useShift.ts +8 -6
- package/src/composables/useTilt.ts +2 -1
- package/src/composables/useTween.ts +10 -5
- package/src/composables/useView.ts +17 -3
- package/src/composables/useZoomPan.ts +2 -5
- package/src/composables/windowing.ts +190 -0
- package/src/icons.ts +27 -6
- package/src/index.ts +41 -4
- package/src/kit-icons.ts +1 -1
- package/src/layout/tree.ts +31 -16
- package/src/layout/useLayout.ts +6 -0
- package/src/layout/useWorkspaces.ts +234 -0
- package/src/nuxt.ts +9 -1
- package/src/runtime/propCheck.plugin.ts +10 -0
- package/src/theme/studio.ts +7 -5
- package/src/theme/useTheme.ts +89 -15
- package/src/tokens/tokens.css +8 -1
- package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
- package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
- package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
- package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
- package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import "vue";
|
|
2
|
+
import { nodeWindow } from "./realm.js";
|
|
3
|
+
function startPointerDrag(event, handlers) {
|
|
4
|
+
const handle = event.currentTarget;
|
|
5
|
+
const body = nodeWindow(handle).document.body.style;
|
|
6
|
+
const { userSelect, cursor } = body;
|
|
7
|
+
let active = true;
|
|
8
|
+
const finish = (completed) => {
|
|
9
|
+
if (!active) return;
|
|
10
|
+
active = false;
|
|
11
|
+
handle.removeEventListener("pointermove", onMove);
|
|
12
|
+
handle.removeEventListener("pointerup", onUp);
|
|
13
|
+
handle.removeEventListener("pointercancel", onCancel);
|
|
14
|
+
handle.removeEventListener("lostpointercapture", onCancel);
|
|
15
|
+
body.userSelect = userSelect;
|
|
16
|
+
body.cursor = cursor;
|
|
17
|
+
handlers.end(completed);
|
|
18
|
+
};
|
|
19
|
+
function onMove(ev) {
|
|
20
|
+
if (ev.pointerId === event.pointerId) handlers.move(ev);
|
|
21
|
+
}
|
|
22
|
+
function onUp(ev) {
|
|
23
|
+
if (ev.pointerId === event.pointerId) finish(true);
|
|
24
|
+
}
|
|
25
|
+
function onCancel(ev) {
|
|
26
|
+
if (ev.pointerId === event.pointerId) finish(false);
|
|
27
|
+
}
|
|
28
|
+
event.preventDefault();
|
|
29
|
+
body.userSelect = "none";
|
|
30
|
+
if (handlers.cursor) body.cursor = handlers.cursor;
|
|
31
|
+
handle.setPointerCapture(event.pointerId);
|
|
32
|
+
handle.addEventListener("pointermove", onMove);
|
|
33
|
+
handle.addEventListener("pointerup", onUp);
|
|
34
|
+
handle.addEventListener("pointercancel", onCancel);
|
|
35
|
+
handle.addEventListener("lostpointercapture", onCancel);
|
|
36
|
+
return () => finish(false);
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
startPointerDrag
|
|
40
|
+
};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { Plugin } from "vue";
|
|
2
|
+
export interface PropCheckOptions {
|
|
3
|
+
/** Attributes that are not a mistake: exact names or patterns. */
|
|
4
|
+
ignore?: (string | RegExp)[];
|
|
5
|
+
/** Where a report goes. Defaults to console.warn. */
|
|
6
|
+
warn?: (message: string) => void;
|
|
7
|
+
}
|
|
8
|
+
/** The attributes no element under this component could take. */
|
|
9
|
+
export declare function unknownAttributes(attributes: string[], elements: Element[], ignore?: PropCheckOptions["ignore"]): string[];
|
|
10
|
+
export declare const lpPropCheck: Plugin<[PropCheckOptions?]>;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
const KIT_COMPONENT = /^Lp[A-Z]/;
|
|
2
|
+
const ALWAYS_ALLOWED = /^(data-|aria-|on[A-Z])/;
|
|
3
|
+
const GLOBAL_ATTRIBUTES = /* @__PURE__ */ new Set([
|
|
4
|
+
"accesskey",
|
|
5
|
+
"class",
|
|
6
|
+
"contenteditable",
|
|
7
|
+
"dir",
|
|
8
|
+
"draggable",
|
|
9
|
+
"enterkeyhint",
|
|
10
|
+
"for",
|
|
11
|
+
"hidden",
|
|
12
|
+
"id",
|
|
13
|
+
"inert",
|
|
14
|
+
"inputmode",
|
|
15
|
+
"is",
|
|
16
|
+
"key",
|
|
17
|
+
"lang",
|
|
18
|
+
"nonce",
|
|
19
|
+
"popover",
|
|
20
|
+
"ref",
|
|
21
|
+
"role",
|
|
22
|
+
"slot",
|
|
23
|
+
"spellcheck",
|
|
24
|
+
"style",
|
|
25
|
+
"tabindex",
|
|
26
|
+
"title",
|
|
27
|
+
"translate"
|
|
28
|
+
]);
|
|
29
|
+
const FORWARD_TARGETS = "input, textarea, select, button, a, img, form, label";
|
|
30
|
+
const propertiesByTag = /* @__PURE__ */ new Map();
|
|
31
|
+
function propertiesOf(el) {
|
|
32
|
+
let known = propertiesByTag.get(el.tagName);
|
|
33
|
+
if (!known) {
|
|
34
|
+
known = /* @__PURE__ */ new Set();
|
|
35
|
+
for (const name in el) known.add(name.toLowerCase());
|
|
36
|
+
propertiesByTag.set(el.tagName, known);
|
|
37
|
+
}
|
|
38
|
+
return known;
|
|
39
|
+
}
|
|
40
|
+
const normalized = (name) => name.replaceAll("-", "").toLowerCase();
|
|
41
|
+
function unknownAttributes(attributes, elements, ignore = []) {
|
|
42
|
+
return attributes.filter((name) => {
|
|
43
|
+
if (ALWAYS_ALLOWED.test(name) || GLOBAL_ATTRIBUTES.has(name.toLowerCase())) return false;
|
|
44
|
+
if (ignore.some((rule) => typeof rule === "string" ? rule === name : rule.test(name))) return false;
|
|
45
|
+
const key = normalized(name);
|
|
46
|
+
return !elements.some((el) => propertiesOf(el).has(key));
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
function renderedElements(instance) {
|
|
50
|
+
const root = instance.$el;
|
|
51
|
+
if (root?.nodeType !== 1) return [];
|
|
52
|
+
const el = root;
|
|
53
|
+
return [el, ...el.querySelectorAll(FORWARD_TARGETS)];
|
|
54
|
+
}
|
|
55
|
+
const lpPropCheck = {
|
|
56
|
+
install(app, options = {}) {
|
|
57
|
+
const warn = options.warn ?? ((message) => console.warn(message));
|
|
58
|
+
const reported = /* @__PURE__ */ new Set();
|
|
59
|
+
app.mixin({
|
|
60
|
+
mounted() {
|
|
61
|
+
const name = this.$options.__name;
|
|
62
|
+
if (!name || !KIT_COMPONENT.test(name)) return;
|
|
63
|
+
const attributes = Object.keys(this.$attrs);
|
|
64
|
+
if (!attributes.length) return;
|
|
65
|
+
for (const attribute of unknownAttributes(attributes, renderedElements(this), options.ignore)) {
|
|
66
|
+
const id = `${name}:${attribute}`;
|
|
67
|
+
if (reported.has(id)) continue;
|
|
68
|
+
reported.add(id);
|
|
69
|
+
warn(`[@leavepulse/ui] <${name}> has no prop "${attribute}". Props: ${Object.keys(this.$props).join(", ")}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
export {
|
|
76
|
+
lpPropCheck,
|
|
77
|
+
unknownAttributes
|
|
78
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare function isNode(value: unknown): value is Node;
|
|
2
|
+
export declare function isElement(value: unknown): value is Element;
|
|
3
|
+
export declare function isInputElement(value: unknown): value is HTMLInputElement;
|
|
4
|
+
export declare function isHTMLElement(value: unknown): value is HTMLElement;
|
|
5
|
+
/** The window a node lives in, with that realm's constructors (`MouseEvent`, `ResizeObserver`). */
|
|
6
|
+
export declare function nodeWindow(node: Node): Window & typeof globalThis;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function isNode(value) {
|
|
2
|
+
return typeof value?.nodeType === "number";
|
|
3
|
+
}
|
|
4
|
+
function isElement(value) {
|
|
5
|
+
return value?.nodeType === 1;
|
|
6
|
+
}
|
|
7
|
+
function isInputElement(value) {
|
|
8
|
+
return isElement(value) && value.tagName === "INPUT";
|
|
9
|
+
}
|
|
10
|
+
function isHTMLElement(value) {
|
|
11
|
+
return isElement(value) && "style" in value;
|
|
12
|
+
}
|
|
13
|
+
function nodeWindow(node) {
|
|
14
|
+
const doc = node.nodeType === 9 ? node : node.ownerDocument;
|
|
15
|
+
return doc?.defaultView ?? globalThis;
|
|
16
|
+
}
|
|
17
|
+
export {
|
|
18
|
+
isElement,
|
|
19
|
+
isHTMLElement,
|
|
20
|
+
isInputElement,
|
|
21
|
+
isNode,
|
|
22
|
+
nodeWindow
|
|
23
|
+
};
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
+
import "vue";
|
|
2
|
+
import { nodeWindow } from "./realm.js";
|
|
1
3
|
const SCROLLS = /(auto|scroll|overlay)/;
|
|
2
4
|
function scrollParent(el, { axis = "y", self = false } = {}) {
|
|
3
5
|
for (let node = self ? el : el?.parentElement; node; node = node.parentElement) {
|
|
4
6
|
if (node === node.ownerDocument.body || node === node.ownerDocument.documentElement) return null;
|
|
5
|
-
const style = getComputedStyle(node);
|
|
7
|
+
const style = nodeWindow(node).getComputedStyle(node);
|
|
6
8
|
const y = axis !== "x" && SCROLLS.test(style.overflowY) && node.scrollHeight > node.clientHeight;
|
|
7
9
|
const x = axis !== "y" && SCROLLS.test(style.overflowX) && node.scrollWidth > node.clientWidth;
|
|
8
10
|
if (y || x) return node;
|
|
@@ -16,7 +18,7 @@ function atScrollEnd(el, slack = 2) {
|
|
|
16
18
|
return box.scrollTop + box.clientHeight >= box.scrollHeight - slack;
|
|
17
19
|
}
|
|
18
20
|
function scrollMarginTop(el) {
|
|
19
|
-
return Number.parseFloat(getComputedStyle(el).scrollMarginTop) || 0;
|
|
21
|
+
return Number.parseFloat(nodeWindow(el).getComputedStyle(el).scrollMarginTop) || 0;
|
|
20
22
|
}
|
|
21
23
|
function scrollToElement(el, { block = "nearest", behavior = "auto", margin = 0 } = {}) {
|
|
22
24
|
if (!el) return;
|
|
@@ -1 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
/** Records a position, dropping the address visited longest ago past `limit`. */
|
|
2
|
+
export declare function rememberPosition(store: Map<string, number>, key: string, top: number, limit?: number): void;
|
|
3
|
+
export declare function hashTargetId(value: string): string;
|
|
4
|
+
export declare function useScrollMemory(viewport: () => HTMLElement | null | undefined, path: () => string | undefined, hash: () => string | undefined,
|
|
5
|
+
/** Sets a second region's positions apart from the first's on the same address. */
|
|
6
|
+
scope?: string,
|
|
7
|
+
/**
|
|
8
|
+
* What covers the top of the viewport (a sticky header), in px: an anchor
|
|
9
|
+
* lands below it. Not scroll-padding-top on the document, which also makes
|
|
10
|
+
* the browser scroll the page whenever a control in that header takes focus.
|
|
11
|
+
*/
|
|
12
|
+
covered?: () => number): void;
|
|
@@ -1,15 +1,36 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
import { watch, nextTick, onMounted, onBeforeUnmount } from "vue";
|
|
2
3
|
import { scrollMarginTop } from "./scroll.js";
|
|
3
4
|
const SETTLE_MS = 1500;
|
|
4
5
|
const DIALOG_WAIT_MS = 2e3;
|
|
5
6
|
const SETTLE_STOP = ["wheel", "touchstart", "keydown", "pointerdown"];
|
|
7
|
+
const MAX_POSITIONS = 200;
|
|
6
8
|
const positions = /* @__PURE__ */ new Map();
|
|
7
|
-
function
|
|
8
|
-
|
|
9
|
+
function rememberPosition(store, key, top, limit = MAX_POSITIONS) {
|
|
10
|
+
store.delete(key);
|
|
11
|
+
store.set(key, top);
|
|
12
|
+
if (store.size > limit) store.delete(store.keys().next().value);
|
|
9
13
|
}
|
|
10
|
-
function
|
|
14
|
+
function isDocument(view) {
|
|
15
|
+
return view === view.ownerDocument.scrollingElement;
|
|
16
|
+
}
|
|
17
|
+
function frameTop(view) {
|
|
18
|
+
return isDocument(view) ? 0 : view.getBoundingClientRect().top;
|
|
19
|
+
}
|
|
20
|
+
function hashTargetId(value) {
|
|
21
|
+
const id = value.replace(/^#/, "");
|
|
22
|
+
try {
|
|
23
|
+
return decodeURIComponent(id);
|
|
24
|
+
} catch {
|
|
25
|
+
return id;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
function addressKey(scope) {
|
|
29
|
+
return `${scope}${location.pathname}${location.search}`;
|
|
30
|
+
}
|
|
31
|
+
function useScrollMemory(viewport, path, hash, scope = "", covered = () => 0) {
|
|
11
32
|
if (typeof window === "undefined") return;
|
|
12
|
-
let current = addressKey();
|
|
33
|
+
let current = addressKey(scope);
|
|
13
34
|
let shown = path();
|
|
14
35
|
let travelled = false;
|
|
15
36
|
let stopHold;
|
|
@@ -20,24 +41,23 @@ function useScrollMemory(viewport, path, hash) {
|
|
|
20
41
|
window.addEventListener("popstate", onPop);
|
|
21
42
|
function anchor(value) {
|
|
22
43
|
if (!value || value === "#") return null;
|
|
23
|
-
|
|
24
|
-
return document.getElementById(id);
|
|
44
|
+
return document.getElementById(hashTargetId(value));
|
|
25
45
|
}
|
|
26
46
|
function reach(value, behavior) {
|
|
27
47
|
const view = viewport();
|
|
28
48
|
const target = anchor(value);
|
|
29
49
|
if (!view || !target || !view.contains(target)) return false;
|
|
30
|
-
const top = target.getBoundingClientRect().top - view
|
|
50
|
+
const top = target.getBoundingClientRect().top - frameTop(view) + view.scrollTop - scrollMarginTop(target) - covered();
|
|
31
51
|
view.scrollTo({ top: Math.max(0, top), behavior });
|
|
32
52
|
return true;
|
|
33
53
|
}
|
|
34
54
|
function hold(land) {
|
|
35
55
|
stopHold?.();
|
|
36
56
|
const view = viewport();
|
|
37
|
-
const content = view
|
|
57
|
+
const content = view && (isDocument(view) ? view.ownerDocument.body : view.firstElementChild);
|
|
38
58
|
land();
|
|
39
59
|
if (!content) return;
|
|
40
|
-
const watcher = new ResizeObserver(land);
|
|
60
|
+
const watcher = new (nodeWindow(content)).ResizeObserver(land);
|
|
41
61
|
const timer = window.setTimeout(() => stop(), SETTLE_MS);
|
|
42
62
|
const stop = () => {
|
|
43
63
|
watcher.disconnect();
|
|
@@ -52,7 +72,7 @@ function useScrollMemory(viewport, path, hash) {
|
|
|
52
72
|
function arrive() {
|
|
53
73
|
const back = travelled;
|
|
54
74
|
travelled = false;
|
|
55
|
-
current = addressKey();
|
|
75
|
+
current = addressKey(scope);
|
|
56
76
|
shown = path();
|
|
57
77
|
const view = viewport();
|
|
58
78
|
if (!view) return;
|
|
@@ -75,7 +95,8 @@ function useScrollMemory(viewport, path, hash) {
|
|
|
75
95
|
const mine = ++pending;
|
|
76
96
|
const tick = () => {
|
|
77
97
|
if (mine !== pending) return;
|
|
78
|
-
const
|
|
98
|
+
const doc = viewport()?.ownerDocument ?? document;
|
|
99
|
+
const locked = doc.querySelector('[role="dialog"]') || nodeWindow(doc).getComputedStyle(doc.body).overflow === "hidden";
|
|
79
100
|
if (locked && performance.now() - since < DIALOG_WAIT_MS) requestAnimationFrame(tick);
|
|
80
101
|
else run();
|
|
81
102
|
};
|
|
@@ -85,7 +106,7 @@ function useScrollMemory(viewport, path, hash) {
|
|
|
85
106
|
path,
|
|
86
107
|
() => {
|
|
87
108
|
const view = viewport();
|
|
88
|
-
if (view) positions
|
|
109
|
+
if (view) rememberPosition(positions, current, view.scrollTop);
|
|
89
110
|
void nextTick(() => requestAnimationFrame(arrive));
|
|
90
111
|
},
|
|
91
112
|
{ flush: "pre" }
|
|
@@ -103,9 +124,12 @@ function useScrollMemory(viewport, path, hash) {
|
|
|
103
124
|
});
|
|
104
125
|
onBeforeUnmount(() => {
|
|
105
126
|
stopHold?.();
|
|
127
|
+
pending += 1;
|
|
106
128
|
window.removeEventListener("popstate", onPop);
|
|
107
129
|
});
|
|
108
130
|
}
|
|
109
131
|
export {
|
|
132
|
+
hashTargetId,
|
|
133
|
+
rememberPosition,
|
|
110
134
|
useScrollMemory
|
|
111
135
|
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
const SIDEWAYS_WEIGHT = 2;
|
|
2
3
|
function nextInDirection(from, candidates, direction) {
|
|
3
4
|
let best = -1;
|
|
@@ -62,7 +63,7 @@ function focusableIn(root) {
|
|
|
62
63
|
if (element.getAttribute("tabindex") === "-1" && !element.matches(ROVING_ITEMS)) return false;
|
|
63
64
|
const rect = element.getBoundingClientRect();
|
|
64
65
|
if (rect.width === 0 || rect.height === 0) return false;
|
|
65
|
-
const style = getComputedStyle(element);
|
|
66
|
+
const style = nodeWindow(element).getComputedStyle(element);
|
|
66
67
|
return style.visibility !== "hidden" && style.display !== "none";
|
|
67
68
|
});
|
|
68
69
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/** Where text can be typed, for a target that may sit inside one. */
|
|
2
|
+
export declare const TEXT_FIELD_SELECTOR = "input, textarea, [contenteditable]";
|
|
3
|
+
export interface TextEntryOptions {
|
|
4
|
+
/** Which `<input>` types count. Defaults to the ones that take typed text. */
|
|
5
|
+
inputType?: (type: string) => boolean;
|
|
6
|
+
/** A `<select>` counts too: it keeps letters and arrows for itself. */
|
|
7
|
+
select?: boolean;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Whether the event lands in something the user is typing into. Checked off the
|
|
11
|
+
* event target rather than `document.activeElement` so it stays right inside a
|
|
12
|
+
* dialog's focus trap, and by tag rather than class so a field of an LpFrame
|
|
13
|
+
* counts too.
|
|
14
|
+
*/
|
|
15
|
+
export declare function isTextEntry(target: EventTarget | null, options?: TextEntryOptions): boolean;
|
|
16
|
+
/** Whether the target is, or sits inside, what the selector names. */
|
|
17
|
+
export declare function inTextField(target: EventTarget | null, selector?: string): boolean;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { isHTMLElement, isElement } from "./realm.js";
|
|
2
|
+
const TYPED_INPUTS = /* @__PURE__ */ new Set(["text", "search", "email", "number", "password", "tel", "url"]);
|
|
3
|
+
const TEXT_FIELD_SELECTOR = "input, textarea, [contenteditable]";
|
|
4
|
+
function isTextEntry(target, options = {}) {
|
|
5
|
+
if (!isHTMLElement(target)) return false;
|
|
6
|
+
if (target.isContentEditable || target.tagName === "TEXTAREA") return true;
|
|
7
|
+
if (options.select && target.tagName === "SELECT") return true;
|
|
8
|
+
if (target.tagName !== "INPUT") return false;
|
|
9
|
+
const { type } = target;
|
|
10
|
+
return options.inputType ? options.inputType(type) : TYPED_INPUTS.has(type);
|
|
11
|
+
}
|
|
12
|
+
function inTextField(target, selector = TEXT_FIELD_SELECTOR) {
|
|
13
|
+
return isElement(target) && !!target.closest(selector);
|
|
14
|
+
}
|
|
15
|
+
export {
|
|
16
|
+
TEXT_FIELD_SELECTOR,
|
|
17
|
+
inTextField,
|
|
18
|
+
isTextEntry
|
|
19
|
+
};
|
|
@@ -6,6 +6,12 @@
|
|
|
6
6
|
* fresher one, and a response landing after the control moved on. The token
|
|
7
7
|
* guards both — the abort signal only asks the consumer to stop, it cannot
|
|
8
8
|
* promise they did.
|
|
9
|
+
*
|
|
10
|
+
* What is guarded is `apply` and `fail`, not the task: whatever it does past
|
|
11
|
+
* the point it honours the signal (a cache write after the fetch) still runs,
|
|
12
|
+
* and an error from a superseded run is dropped unseen. It is also one slot:
|
|
13
|
+
* a new `run` replaces the last, and `pending` speaks for the latest only, so
|
|
14
|
+
* independent requests each need their own `useAsyncTask`.
|
|
9
15
|
*/
|
|
10
16
|
export declare function useAsyncTask<T>(): {
|
|
11
17
|
pending: import("vue").Ref<boolean, boolean>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { computed, toValue, onScopeDispose, shallowRef } from "vue";
|
|
2
|
+
const SYNC_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:chart-sync");
|
|
3
|
+
const groups = globalThis[SYNC_KEY] ??= /* @__PURE__ */ new Map();
|
|
4
|
+
function groupOf(name) {
|
|
5
|
+
let group = groups.get(name);
|
|
6
|
+
if (!group) {
|
|
7
|
+
group = shallowRef(null);
|
|
8
|
+
groups.set(name, group);
|
|
9
|
+
}
|
|
10
|
+
return group;
|
|
11
|
+
}
|
|
12
|
+
function useChartSync(group) {
|
|
13
|
+
const owner = /* @__PURE__ */ Symbol("chart");
|
|
14
|
+
const shared = computed(() => {
|
|
15
|
+
const name = toValue(group);
|
|
16
|
+
return name ? groupOf(name) : null;
|
|
17
|
+
});
|
|
18
|
+
const peerLabel = computed(() => {
|
|
19
|
+
const hovered = shared.value?.value;
|
|
20
|
+
return hovered && hovered.owner !== owner ? hovered.label : null;
|
|
21
|
+
});
|
|
22
|
+
function publish(label) {
|
|
23
|
+
const target = shared.value;
|
|
24
|
+
if (!target) return;
|
|
25
|
+
if (label != null) target.value = { owner, label };
|
|
26
|
+
else if (target.value?.owner === owner) target.value = null;
|
|
27
|
+
}
|
|
28
|
+
onScopeDispose(() => publish(null));
|
|
29
|
+
return { peerLabel, publish };
|
|
30
|
+
}
|
|
31
|
+
export {
|
|
32
|
+
useChartSync
|
|
33
|
+
};
|
|
@@ -5,7 +5,9 @@ import { type MaybeRefOrGetter } from "vue";
|
|
|
5
5
|
* - `true`: there is something unsaved. Closing asks "Discard changes?" through
|
|
6
6
|
* the kit's confirm, and leaving the page asks the browser's own question.
|
|
7
7
|
* - a function: the app asks its own question (or saves first) and answers
|
|
8
|
-
* whether the window may close.
|
|
8
|
+
* whether the window may close. It covers the window's own ways out only:
|
|
9
|
+
* a browser cannot wait for it, so closing the tab or reloading goes
|
|
10
|
+
* unguarded. Only `true` raises the browser's question.
|
|
9
11
|
* - `false` / unset: nothing to lose, the window closes as always.
|
|
10
12
|
*
|
|
11
13
|
* Usually bound straight to a form's state: `:guard="form.dirty"`.
|
|
@@ -13,21 +13,24 @@ function useCloseGuard(guard, open, labelsOverride) {
|
|
|
13
13
|
labelsOverride
|
|
14
14
|
);
|
|
15
15
|
let asking = false;
|
|
16
|
+
let session = 0;
|
|
17
|
+
watch(() => !!toValue(open), () => session += 1, { flush: "sync" });
|
|
16
18
|
async function allowClose() {
|
|
17
19
|
const current = toValue(guard);
|
|
18
20
|
if (!current) return true;
|
|
19
21
|
if (asking) return false;
|
|
20
22
|
asking = true;
|
|
23
|
+
const mine = session;
|
|
21
24
|
try {
|
|
22
|
-
|
|
23
|
-
return await confirm({
|
|
25
|
+
const allowed = await (typeof current === "function" ? current() : confirm({
|
|
24
26
|
title: labels.value.title,
|
|
25
27
|
description: labels.value.description,
|
|
26
28
|
danger: true,
|
|
27
29
|
icon: "lucide:triangle-alert",
|
|
28
30
|
confirmLabel: labels.value.discard,
|
|
29
31
|
cancelLabel: labels.value.keep
|
|
30
|
-
});
|
|
32
|
+
}));
|
|
33
|
+
return allowed && mine === session;
|
|
31
34
|
} finally {
|
|
32
35
|
asking = false;
|
|
33
36
|
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter } from "vue";
|
|
2
|
+
import type { Command } from "../components/LpCommandPalette.vue";
|
|
3
|
+
import type { ContextMenuItemDef } from "../components/LpContextMenu.vue";
|
|
4
|
+
import { type HotkeyBinding, type ShortcutGroup, type UseHotkeysOptions } from "./useHotkeys";
|
|
5
|
+
import { type PaletteScope } from "./usePaletteCommands";
|
|
6
|
+
export interface AppCommand {
|
|
7
|
+
/** Stable: the palette keeps recents and pins by it. */
|
|
8
|
+
id: string;
|
|
9
|
+
label: string;
|
|
10
|
+
/** Section in the palette and in the key reference. */
|
|
11
|
+
group?: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
icon?: string;
|
|
14
|
+
keywords?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* Written as it reads: "Ctrl+K", "Shift+Alt+N", or spaces for a sequence,
|
|
17
|
+
* "G I". Binds the key and labels it in the palette, the menu and the reference.
|
|
18
|
+
*/
|
|
19
|
+
shortcut?: string;
|
|
20
|
+
/** Listed but not runnable: greyed in the palette and the menu, the key does nothing. */
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
/** Gone everywhere, key included. For what this user or this page cannot do at all. */
|
|
23
|
+
hidden?: boolean;
|
|
24
|
+
/** Marked as dangerous in a menu; the palette has no such mark. */
|
|
25
|
+
danger?: boolean;
|
|
26
|
+
/** The key also works while a text field has focus. */
|
|
27
|
+
allowInInput?: boolean;
|
|
28
|
+
/** The key also works while an overlay owns the keyboard. */
|
|
29
|
+
overLayers?: boolean;
|
|
30
|
+
run: () => unknown | Promise<unknown>;
|
|
31
|
+
}
|
|
32
|
+
/** What the palette lists for a command. */
|
|
33
|
+
export declare function commandToPalette(command: AppCommand): Command;
|
|
34
|
+
/** What a menu shows for a command: LpContextMenu and LpDropdownMenu take these. */
|
|
35
|
+
export declare function commandToMenuItem(command: AppCommand): ContextMenuItemDef;
|
|
36
|
+
/** The binding for a command, or null when it has no key. */
|
|
37
|
+
export declare function commandToHotkey(command: AppCommand): HotkeyBinding | null;
|
|
38
|
+
/** The key reference of these commands alone, in LpShortcutsDialog's shape. */
|
|
39
|
+
export declare function commandShortcuts(commands: readonly AppCommand[]): ShortcutGroup[];
|
|
40
|
+
export interface UseCommandsOptions extends Pick<UseHotkeysOptions, "enabled" | "priority" | "scope"> {
|
|
41
|
+
/** The palette scope to list in. Defaults to the one this component sits in. */
|
|
42
|
+
palette?: PaletteScope;
|
|
43
|
+
}
|
|
44
|
+
export declare function useCommands(commands: MaybeRefOrGetter<readonly AppCommand[]>, options?: UseCommandsOptions): {
|
|
45
|
+
commands: import("vue").ComputedRef<AppCommand[]>;
|
|
46
|
+
menuItems: import("vue").ComputedRef<ContextMenuItemDef[]>;
|
|
47
|
+
shortcuts: import("vue").ComputedRef<ShortcutGroup[]>;
|
|
48
|
+
/** Runs a command by id, unless it is disabled or hidden. Returns whether it ran. */
|
|
49
|
+
run(id: string): boolean;
|
|
50
|
+
};
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { computed, toValue } from "vue";
|
|
2
|
+
import { parseCombo, useHotkeys } from "./useHotkeys.js";
|
|
3
|
+
import { usePaletteCommands } from "./usePaletteCommands.js";
|
|
4
|
+
const DEFAULT_GROUP = "Commands";
|
|
5
|
+
const available = (commands) => commands.filter((command) => !command.hidden);
|
|
6
|
+
function commandToPalette(command) {
|
|
7
|
+
const { id, label, group, description, icon, keywords, shortcut, disabled, run } = command;
|
|
8
|
+
return { id, label, group, description, icon, keywords, shortcut, disabled, onSelect: run };
|
|
9
|
+
}
|
|
10
|
+
function commandToMenuItem(command) {
|
|
11
|
+
const { label, icon, shortcut, disabled, danger, run } = command;
|
|
12
|
+
return { label, icon, shortcut, disabled, danger, onSelect: () => void run() };
|
|
13
|
+
}
|
|
14
|
+
function commandToHotkey(command) {
|
|
15
|
+
const shortcut = command.shortcut?.trim();
|
|
16
|
+
if (!shortcut) return null;
|
|
17
|
+
const steps = shortcut.split(/\s+/).map(parseCombo);
|
|
18
|
+
const keys = steps.length > 1 ? { sequence: steps } : steps[0];
|
|
19
|
+
return {
|
|
20
|
+
...keys,
|
|
21
|
+
allowInInput: command.allowInInput,
|
|
22
|
+
overLayers: command.overLayers,
|
|
23
|
+
help: { group: command.group ?? DEFAULT_GROUP, label: command.label, combo: shortcut },
|
|
24
|
+
// A disabled command leaves the key alone, for the page or the browser.
|
|
25
|
+
handler: () => {
|
|
26
|
+
if (command.disabled) return false;
|
|
27
|
+
void command.run();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function commandShortcuts(commands) {
|
|
32
|
+
const groups = /* @__PURE__ */ new Map();
|
|
33
|
+
for (const command of available(commands)) {
|
|
34
|
+
if (!command.shortcut) continue;
|
|
35
|
+
const title = command.group ?? DEFAULT_GROUP;
|
|
36
|
+
const entries = groups.get(title) ?? [];
|
|
37
|
+
entries.push({ combo: command.shortcut, label: command.label });
|
|
38
|
+
groups.set(title, entries);
|
|
39
|
+
}
|
|
40
|
+
return [...groups].map(([title, entries]) => ({ title, entries }));
|
|
41
|
+
}
|
|
42
|
+
function useCommands(commands, options = {}) {
|
|
43
|
+
const { palette, ...hotkeys } = options;
|
|
44
|
+
const current = computed(() => available(toValue(commands)));
|
|
45
|
+
usePaletteCommands(() => current.value.map(commandToPalette), { scope: palette });
|
|
46
|
+
useHotkeys(() => current.value.flatMap((command) => commandToHotkey(command) ?? []), hotkeys);
|
|
47
|
+
return {
|
|
48
|
+
commands: current,
|
|
49
|
+
menuItems: computed(() => current.value.map(commandToMenuItem)),
|
|
50
|
+
shortcuts: computed(() => commandShortcuts(current.value)),
|
|
51
|
+
/** Runs a command by id, unless it is disabled or hidden. Returns whether it ran. */
|
|
52
|
+
run(id) {
|
|
53
|
+
const command = current.value.find((candidate) => candidate.id === id);
|
|
54
|
+
if (!command || command.disabled) return false;
|
|
55
|
+
void command.run();
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
export {
|
|
61
|
+
commandShortcuts,
|
|
62
|
+
commandToHotkey,
|
|
63
|
+
commandToMenuItem,
|
|
64
|
+
commandToPalette,
|
|
65
|
+
useCommands
|
|
66
|
+
};
|
|
@@ -21,6 +21,15 @@ export declare function provideField(context: ComputedRef<FieldContext>): void;
|
|
|
21
21
|
/** The nearest LpFormField's context, or null outside one. */
|
|
22
22
|
export declare function useField(): ComputedRef<FieldContext> | null;
|
|
23
23
|
export declare function fieldMessageId(id: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* The `aria-describedby` of a control: the consumer's own ids, the field's and
|
|
26
|
+
* whatever the control adds, each once. A template's explicit binding replaces
|
|
27
|
+
* what `v-bind` passed, undefined included, so every control merges here
|
|
28
|
+
* instead of dropping the consumer's description.
|
|
29
|
+
*/
|
|
30
|
+
export declare function mergeDescribedBy(...ids: unknown[]): string | undefined;
|
|
31
|
+
/** Is a boolean attribute that arrived through `$attrs` on? The same test Vue renders it by. */
|
|
32
|
+
export declare function isAttrOn(value: unknown): boolean;
|
|
24
33
|
export interface FieldControlState {
|
|
25
34
|
/** The control wraps itself in its own LpFormField (it has a label, hint or error prop). */
|
|
26
35
|
wrapped: boolean;
|
|
@@ -53,3 +62,31 @@ export declare function useFieldBlur(blur: (event: FocusEvent) => void): {
|
|
|
53
62
|
partId: string;
|
|
54
63
|
onFocusOut: (event: FocusEvent) => void;
|
|
55
64
|
};
|
|
65
|
+
/** What a control hands the FieldWrapper around it: its id, its texts, and the classes it takes from the app. */
|
|
66
|
+
export declare function fieldWrapperBinds(wrapped: boolean, field: {
|
|
67
|
+
id?: string;
|
|
68
|
+
}, props: {
|
|
69
|
+
label?: string;
|
|
70
|
+
hint?: string;
|
|
71
|
+
error?: string;
|
|
72
|
+
required?: boolean;
|
|
73
|
+
}, attrs: Record<string, unknown>): {
|
|
74
|
+
wrapped: boolean;
|
|
75
|
+
id: string | undefined;
|
|
76
|
+
label: string | undefined;
|
|
77
|
+
hint: string | undefined;
|
|
78
|
+
error: string | undefined;
|
|
79
|
+
required: boolean | undefined;
|
|
80
|
+
class: unknown;
|
|
81
|
+
style: unknown;
|
|
82
|
+
};
|
|
83
|
+
/** The state of a control that takes its id from the app and draws no wrapper of its own. */
|
|
84
|
+
export declare function useAttrsField(state: () => {
|
|
85
|
+
invalid?: boolean;
|
|
86
|
+
disabled?: boolean;
|
|
87
|
+
}): {
|
|
88
|
+
attrs: import("vue").Attrs;
|
|
89
|
+
field: ComputedRef<Omit<FieldContext, "id"> & {
|
|
90
|
+
id?: string;
|
|
91
|
+
}>;
|
|
92
|
+
};
|