@leavepulse/ui 0.77.3 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -0
- package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
- package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
- package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
- package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
- package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
- package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
- package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
- package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
- package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
- package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
- package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
- package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
- package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
- package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
- package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
- package/dist/chunks/{LpAddressInput-E8KtwU7-.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
- package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
- package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
- package/dist/chunks/{LpAutocomplete-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -42
- package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
- package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
- package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
- package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
- package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
- package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
- package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
- package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
- package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
- package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
- package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
- package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
- package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
- package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
- package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
- package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
- package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
- package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
- package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
- package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
- package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
- package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
- package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
- package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
- package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
- package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
- package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
- package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
- package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
- package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
- package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
- package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
- package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
- package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
- package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
- package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
- package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
- package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
- package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
- package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
- package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
- package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
- package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
- package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
- package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
- package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
- package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
- package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
- package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
- package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
- package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
- package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
- package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
- package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
- package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
- package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
- package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
- package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
- package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
- package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
- package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
- package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
- package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
- package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
- package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
- package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
- package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
- package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
- package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
- package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
- package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
- package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
- package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
- package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
- package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
- package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
- package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
- package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
- package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
- package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
- package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
- package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
- package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
- package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
- package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
- package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
- package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
- package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
- package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
- package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
- package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
- package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
- package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
- package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
- package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
- package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
- package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
- package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
- package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
- package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
- package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
- package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
- package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
- package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
- package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
- package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
- package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
- package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
- package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
- package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
- package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
- package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AppShellContextNav.vue.d.ts +13 -0
- package/dist/components/AppShellContextNav.vue.js +4 -0
- package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
- package/dist/components/ChartRangeSelector.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.js +1 -1
- package/dist/components/IconCloseButton.vue.d.ts +7 -0
- package/dist/components/IconCloseButton.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.js +1 -1
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +110 -2
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBottomNav.vue.d.ts +5 -0
- package/dist/components/LpBottomNav.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +14 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +74 -2
- package/dist/components/LpChart.vue.js +326 -85
- package/dist/components/LpCheckbox.vue.d.ts +6 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.js +1 -1
- package/dist/components/LpCollapse.vue.js +1 -1
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.d.ts +8 -0
- package/dist/components/LpCommandPalette.vue.js +107 -56
- package/dist/components/LpCommandScope.vue.js +1 -1
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpContextSwitcher.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.js +1 -1
- package/dist/components/LpCountdown.vue.js +1 -1
- package/dist/components/LpDataList.vue.d.ts +1 -1
- package/dist/components/LpDataList.vue.js +1 -1
- package/dist/components/LpDatePicker.vue.d.ts +3 -15
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.js +21 -18
- package/dist/components/LpDrawer.vue.d.ts +1 -1
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.js +14 -11
- package/dist/components/LpEditable.vue.js +1 -1
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.d.ts +96 -6
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.js +1 -1
- package/dist/components/LpGauge.vue.d.ts +1 -1
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.js +1 -1
- package/dist/components/LpIcon.vue.d.ts +2 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.js +1 -1
- package/dist/components/LpImageEditor.vue.js +7 -6
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +1 -1
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpInspector.vue.d.ts +87 -0
- package/dist/components/LpInspector.vue.js +4 -0
- package/dist/components/LpLightbox.vue.d.ts +8 -0
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +1 -1
- package/dist/components/LpLoader.vue.js +1 -1
- package/dist/components/LpLogInspector.vue.d.ts +18 -0
- package/dist/components/LpLogInspector.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.d.ts +93 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.js +1 -1
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.d.ts +4 -2
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.d.ts +5 -5
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +2 -2
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPaletteTheme.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +2 -2
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +4 -0
- package/dist/components/LpPipeline.vue.js +1 -1
- package/dist/components/LpPopover.vue.d.ts +7 -3
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +1 -1
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.js +1 -1
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.js +1 -1
- package/dist/components/LpRepeater.vue.js +1 -1
- package/dist/components/LpRevealOnScroll.vue.js +1 -1
- package/dist/components/LpScramble.vue.js +1 -1
- package/dist/components/LpScrollArea.vue.js +1 -1
- package/dist/components/LpSecretField.vue.js +1 -1
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.js +1 -1
- package/dist/components/LpShift.vue.js +1 -1
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.d.ts +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSidebarRow.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +1 -1
- package/dist/components/LpSpotlight.vue.js +1 -1
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.js +1 -1
- package/dist/components/LpStepMark.vue.js +1 -1
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTabFace.vue.js +1 -1
- package/dist/components/LpTable.vue.d.ts +132 -0
- package/dist/components/LpTable.vue.js +547 -135
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.js +6 -5
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.d.ts +2 -0
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.js +1 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.js +1 -1
- package/dist/components/LpTypewriter.vue.js +1 -1
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/LpWindow.vue.d.ts +99 -0
- package/dist/components/LpWindow.vue.js +4 -0
- package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
- package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.js +1 -1
- package/dist/components/PickerField.vue.d.ts +2 -2
- package/dist/components/PickerField.vue.js +1 -1
- package/dist/components/RevealToggle.vue.js +1 -1
- package/dist/components/SliderRail.vue.d.ts +3 -0
- package/dist/components/SliderRail.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/address.js +2 -1
- package/dist/components/appShell.d.ts +36 -0
- package/dist/components/appShell.js +30 -0
- package/dist/components/calendar.d.ts +12 -3
- package/dist/components/calendar.js +2 -5
- package/dist/components/chart.d.ts +21 -0
- package/dist/components/chart.js +4 -3
- package/dist/components/chartWindow.d.ts +57 -0
- package/dist/components/chartWindow.js +136 -0
- package/dist/components/color.js +1 -1
- package/dist/components/commandPalette.d.ts +16 -2
- package/dist/components/commandPalette.js +39 -4
- package/dist/components/controlSize.d.ts +5 -0
- package/dist/components/controlSize.js +8 -0
- package/dist/components/dropdown.d.ts +5 -0
- package/dist/components/dropdown.js +2 -0
- package/dist/components/exportData.d.ts +6 -1
- package/dist/components/exportData.js +25 -18
- package/dist/components/fileTree.d.ts +67 -0
- package/dist/components/fileTree.js +141 -1
- package/dist/components/identicon.js +3 -2
- package/dist/components/logTools.d.ts +93 -0
- package/dist/components/logTools.js +210 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.js +2 -1
- package/dist/components/pipeline.d.ts +2 -0
- package/dist/components/pipeline.js +5 -0
- package/dist/components/relativeTime.js +2 -1
- package/dist/components/reveal.js +2 -1
- package/dist/components/select.d.ts +5 -0
- package/dist/components/select.js +10 -0
- package/dist/components/sidebar.d.ts +1 -0
- package/dist/components/tableFeatures.d.ts +58 -0
- package/dist/components/tableFeatures.js +87 -0
- package/dist/components/topologyGraph.d.ts +164 -0
- package/dist/components/topologyGraph.js +416 -0
- package/dist/components/tour.js +5 -3
- package/dist/components/videoBackdrop.js +7 -6
- package/dist/composables/clamp.d.ts +2 -0
- package/dist/composables/clamp.js +4 -0
- package/dist/composables/devWarn.d.ts +3 -0
- package/dist/composables/devWarn.js +14 -0
- package/dist/composables/easing.d.ts +13 -4
- package/dist/composables/easing.js +16 -10
- package/dist/composables/overlayHistory.js +14 -1
- package/dist/composables/pointerDrag.d.ts +15 -0
- package/dist/composables/pointerDrag.js +40 -0
- package/dist/composables/propCheck.d.ts +10 -0
- package/dist/composables/propCheck.js +78 -0
- package/dist/composables/realm.d.ts +6 -0
- package/dist/composables/realm.js +23 -0
- package/dist/composables/scroll.js +4 -2
- package/dist/composables/scrollMemory.d.ts +12 -1
- package/dist/composables/scrollMemory.js +36 -12
- package/dist/composables/spatialNav.js +2 -1
- package/dist/composables/textEntry.d.ts +17 -0
- package/dist/composables/textEntry.js +19 -0
- package/dist/composables/useAsyncTask.d.ts +6 -0
- package/dist/composables/useChartSync.d.ts +5 -0
- package/dist/composables/useChartSync.js +33 -0
- package/dist/composables/useCloseGuard.d.ts +3 -1
- package/dist/composables/useCloseGuard.js +6 -3
- package/dist/composables/useCommands.d.ts +50 -0
- package/dist/composables/useCommands.js +66 -0
- package/dist/composables/useField.d.ts +37 -0
- package/dist/composables/useField.js +27 -2
- package/dist/composables/useFitScale.js +4 -1
- package/dist/composables/useFormDraft.d.ts +13 -2
- package/dist/composables/useFormDraft.js +17 -9
- package/dist/composables/useHintSystem.js +2 -2
- package/dist/composables/useHotkeys.js +11 -32
- package/dist/composables/useInView.js +2 -1
- package/dist/composables/useInputFilter.js +7 -5
- package/dist/composables/useInputMask.js +5 -3
- package/dist/composables/useLinkedView.d.ts +97 -0
- package/dist/composables/useLinkedView.js +139 -0
- package/dist/composables/useOptimisticToggle.d.ts +3 -1
- package/dist/composables/useOptimisticToggle.js +2 -1
- package/dist/composables/useOverlayHistory.d.ts +7 -0
- package/dist/composables/useOverlayHistory.js +16 -2
- package/dist/composables/usePaintSelect.js +18 -14
- package/dist/composables/usePaletteCommands.d.ts +7 -0
- package/dist/composables/usePaletteCommands.js +12 -1
- package/dist/composables/usePersisted.d.ts +10 -0
- package/dist/composables/usePersisted.js +1 -1
- package/dist/composables/usePillTransition.d.ts +2 -2
- package/dist/composables/usePillTransition.js +5 -5
- package/dist/composables/useResizeObserver.js +2 -1
- package/dist/composables/useReveal.js +2 -1
- package/dist/composables/useRovingFocus.d.ts +2 -2
- package/dist/composables/useRovingFocus.js +9 -11
- package/dist/composables/useScramble.js +7 -1
- package/dist/composables/useShift.js +8 -6
- package/dist/composables/useTilt.js +2 -1
- package/dist/composables/useTween.js +9 -5
- package/dist/composables/useView.d.ts +1 -0
- package/dist/composables/useView.js +14 -2
- package/dist/composables/useZoomPan.js +2 -4
- package/dist/composables/windowing.d.ts +40 -0
- package/dist/composables/windowing.js +118 -0
- package/dist/icons-all.js +1 -1
- package/dist/icons.d.ts +4 -0
- package/dist/index.d.ts +30 -5
- package/dist/index.js +310 -264
- package/dist/layout/tree.js +19 -15
- package/dist/layout/useLayout.d.ts +2 -0
- package/dist/layout/useLayout.js +5 -1
- package/dist/layout/useWorkspaces.d.ts +52 -0
- package/dist/layout/useWorkspaces.js +140 -0
- package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
- package/dist/theme/config.js +25 -0
- package/dist/theme/define.js +61 -0
- package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
- package/dist/theme/presets.js +239 -0
- package/dist/theme/studio.js +134 -0
- package/dist/theme/tokens.js +63 -0
- package/dist/theme/useTheme.d.ts +3 -2
- package/dist/theme/useTheme.js +325 -0
- package/package.json +8 -1
- package/src/component-names.ts +5 -1
- package/src/components/AppShellContextNav.vue +44 -0
- package/src/components/ChartRangeSelector.vue +120 -0
- package/src/components/IconCloseButton.vue +21 -0
- package/src/components/LayoutCanvas.vue +3 -0
- package/src/components/LayoutNode.vue +37 -38
- package/src/components/LpActivityLine.vue +4 -2
- package/src/components/LpAddressInput.vue +3 -3
- package/src/components/LpAppShell.vue +362 -24
- package/src/components/LpAutocomplete.vue +13 -30
- package/src/components/LpBottomNav.vue +9 -1
- package/src/components/LpBreadcrumbs.vue +2 -1
- package/src/components/LpButton.vue +11 -4
- package/src/components/LpChart.vue +336 -37
- package/src/components/LpCheckbox.vue +43 -9
- package/src/components/LpCodeBlock.vue +17 -23
- package/src/components/LpCollapse.vue +5 -4
- package/src/components/LpColorPicker.vue +8 -9
- package/src/components/LpCommandPalette.vue +133 -50
- package/src/components/LpContextMenu.vue +15 -13
- package/src/components/LpCountdown.vue +2 -1
- package/src/components/LpDataList.vue +13 -1
- package/src/components/LpDatePicker.vue +5 -17
- package/src/components/LpDateRangePicker.vue +5 -16
- package/src/components/LpDock.vue +25 -16
- package/src/components/LpDrawer.vue +70 -61
- package/src/components/LpDropdownMenu.vue +6 -10
- package/src/components/LpDropzone.vue +12 -7
- package/src/components/LpEditable.vue +6 -2
- package/src/components/LpFileTree.vue +507 -66
- package/src/components/LpFileTreeNode.vue +106 -5
- package/src/components/LpFormField.vue +1 -1
- package/src/components/LpFrame.vue +33 -13
- package/src/components/LpHoverCard.vue +30 -5
- package/src/components/LpIcon.vue +6 -2
- package/src/components/LpIdenticon.vue +2 -1
- package/src/components/LpImageEditor.vue +5 -2
- package/src/components/LpInput.vue +15 -23
- package/src/components/LpInspector.vue +197 -0
- package/src/components/LpLightbox.vue +74 -29
- package/src/components/LpLogInspector.vue +85 -0
- package/src/components/LpLogViewer.vue +239 -29
- package/src/components/LpMapPicker.vue +2 -1
- package/src/components/LpMasonry.vue +8 -5
- package/src/components/LpModal.vue +12 -12
- package/src/components/LpModalNav.vue +2 -21
- package/src/components/LpNumberField.vue +6 -15
- package/src/components/LpOtpInput.vue +2 -2
- package/src/components/LpPagination.vue +5 -3
- package/src/components/LpPhoneInput.vue +8 -19
- package/src/components/LpPie.vue +25 -23
- package/src/components/LpPipeline.vue +14 -1
- package/src/components/LpPopover.vue +23 -2
- package/src/components/LpProgress.vue +2 -1
- package/src/components/LpRadioGroup.vue +2 -2
- package/src/components/LpRangeSlider.vue +5 -6
- package/src/components/LpRevealOnScroll.vue +1 -1
- package/src/components/LpScrollArea.vue +28 -11
- package/src/components/LpSecretField.vue +2 -1
- package/src/components/LpSegmented.vue +6 -8
- package/src/components/LpSelect.vue +54 -24
- package/src/components/LpShaderBackdrop.vue +12 -9
- package/src/components/LpShift.vue +18 -15
- package/src/components/LpSidebar.vue +77 -74
- package/src/components/LpSidebarNav.vue +3 -2
- package/src/components/LpSidebarRow.vue +2 -1
- package/src/components/LpSlider.vue +5 -6
- package/src/components/LpSpotlight.vue +2 -1
- package/src/components/LpSwitch.vue +5 -3
- package/src/components/LpTable.vue +609 -93
- package/src/components/LpTableFilter.vue +1 -1
- package/src/components/LpTableOfContents.vue +16 -9
- package/src/components/LpTabs.vue +2 -1
- package/src/components/LpTagsInput.vue +12 -19
- package/src/components/LpTextarea.vue +5 -11
- package/src/components/LpThemeProvider.vue +29 -13
- package/src/components/LpTimeField.vue +4 -7
- package/src/components/LpToaster.vue +7 -6
- package/src/components/LpTooltip.vue +62 -18
- package/src/components/LpTopologyCanvas.vue +567 -42
- package/src/components/LpTour.vue +7 -5
- package/src/components/LpTruncate.vue +4 -3
- package/src/components/LpTypewriter.vue +2 -1
- package/src/components/LpVideoBackdrop.vue +11 -13
- package/src/components/LpWindow.vue +373 -0
- package/src/components/LpWorkspaceSwitcher.vue +116 -0
- package/src/components/PickerField.vue +2 -2
- package/src/components/SliderRail.vue +10 -0
- package/src/components/address.ts +3 -1
- package/src/components/appShell.ts +74 -0
- package/src/components/calendar.ts +12 -5
- package/src/components/chart.ts +27 -3
- package/src/components/chartWindow.ts +198 -0
- package/src/components/color.ts +2 -1
- package/src/components/commandPalette.ts +66 -5
- package/src/components/controlSize.ts +6 -0
- package/src/components/dropdown.ts +3 -0
- package/src/components/exportData.ts +33 -18
- package/src/components/fileTree.ts +215 -0
- package/src/components/identicon.ts +4 -2
- package/src/components/logTools.ts +298 -0
- package/src/components/meter.ts +2 -1
- package/src/components/pipeline.ts +6 -0
- package/src/components/relativeTime.ts +2 -1
- package/src/components/reveal.ts +3 -1
- package/src/components/select.ts +14 -0
- package/src/components/sidebar.ts +1 -0
- package/src/components/tableFeatures.ts +149 -0
- package/src/components/topologyGraph.ts +655 -0
- package/src/components/tour.ts +5 -3
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/clamp.ts +2 -0
- package/src/composables/devWarn.ts +19 -0
- package/src/composables/easing.ts +37 -12
- package/src/composables/overlayHistory.ts +24 -0
- package/src/composables/pointerDrag.ts +54 -0
- package/src/composables/propCheck.ts +90 -0
- package/src/composables/realm.ts +25 -0
- package/src/composables/scroll.ts +4 -2
- package/src/composables/scrollMemory.ts +56 -14
- package/src/composables/spatialNav.ts +2 -1
- package/src/composables/textEntry.ts +33 -0
- package/src/composables/useAsyncTask.ts +6 -0
- package/src/composables/useChartSync.ts +52 -0
- package/src/composables/useCloseGuard.ts +22 -10
- package/src/composables/useCommands.ts +123 -0
- package/src/composables/useField.ts +41 -2
- package/src/composables/useFitScale.ts +4 -1
- package/src/composables/useFormDraft.ts +38 -14
- package/src/composables/useHintSystem.ts +2 -2
- package/src/composables/useHotkeys.ts +19 -48
- package/src/composables/useInView.ts +2 -1
- package/src/composables/useInputFilter.ts +8 -5
- package/src/composables/useInputMask.ts +8 -3
- package/src/composables/useLinkedView.ts +222 -0
- package/src/composables/useOptimisticToggle.ts +7 -1
- package/src/composables/useOverlayHistory.ts +20 -0
- package/src/composables/usePaintSelect.ts +20 -14
- package/src/composables/usePaletteCommands.ts +13 -0
- package/src/composables/usePersisted.ts +10 -0
- package/src/composables/usePillTransition.ts +9 -6
- package/src/composables/useResizeObserver.ts +2 -1
- package/src/composables/useReveal.ts +2 -1
- package/src/composables/useRovingFocus.ts +11 -14
- package/src/composables/useScramble.ts +12 -1
- package/src/composables/useShift.ts +8 -6
- package/src/composables/useTilt.ts +2 -1
- package/src/composables/useTween.ts +10 -5
- package/src/composables/useView.ts +17 -3
- package/src/composables/useZoomPan.ts +2 -5
- package/src/composables/windowing.ts +190 -0
- package/src/icons.ts +27 -6
- package/src/index.ts +41 -4
- package/src/kit-icons.ts +1 -1
- package/src/layout/tree.ts +31 -16
- package/src/layout/useLayout.ts +6 -0
- package/src/layout/useWorkspaces.ts +234 -0
- package/src/nuxt.ts +9 -1
- package/src/runtime/propCheck.plugin.ts +10 -0
- package/src/theme/studio.ts +7 -5
- package/src/theme/useTheme.ts +89 -15
- package/src/tokens/tokens.css +8 -1
- package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
- package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
- package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
- package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
- package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
|
@@ -80,7 +80,7 @@ const paint = usePaintSelect<unknown>({
|
|
|
80
80
|
function onListKeydown(event: KeyboardEvent) {
|
|
81
81
|
if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return
|
|
82
82
|
const boxes = [...(list.value?.querySelectorAll<HTMLElement>("[role=checkbox]") ?? [])]
|
|
83
|
-
const at = boxes.indexOf(
|
|
83
|
+
const at = boxes.indexOf(list.value?.ownerDocument.activeElement as HTMLElement)
|
|
84
84
|
const next = boxes[at + (event.key === "ArrowDown" ? 1 : -1)]
|
|
85
85
|
if (!next) return
|
|
86
86
|
event.preventDefault()
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { Motion } from "motion-v"
|
|
13
13
|
import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
|
|
14
14
|
import { useLabels } from "../composables/useLpConfig"
|
|
15
|
+
import { useView, viewDocument, viewWindow } from "../composables/useView"
|
|
15
16
|
import { atScrollEnd, scrollMarginTop, scrollParent, scrollToElement } from "../composables/scroll"
|
|
16
17
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
17
18
|
|
|
@@ -92,12 +93,17 @@ let safetyTimer: ReturnType<typeof setTimeout> | null = null
|
|
|
92
93
|
* final section could otherwise never reach. Works for the window and for a
|
|
93
94
|
* scroll area the headings live in.
|
|
94
95
|
*/
|
|
96
|
+
// Headings sit in the document this list renders in, a frame's inside one.
|
|
97
|
+
const host = useView()
|
|
98
|
+
|
|
95
99
|
function setup() {
|
|
96
100
|
stopSpy?.()
|
|
97
101
|
stopSpy = null
|
|
98
102
|
const ids = flatIds(props.links)
|
|
99
103
|
if (!ids.length) return
|
|
100
|
-
const
|
|
104
|
+
const page = viewDocument(host.value)
|
|
105
|
+
const win = viewWindow(host.value)
|
|
106
|
+
const first = page.getElementById(ids[0]!)
|
|
101
107
|
const scroller = first ? scrollParent(first) : null
|
|
102
108
|
let frame = 0
|
|
103
109
|
|
|
@@ -105,13 +111,13 @@ function setup() {
|
|
|
105
111
|
frame = 0
|
|
106
112
|
if (spySuppressed) return
|
|
107
113
|
const top = scroller ? scroller.getBoundingClientRect().top : 0
|
|
108
|
-
const headings = ids.map((id) =>
|
|
114
|
+
const headings = ids.map((id) => page.getElementById(id)).filter((el): el is HTMLElement => !!el)
|
|
109
115
|
if (!headings.length) return
|
|
110
116
|
let current = headings[0]!.id
|
|
111
|
-
const view = scroller ? scroller.clientHeight :
|
|
117
|
+
const view = scroller ? scroller.clientHeight : win.innerHeight
|
|
112
118
|
const line = Math.max(props.offset, view / 4)
|
|
113
119
|
for (const el of headings) if (el.getBoundingClientRect().top - top <= line + 1) current = el.id
|
|
114
|
-
const scrolled = scroller ? scroller.scrollTop :
|
|
120
|
+
const scrolled = scroller ? scroller.scrollTop : win.scrollY
|
|
115
121
|
const end = atScrollEnd(headings[0])
|
|
116
122
|
if (scrolled > 0 && end) current = headings[headings.length - 1]!.id
|
|
117
123
|
activeId.value = current
|
|
@@ -119,13 +125,13 @@ function setup() {
|
|
|
119
125
|
const onScroll = () => {
|
|
120
126
|
if (!frame) frame = requestAnimationFrame(measure)
|
|
121
127
|
}
|
|
122
|
-
const target: HTMLElement | Window = scroller ??
|
|
128
|
+
const target: HTMLElement | Window = scroller ?? win
|
|
123
129
|
target.addEventListener("scroll", onScroll, { passive: true })
|
|
124
|
-
|
|
130
|
+
win.addEventListener("resize", onScroll)
|
|
125
131
|
measure()
|
|
126
132
|
stopSpy = () => {
|
|
127
133
|
target.removeEventListener("scroll", onScroll)
|
|
128
|
-
|
|
134
|
+
win.removeEventListener("resize", onScroll)
|
|
129
135
|
if (frame) cancelAnimationFrame(frame)
|
|
130
136
|
}
|
|
131
137
|
}
|
|
@@ -147,7 +153,8 @@ function suppressSpyUntilScrollEnds(target: HTMLElement) {
|
|
|
147
153
|
if (rafId != null) cancelAnimationFrame(rafId)
|
|
148
154
|
if (safetyTimer != null) clearTimeout(safetyTimer)
|
|
149
155
|
const scroller = scrollParent(target)
|
|
150
|
-
const
|
|
156
|
+
const win = viewWindow(host.value)
|
|
157
|
+
const position = () => (scroller ? scroller.scrollTop : win.scrollY)
|
|
151
158
|
let last = position()
|
|
152
159
|
const tick = () => {
|
|
153
160
|
const y = position()
|
|
@@ -165,7 +172,7 @@ function suppressSpyUntilScrollEnds(target: HTMLElement) {
|
|
|
165
172
|
}
|
|
166
173
|
|
|
167
174
|
function onClick(id: string, ev: MouseEvent) {
|
|
168
|
-
const el =
|
|
175
|
+
const el = viewDocument(host.value).getElementById(id)
|
|
169
176
|
if (!el) return
|
|
170
177
|
ev.preventDefault()
|
|
171
178
|
activeId.value = id // mark immediately so the bar jumps to the clicked item
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
<script setup lang="ts">
|
|
2
|
+
import { isHTMLElement } from "../composables/useView"
|
|
2
3
|
import { usePaletteCommands, usePaletteScope } from "../composables/usePaletteCommands"
|
|
3
4
|
import { Motion } from "motion-v"
|
|
4
5
|
import { TabsContent, TabsList, TabsRoot, TabsTrigger } from "reka-ui"
|
|
@@ -179,7 +180,7 @@ function pillUnder(value: string, active?: string): boolean {
|
|
|
179
180
|
*/
|
|
180
181
|
function releaseFocusAfterPointer(event: PointerEvent) {
|
|
181
182
|
const target = event.currentTarget
|
|
182
|
-
if (target
|
|
183
|
+
if (isHTMLElement(target)) target.blur()
|
|
183
184
|
}
|
|
184
185
|
|
|
185
186
|
const paletteScope = usePaletteScope()
|
|
@@ -13,6 +13,7 @@ export type TagsInputLabels = {
|
|
|
13
13
|
</script>
|
|
14
14
|
|
|
15
15
|
<script setup lang="ts">
|
|
16
|
+
import { isNode, isInputElement } from "../composables/realm"
|
|
16
17
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
17
18
|
/*
|
|
18
19
|
* Free-form list of short values: emails, labels, hostnames. Typing a
|
|
@@ -38,7 +39,7 @@ import {
|
|
|
38
39
|
TagsInputRoot,
|
|
39
40
|
} from "reka-ui"
|
|
40
41
|
import { computed, ref, useAttrs, useId, watch } from "vue"
|
|
41
|
-
import { fieldMessageId, useField, useFieldControl } from "../composables/useField"
|
|
42
|
+
import { fieldWrapperBinds, fieldMessageId, useField, useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
42
43
|
import { prefersReducedMotion } from "../composables/easing"
|
|
43
44
|
import { useFieldNotice, type FieldNoticeOptions } from "../composables/useFieldNotice"
|
|
44
45
|
import { useShift } from "../composables/useShift"
|
|
@@ -177,13 +178,12 @@ const field = useFieldControl(() => ({
|
|
|
177
178
|
|
|
178
179
|
const describedBy = computed(
|
|
179
180
|
() =>
|
|
180
|
-
|
|
181
|
+
mergeDescribedBy(
|
|
182
|
+
attrs["aria-describedby"],
|
|
181
183
|
field.value.describedBy,
|
|
182
184
|
hasField.value && field.value.id ? `${field.value.id}-notice` : undefined,
|
|
183
185
|
standalone.value && notice.message.value ? noticeId : undefined,
|
|
184
|
-
|
|
185
|
-
.filter(Boolean)
|
|
186
|
-
.join(" ") || undefined,
|
|
186
|
+
),
|
|
187
187
|
)
|
|
188
188
|
|
|
189
189
|
const rootAttrs = computed(() => {
|
|
@@ -336,7 +336,7 @@ function choose(opt: LpOptionBase<string>): void {
|
|
|
336
336
|
function keepOpenInside(event: Event): void {
|
|
337
337
|
guardOutside(event)
|
|
338
338
|
const target = event.target
|
|
339
|
-
if (target
|
|
339
|
+
if (isNode(target) && boxEl.value?.contains(target)) event.preventDefault()
|
|
340
340
|
}
|
|
341
341
|
|
|
342
342
|
function isDelimiter(data: string): boolean {
|
|
@@ -346,7 +346,7 @@ function isDelimiter(data: string): boolean {
|
|
|
346
346
|
}
|
|
347
347
|
|
|
348
348
|
function onKeydown(event: KeyboardEvent): void {
|
|
349
|
-
if (event.isComposing || !(event.target
|
|
349
|
+
if (event.isComposing || !isInputElement(event.target)) return
|
|
350
350
|
const count = suggestions.value.length
|
|
351
351
|
if (listOpen.value && count) {
|
|
352
352
|
if (event.key === "ArrowDown" || event.key === "ArrowUp") {
|
|
@@ -369,7 +369,7 @@ function onKeydown(event: KeyboardEvent): void {
|
|
|
369
369
|
}
|
|
370
370
|
|
|
371
371
|
function onBeforeInput(event: InputEvent): void {
|
|
372
|
-
if (event.isComposing || !(event.target
|
|
372
|
+
if (event.isComposing || !isInputElement(event.target)) return
|
|
373
373
|
if (event.inputType === "insertText" && event.data && isDelimiter(event.data)) {
|
|
374
374
|
event.preventDefault()
|
|
375
375
|
commit(event.target)
|
|
@@ -377,7 +377,7 @@ function onBeforeInput(event: InputEvent): void {
|
|
|
377
377
|
}
|
|
378
378
|
|
|
379
379
|
function onInput(event: Event): void {
|
|
380
|
-
if (event.target
|
|
380
|
+
if (isInputElement(event.target)) sync(event.target)
|
|
381
381
|
if (!stuck.value) return
|
|
382
382
|
stuck.value = false
|
|
383
383
|
unsay()
|
|
@@ -385,7 +385,7 @@ function onInput(event: Event): void {
|
|
|
385
385
|
|
|
386
386
|
function onPaste(event: ClipboardEvent): void {
|
|
387
387
|
const pasted = event.clipboardData?.getData("text") ?? ""
|
|
388
|
-
if (!(event.target
|
|
388
|
+
if (!isInputElement(event.target) || !pasted) return
|
|
389
389
|
if (splitTags(pasted, props.delimiter).length < 2) return
|
|
390
390
|
event.preventDefault()
|
|
391
391
|
const el = event.target
|
|
@@ -397,7 +397,7 @@ function onPaste(event: ClipboardEvent): void {
|
|
|
397
397
|
function onBlur(event: FocusEvent): void {
|
|
398
398
|
focused.value = false
|
|
399
399
|
emit("blur", event)
|
|
400
|
-
if (props.addOnBlur && event.target
|
|
400
|
+
if (props.addOnBlur && isInputElement(event.target) && event.target.value.trim()) commit(event.target)
|
|
401
401
|
}
|
|
402
402
|
|
|
403
403
|
function onFocus(): void {
|
|
@@ -433,15 +433,8 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
433
433
|
|
|
434
434
|
<template>
|
|
435
435
|
<FieldWrapper
|
|
436
|
-
|
|
436
|
+
v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
|
|
437
437
|
:ref="bindField"
|
|
438
|
-
:id="field.id"
|
|
439
|
-
:label="label"
|
|
440
|
-
:hint="hint"
|
|
441
|
-
:error="error"
|
|
442
|
-
:required="required"
|
|
443
|
-
:class="attrs.class"
|
|
444
|
-
:style="attrs.style"
|
|
445
438
|
>
|
|
446
439
|
<div class="relative">
|
|
447
440
|
<TagsInputRoot
|
|
@@ -3,9 +3,10 @@ export default { inheritAttrs: false }
|
|
|
3
3
|
</script>
|
|
4
4
|
|
|
5
5
|
<script setup lang="ts">
|
|
6
|
+
import { nodeWindow } from "../composables/realm"
|
|
6
7
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
7
8
|
import { computed, nextTick, onMounted, ref, useAttrs, watch } from "vue"
|
|
8
|
-
import { useFieldControl } from "../composables/useField"
|
|
9
|
+
import { fieldWrapperBinds, useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
9
10
|
import { mergeClass } from "../composables/useMergedClass"
|
|
10
11
|
import FieldWrapper from "./FieldWrapper.vue"
|
|
11
12
|
|
|
@@ -63,7 +64,7 @@ const box = ref<HTMLTextAreaElement | null>(null)
|
|
|
63
64
|
function fit() {
|
|
64
65
|
const el = box.value
|
|
65
66
|
if (!props.autosize || !el) return
|
|
66
|
-
const style = getComputedStyle(el)
|
|
67
|
+
const style = nodeWindow(el).getComputedStyle(el)
|
|
67
68
|
const line = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.4
|
|
68
69
|
const borders = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth)
|
|
69
70
|
const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)
|
|
@@ -91,14 +92,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
91
92
|
|
|
92
93
|
<template>
|
|
93
94
|
<FieldWrapper
|
|
94
|
-
|
|
95
|
-
:id="field.id"
|
|
96
|
-
:label="label"
|
|
97
|
-
:hint="hint"
|
|
98
|
-
:error="error"
|
|
99
|
-
:required="required"
|
|
100
|
-
:class="attrs.class"
|
|
101
|
-
:style="attrs.style"
|
|
95
|
+
v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
|
|
102
96
|
>
|
|
103
97
|
<textarea
|
|
104
98
|
ref="box"
|
|
@@ -110,7 +104,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
|
|
|
110
104
|
:disabled="field.disabled"
|
|
111
105
|
:required="field.required || undefined"
|
|
112
106
|
:aria-invalid="field.invalid || undefined"
|
|
113
|
-
:aria-describedby="field.describedBy"
|
|
107
|
+
:aria-describedby="mergeDescribedBy(attrs['aria-describedby'], field.describedBy)"
|
|
114
108
|
:class="textareaClass"
|
|
115
109
|
:style="hasField ? undefined : (attrs.style as never)"
|
|
116
110
|
@input="$emit('update:modelValue', ($event.target as HTMLTextAreaElement).value); fit()"
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
|
-
// The last press
|
|
3
|
-
//
|
|
2
|
+
// The last press in each window: a theme change triggered by a toggle reveals
|
|
3
|
+
// from the toggle the user just pressed. Per window because an LpFrame has its
|
|
4
|
+
// own, whose presses and viewport coordinates the page never sees.
|
|
4
5
|
const PRESS_FRESH_MS = 1500
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
const presses = new WeakMap<Window, { x: number; y: number; at: number } | null>()
|
|
7
|
+
|
|
8
|
+
function trackPresses(win: Window) {
|
|
9
|
+
if (presses.has(win)) return
|
|
10
|
+
presses.set(win, null)
|
|
11
|
+
win.addEventListener(
|
|
8
12
|
"pointerdown",
|
|
9
|
-
(event) => (
|
|
13
|
+
(event) => presses.set(win, { x: event.clientX, y: event.clientY, at: performance.now() }),
|
|
10
14
|
{ capture: true, passive: true },
|
|
11
15
|
)
|
|
12
16
|
}
|
|
@@ -26,13 +30,15 @@ export default { inheritAttrs: false }
|
|
|
26
30
|
* circular reveal the global theme switch uses, growing from where the user
|
|
27
31
|
* last pressed, or from the subtree's centre.
|
|
28
32
|
*/
|
|
29
|
-
import { computed, nextTick, ref, shallowRef, watch, type Component, type ComponentPublicInstance } from "vue"
|
|
33
|
+
import { computed, nextTick, onMounted, ref, shallowRef, watch, type Component, type ComponentPublicInstance } from "vue"
|
|
30
34
|
import type { TokenSet } from "../theme/tokens"
|
|
31
35
|
import { revealTransition, themeEntries, type RevealOrigin } from "../theme/useTheme"
|
|
32
36
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
37
|
+
import { isElement, nodeWindow, useView, viewWindow } from "../composables/useView"
|
|
33
38
|
|
|
34
39
|
const props = withDefaults(
|
|
35
40
|
defineProps<{
|
|
41
|
+
/** Replace the object to change the theme: a mutation inside it is not seen. */
|
|
36
42
|
theme: TokenSet
|
|
37
43
|
/** Root element. A wrapper that should not affect layout can use `class="contents"`. */
|
|
38
44
|
as?: string | Component
|
|
@@ -54,11 +60,19 @@ const style = computed(() => ({
|
|
|
54
60
|
colorScheme: shown.value.mode,
|
|
55
61
|
}))
|
|
56
62
|
|
|
57
|
-
|
|
58
|
-
|
|
63
|
+
const view = useView()
|
|
64
|
+
onMounted(() => trackPresses(viewWindow(view.value)))
|
|
65
|
+
|
|
66
|
+
function rootElement(): Element | undefined {
|
|
59
67
|
const value = root.value
|
|
60
|
-
const el = value
|
|
61
|
-
|
|
68
|
+
const el = isElement(value) ? value : value?.$el
|
|
69
|
+
return isElement(el) ? el : undefined
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function originOf(el: Element | undefined): RevealOrigin | undefined {
|
|
73
|
+
const press = presses.get(el ? nodeWindow(el) : viewWindow(view.value))
|
|
74
|
+
if (press && performance.now() - press.at < PRESS_FRESH_MS) return press
|
|
75
|
+
const box = el?.getBoundingClientRect()
|
|
62
76
|
return box ? { x: box.left + box.width / 2, y: box.top + box.height / 2 } : undefined
|
|
63
77
|
}
|
|
64
78
|
|
|
@@ -69,10 +83,12 @@ watch(
|
|
|
69
83
|
shown.value = next
|
|
70
84
|
return
|
|
71
85
|
}
|
|
72
|
-
|
|
86
|
+
const el = rootElement()
|
|
87
|
+
const update = async () => {
|
|
73
88
|
shown.value = next
|
|
74
89
|
await nextTick()
|
|
75
|
-
}
|
|
90
|
+
}
|
|
91
|
+
revealTransition(update, originOf(el), undefined, el?.ownerDocument)
|
|
76
92
|
},
|
|
77
93
|
)
|
|
78
94
|
</script>
|
|
@@ -6,6 +6,7 @@ export default { inheritAttrs: false }
|
|
|
6
6
|
</script>
|
|
7
7
|
|
|
8
8
|
<script setup lang="ts">
|
|
9
|
+
import { CONTROL_SIZE } from "./controlSize"
|
|
9
10
|
import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
|
|
10
11
|
/*
|
|
11
12
|
* Time-of-day field: hour and minute segments, typed or stepped with the arrow
|
|
@@ -21,7 +22,7 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
|
|
|
21
22
|
import { Time } from "@internationalized/date"
|
|
22
23
|
import { TimeFieldInput, TimeFieldRoot } from "reka-ui"
|
|
23
24
|
import { computed } from "vue"
|
|
24
|
-
import { focusLeft, useFieldControl } from "../composables/useField"
|
|
25
|
+
import { focusLeft, useFieldControl, mergeDescribedBy } from "../composables/useField"
|
|
25
26
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
26
27
|
import LpIcon from "./LpIcon.vue"
|
|
27
28
|
|
|
@@ -73,11 +74,7 @@ const field = useFieldControl(() => ({
|
|
|
73
74
|
disabled: props.disabled,
|
|
74
75
|
}))
|
|
75
76
|
|
|
76
|
-
const shellSize =
|
|
77
|
-
sm: "h-(--size-control-sm) text-xs",
|
|
78
|
-
md: "h-(--size-control-md) text-sm",
|
|
79
|
-
lg: "h-(--size-control-lg) text-sm",
|
|
80
|
-
}
|
|
77
|
+
const shellSize = CONTROL_SIZE
|
|
81
78
|
|
|
82
79
|
// `w-full` is the default, not a rule: a time column of `w-28` must win over it.
|
|
83
80
|
const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
|
|
@@ -101,10 +98,10 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
|
|
|
101
98
|
:disabled="field.disabled"
|
|
102
99
|
:required="field.required"
|
|
103
100
|
:aria-invalid="field.invalid || undefined"
|
|
104
|
-
:aria-describedby="field.describedBy"
|
|
105
101
|
:aria-labelledby="field.labelId"
|
|
106
102
|
:class="rootClass"
|
|
107
103
|
v-bind="rest"
|
|
104
|
+
:aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
|
|
108
105
|
@update:model-value="onUpdate"
|
|
109
106
|
@focusout="onFocusOut"
|
|
110
107
|
>
|
|
@@ -19,7 +19,7 @@ import { CLOSE_ICON } from "./dropdown"
|
|
|
19
19
|
import LpCopyButton from "./LpCopyButton.vue"
|
|
20
20
|
import LpIcon from "./LpIcon.vue"
|
|
21
21
|
import { toneLook } from "./tone"
|
|
22
|
-
import { usePortalTarget } from "../composables/useView"
|
|
22
|
+
import { nodeWindow, usePortalTarget, useView, viewDocument, viewWindow } from "../composables/useView"
|
|
23
23
|
|
|
24
24
|
const props = defineProps<{ labels?: Partial<{ dismiss: string; copy: string; copied: string }> }>()
|
|
25
25
|
const text = useLabels("toast", { dismiss: "Dismiss", copy: "Copy message", copied: "Copied" }, () => props.labels)
|
|
@@ -44,7 +44,7 @@ function toastsIn(root: Element): HTMLElement[] {
|
|
|
44
44
|
}
|
|
45
45
|
|
|
46
46
|
function slide(root: Element) {
|
|
47
|
-
const reduce = prefersReducedMotion()
|
|
47
|
+
const reduce = prefersReducedMotion(nodeWindow(root))
|
|
48
48
|
const height = (root as HTMLElement).offsetHeight
|
|
49
49
|
for (const el of toastsIn(root)) {
|
|
50
50
|
const before = tops.get(el)
|
|
@@ -61,12 +61,13 @@ function slide(root: Element) {
|
|
|
61
61
|
// The viewport's component root is a wrapper fragment, not the list, so the
|
|
62
62
|
// list is found by a mark of its own once it is teleported into place.
|
|
63
63
|
const viewportId = useId()
|
|
64
|
+
const view = useView()
|
|
64
65
|
onMounted(() =>
|
|
65
66
|
nextTick(() => {
|
|
66
|
-
const root =
|
|
67
|
-
if (!root
|
|
67
|
+
const root = viewDocument(view.value).querySelector(`[data-lp-toasts="${viewportId}"]`)
|
|
68
|
+
if (!root) return
|
|
68
69
|
for (const el of toastsIn(root)) tops.set(el, el.offsetTop - (root as HTMLElement).offsetHeight)
|
|
69
|
-
observer = new MutationObserver(() => slide(root))
|
|
70
|
+
observer = new (nodeWindow(root).MutationObserver)(() => slide(root))
|
|
70
71
|
observer.observe(root, { childList: true, subtree: true })
|
|
71
72
|
}),
|
|
72
73
|
)
|
|
@@ -207,7 +208,7 @@ const copyable = (t: ToastItem) => t.variant === "error" || t.variant === "warni
|
|
|
207
208
|
const toastText = (t: ToastItem) => () => [t.title, t.message, t.details, t.context].filter(Boolean).join("\n")
|
|
208
209
|
|
|
209
210
|
function selecting(): boolean {
|
|
210
|
-
return Boolean(
|
|
211
|
+
return Boolean(viewWindow(view.value).getSelection()?.toString())
|
|
211
212
|
}
|
|
212
213
|
|
|
213
214
|
function runClick(t: ToastItem) {
|
|
@@ -27,6 +27,7 @@
|
|
|
27
27
|
* those bind their handlers to the slot's direct child, so a wrapper swallows
|
|
28
28
|
* them and the control stops opening. Put `aria-label` on the trigger instead.
|
|
29
29
|
*/
|
|
30
|
+
import { clamp } from "../composables/clamp"
|
|
30
31
|
import {
|
|
31
32
|
injectTooltipProviderContext,
|
|
32
33
|
TooltipContent,
|
|
@@ -43,7 +44,7 @@ import {
|
|
|
43
44
|
} from "../composables/usePillTransition"
|
|
44
45
|
import { PANEL_SURFACE, TOOLTIP_ANIM } from "./dropdown"
|
|
45
46
|
import { prefersReducedMotion } from "../composables/easing"
|
|
46
|
-
import { useOutsideGuard, usePortalTarget } from "../composables/useView"
|
|
47
|
+
import { useOutsideGuard, usePortalTarget, useView, viewWindow } from "../composables/useView"
|
|
47
48
|
|
|
48
49
|
const props = withDefaults(
|
|
49
50
|
defineProps<{
|
|
@@ -131,15 +132,21 @@ const EDGE = 8
|
|
|
131
132
|
* uptime slice with its breakdown) slid half off screen. The offset is held to
|
|
132
133
|
* the room the window has on each side of where reka put the tip.
|
|
133
134
|
*/
|
|
134
|
-
function inView(x: number): number {
|
|
135
|
+
function inView(x: number, y: number): { x: number; y: number } {
|
|
135
136
|
const panel = tipBody.value?.parentElement
|
|
136
|
-
if (!panel) return x
|
|
137
|
+
if (!panel) return { x, y }
|
|
137
138
|
const rect = panel.getBoundingClientRect()
|
|
138
|
-
const
|
|
139
|
-
|
|
139
|
+
const win = panel.ownerDocument.defaultView ?? window
|
|
140
|
+
return {
|
|
141
|
+
x: withinRoom(x, rect.left - offset.value.x, rect.width, win.innerWidth),
|
|
142
|
+
y: withinRoom(y, rect.top - offset.value.y, rect.height, win.innerHeight),
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function withinRoom(value: number, placed: number, size: number, room: number): number {
|
|
140
147
|
const min = EDGE - placed
|
|
141
|
-
const max =
|
|
142
|
-
return max < min ?
|
|
148
|
+
const max = room - EDGE - size - placed
|
|
149
|
+
return max < min ? value : clamp(value, min, max)
|
|
143
150
|
}
|
|
144
151
|
|
|
145
152
|
/*
|
|
@@ -152,6 +159,22 @@ let sx: SpringState = { value: 0, velocity: 0 }
|
|
|
152
159
|
let sy: SpringState = { value: 0, velocity: 0 }
|
|
153
160
|
let frame = 0
|
|
154
161
|
let lastFrame = 0
|
|
162
|
+
/* The last reading, so the tip can be placed again when the window changes under it. */
|
|
163
|
+
let pointer: { el: HTMLElement; x: number; y: number } | null = null
|
|
164
|
+
|
|
165
|
+
function stopSpring() {
|
|
166
|
+
if (frame) cancelAnimationFrame(frame)
|
|
167
|
+
frame = 0
|
|
168
|
+
lastFrame = 0
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/* Straight to the target, with no spring left over to pull it back. */
|
|
172
|
+
function jumpToTarget() {
|
|
173
|
+
stopSpring()
|
|
174
|
+
offset.value = { x: target.x, y: target.y }
|
|
175
|
+
sx = { value: target.x, velocity: 0 }
|
|
176
|
+
sy = { value: target.y, velocity: 0 }
|
|
177
|
+
}
|
|
155
178
|
|
|
156
179
|
const settle = (now: number) => {
|
|
157
180
|
const dt = lastFrame ? (now - lastFrame) / 1000 : 1 / 60
|
|
@@ -179,10 +202,17 @@ const onPointerMove = (e: PointerEvent) => {
|
|
|
179
202
|
if (!props.followCursor) return
|
|
180
203
|
const el = e.currentTarget as HTMLElement | null
|
|
181
204
|
if (!el) return
|
|
205
|
+
pointer = { el, x: e.clientX, y: e.clientY }
|
|
206
|
+
follow()
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function follow() {
|
|
210
|
+
if (!pointer) return
|
|
211
|
+
const { el, x: clientX, y: clientY } = pointer
|
|
182
212
|
const rect = el.getBoundingClientRect()
|
|
183
213
|
const halfX = props.side === "left" || props.side === "right" ? rect.width / 2 : 0
|
|
184
214
|
const dirX = props.side === "right" ? -1 : 1
|
|
185
|
-
target.x =
|
|
215
|
+
target.x = clientX - (rect.left + rect.width / 2) + halfX * dirX
|
|
186
216
|
/*
|
|
187
217
|
* reka clears the tip past the whole box's EDGE, not past the pointer, so on
|
|
188
218
|
* a tall trigger it ends up half the box above the cursor — measured at 96px
|
|
@@ -192,11 +222,11 @@ const onPointerMove = (e: PointerEvent) => {
|
|
|
192
222
|
*/
|
|
193
223
|
const half = props.side === "top" || props.side === "bottom" ? rect.height / 2 : 0
|
|
194
224
|
const dir = props.side === "bottom" ? -1 : 1
|
|
195
|
-
target.y =
|
|
196
|
-
target
|
|
225
|
+
target.y = clientY - (rect.top + rect.height / 2) + half * dir
|
|
226
|
+
Object.assign(target, inView(target.x, target.y))
|
|
197
227
|
// Without motion the tip goes straight to the reading instead of trailing.
|
|
198
228
|
if (prefersReducedMotion()) {
|
|
199
|
-
|
|
229
|
+
jumpToTarget()
|
|
200
230
|
return
|
|
201
231
|
}
|
|
202
232
|
if (!frame) frame = requestAnimationFrame(settle)
|
|
@@ -218,10 +248,7 @@ const onOpenChange = (next: boolean) => {
|
|
|
218
248
|
if (!open.value || !props.followCursor) return
|
|
219
249
|
// A fresh open starts at the cursor instead of flying in from wherever the
|
|
220
250
|
// last one came to rest.
|
|
221
|
-
|
|
222
|
-
sx = { value: target.x, velocity: 0 }
|
|
223
|
-
sy = { value: target.y, velocity: 0 }
|
|
224
|
-
lastFrame = 0
|
|
251
|
+
jumpToTarget()
|
|
225
252
|
}
|
|
226
253
|
|
|
227
254
|
/*
|
|
@@ -243,9 +270,26 @@ watch(
|
|
|
243
270
|
},
|
|
244
271
|
)
|
|
245
272
|
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
273
|
+
/*
|
|
274
|
+
* A followed tip moves only with the pointer, so a window that changes under a
|
|
275
|
+
* still pointer (a resize, a phone's address bar, a rotation) would leave it
|
|
276
|
+
* off screen. And a tip that is gone has nothing left to animate.
|
|
277
|
+
*/
|
|
278
|
+
const view = useView()
|
|
279
|
+
watch(
|
|
280
|
+
() => open.value && props.followCursor,
|
|
281
|
+
(following, _, onCleanup) => {
|
|
282
|
+
if (!following) {
|
|
283
|
+
stopSpring()
|
|
284
|
+
return
|
|
285
|
+
}
|
|
286
|
+
const win = viewWindow(view.value)
|
|
287
|
+
win.addEventListener("resize", follow)
|
|
288
|
+
onCleanup(() => win.removeEventListener("resize", follow))
|
|
289
|
+
},
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
onBeforeUnmount(stopSpring)
|
|
249
293
|
|
|
250
294
|
// Overlays open in the window this component renders in (an LpFrame's, inside one).
|
|
251
295
|
const portalTo = usePortalTarget()
|