@leavepulse/ui 0.77.3 → 0.78.1
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-CLLhd3WB.js} +2 -2
- package/dist/chunks/FieldLeading-mr81aEAP.js +27 -0
- 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-BSS49jpm.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BKbYCHkx.js +601 -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-DBqy4RLd.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-D3BUAhV1.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-COHzV68R.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-CnrmzkuN.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-CwbObVGH.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu-Bx_IhQDS.js} +17 -19
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-sAMvWeLP.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-CaVfsozH.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-DXNQFpAA.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-C-rJKzEQ.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-BgYn4U1J.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-CHE9jAJG.js} +29 -11
- 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-Bb5nbuFY.js} +19 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-D0O6dpuA.js} +32 -47
- package/dist/chunks/LpInspector-DO3fTCQ1.js +209 -0
- package/dist/chunks/{LpLaneNode-HtnQf2FF.js → LpLaneNode-Bqcdm8Rf.js} +19 -1
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-CtDTQV01.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-BdQlX6S-.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-umCZBapN.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-BYEwySoF.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DDvrSAnf.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-gOi1Giz1.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-DUbVyK6R.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-Csg-1Zh_.js} +25 -20
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/LpPageScrollbar-D2O0xhJw.js +164 -0
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-BIXpZLGe.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-D4HPhqfV.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-oVNHjsKD.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-BSXT6oUJ.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-0zI-44ve.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-CqvwfZs2.js} +31 -22
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-B2roc4Iz.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/{LpServiceNode-D8uJ8sGk.js → LpServiceNode-Cln2ntdw.js} +17 -0
- 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-DDNJzb69.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-CE0jQS8i.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-DOTg1txp.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-DPjc6_fX.js} +19 -6
- 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-B_XMOeAh.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-ChU0_Ga8.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-DmCZ21P_.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-Ct_ZOhCh.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-Bz_rrq5S.js} +56 -24
- package/dist/chunks/LpTopologyCanvas-jqz1KCq2.js +678 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-ellq9RYM.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BoxcCDVY.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-BeNHCLd5.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-D_iyrB8d.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/FieldLeading.vue.d.ts +16 -0
- package/dist/components/FieldLeading.vue.js +4 -0
- 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 +125 -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.d.ts +11 -2
- 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/LpLaneNode.vue.d.ts +2 -3
- package/dist/components/LpLaneNode.vue.js +1 -1
- 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.d.ts +13 -2
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPageScrollbar.vue.d.ts +10 -0
- package/dist/components/LpPageScrollbar.vue.js +4 -0
- 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/LpServiceNode.vue.d.ts +8 -2
- package/dist/components/LpServiceNode.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.d.ts +16 -0
- 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/scrollbar.d.ts +34 -0
- package/dist/components/scrollbar.js +47 -0
- 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 +89 -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 +16 -3
- 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 +31 -5
- package/dist/index.js +312 -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 +6 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/FieldLeading.vue +17 -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 +385 -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 +22 -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 +37 -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/LpInfraNode.vue +4 -3
- package/src/components/LpInput.vue +19 -26
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLaneNode.vue +5 -1
- 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 +13 -16
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPageScrollbar.vue +195 -0
- 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 +55 -34
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpServiceNode.vue +4 -2
- 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/LpStat.vue +25 -5
- 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 +69 -18
- package/src/components/LpTopologyCanvas.vue +569 -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/scrollbar.ts +71 -0
- 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 +105 -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 +18 -2
- 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 +42 -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,6 +1,7 @@
|
|
|
1
1
|
import { ref, toValue, onMounted, onBeforeUnmount, readonly } from "vue";
|
|
2
2
|
import { useHotkeys } from "./useHotkeys.js";
|
|
3
3
|
import { scrollParent } from "./scroll.js";
|
|
4
|
+
import { nodeWindow } from "./realm.js";
|
|
4
5
|
const HOLD_MS = 320;
|
|
5
6
|
const SLOP_PX = 8;
|
|
6
7
|
const EDGE_PX = 40;
|
|
@@ -23,8 +24,9 @@ function usePaintSelect(options) {
|
|
|
23
24
|
}
|
|
24
25
|
return out;
|
|
25
26
|
}
|
|
27
|
+
const hostWindow = () => options.root.value ? nodeWindow(options.root.value) : window;
|
|
26
28
|
function keyAt(x, y) {
|
|
27
|
-
const item =
|
|
29
|
+
const item = options.root.value?.ownerDocument.elementFromPoint(x, y)?.closest("[data-paint-key]");
|
|
28
30
|
if (!item || !options.root.value?.contains(item)) return void 0;
|
|
29
31
|
return resolve(item.dataset.paintKey ?? "");
|
|
30
32
|
}
|
|
@@ -45,11 +47,11 @@ function usePaintSelect(options) {
|
|
|
45
47
|
function tick() {
|
|
46
48
|
frame = 0;
|
|
47
49
|
if (!stroke) return;
|
|
48
|
-
const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom:
|
|
50
|
+
const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom: hostWindow().innerHeight };
|
|
49
51
|
const delta = stroke.y > box.bottom - EDGE_PX ? SCROLL_STEP : stroke.y < box.top + EDGE_PX ? -SCROLL_STEP : 0;
|
|
50
52
|
if (delta) {
|
|
51
53
|
if (stroke.scroller) stroke.scroller.scrollTop += delta;
|
|
52
|
-
else
|
|
54
|
+
else hostWindow().scrollBy(0, delta);
|
|
53
55
|
extend();
|
|
54
56
|
}
|
|
55
57
|
frame = requestAnimationFrame(tick);
|
|
@@ -61,7 +63,7 @@ function usePaintSelect(options) {
|
|
|
61
63
|
const before = new Set(options.selection());
|
|
62
64
|
stroke = { keys, anchor, paint: !before.has(key), before, x, y, scroller: scrollParent(options.root.value) };
|
|
63
65
|
painting.value = true;
|
|
64
|
-
|
|
66
|
+
hostWindow().getSelection()?.removeAllRanges();
|
|
65
67
|
if (options.root.value) options.root.value.style.userSelect = "none";
|
|
66
68
|
extend();
|
|
67
69
|
if (!frame) frame = requestAnimationFrame(tick);
|
|
@@ -138,22 +140,24 @@ function usePaintSelect(options) {
|
|
|
138
140
|
] : [],
|
|
139
141
|
{ scope: options.root }
|
|
140
142
|
);
|
|
143
|
+
let listening = null;
|
|
141
144
|
onMounted(() => {
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
145
|
+
listening = hostWindow();
|
|
146
|
+
listening.addEventListener("pointermove", onMove);
|
|
147
|
+
listening.addEventListener("pointerup", onUp);
|
|
148
|
+
listening.addEventListener("pointercancel", onUp);
|
|
149
|
+
listening.addEventListener("click", onClickCapture, true);
|
|
150
|
+
listening.addEventListener("contextmenu", onContextMenu, true);
|
|
147
151
|
options.root.value?.addEventListener("touchmove", onTouchMove, { passive: false });
|
|
148
152
|
});
|
|
149
153
|
onBeforeUnmount(() => {
|
|
150
154
|
onUp();
|
|
151
155
|
swallowClick = false;
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
156
|
+
listening?.removeEventListener("pointermove", onMove);
|
|
157
|
+
listening?.removeEventListener("pointerup", onUp);
|
|
158
|
+
listening?.removeEventListener("pointercancel", onUp);
|
|
159
|
+
listening?.removeEventListener("click", onClickCapture, true);
|
|
160
|
+
listening?.removeEventListener("contextmenu", onContextMenu, true);
|
|
157
161
|
options.root.value?.removeEventListener("touchmove", onTouchMove);
|
|
158
162
|
});
|
|
159
163
|
return { onPointerDown, painting: readonly(painting) };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { type Directive, type MaybeRefOrGetter } from "vue";
|
|
2
2
|
import type { Command } from "../components/LpCommandPalette.vue";
|
|
3
|
+
import type { ContextMenuItemDef } from "../components/LpContextMenu.vue";
|
|
3
4
|
export interface PaletteRegistration {
|
|
4
5
|
commands: () => readonly Command[];
|
|
5
6
|
priority: number;
|
|
@@ -30,6 +31,12 @@ export declare function usePaletteCommands(commands: MaybeRefOrGetter<readonly C
|
|
|
30
31
|
scope?: PaletteScope;
|
|
31
32
|
}): void;
|
|
32
33
|
/** Manual definitions override a discovered command without changing its place. */
|
|
34
|
+
/** A titled menu as one command of the palette, with its items inside. */
|
|
35
|
+
export declare function useMenuPalette(menu: {
|
|
36
|
+
palette?: PaletteControlOptions;
|
|
37
|
+
title?: string;
|
|
38
|
+
items: ContextMenuItemDef[];
|
|
39
|
+
}): void;
|
|
33
40
|
export declare function mergePaletteCommands(discovered: readonly Command[], manual: readonly Command[]): Command[];
|
|
34
41
|
export type PaletteControlOptions = false | {
|
|
35
42
|
id?: string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { inject, toValue, onScopeDispose, getCurrentInstance, ref, onMounted, onUpdated,
|
|
1
|
+
import { useId, inject, toValue, onScopeDispose, provide, getCurrentInstance, ref, onMounted, onUpdated, computed, h, shallowReactive, shallowRef } from "vue";
|
|
2
|
+
import { menuPaletteCommands } from "../components/commandPalette.js";
|
|
2
3
|
import { useField, provideField } from "./useField.js";
|
|
3
4
|
import { useLabels } from "./useLpConfig.js";
|
|
4
5
|
function uniqueCommands(commands) {
|
|
@@ -73,6 +74,15 @@ function usePaletteCommands(commands, options = {}) {
|
|
|
73
74
|
});
|
|
74
75
|
onScopeDispose(unregister);
|
|
75
76
|
}
|
|
77
|
+
function useMenuPalette(menu) {
|
|
78
|
+
const scope = usePaletteScope();
|
|
79
|
+
const generated = useId();
|
|
80
|
+
usePaletteCommands(() => {
|
|
81
|
+
if (menu.palette === false || !menu.title || !menu.items.length) return [];
|
|
82
|
+
const id = `${scope?.id}/${menu.palette?.id ?? generated}`;
|
|
83
|
+
return [{ id, label: menu.palette?.label ?? menu.title, children: menuPaletteCommands(menu.items, id) }];
|
|
84
|
+
}, { automatic: true });
|
|
85
|
+
}
|
|
76
86
|
function mergePaletteCommands(discovered, manual) {
|
|
77
87
|
const overrides = new Map(manual.map((command) => [command.id, command]));
|
|
78
88
|
return uniqueCommands([...discovered.map((command) => overrides.get(command.id) ?? command), ...manual]);
|
|
@@ -184,8 +194,10 @@ function usePaletteControl(options = {}) {
|
|
|
184
194
|
autofocus: void 0,
|
|
185
195
|
palette: false,
|
|
186
196
|
disabled: options.disabled?.() || !writable(),
|
|
187
|
-
|
|
188
|
-
|
|
197
|
+
// Only to a control that declares them: elsewhere they fell through
|
|
198
|
+
// as attributes onto its root (a switch's button took `required`).
|
|
199
|
+
..."invalid" in instance.props ? { invalid: options.invalid?.() } : {},
|
|
200
|
+
..."required" in instance.props ? { required: field?.value.required ?? instance.props.required } : {},
|
|
189
201
|
"aria-label": label(),
|
|
190
202
|
class: "w-full",
|
|
191
203
|
style: void 0
|
|
@@ -219,6 +231,7 @@ export {
|
|
|
219
231
|
mergePaletteCommands,
|
|
220
232
|
providePaletteScope,
|
|
221
233
|
suppressPaletteDiscovery,
|
|
234
|
+
useMenuPalette,
|
|
222
235
|
usePaletteAction,
|
|
223
236
|
usePaletteCommands,
|
|
224
237
|
usePaletteControl,
|
|
@@ -24,5 +24,15 @@ export interface PersistedOptions<T> {
|
|
|
24
24
|
*
|
|
25
25
|
* A changed key reads the new key's value, so one component instance can
|
|
26
26
|
* follow the thing it shows (a drawer per record).
|
|
27
|
+
*
|
|
28
|
+
* Made for small preferences, and this is the contract:
|
|
29
|
+
* - JSON values only, `initial` included. A Map, Set or Date does not survive
|
|
30
|
+
* the round trip, a key holding `undefined` is dropped, and a BigInt or a
|
|
31
|
+
* cycle throws here, however `T` reads.
|
|
32
|
+
* - Every change walks the value and rewrites it whole, synchronously. A large
|
|
33
|
+
* document wants its own saving: debounced, with dirty state and versions.
|
|
34
|
+
* - One owner per key. Two refs on one key do not see each other's writes
|
|
35
|
+
* (the `storage` event only reaches other tabs) and the last write wins, so
|
|
36
|
+
* share the ref instead.
|
|
27
37
|
*/
|
|
28
38
|
export declare function usePersisted<T>(key: MaybeRefOrGetter<string | false | null | undefined>, initial: T, options?: PersistedOptions<T>): Ref<T>;
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { type ComputedRef } from "vue";
|
|
2
2
|
export type PillTransition = {
|
|
3
3
|
duration: number;
|
|
4
|
-
} | {
|
|
4
|
+
} | Readonly<{
|
|
5
5
|
type: "spring";
|
|
6
6
|
stiffness: number;
|
|
7
7
|
damping: number;
|
|
8
8
|
mass?: number;
|
|
9
|
-
}
|
|
9
|
+
}>;
|
|
10
10
|
export type PillFeel = "pill" | "float" | "layout";
|
|
11
11
|
export declare function usePillTransition(feel?: PillFeel): ComputedRef<PillTransition>;
|
|
12
12
|
/** The feels a pointer follower uses; "layout" is a motion-v layout move only. */
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { computed } from "vue";
|
|
2
2
|
import { usePrefersReducedMotion } from "./useReducedMotion.js";
|
|
3
|
-
const SPRING = {
|
|
4
|
-
pill: { type: "spring", stiffness: 520, damping: 40 },
|
|
5
|
-
float: { type: "spring", stiffness: 210, damping: 26 },
|
|
6
|
-
layout: { type: "spring", stiffness: 520, damping: 42, mass: 0.9 }
|
|
7
|
-
};
|
|
3
|
+
const SPRING = Object.freeze({
|
|
4
|
+
pill: Object.freeze({ type: "spring", stiffness: 520, damping: 40 }),
|
|
5
|
+
float: Object.freeze({ type: "spring", stiffness: 210, damping: 26 }),
|
|
6
|
+
layout: Object.freeze({ type: "spring", stiffness: 520, damping: 42, mass: 0.9 })
|
|
7
|
+
});
|
|
8
8
|
function usePillTransition(feel = "pill") {
|
|
9
9
|
const reduceMotion = usePrefersReducedMotion();
|
|
10
10
|
return computed(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
import { watch, toValue, onScopeDispose } from "vue";
|
|
2
3
|
function useResizeObserver(target, callback, options = {}) {
|
|
3
4
|
const { immediate = false, ...observe } = options;
|
|
@@ -13,7 +14,7 @@ function useResizeObserver(target, callback, options = {}) {
|
|
|
13
14
|
if (!el) return;
|
|
14
15
|
if (immediate) callback(void 0, el);
|
|
15
16
|
if (typeof ResizeObserver === "undefined") return;
|
|
16
|
-
observer = new ResizeObserver((entries) => {
|
|
17
|
+
observer = new (nodeWindow(el)).ResizeObserver((entries) => {
|
|
17
18
|
const entry = entries[entries.length - 1];
|
|
18
19
|
if (entry) callback(entry, el);
|
|
19
20
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { nodeWindow } from "./realm.js";
|
|
1
2
|
import { ref, watch, toValue, onBeforeUnmount } from "vue";
|
|
2
3
|
import { prefersReducedMotion } from "./easing.js";
|
|
3
4
|
function useReveal(options = {}) {
|
|
@@ -27,7 +28,7 @@ function useReveal(options = {}) {
|
|
|
27
28
|
reveal();
|
|
28
29
|
return;
|
|
29
30
|
}
|
|
30
|
-
observer = new IntersectionObserver(
|
|
31
|
+
observer = new (nodeWindow(node)).IntersectionObserver(
|
|
31
32
|
(entries) => {
|
|
32
33
|
if (entries.some((entry) => entry.isIntersecting)) reveal();
|
|
33
34
|
},
|
|
@@ -13,9 +13,9 @@ export interface UseRovingFocusOptions {
|
|
|
13
13
|
/**
|
|
14
14
|
* Which axis the arrows follow. `vertical` (default) uses ↑↓, `horizontal`
|
|
15
15
|
* uses ←→, `both` accepts either — for a grid whose wrapping the caller
|
|
16
|
-
* cannot describe here.
|
|
16
|
+
* cannot describe here. A ref or getter follows a list that changes axis.
|
|
17
17
|
*/
|
|
18
|
-
orientation?: "vertical" | "horizontal" | "both"
|
|
18
|
+
orientation?: MaybeRefOrGetter<"vertical" | "horizontal" | "both">;
|
|
19
19
|
/** Wrap around at the ends instead of stopping. Default true. */
|
|
20
20
|
loop?: boolean;
|
|
21
21
|
/** Jump to an item by typing its first letters. Default true. */
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { ref, computed, toValue, watch } from "vue";
|
|
2
|
+
import { isTextEntry } from "./textEntry.js";
|
|
3
|
+
import { isHTMLElement } from "./realm.js";
|
|
2
4
|
const NON_TEXT_INPUTS = /* @__PURE__ */ new Set(["checkbox", "radio", "button", "submit", "reset", "range", "color", "file", "image"]);
|
|
5
|
+
const ROW_FIELD = { select: true, inputType: (type) => !NON_TEXT_INPUTS.has(type) };
|
|
3
6
|
const TYPEAHEAD_RESET_MS = 700;
|
|
4
7
|
function useRovingFocus(items, options = {}) {
|
|
5
8
|
const {
|
|
@@ -70,15 +73,11 @@ function useRovingFocus(items, options = {}) {
|
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
}
|
|
73
|
-
function isTextEntry(target) {
|
|
74
|
-
if (!(target instanceof HTMLElement)) return false;
|
|
75
|
-
if (target.isContentEditable || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
|
|
76
|
-
return target instanceof HTMLInputElement && !NON_TEXT_INPUTS.has(target.type);
|
|
77
|
-
}
|
|
78
76
|
function onKeydown(event) {
|
|
79
|
-
if (event.isComposing || isTextEntry(event.target)) return;
|
|
80
|
-
const
|
|
81
|
-
const
|
|
77
|
+
if (event.isComposing || isTextEntry(event.target, ROW_FIELD)) return;
|
|
78
|
+
const axis = toValue(orientation);
|
|
79
|
+
const vertical = axis === "vertical" || axis === "both";
|
|
80
|
+
const horizontal = axis === "horizontal" || axis === "both";
|
|
82
81
|
switch (event.key) {
|
|
83
82
|
case "ArrowDown":
|
|
84
83
|
if (!vertical) return;
|
|
@@ -126,9 +125,8 @@ function useRovingFocus(items, options = {}) {
|
|
|
126
125
|
}
|
|
127
126
|
}
|
|
128
127
|
watch(activeId, (id) => {
|
|
129
|
-
if (!id || typeof document === "undefined") return;
|
|
130
128
|
const container = containerEl.value;
|
|
131
|
-
if (!container || !container.contains(
|
|
129
|
+
if (!id || !container || !container.contains(container.ownerDocument.activeElement)) return;
|
|
132
130
|
const target = container.querySelector(
|
|
133
131
|
`[data-roving-id="${CSS.escape(id)}"]`
|
|
134
132
|
);
|
|
@@ -138,7 +136,7 @@ function useRovingFocus(items, options = {}) {
|
|
|
138
136
|
containerEl.value = el;
|
|
139
137
|
}
|
|
140
138
|
const containerProps = computed(() => ({
|
|
141
|
-
ref: (el) => setContainer(el
|
|
139
|
+
ref: (el) => setContainer(isHTMLElement(el) ? el : null),
|
|
142
140
|
onKeydown
|
|
143
141
|
}));
|
|
144
142
|
function itemProps(id) {
|
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { toValue, shallowRef, computed, watch, onScopeDispose } from "vue";
|
|
2
2
|
import { scrambleFrame, planScramble, settledCells, SCRAMBLE_GLYPHS } from "../components/scramble.js";
|
|
3
3
|
import { prefersReducedMotion } from "./easing.js";
|
|
4
|
+
const SEED_MULTIPLIER = 16807;
|
|
5
|
+
const SEED_MODULUS = 2147483647;
|
|
6
|
+
function seededRandom(seed = 1) {
|
|
7
|
+
return () => (seed = seed * SEED_MULTIPLIER % SEED_MODULUS) / SEED_MODULUS;
|
|
8
|
+
}
|
|
4
9
|
function useScramble(source, options = {}) {
|
|
5
10
|
const random = options.random ?? Math.random;
|
|
11
|
+
const firstRoll = options.random ?? seededRandom();
|
|
6
12
|
const tick = options.tick ?? 50;
|
|
7
13
|
const glyphs = () => toValue(options.glyphs) || SCRAMBLE_GLYPHS;
|
|
8
14
|
const initial = toValue(source);
|
|
9
15
|
const cells = shallowRef(
|
|
10
|
-
options.start === "masked" ? scrambleFrame(planScramble(initial, initial, { duration: 1, keep: options.keep },
|
|
16
|
+
options.start === "masked" ? scrambleFrame(planScramble(initial, initial, { duration: 1, keep: options.keep }, firstRoll), 0, firstRoll, glyphs()) : settledCells(initial)
|
|
11
17
|
);
|
|
12
18
|
const running = shallowRef(false);
|
|
13
19
|
const text = computed(() => cells.value.map((cell) => cell.char).join(""));
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { ref, watch, toValue, onBeforeUnmount, nextTick } from "vue";
|
|
2
|
+
import { nodeWindow, isElement } from "./realm.js";
|
|
2
3
|
import { prefersReducedMotion } from "./easing.js";
|
|
3
4
|
const TWEEN_MS = 160;
|
|
4
5
|
const RETARGET_AFTER_MS = 40;
|
|
@@ -18,7 +19,7 @@ function useShift(options = {}) {
|
|
|
18
19
|
const scrolled = /* @__PURE__ */ new Set();
|
|
19
20
|
const rememberScroll = (event) => {
|
|
20
21
|
const target = event.target;
|
|
21
|
-
if (target
|
|
22
|
+
if (isElement(target)) scrolled.add(target);
|
|
22
23
|
};
|
|
23
24
|
function readScroll() {
|
|
24
25
|
const tops = /* @__PURE__ */ new Map();
|
|
@@ -72,7 +73,7 @@ function useShift(options = {}) {
|
|
|
72
73
|
tweenStart = performance.now();
|
|
73
74
|
resizing.value = true;
|
|
74
75
|
clearTimeout(settleTimer);
|
|
75
|
-
const wait = prefersReducedMotion() ? 0 : toValue(options.duration) ?? TWEEN_MS;
|
|
76
|
+
const wait = prefersReducedMotion(nodeWindow(node)) ? 0 : toValue(options.duration) ?? TWEEN_MS;
|
|
76
77
|
settleTimer = setTimeout(() => {
|
|
77
78
|
inFlight = false;
|
|
78
79
|
resizing.value = false;
|
|
@@ -125,12 +126,13 @@ function useShift(options = {}) {
|
|
|
125
126
|
ro.disconnect();
|
|
126
127
|
for (const child of Array.from(node.children)) ro.observe(child);
|
|
127
128
|
};
|
|
128
|
-
|
|
129
|
-
|
|
129
|
+
const win = nodeWindow(node);
|
|
130
|
+
if (typeof win.ResizeObserver !== "undefined") {
|
|
131
|
+
ro = new win.ResizeObserver(() => retune());
|
|
130
132
|
watchChildren();
|
|
131
133
|
}
|
|
132
|
-
if (typeof MutationObserver !== "undefined") {
|
|
133
|
-
mo = new MutationObserver(() => {
|
|
134
|
+
if (typeof win.MutationObserver !== "undefined") {
|
|
135
|
+
mo = new win.MutationObserver(() => {
|
|
134
136
|
watchChildren();
|
|
135
137
|
retune();
|
|
136
138
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { computed, toValue, ref } from "vue";
|
|
2
|
+
import { isHTMLElement } from "./realm.js";
|
|
2
3
|
import { usePointerFrame } from "./usePointerFrame.js";
|
|
3
4
|
import { usePrefersReducedMotion } from "./useReducedMotion.js";
|
|
4
5
|
import { spotlightPoint } from "./useSpotlight.js";
|
|
@@ -21,7 +22,7 @@ function useTilt(source = {}) {
|
|
|
21
22
|
}
|
|
22
23
|
});
|
|
23
24
|
function onPointerMove(e) {
|
|
24
|
-
if (e.currentTarget
|
|
25
|
+
if (isHTMLElement(e.currentTarget)) target = e.currentTarget;
|
|
25
26
|
pointer.move(e);
|
|
26
27
|
}
|
|
27
28
|
function onPointerEnter() {
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { clamp } from "./clamp.js";
|
|
2
|
+
import { useView } from "./useView.js";
|
|
3
|
+
import { hasInjectionContext, shallowRef, watch, toValue, onScopeDispose } from "vue";
|
|
2
4
|
import { durationToken, prefersReducedMotion, tokenEase } from "./easing.js";
|
|
3
5
|
function useTween(source, mix, options = {}) {
|
|
6
|
+
const view = hasInjectionContext() ? useView() : null;
|
|
4
7
|
const shown = shallowRef(source());
|
|
5
8
|
let target = shown.value;
|
|
6
9
|
let frame = 0;
|
|
@@ -11,18 +14,19 @@ function useTween(source, mix, options = {}) {
|
|
|
11
14
|
watch(source, (to) => {
|
|
12
15
|
if (options.equal?.(target, to)) return;
|
|
13
16
|
target = to;
|
|
14
|
-
const
|
|
15
|
-
|
|
17
|
+
const scope = view?.value?.document;
|
|
18
|
+
const ms = toValue(options.duration) ?? durationToken("duration-medium", void 0, scope);
|
|
19
|
+
if (toValue(options.enabled) === false || ms <= 0 || prefersReducedMotion(view?.value?.window) || typeof requestAnimationFrame === "undefined") {
|
|
16
20
|
stop();
|
|
17
21
|
shown.value = to;
|
|
18
22
|
return;
|
|
19
23
|
}
|
|
20
24
|
const from = shown.value;
|
|
21
|
-
const ease = options.ease ?? tokenEase("ease-emphasized");
|
|
25
|
+
const ease = options.ease ?? tokenEase("ease-emphasized", scope);
|
|
22
26
|
const started = performance.now();
|
|
23
27
|
stop();
|
|
24
28
|
const step = (now) => {
|
|
25
|
-
const t =
|
|
29
|
+
const t = clamp((now - started) / ms, 0, 1);
|
|
26
30
|
shown.value = t < 1 ? mix(from, to, ease(t)) : to;
|
|
27
31
|
frame = t < 1 ? requestAnimationFrame(step) : 0;
|
|
28
32
|
};
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { inject, computed, provide } from "vue";
|
|
2
|
+
import { isNode } from "./realm.js";
|
|
3
|
+
import { isElement, isHTMLElement, isInputElement, nodeWindow } from "./realm.js";
|
|
4
|
+
import { isTextEntry } from "./textEntry.js";
|
|
2
5
|
const LP_VIEW = /* @__PURE__ */ Symbol.for("lp-view");
|
|
3
6
|
function provideView(view) {
|
|
4
7
|
provide(LP_VIEW, view);
|
|
@@ -21,11 +24,15 @@ function usePortalTarget() {
|
|
|
21
24
|
}
|
|
22
25
|
const ORIGIN = "lpViewDocument";
|
|
23
26
|
const FORWARDED = ["pointerdown", "pointerup", "click", "focusin", "keydown"];
|
|
27
|
+
function typedHere(event) {
|
|
28
|
+
const printable = event.key.length === 1 && !event.ctrlKey && !event.metaKey;
|
|
29
|
+
return printable && isTextEntry(event.target, { select: true });
|
|
30
|
+
}
|
|
24
31
|
function forwardViewEvents(from, to) {
|
|
25
32
|
const forward = (event) => {
|
|
26
33
|
if (event.type === "keydown") {
|
|
27
34
|
const key = event;
|
|
28
|
-
if (key.defaultPrevented || key
|
|
35
|
+
if (key.defaultPrevented || typedHere(key)) return;
|
|
29
36
|
}
|
|
30
37
|
const Copy = event.constructor;
|
|
31
38
|
const copy = new Copy(event.type, event);
|
|
@@ -47,7 +54,7 @@ function originOf(event) {
|
|
|
47
54
|
const marked = inner[ORIGIN];
|
|
48
55
|
if (marked) return marked;
|
|
49
56
|
const target = inner.target;
|
|
50
|
-
if (!target
|
|
57
|
+
if (!isNode(target)) return null;
|
|
51
58
|
return target.nodeType === 9 ? target : target.ownerDocument;
|
|
52
59
|
}
|
|
53
60
|
function useOutsideGuard() {
|
|
@@ -59,6 +66,11 @@ function useOutsideGuard() {
|
|
|
59
66
|
}
|
|
60
67
|
export {
|
|
61
68
|
forwardViewEvents,
|
|
69
|
+
isElement,
|
|
70
|
+
isHTMLElement,
|
|
71
|
+
isInputElement,
|
|
72
|
+
isNode,
|
|
73
|
+
nodeWindow,
|
|
62
74
|
provideView,
|
|
63
75
|
useOutsideGuard,
|
|
64
76
|
usePortalTarget,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { clamp } from "./clamp.js";
|
|
1
2
|
import { ref, computed, toValue } from "vue";
|
|
2
3
|
function useZoomPan(options = {}) {
|
|
3
4
|
const min = options.min ?? 1;
|
|
@@ -17,9 +18,6 @@ function useZoomPan(options = {}) {
|
|
|
17
18
|
function setViewport(el) {
|
|
18
19
|
viewport = el;
|
|
19
20
|
}
|
|
20
|
-
function clamp(value, lo, hi) {
|
|
21
|
-
return Math.min(hi, Math.max(lo, value));
|
|
22
|
-
}
|
|
23
21
|
function clampPan() {
|
|
24
22
|
if (!viewport) return;
|
|
25
23
|
const rect = viewport.getBoundingClientRect();
|
|
@@ -116,7 +114,7 @@ function useZoomPan(options = {}) {
|
|
|
116
114
|
const offset = computed(() => ({ x: x.value, y: y.value }));
|
|
117
115
|
function setView(view) {
|
|
118
116
|
if (view.scale !== void 0) {
|
|
119
|
-
scale.value =
|
|
117
|
+
scale.value = clamp(view.scale, min, maxOf());
|
|
120
118
|
}
|
|
121
119
|
x.value = view.x;
|
|
122
120
|
y.value = view.y;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { type ComputedRef } from "vue";
|
|
2
|
+
export interface WindowRect {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
width: number;
|
|
6
|
+
height: number;
|
|
7
|
+
}
|
|
8
|
+
export interface WindowViewport {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
}
|
|
12
|
+
export interface WindowBounds {
|
|
13
|
+
minWidth: number;
|
|
14
|
+
minHeight: number;
|
|
15
|
+
}
|
|
16
|
+
export type WindowDock = "left" | "right" | "top" | "bottom" | "full";
|
|
17
|
+
export type WindowEdge = "n" | "s" | "e" | "w" | "ne" | "nw" | "se" | "sw";
|
|
18
|
+
export declare const WINDOW_DOCKS: readonly WindowDock[];
|
|
19
|
+
/** True for a stored rectangle that can still be used. */
|
|
20
|
+
export declare function isWindowRect(value: unknown): value is WindowRect;
|
|
21
|
+
/** Fit a rectangle on screen: no smaller than its bounds where there is room, never larger than the view. */
|
|
22
|
+
export declare function clampRect(rect: WindowRect, viewport: WindowViewport, bounds: WindowBounds): WindowRect;
|
|
23
|
+
/** Pull a moved rectangle onto the view's edges and the edges of other windows, when within `threshold`. */
|
|
24
|
+
export declare function snapRect(rect: WindowRect, viewport: WindowViewport, others: readonly WindowRect[], threshold: number): WindowRect;
|
|
25
|
+
/** Which dock a pointer at this point asks for: the top edge fills the view. */
|
|
26
|
+
export declare function dockAt(x: number, y: number, viewport: WindowViewport, edge: number): WindowDock | null;
|
|
27
|
+
/** The rectangle of a dock. `fraction` is the share of the view a side takes. */
|
|
28
|
+
export declare function dockedRect(dock: WindowDock, viewport: WindowViewport, fraction: number): WindowRect;
|
|
29
|
+
/** Drag one edge or corner; the opposite side stays put, also against the bounds and the view. */
|
|
30
|
+
export declare function resizeRect(start: WindowRect, edge: WindowEdge, dx: number, dy: number, viewport: WindowViewport, bounds: WindowBounds): WindowRect;
|
|
31
|
+
export interface WindowLayer {
|
|
32
|
+
/** Join the order, or come to its top. Ignored on the server, where nothing would release it. */
|
|
33
|
+
raise: () => void;
|
|
34
|
+
release: () => void;
|
|
35
|
+
/** Where the other open windows are, for snapping to. */
|
|
36
|
+
others: () => WindowRect[];
|
|
37
|
+
z: ComputedRef<string>;
|
|
38
|
+
top: ComputedRef<boolean>;
|
|
39
|
+
}
|
|
40
|
+
export declare function useWindowLayer(rect: () => WindowRect | null): WindowLayer;
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { clamp } from "./clamp.js";
|
|
2
|
+
import { ref, computed } from "vue";
|
|
3
|
+
const WINDOW_DOCKS = ["left", "right", "top", "bottom", "full"];
|
|
4
|
+
function isWindowRect(value) {
|
|
5
|
+
const rect = value;
|
|
6
|
+
return !!rect && [rect.x, rect.y, rect.width, rect.height].every((n) => typeof n === "number" && Number.isFinite(n)) && rect.width > 0 && rect.height > 0;
|
|
7
|
+
}
|
|
8
|
+
const between = (value, min, max) => Math.min(Math.max(value, min), Math.max(min, max));
|
|
9
|
+
function clampRect(rect, viewport, bounds) {
|
|
10
|
+
const width = clamp(rect.width, bounds.minWidth, viewport.width);
|
|
11
|
+
const height = clamp(rect.height, bounds.minHeight, viewport.height);
|
|
12
|
+
return {
|
|
13
|
+
x: between(rect.x, 0, viewport.width - width),
|
|
14
|
+
y: between(rect.y, 0, viewport.height - height),
|
|
15
|
+
width,
|
|
16
|
+
height
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function nearest(value, candidates, threshold) {
|
|
20
|
+
let best = value;
|
|
21
|
+
let distance = threshold;
|
|
22
|
+
for (const candidate of candidates) {
|
|
23
|
+
const gap = Math.abs(candidate - value);
|
|
24
|
+
if (gap <= distance) {
|
|
25
|
+
best = candidate;
|
|
26
|
+
distance = gap;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return best;
|
|
30
|
+
}
|
|
31
|
+
function snapRect(rect, viewport, others, threshold) {
|
|
32
|
+
const xs = [0, viewport.width - rect.width];
|
|
33
|
+
const ys = [0, viewport.height - rect.height];
|
|
34
|
+
for (const other of others) {
|
|
35
|
+
xs.push(other.x, other.x + other.width, other.x - rect.width, other.x + other.width - rect.width);
|
|
36
|
+
ys.push(other.y, other.y + other.height, other.y - rect.height, other.y + other.height - rect.height);
|
|
37
|
+
}
|
|
38
|
+
return { ...rect, x: nearest(rect.x, xs, threshold), y: nearest(rect.y, ys, threshold) };
|
|
39
|
+
}
|
|
40
|
+
function dockAt(x, y, viewport, edge) {
|
|
41
|
+
if (y <= edge) return "full";
|
|
42
|
+
if (x <= edge) return "left";
|
|
43
|
+
if (x >= viewport.width - edge) return "right";
|
|
44
|
+
if (y >= viewport.height - edge) return "bottom";
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function dockedRect(dock, viewport, fraction) {
|
|
48
|
+
const { width, height } = viewport;
|
|
49
|
+
const across = Math.round(width * fraction);
|
|
50
|
+
const down = Math.round(height * fraction);
|
|
51
|
+
switch (dock) {
|
|
52
|
+
case "left":
|
|
53
|
+
return { x: 0, y: 0, width: across, height };
|
|
54
|
+
case "right":
|
|
55
|
+
return { x: width - across, y: 0, width: across, height };
|
|
56
|
+
case "top":
|
|
57
|
+
return { x: 0, y: 0, width, height: down };
|
|
58
|
+
case "bottom":
|
|
59
|
+
return { x: 0, y: height - down, width, height: down };
|
|
60
|
+
case "full":
|
|
61
|
+
return { x: 0, y: 0, width, height };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function resizeRect(start, edge, dx, dy, viewport, bounds) {
|
|
65
|
+
let { x, y, width, height } = start;
|
|
66
|
+
const right = start.x + start.width;
|
|
67
|
+
const bottom = start.y + start.height;
|
|
68
|
+
if (edge.includes("e")) width = between(start.width + dx, bounds.minWidth, viewport.width - start.x);
|
|
69
|
+
if (edge.includes("s")) height = between(start.height + dy, bounds.minHeight, viewport.height - start.y);
|
|
70
|
+
if (edge.includes("w")) {
|
|
71
|
+
x = between(start.x + dx, 0, right - bounds.minWidth);
|
|
72
|
+
width = right - x;
|
|
73
|
+
}
|
|
74
|
+
if (edge.includes("n")) {
|
|
75
|
+
y = between(start.y + dy, 0, bottom - bounds.minHeight);
|
|
76
|
+
height = bottom - y;
|
|
77
|
+
}
|
|
78
|
+
return { x, y, width, height };
|
|
79
|
+
}
|
|
80
|
+
const WINDOW_Z_ROOM = 20;
|
|
81
|
+
const STATE_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:window-stack");
|
|
82
|
+
const g = globalThis;
|
|
83
|
+
const state = g[STATE_KEY] ??= { order: ref([]), nextId: 0, rects: /* @__PURE__ */ new Map() };
|
|
84
|
+
function useWindowLayer(rect) {
|
|
85
|
+
const id = state.nextId++;
|
|
86
|
+
const order = state.order;
|
|
87
|
+
return {
|
|
88
|
+
raise: () => {
|
|
89
|
+
if (typeof window === "undefined") return;
|
|
90
|
+
state.rects.set(id, rect);
|
|
91
|
+
if (order.value[order.value.length - 1] === id) return;
|
|
92
|
+
order.value = [...order.value.filter((x) => x !== id), id];
|
|
93
|
+
},
|
|
94
|
+
release: () => {
|
|
95
|
+
state.rects.delete(id);
|
|
96
|
+
order.value = order.value.filter((x) => x !== id);
|
|
97
|
+
},
|
|
98
|
+
others: () => [...state.rects.entries()].flatMap(([other, read]) => {
|
|
99
|
+
const found = other === id ? null : read();
|
|
100
|
+
return found ? [found] : [];
|
|
101
|
+
}),
|
|
102
|
+
z: computed(() => {
|
|
103
|
+
const at = clamp(order.value.indexOf(id), 0, WINDOW_Z_ROOM - 1);
|
|
104
|
+
return `calc(var(--z-dropdown) - ${WINDOW_Z_ROOM - at})`;
|
|
105
|
+
}),
|
|
106
|
+
top: computed(() => order.value[order.value.length - 1] === id)
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
WINDOW_DOCKS,
|
|
111
|
+
clampRect,
|
|
112
|
+
dockAt,
|
|
113
|
+
dockedRect,
|
|
114
|
+
isWindowRect,
|
|
115
|
+
resizeRect,
|
|
116
|
+
snapRect,
|
|
117
|
+
useWindowLayer
|
|
118
|
+
};
|
package/dist/icons-all.js
CHANGED