@leavepulse/ui 0.69.0 → 0.70.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 +49 -0
- package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
- package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
- package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
- package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
- package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
- package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
- package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
- package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
- package/dist/assets/LpRepeater-C1Cw27hj.css +21 -0
- package/dist/assets/{LpRollingText-BGnE6q9j.css → LpRollingText-dyOXedGO.css} +7 -0
- package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
- package/dist/assets/LpStatus-430OGTZY.css +17 -0
- package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
- package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
- package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
- package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
- package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
- package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
- package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-6kxEivBI.js} +11 -5
- package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
- package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
- package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
- package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
- package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
- package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
- package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
- package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
- package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-Chv_Xf8q.js} +7 -7
- package/dist/chunks/LpAlert-C5igj802.js +119 -0
- package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-BiWByLmt.js} +15 -16
- package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
- package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
- package/dist/chunks/LpBadge-BBq1Er9T.js +126 -0
- package/dist/chunks/LpBreadcrumbs-JKEi_yFF.js +144 -0
- package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
- package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
- package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
- package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
- package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
- package/dist/chunks/LpCodeDisplay-CbJMs-IK.js +189 -0
- package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
- package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-B7HSIFmn.js} +11 -6
- package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
- package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
- package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-Cj96ENDC.js} +16 -7
- package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
- package/dist/chunks/LpCountdown-BQnmB4gq.js +231 -0
- package/dist/chunks/LpDataList-CHNYQw7h.js +121 -0
- package/dist/chunks/LpDatePicker-ac1_6o5P.js +169 -0
- package/dist/chunks/LpDateRangePicker-B15gYrZJ.js +127 -0
- package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
- package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
- package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-R4aYVtVV.js} +14 -6
- package/dist/chunks/LpEditable-Ws3DNQHn.js +238 -0
- package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
- package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DDNg34tJ.js} +5 -3
- package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-DmPuYNZ_.js} +42 -55
- package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
- package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
- package/dist/chunks/LpGauge-C14Z9503.js +204 -0
- package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
- package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
- package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-HvwUA5Ec.js} +27 -14
- package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-DxbPKOzQ.js} +3 -3
- package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
- package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
- package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
- package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-D64hywJI.js} +39 -25
- package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
- package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
- package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
- package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-DKK4ySZl.js} +225 -129
- package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
- package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
- package/dist/chunks/LpMasonry--k0571qG.js +185 -0
- package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-rmI1DjKN.js} +3 -3
- package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
- package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-DiyFCHiZ.js} +4 -4
- package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-D-WhE5m2.js} +32 -48
- package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
- package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
- package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
- package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
- package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
- package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-GL2KOFK8.js} +26 -22
- package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
- package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-BgXZ3xmm.js} +159 -48
- package/dist/chunks/LpPipeline-B31h41Mu.js +329 -0
- package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-DmZ3wUtP.js} +13 -7
- package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
- package/dist/chunks/LpQuota-DaL8TgNe.js +162 -0
- package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
- package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
- package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
- package/dist/chunks/LpRelativeTime-yin9uQP7.js +73 -0
- package/dist/chunks/LpRepeater-D0S7jjwr.js +180 -0
- package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
- package/dist/chunks/{LpRollingText-DB7upf-5.js → LpRollingText-DiL717LK.js} +4 -3
- package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
- package/dist/chunks/LpSecretField-CfWyHv9m.js +316 -0
- package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
- package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
- package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-C_8cJtj6.js} +91 -111
- package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
- package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
- package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-CZRXtvem.js} +5 -3
- package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DBg1U1oW.js} +3 -3
- package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
- package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
- package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
- package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-DFKlPJgy.js} +38 -35
- package/dist/chunks/LpStatus-BsGLrpor.js +86 -0
- package/dist/chunks/LpStepMark-TrzOioa9.js +101 -0
- package/dist/chunks/LpStepper-BbnS5jUr.js +76 -0
- package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
- package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
- package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
- package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
- package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DZg80W-B.js} +68 -71
- package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
- package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
- package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
- package/dist/chunks/LpThemeStudio-DxVZMtzN.js +416 -0
- package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
- package/dist/chunks/LpThemeSwitcher-CadVBTBn.js +278 -0
- package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
- package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
- package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
- package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-C17A1XCb.js} +1 -1
- package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-CY2bFXge.js} +24 -18
- package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
- package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
- package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-Tew1Ykx4.js} +10 -9
- package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
- package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
- package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
- package/dist/chunks/PickerField-DoHv0WMH.js +125 -0
- package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
- package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
- package/dist/chunks/TourCard-BJ8i7dk0.js +123 -0
- package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
- package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
- package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AttentionDot.vue.d.ts +9 -0
- package/dist/components/AttentionDot.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.d.ts +25 -0
- package/dist/components/FieldWrapper.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.d.ts +4 -4
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LegendSwatch.vue.d.ts +6 -0
- package/dist/components/LegendSwatch.vue.js +4 -0
- package/dist/components/LoaderMark.vue.d.ts +12 -0
- package/dist/components/LoaderMark.vue.js +4 -0
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.d.ts +58 -0
- package/dist/components/LpActivityLine.vue.js +4 -0
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.d.ts +2 -2
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +8 -7
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.d.ts +16 -0
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.d.ts +19 -5
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +2 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.d.ts +24 -0
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.js +131 -160
- package/dist/components/LpCheckbox.vue.d.ts +2 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
- package/dist/components/LpCodeDisplay.vue.js +4 -0
- package/dist/components/LpCollapse.vue.d.ts +58 -0
- package/dist/components/LpCollapse.vue.js +4 -0
- package/dist/components/LpColorPicker.vue.d.ts +2 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.js +34 -23
- 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/LpCopyButton.vue.d.ts +82 -0
- package/dist/components/LpCopyButton.vue.js +4 -0
- package/dist/components/LpCountdown.vue.d.ts +100 -0
- package/dist/components/LpCountdown.vue.js +4 -0
- package/dist/components/LpDataList.vue.d.ts +66 -0
- package/dist/components/LpDataList.vue.js +4 -0
- package/dist/components/LpDatePicker.vue.d.ts +3 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -1
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.d.ts +74 -0
- package/dist/components/LpDock.vue.js +204 -0
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.d.ts +8 -1
- package/dist/components/LpDropzone.vue.js +36 -15
- package/dist/components/LpEditable.vue.d.ts +85 -0
- package/dist/components/LpEditable.vue.js +4 -0
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.d.ts +22 -0
- package/dist/components/LpFrame.vue.js +4 -0
- package/dist/components/LpGauge.vue.d.ts +116 -0
- package/dist/components/LpGauge.vue.js +4 -0
- package/dist/components/LpGlowBorder.vue.d.ts +47 -0
- package/dist/components/LpGlowBorder.vue.js +4 -0
- package/dist/components/LpHintExample.vue.d.ts +2 -2
- 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.d.ts +60 -0
- package/dist/components/LpHoverCard.vue.js +4 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.d.ts +37 -0
- package/dist/components/LpIdenticon.vue.js +4 -0
- package/dist/components/LpImageEditor.vue.js +13 -19
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +10 -0
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +106 -0
- package/dist/components/LpLoader.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMagnetic.vue.d.ts +28 -0
- package/dist/components/LpMagnetic.vue.js +4 -0
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.d.ts +42 -0
- package/dist/components/LpMasonry.vue.js +4 -0
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +15 -6
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +57 -0
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.d.ts +12 -4
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +2 -2
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPalettePreview.vue.js +1 -1
- package/dist/components/LpPaletteStats.vue.js +2 -2
- package/dist/components/LpPasswordInput.vue.d.ts +19 -2
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +3 -1
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +91 -0
- package/dist/components/LpPipeline.vue.js +4 -0
- package/dist/components/LpPopover.vue.d.ts +2 -2
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +11 -4
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.d.ts +68 -0
- package/dist/components/LpQuota.vue.js +4 -0
- 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.d.ts +41 -0
- package/dist/components/LpRelativeTime.vue.js +4 -0
- package/dist/components/LpRepeater.vue.d.ts +48 -0
- package/dist/components/LpRepeater.vue.js +4 -0
- package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
- package/dist/components/LpRevealOnScroll.vue.js +4 -0
- package/dist/components/LpRollingText.vue.d.ts +3 -1
- package/dist/components/LpRollingText.vue.js +1 -1
- package/dist/components/LpScramble.vue.d.ts +55 -0
- package/dist/components/LpScramble.vue.js +4 -0
- package/dist/components/LpScrollArea.vue.d.ts +1 -1
- package/dist/components/LpSecretField.vue.d.ts +108 -0
- package/dist/components/LpSecretField.vue.js +4 -0
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.d.ts +2 -0
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
- package/dist/components/LpShaderBackdrop.vue.js +4 -0
- package/dist/components/LpShinyText.vue.d.ts +39 -0
- package/dist/components/LpShinyText.vue.js +4 -0
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +4 -3
- package/dist/components/LpSparkline.vue.js +1 -1
- package/dist/components/LpSpotlight.vue.d.ts +37 -0
- package/dist/components/LpSpotlight.vue.js +4 -0
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.d.ts +65 -0
- package/dist/components/LpStatus.vue.js +4 -0
- package/dist/components/LpStepMark.vue.d.ts +31 -0
- package/dist/components/LpStepMark.vue.js +4 -0
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.d.ts +2 -2
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.js +104 -120
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.d.ts +6 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +5 -5
- package/dist/components/LpTabs.vue.js +25 -33
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextReveal.vue.d.ts +58 -0
- package/dist/components/LpTextReveal.vue.js +4 -0
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.d.ts +54 -0
- package/dist/components/LpThemeStudio.vue.js +4 -0
- package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
- package/dist/components/LpThemeStudioSection.vue.js +4 -0
- package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.d.ts +2 -0
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.d.ts +2 -2
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.d.ts +34 -0
- package/dist/components/LpTruncate.vue.js +4 -0
- package/dist/components/LpTypewriter.vue.d.ts +61 -0
- package/dist/components/LpTypewriter.vue.js +4 -0
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.d.ts +7 -0
- package/dist/components/OptionContent.vue.js +4 -0
- package/dist/components/PickerField.vue.d.ts +45 -0
- package/dist/components/PickerField.vue.js +4 -0
- package/dist/components/RevealToggle.vue.d.ts +21 -0
- package/dist/components/RevealToggle.vue.js +4 -0
- package/dist/components/StepConnector.vue.d.ts +19 -0
- package/dist/components/StepConnector.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/badge.d.ts +1 -0
- package/dist/components/badge.js +4 -0
- package/dist/components/chart.d.ts +5 -1
- package/dist/components/chart.js +2 -21
- package/dist/components/dateRange.d.ts +11 -0
- package/dist/components/dateRange.js +12 -0
- package/dist/components/dock.d.ts +19 -0
- package/dist/components/dock.js +16 -0
- package/dist/components/dropdown.d.ts +10 -1
- package/dist/components/dropdown.js +7 -2
- package/dist/components/fieldText.d.ts +38 -0
- package/dist/components/fieldText.js +53 -0
- package/dist/components/fileTree.d.ts +7 -3
- package/dist/components/fileTree.js +12 -18
- package/dist/components/format.d.ts +41 -0
- package/dist/components/format.js +67 -0
- package/dist/components/identicon.d.ts +38 -0
- package/dist/components/identicon.js +85 -0
- package/dist/components/masonry.d.ts +32 -0
- package/dist/components/masonry.js +40 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.d.ts +64 -0
- package/dist/components/meter.js +53 -0
- package/dist/components/otp.d.ts +1 -1
- package/dist/components/otp.js +7 -2
- package/dist/components/pipeline.d.ts +55 -0
- package/dist/components/pipeline.js +51 -0
- package/dist/components/quota.d.ts +57 -0
- package/dist/components/quota.js +40 -0
- package/dist/components/relativeTime.d.ts +24 -0
- package/dist/components/relativeTime.js +56 -0
- package/dist/components/reveal.d.ts +18 -0
- package/dist/components/reveal.js +32 -0
- package/dist/components/scramble.d.ts +68 -0
- package/dist/components/scramble.js +58 -0
- package/dist/components/shaderBackdrop.d.ts +20 -0
- package/dist/components/shaderBackdrop.js +156 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.js +24 -0
- package/dist/components/slotText.d.ts +2 -0
- package/dist/components/slotText.js +9 -0
- package/dist/components/status.d.ts +14 -0
- package/dist/components/status.js +22 -0
- package/dist/components/tableFacets.d.ts +8 -0
- package/dist/components/tableFacets.js +19 -0
- package/dist/components/textSplit.d.ts +17 -0
- package/dist/components/textSplit.js +24 -0
- package/dist/components/timeSpan.d.ts +78 -0
- package/dist/components/timeSpan.js +85 -0
- package/dist/components/tone.d.ts +43 -0
- package/dist/components/tone.js +82 -0
- package/dist/components/tour.js +3 -2
- package/dist/components/typewriter.d.ts +36 -0
- package/dist/components/typewriter.js +53 -0
- package/dist/components/videoBackdrop.js +5 -6
- package/dist/composables/easing.d.ts +22 -1
- package/dist/composables/easing.js +42 -1
- package/dist/composables/pseudoLocale.d.ts +15 -0
- package/dist/composables/pseudoLocale.js +96 -0
- package/dist/composables/scroll.js +5 -3
- package/dist/composables/useClipboard.d.ts +4 -1
- package/dist/composables/useClipboard.js +12 -2
- package/dist/composables/useField.d.ts +13 -0
- package/dist/composables/useField.js +26 -1
- package/dist/composables/useForm.js +32 -9
- package/dist/composables/useInView.d.ts +11 -0
- package/dist/composables/useInView.js +39 -0
- package/dist/composables/useLoadingGate.d.ts +8 -0
- package/dist/composables/useLoadingGate.js +38 -0
- package/dist/composables/useLpConfig.d.ts +10 -0
- package/dist/composables/useLpConfig.js +11 -1
- package/dist/composables/useMediaQuery.js +3 -1
- package/dist/composables/useNow.d.ts +16 -0
- package/dist/composables/useNow.js +39 -0
- package/dist/composables/usePersisted.js +14 -7
- package/dist/composables/usePillTransition.d.ts +5 -2
- package/dist/composables/usePillTransition.js +4 -3
- package/dist/composables/usePointerFrame.d.ts +18 -0
- package/dist/composables/usePointerFrame.js +31 -0
- package/dist/composables/useReducedMotion.d.ts +2 -0
- package/dist/composables/useReducedMotion.js +7 -0
- package/dist/composables/useRepeater.d.ts +17 -0
- package/dist/composables/useRepeater.js +31 -0
- package/dist/composables/useResizeObserver.d.ts +8 -0
- package/dist/composables/useResizeObserver.js +33 -0
- package/dist/composables/useRevealedValue.d.ts +31 -0
- package/dist/composables/useRevealedValue.js +26 -0
- package/dist/composables/useScramble.d.ts +42 -0
- package/dist/composables/useScramble.js +76 -0
- package/dist/composables/useShift.js +2 -10
- package/dist/composables/useSpotlight.d.ts +18 -0
- package/dist/composables/useSpotlight.js +53 -0
- package/dist/composables/useTilt.js +26 -18
- package/dist/composables/useTween.d.ts +43 -0
- package/dist/composables/useTween.js +69 -0
- package/dist/composables/useView.d.ts +18 -0
- package/dist/composables/useView.js +64 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +98 -1
- package/dist/index.js +263 -105
- package/dist/theme/define.d.ts +12 -0
- package/dist/theme/studio.d.ts +90 -0
- package/package.json +8 -2
- package/src/component-names.ts +33 -0
- package/src/components/AttentionDot.vue +27 -0
- package/src/components/ContextMenuItems.vue +5 -2
- package/src/components/FieldWrapper.vue +38 -0
- package/src/components/LayoutNode.vue +5 -9
- package/src/components/LegendSwatch.vue +15 -0
- package/src/components/LoaderMark.vue +90 -0
- package/src/components/LpActionBar.vue +12 -20
- package/src/components/LpActivityLine.vue +186 -0
- package/src/components/LpAlert.vue +54 -24
- package/src/components/LpAppShell.vue +7 -11
- package/src/components/LpAutocomplete.vue +16 -14
- package/src/components/LpAvatar.vue +17 -2
- package/src/components/LpBadge.vue +77 -13
- package/src/components/LpBreadcrumbs.vue +101 -35
- package/src/components/LpButton.vue +15 -3
- package/src/components/LpCard.vue +30 -7
- package/src/components/LpChart.vue +162 -171
- package/src/components/LpCheckbox.vue +10 -4
- package/src/components/LpCodeBlock.vue +11 -19
- package/src/components/LpCodeDisplay.vue +228 -0
- package/src/components/LpCollapse.vue +162 -0
- package/src/components/LpColorPicker.vue +10 -1
- package/src/components/LpCommandPalette.vue +38 -24
- package/src/components/LpContextMenu.vue +13 -3
- package/src/components/LpCopyButton.vue +185 -0
- package/src/components/LpCountdown.vue +308 -0
- package/src/components/LpDataList.vue +154 -0
- package/src/components/LpDatePicker.vue +55 -104
- package/src/components/LpDateRangePicker.vue +51 -95
- package/src/components/LpDisclosure.vue +58 -36
- package/src/components/LpDock.vue +274 -0
- package/src/components/LpDrawer.vue +10 -1
- package/src/components/LpDropdownMenu.vue +11 -2
- package/src/components/LpDropzone.vue +34 -13
- package/src/components/LpEditable.vue +295 -0
- package/src/components/LpFileTree.vue +5 -1
- package/src/components/LpFileTreeNode.vue +25 -50
- package/src/components/LpFormField.vue +22 -3
- package/src/components/LpFrame.vue +200 -0
- package/src/components/LpGauge.vue +287 -0
- package/src/components/LpGlowBorder.vue +60 -0
- package/src/components/LpHintExample.vue +9 -32
- package/src/components/LpHintLayer.vue +13 -3
- package/src/components/LpHoverCard.vue +175 -0
- package/src/components/LpIdenticon.vue +69 -0
- package/src/components/LpImageEditor.vue +15 -18
- package/src/components/LpInfraNode.vue +27 -16
- package/src/components/LpInput.vue +30 -16
- package/src/components/LpLightbox.vue +44 -23
- package/src/components/LpLoader.vue +145 -0
- package/src/components/LpLogViewer.vue +311 -82
- package/src/components/LpMagnetic.vue +97 -0
- package/src/components/LpMapPicker.vue +26 -28
- package/src/components/LpMasonry.vue +247 -0
- package/src/components/LpModal.vue +10 -1
- package/src/components/LpNotificationBell.vue +33 -49
- package/src/components/LpNumberField.vue +79 -14
- package/src/components/LpNumberFlow.vue +10 -35
- package/src/components/LpOtpInput.vue +7 -2
- package/src/components/LpPagination.vue +38 -4
- package/src/components/LpPalettePreview.vue +2 -7
- package/src/components/LpPasswordInput.vue +25 -18
- package/src/components/LpPhoneInput.vue +12 -3
- package/src/components/LpPie.vue +197 -36
- package/src/components/LpPipeline.vue +366 -0
- package/src/components/LpPopover.vue +14 -1
- package/src/components/LpProgress.vue +22 -84
- package/src/components/LpQuota.vue +197 -0
- package/src/components/LpRangeSlider.vue +5 -1
- package/src/components/LpRelativeTime.vue +90 -0
- package/src/components/LpRepeater.vue +131 -0
- package/src/components/LpRevealOnScroll.vue +125 -0
- package/src/components/LpRollingText.vue +12 -1
- package/src/components/LpScramble.vue +107 -0
- package/src/components/LpSecretField.vue +320 -0
- package/src/components/LpSegmented.vue +3 -10
- package/src/components/LpSelect.vue +74 -65
- package/src/components/LpShaderBackdrop.vue +434 -0
- package/src/components/LpShinyText.vue +139 -0
- package/src/components/LpSidebar.vue +2 -0
- package/src/components/LpSlider.vue +5 -1
- package/src/components/LpSparkline.vue +55 -37
- package/src/components/LpSpotlight.vue +51 -0
- package/src/components/LpStat.vue +6 -2
- package/src/components/LpStatus.vue +127 -0
- package/src/components/LpStepMark.vue +138 -0
- package/src/components/LpStepper.vue +37 -43
- package/src/components/LpSwap.vue +2 -2
- package/src/components/LpSwitch.vue +15 -22
- package/src/components/LpTable.vue +47 -63
- package/src/components/LpTableFilter.vue +1 -0
- package/src/components/LpTableOfContents.vue +53 -29
- package/src/components/LpTabs.vue +10 -21
- package/src/components/LpTagsInput.vue +53 -37
- package/src/components/LpTextReveal.vue +236 -0
- package/src/components/LpTextarea.vue +11 -11
- package/src/components/LpThemeStudio.vue +216 -0
- package/src/components/LpThemeStudioSection.vue +16 -0
- package/src/components/LpThemeSwitcher.vue +156 -47
- package/src/components/LpTimeField.vue +9 -1
- package/src/components/LpToaster.vue +63 -83
- package/src/components/LpTooltip.vue +10 -1
- package/src/components/LpTour.vue +24 -13
- package/src/components/LpTruncate.vue +135 -0
- package/src/components/LpTypewriter.vue +236 -0
- package/src/components/LpUptimeBar.vue +6 -5
- package/src/components/LpVideoBackdrop.vue +15 -13
- package/src/components/OptionContent.vue +17 -0
- package/src/components/PickerField.vue +59 -0
- package/src/components/RevealToggle.vue +51 -0
- package/src/components/StepConnector.vue +54 -0
- package/src/components/TourCard.vue +29 -16
- package/src/components/badge.ts +8 -0
- package/src/components/chart.ts +8 -23
- package/src/components/dateRange.ts +25 -0
- package/src/components/dock.ts +31 -0
- package/src/components/dropdown.ts +15 -3
- package/src/components/fieldText.ts +95 -0
- package/src/components/fileTree.ts +19 -21
- package/src/components/format.ts +136 -0
- package/src/components/identicon.ts +160 -0
- package/src/components/masonry.ts +73 -0
- package/src/components/meter.ts +122 -0
- package/src/components/otp.ts +14 -3
- package/src/components/pipeline.ts +101 -0
- package/src/components/quota.ts +111 -0
- package/src/components/relativeTime.ts +118 -0
- package/src/components/reveal.ts +56 -0
- package/src/components/scramble.ts +138 -0
- package/src/components/shaderBackdrop.ts +208 -0
- package/src/components/slider.ts +30 -0
- package/src/components/slotText.ts +13 -0
- package/src/components/status.ts +46 -0
- package/src/components/tableFacets.ts +25 -0
- package/src/components/textSplit.ts +55 -0
- package/src/components/timeSpan.ts +183 -0
- package/src/components/tone.ts +144 -0
- package/src/components/tour.ts +3 -2
- package/src/components/typewriter.ts +104 -0
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/easing.ts +66 -1
- package/src/composables/pseudoLocale.ts +105 -0
- package/src/composables/scroll.ts +6 -3
- package/src/composables/useClipboard.ts +25 -3
- package/src/composables/useField.ts +38 -1
- package/src/composables/useForm.ts +41 -11
- package/src/composables/useInView.ts +61 -0
- package/src/composables/useLoadingGate.ts +63 -0
- package/src/composables/useLpConfig.ts +20 -1
- package/src/composables/useMediaQuery.ts +6 -2
- package/src/composables/useNow.ts +84 -0
- package/src/composables/usePersisted.ts +19 -8
- package/src/composables/usePillTransition.ts +21 -13
- package/src/composables/usePointerFrame.ts +72 -0
- package/src/composables/useReducedMotion.ts +22 -0
- package/src/composables/useRepeater.ts +44 -0
- package/src/composables/useResizeObserver.ts +59 -0
- package/src/composables/useRevealedValue.ts +84 -0
- package/src/composables/useScramble.ts +152 -0
- package/src/composables/useShift.ts +10 -16
- package/src/composables/useSpotlight.ts +82 -0
- package/src/composables/useTilt.ts +40 -23
- package/src/composables/useTween.ts +149 -0
- package/src/composables/useView.ts +96 -0
- package/src/index.css +1 -0
- package/src/index.ts +143 -1
- package/src/kit-icons.ts +1 -1
- package/src/theme/define.ts +65 -0
- package/src/theme/studio.ts +202 -0
- package/src/tokens/effects.css +151 -0
- package/src/tokens/tokens.css +131 -39
- package/src/tokens/utilities.css +81 -0
- package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
- package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
- package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
- package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
- package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
- package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
- package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
- package/dist/chunks/LpStepper-C2slwObu.js +0 -90
- package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
- package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
- package/dist/chunks/TourCard-BKI7X9-r.js +0 -105
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
const TONE_ALIASES = {
|
|
2
|
+
neutral: "neutral",
|
|
3
|
+
muted: "neutral",
|
|
4
|
+
brand: "brand",
|
|
5
|
+
info: "brand",
|
|
6
|
+
success: "success",
|
|
7
|
+
ok: "success",
|
|
8
|
+
action: "success",
|
|
9
|
+
warning: "warning",
|
|
10
|
+
accent: "warning",
|
|
11
|
+
danger: "danger",
|
|
12
|
+
error: "danger"
|
|
13
|
+
};
|
|
14
|
+
const TONES = {
|
|
15
|
+
neutral: {
|
|
16
|
+
color: "var(--color-muted)",
|
|
17
|
+
soft: "var(--color-surface-soft)",
|
|
18
|
+
text: "text-muted",
|
|
19
|
+
bg: "bg-muted",
|
|
20
|
+
softBg: "bg-surface-soft",
|
|
21
|
+
chip: "bg-surface-soft text-muted-strong",
|
|
22
|
+
border: "border-line-strong",
|
|
23
|
+
panel: "border-line bg-surface-soft",
|
|
24
|
+
selection: "selection:bg-muted/40"
|
|
25
|
+
},
|
|
26
|
+
brand: {
|
|
27
|
+
color: "var(--color-brand)",
|
|
28
|
+
soft: "var(--color-brand-soft)",
|
|
29
|
+
text: "text-brand",
|
|
30
|
+
bg: "bg-brand",
|
|
31
|
+
softBg: "bg-brand-soft",
|
|
32
|
+
chip: "bg-brand-soft text-[color-mix(in_oklab,var(--color-brand)_60%,var(--color-ink))]",
|
|
33
|
+
border: "border-brand",
|
|
34
|
+
panel: "border-brand/30 bg-brand/10",
|
|
35
|
+
selection: "selection:bg-brand/40"
|
|
36
|
+
},
|
|
37
|
+
success: {
|
|
38
|
+
color: "var(--color-action)",
|
|
39
|
+
soft: "var(--color-action-soft)",
|
|
40
|
+
text: "text-action",
|
|
41
|
+
bg: "bg-action",
|
|
42
|
+
softBg: "bg-action-soft",
|
|
43
|
+
chip: "bg-action-soft text-[color-mix(in_oklab,var(--color-action)_60%,var(--color-ink))]",
|
|
44
|
+
border: "border-action",
|
|
45
|
+
panel: "border-action/30 bg-action/10",
|
|
46
|
+
selection: "selection:bg-action/40"
|
|
47
|
+
},
|
|
48
|
+
warning: {
|
|
49
|
+
color: "var(--color-accent)",
|
|
50
|
+
soft: "var(--color-accent-soft)",
|
|
51
|
+
text: "text-accent",
|
|
52
|
+
bg: "bg-accent",
|
|
53
|
+
softBg: "bg-accent-soft",
|
|
54
|
+
chip: "bg-accent-soft text-[color-mix(in_oklab,var(--color-accent)_60%,var(--color-ink))]",
|
|
55
|
+
border: "border-accent",
|
|
56
|
+
panel: "border-accent/30 bg-accent/10",
|
|
57
|
+
selection: "selection:bg-accent/40"
|
|
58
|
+
},
|
|
59
|
+
danger: {
|
|
60
|
+
color: "var(--color-danger)",
|
|
61
|
+
soft: "var(--color-danger-soft)",
|
|
62
|
+
text: "text-danger",
|
|
63
|
+
bg: "bg-danger",
|
|
64
|
+
softBg: "bg-danger-soft",
|
|
65
|
+
chip: "bg-danger-soft text-[color-mix(in_oklab,var(--color-danger)_60%,var(--color-ink))]",
|
|
66
|
+
border: "border-danger",
|
|
67
|
+
panel: "border-danger/30 bg-danger/10",
|
|
68
|
+
selection: "selection:bg-danger/40"
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
function toneOf(name, fallback = "neutral") {
|
|
72
|
+
return name && TONE_ALIASES[name] || fallback;
|
|
73
|
+
}
|
|
74
|
+
function toneLook(name, fallback = "neutral") {
|
|
75
|
+
return TONES[toneOf(name, fallback)];
|
|
76
|
+
}
|
|
77
|
+
export {
|
|
78
|
+
TONES,
|
|
79
|
+
TONE_ALIASES,
|
|
80
|
+
toneLook,
|
|
81
|
+
toneOf
|
|
82
|
+
};
|
package/dist/components/tour.js
CHANGED
|
@@ -48,8 +48,9 @@ function openContextMenu(el) {
|
|
|
48
48
|
);
|
|
49
49
|
return () => {
|
|
50
50
|
const outside = { bubbles: true, cancelable: true, clientX: 0, clientY: 0 };
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
const body = el.ownerDocument.body;
|
|
52
|
+
body.dispatchEvent(new PointerEvent("pointerdown", outside));
|
|
53
|
+
body.dispatchEvent(new PointerEvent("pointerup", outside));
|
|
53
54
|
};
|
|
54
55
|
}
|
|
55
56
|
export {
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { Random } from "./scramble";
|
|
2
|
+
export interface TypewriterState {
|
|
3
|
+
/** The string being shown. */
|
|
4
|
+
index: number;
|
|
5
|
+
/** How many of its characters are shown. */
|
|
6
|
+
length: number;
|
|
7
|
+
phase: "typing" | "holding" | "erasing" | "done";
|
|
8
|
+
/** The string to type once erasing has gone far enough. */
|
|
9
|
+
to: number;
|
|
10
|
+
}
|
|
11
|
+
export interface TypewriterOptions {
|
|
12
|
+
/** Ms per typed character, before variance. */
|
|
13
|
+
speed: number;
|
|
14
|
+
/** Ms per erased character. Erasing is steady: nobody holds backspace unevenly. */
|
|
15
|
+
eraseSpeed: number;
|
|
16
|
+
/** Ms a finished string stays before it is erased. */
|
|
17
|
+
hold: number;
|
|
18
|
+
/** Start over after the last string instead of stopping on it. */
|
|
19
|
+
loop: boolean;
|
|
20
|
+
}
|
|
21
|
+
export interface TypewriterStep {
|
|
22
|
+
state: TypewriterState;
|
|
23
|
+
/** Ms until the next call. Infinity: nothing more to do. */
|
|
24
|
+
wait: number;
|
|
25
|
+
/** Set when this step finished typing a string: its index. */
|
|
26
|
+
typed?: number;
|
|
27
|
+
}
|
|
28
|
+
export declare const typewriterStart: () => TypewriterState;
|
|
29
|
+
/**
|
|
30
|
+
* A keystroke's delay: the base speed with some unevenness, and a pause after
|
|
31
|
+
* punctuation, which is where a person typing actually stops.
|
|
32
|
+
*/
|
|
33
|
+
export declare function keystrokeDelay(char: string, speed: number, random: Random): number;
|
|
34
|
+
/** Characters two strings share at the start: erasing stops there and typing goes on from it. */
|
|
35
|
+
export declare function sharedPrefix(a: string[], b: string[]): number;
|
|
36
|
+
export declare function typewriterNext(state: TypewriterState, strings: string[][], options: TypewriterOptions, random?: Random): TypewriterStep;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
const typewriterStart = () => ({ index: 0, length: 0, phase: "typing", to: 0 });
|
|
2
|
+
function keystrokeDelay(char, speed, random) {
|
|
3
|
+
const jitter = speed * (0.55 + 0.9 * random());
|
|
4
|
+
if (/[.!?…]/.test(char)) return jitter + speed * 5;
|
|
5
|
+
if (/[,;:]/.test(char)) return jitter + speed * 2.5;
|
|
6
|
+
return jitter;
|
|
7
|
+
}
|
|
8
|
+
function sharedPrefix(a, b) {
|
|
9
|
+
let n = 0;
|
|
10
|
+
while (n < a.length && n < b.length && a[n] === b[n]) n++;
|
|
11
|
+
return n;
|
|
12
|
+
}
|
|
13
|
+
function typewriterNext(state, strings, options, random = Math.random) {
|
|
14
|
+
const count = strings.length;
|
|
15
|
+
if (!count) return { state: { ...state, phase: "done" }, wait: Infinity };
|
|
16
|
+
const current = strings[state.index] ?? [];
|
|
17
|
+
switch (state.phase) {
|
|
18
|
+
case "typing": {
|
|
19
|
+
if (state.length >= current.length) return finish(state, count, options);
|
|
20
|
+
const length = state.length + 1;
|
|
21
|
+
const next = { ...state, length };
|
|
22
|
+
if (length < current.length) return { state: next, wait: keystrokeDelay(current[length - 1], options.speed, random) };
|
|
23
|
+
return finish(next, count, options);
|
|
24
|
+
}
|
|
25
|
+
case "holding": {
|
|
26
|
+
const to = (state.index + 1) % count;
|
|
27
|
+
return erase({ ...state, phase: "erasing", to }, strings, options);
|
|
28
|
+
}
|
|
29
|
+
case "erasing":
|
|
30
|
+
return erase(state, strings, options);
|
|
31
|
+
case "done":
|
|
32
|
+
return { state, wait: Infinity };
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function finish(state, count, options) {
|
|
36
|
+
const last = state.index === count - 1;
|
|
37
|
+
if (last && !options.loop) return { state: { ...state, phase: "done" }, wait: Infinity, typed: state.index };
|
|
38
|
+
return { state: { ...state, phase: "holding" }, wait: options.hold, typed: state.index };
|
|
39
|
+
}
|
|
40
|
+
function erase(state, strings, options) {
|
|
41
|
+
const keep = sharedPrefix(strings[state.index] ?? [], strings[state.to] ?? []);
|
|
42
|
+
if (state.length > keep) {
|
|
43
|
+
const length = state.length - 1;
|
|
44
|
+
return { state: { ...state, length }, wait: length > keep ? options.eraseSpeed : options.speed * 4 };
|
|
45
|
+
}
|
|
46
|
+
return { state: { index: state.to, length: state.length, phase: "typing", to: state.to }, wait: 0 };
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
keystrokeDelay,
|
|
50
|
+
sharedPrefix,
|
|
51
|
+
typewriterNext,
|
|
52
|
+
typewriterStart
|
|
53
|
+
};
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { splitTime } from "./timeSpan.js";
|
|
1
2
|
function planLoop(duration, options = {}) {
|
|
2
3
|
if (!Number.isFinite(duration) || duration <= 0) return { from: 0, to: 0, fade: 0 };
|
|
3
4
|
const clamp = (value) => Math.min(duration, Math.max(0, value));
|
|
@@ -23,12 +24,10 @@ function isNativeLoop(plan, duration) {
|
|
|
23
24
|
return plan.fade === 0 && plan.from === 0 && plan.to >= duration;
|
|
24
25
|
}
|
|
25
26
|
function formatClipTime(seconds, precise = false) {
|
|
26
|
-
const
|
|
27
|
-
const minutes =
|
|
28
|
-
const
|
|
29
|
-
const
|
|
30
|
-
const tenth = Math.floor((rest - whole) * 10);
|
|
31
|
-
const secs = String(whole).padStart(2, "0");
|
|
27
|
+
const t = splitTime(Number.isFinite(seconds) ? seconds * 1e3 : 0);
|
|
28
|
+
const minutes = (t.days * 24 + t.hours) * 60 + t.minutes;
|
|
29
|
+
const secs = String(t.seconds).padStart(2, "0");
|
|
30
|
+
const tenth = Math.floor(t.ms / 100);
|
|
32
31
|
return precise && tenth ? `${minutes}:${secs}.${tenth}` : `${minutes}:${secs}`;
|
|
33
32
|
}
|
|
34
33
|
export {
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
*
|
|
8
8
|
* A plain function, not a reactive composable: it is read at the moment an
|
|
9
9
|
* animation starts, and a component that also needs to RE-RENDER when the
|
|
10
|
-
* setting changes mid-session should use
|
|
10
|
+
* setting changes mid-session should use `usePrefersReducedMotion`.
|
|
11
11
|
*/
|
|
12
12
|
export declare const prefersReducedMotion: () => boolean;
|
|
13
13
|
/**
|
|
@@ -50,3 +50,24 @@ export declare const easeOut: (t: number) => number;
|
|
|
50
50
|
* the tail short.
|
|
51
51
|
*/
|
|
52
52
|
export declare const easeTravel: (t: number) => number;
|
|
53
|
+
/**
|
|
54
|
+
* A cubic-bezier as a function of time, solved per call.
|
|
55
|
+
*
|
|
56
|
+
* The curves above are hand-shaped stand-ins for tokens a component reaches for
|
|
57
|
+
* by feel. A tween that has to match a CSS transition running beside it (a
|
|
58
|
+
* slice's arc easing while its colour and lift move on `--ease-emphasized`)
|
|
59
|
+
* needs the token's actual curve, and a theme may retune it — so this reads the
|
|
60
|
+
* four numbers and solves for them rather than approximating one fixed shape.
|
|
61
|
+
*
|
|
62
|
+
* Newton's method on x(s) = t, falling back to bisection where the slope is
|
|
63
|
+
* too flat to step on; a handful of iterations is far below a pixel.
|
|
64
|
+
*/
|
|
65
|
+
export declare const cubicBezier: (x1: number, y1: number, x2: number, y2: number) => (t: number) => number;
|
|
66
|
+
/**
|
|
67
|
+
* An easing token as a function, for a value tweened in script.
|
|
68
|
+
*
|
|
69
|
+
* Anything the token does not spell as a `cubic-bezier()` (a keyword, a
|
|
70
|
+
* `linear()` list) falls back to `easeOut`, which has the same "arrives and
|
|
71
|
+
* settles" intent as every curve the kit defines.
|
|
72
|
+
*/
|
|
73
|
+
export declare const tokenEase: (name: "ease-emphasized" | "ease-travel" | "ease-settle") => ((t: number) => number);
|
|
@@ -21,10 +21,51 @@ const easeTravel = (t) => {
|
|
|
21
21
|
const head = EDGE * EDGE / (2 * EDGE) + EDGE * 0.1;
|
|
22
22
|
return head + (t - EDGE) / (1 - 2 * EDGE) * (1 - 2 * head);
|
|
23
23
|
};
|
|
24
|
+
const cubicBezier = (x1, y1, x2, y2) => {
|
|
25
|
+
const cx = 3 * x1;
|
|
26
|
+
const bx = 3 * (x2 - x1) - cx;
|
|
27
|
+
const ax = 1 - cx - bx;
|
|
28
|
+
const cy = 3 * y1;
|
|
29
|
+
const by = 3 * (y2 - y1) - cy;
|
|
30
|
+
const ay = 1 - cy - by;
|
|
31
|
+
const x = (s) => ((ax * s + bx) * s + cx) * s;
|
|
32
|
+
const y = (s) => ((ay * s + by) * s + cy) * s;
|
|
33
|
+
const dx = (s) => (3 * ax * s + 2 * bx) * s + cx;
|
|
34
|
+
return (t) => {
|
|
35
|
+
if (t <= 0) return 0;
|
|
36
|
+
if (t >= 1) return 1;
|
|
37
|
+
let s = t;
|
|
38
|
+
for (let i = 0; i < 6; i++) {
|
|
39
|
+
const err = x(s) - t;
|
|
40
|
+
if (Math.abs(err) < 1e-5) return y(s);
|
|
41
|
+
const slope = dx(s);
|
|
42
|
+
if (Math.abs(slope) < 1e-6) break;
|
|
43
|
+
s -= err / slope;
|
|
44
|
+
}
|
|
45
|
+
let lo = 0;
|
|
46
|
+
let hi = 1;
|
|
47
|
+
s = t;
|
|
48
|
+
for (let i = 0; i < 20; i++) {
|
|
49
|
+
const v = x(s);
|
|
50
|
+
if (Math.abs(v - t) < 1e-5) break;
|
|
51
|
+
if (v < t) lo = s;
|
|
52
|
+
else hi = s;
|
|
53
|
+
s = (lo + hi) / 2;
|
|
54
|
+
}
|
|
55
|
+
return y(s);
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
const tokenEase = (name) => {
|
|
59
|
+
const match = /cubic-bezier\(([^)]+)\)/.exec(easingToken(name));
|
|
60
|
+
const n = match?.[1].split(",").map((p) => Number.parseFloat(p));
|
|
61
|
+
return n && n.length === 4 && n.every(Number.isFinite) ? cubicBezier(n[0], n[1], n[2], n[3]) : easeOut;
|
|
62
|
+
};
|
|
24
63
|
export {
|
|
64
|
+
cubicBezier,
|
|
25
65
|
durationToken,
|
|
26
66
|
easeOut,
|
|
27
67
|
easeTravel,
|
|
28
68
|
easingToken,
|
|
29
|
-
prefersReducedMotion
|
|
69
|
+
prefersReducedMotion,
|
|
70
|
+
tokenEase
|
|
30
71
|
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export interface PseudoOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Extra length as a share of the text's letters: 0.35 adds about a third.
|
|
4
|
+
* Spread over the vowels, so the text grows the way a longer word does
|
|
5
|
+
* rather than gaining a tail that wraps somewhere convenient.
|
|
6
|
+
*/
|
|
7
|
+
expand?: number;
|
|
8
|
+
/**
|
|
9
|
+
* Markers around the whole string. `true` uses square brackets, a pair of
|
|
10
|
+
* strings picks others, `false` drops them.
|
|
11
|
+
*/
|
|
12
|
+
brackets?: boolean | readonly [string, string];
|
|
13
|
+
}
|
|
14
|
+
/** English text made to look translated and longer; see the module comment. */
|
|
15
|
+
export declare function pseudoLocalize(text: string, options?: PseudoOptions): string;
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
const ACCENTED = {
|
|
2
|
+
a: "å",
|
|
3
|
+
b: "ƀ",
|
|
4
|
+
c: "ç",
|
|
5
|
+
d: "ð",
|
|
6
|
+
e: "é",
|
|
7
|
+
f: "ƒ",
|
|
8
|
+
g: "ĝ",
|
|
9
|
+
h: "ĥ",
|
|
10
|
+
i: "î",
|
|
11
|
+
j: "ĵ",
|
|
12
|
+
k: "ķ",
|
|
13
|
+
l: "ļ",
|
|
14
|
+
m: "ɱ",
|
|
15
|
+
n: "ñ",
|
|
16
|
+
o: "ö",
|
|
17
|
+
p: "þ",
|
|
18
|
+
q: "ǫ",
|
|
19
|
+
r: "ŕ",
|
|
20
|
+
s: "š",
|
|
21
|
+
t: "ţ",
|
|
22
|
+
u: "û",
|
|
23
|
+
v: "ṽ",
|
|
24
|
+
w: "ŵ",
|
|
25
|
+
x: "ẋ",
|
|
26
|
+
y: "ý",
|
|
27
|
+
z: "ž",
|
|
28
|
+
A: "Å",
|
|
29
|
+
B: "Ɓ",
|
|
30
|
+
C: "Ç",
|
|
31
|
+
D: "Ð",
|
|
32
|
+
E: "É",
|
|
33
|
+
F: "Ƒ",
|
|
34
|
+
G: "Ĝ",
|
|
35
|
+
H: "Ĥ",
|
|
36
|
+
I: "Î",
|
|
37
|
+
J: "Ĵ",
|
|
38
|
+
K: "Ķ",
|
|
39
|
+
L: "Ļ",
|
|
40
|
+
M: "Ṁ",
|
|
41
|
+
N: "Ñ",
|
|
42
|
+
O: "Ö",
|
|
43
|
+
P: "Þ",
|
|
44
|
+
Q: "Ǫ",
|
|
45
|
+
R: "Ŕ",
|
|
46
|
+
S: "Š",
|
|
47
|
+
T: "Ţ",
|
|
48
|
+
U: "Û",
|
|
49
|
+
V: "Ṽ",
|
|
50
|
+
W: "Ŵ",
|
|
51
|
+
X: "Ẋ",
|
|
52
|
+
Y: "Ý",
|
|
53
|
+
Z: "Ž"
|
|
54
|
+
};
|
|
55
|
+
const VOWEL = /[aeiouyAEIOUY]/;
|
|
56
|
+
const PROTECTED = /\{\{[^}]*\}\}|\{[^{}]*\}|%(?:\d+\$)?[-+ 0#]*\d*(?:\.\d+)?[sdifoxXeEgGc%]|<[^>]+>|&[a-zA-Z#0-9]+;/g;
|
|
57
|
+
function pseudoLocalize(text, options = {}) {
|
|
58
|
+
if (!text.trim()) return text;
|
|
59
|
+
const expand = Math.max(0, options.expand ?? 0.35);
|
|
60
|
+
const brackets = options.brackets ?? true;
|
|
61
|
+
const [open, close] = brackets === true ? ["[", "]"] : brackets === false ? ["", ""] : brackets;
|
|
62
|
+
const runs = [];
|
|
63
|
+
let last = 0;
|
|
64
|
+
for (const match of text.matchAll(PROTECTED)) {
|
|
65
|
+
const at = match.index ?? 0;
|
|
66
|
+
if (at > last) runs.push({ text: text.slice(last, at), code: false });
|
|
67
|
+
runs.push({ text: match[0], code: true });
|
|
68
|
+
last = at + match[0].length;
|
|
69
|
+
}
|
|
70
|
+
if (last < text.length) runs.push({ text: text.slice(last), code: false });
|
|
71
|
+
const letters = runs.reduce((n, run) => run.code ? n : n + (run.text.match(/[a-zA-Z]/g)?.length ?? 0), 0);
|
|
72
|
+
const vowels = runs.reduce((n, run) => run.code ? n : n + (run.text.match(/[aeiouyAEIOUY]/g)?.length ?? 0), 0);
|
|
73
|
+
let extra = Math.round(letters * expand);
|
|
74
|
+
const per = vowels ? Math.floor(extra / vowels) : 0;
|
|
75
|
+
let rest = vowels ? extra % vowels : 0;
|
|
76
|
+
if (vowels) extra = 0;
|
|
77
|
+
const out = runs.map((run) => {
|
|
78
|
+
if (run.code) return run.text;
|
|
79
|
+
let s = "";
|
|
80
|
+
for (const ch of run.text) {
|
|
81
|
+
const mapped = ACCENTED[ch] ?? ch;
|
|
82
|
+
s += mapped;
|
|
83
|
+
if (VOWEL.test(ch)) {
|
|
84
|
+
const times = per + (rest > 0 ? 1 : 0);
|
|
85
|
+
if (rest > 0) rest--;
|
|
86
|
+
s += mapped.toLowerCase().repeat(times);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
return s;
|
|
90
|
+
}).join("");
|
|
91
|
+
const tail = extra > 0 ? "·".repeat(extra) : "";
|
|
92
|
+
return `${open}${out}${tail}${close}`;
|
|
93
|
+
}
|
|
94
|
+
export {
|
|
95
|
+
pseudoLocalize
|
|
96
|
+
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
const SCROLLS = /(auto|scroll|overlay)/;
|
|
2
2
|
function scrollParent(el, { axis = "y", self = false } = {}) {
|
|
3
3
|
for (let node = self ? el : el?.parentElement; node; node = node.parentElement) {
|
|
4
|
-
if (node ===
|
|
4
|
+
if (node === node.ownerDocument.body || node === node.ownerDocument.documentElement) return null;
|
|
5
5
|
const style = getComputedStyle(node);
|
|
6
6
|
const y = axis !== "x" && SCROLLS.test(style.overflowY) && node.scrollHeight > node.clientHeight;
|
|
7
7
|
const x = axis !== "y" && SCROLLS.test(style.overflowX) && node.scrollWidth > node.clientWidth;
|
|
@@ -11,9 +11,11 @@ function scrollParent(el, { axis = "y", self = false } = {}) {
|
|
|
11
11
|
}
|
|
12
12
|
function scrollToElement(el, { block = "nearest", behavior = "auto", margin = 0 } = {}) {
|
|
13
13
|
if (!el) return;
|
|
14
|
-
const
|
|
14
|
+
const doc = el.ownerDocument;
|
|
15
|
+
const win = doc.defaultView ?? window;
|
|
16
|
+
const box = scrollParent(el) ?? doc.scrollingElement;
|
|
15
17
|
if (!box) return;
|
|
16
|
-
const outer = box ===
|
|
18
|
+
const outer = box === doc.scrollingElement ? new DOMRect(0, 0, win.innerWidth, win.innerHeight) : box.getBoundingClientRect();
|
|
17
19
|
const inner = el.getBoundingClientRect();
|
|
18
20
|
const top = inner.top - outer.top + box.scrollTop;
|
|
19
21
|
let target = box.scrollTop;
|
|
@@ -26,8 +26,11 @@ export interface UseClipboard {
|
|
|
26
26
|
* Writes `text` to the clipboard. Resolves true on success, false when the
|
|
27
27
|
* clipboard was unavailable or refused — it never rejects, so `await copy(x)`
|
|
28
28
|
* is safe to call bare from an event handler.
|
|
29
|
+
*
|
|
30
|
+
* A `Blob` is written as itself under its own type (an image as a PNG blob),
|
|
31
|
+
* for "copy image" next to "copy link".
|
|
29
32
|
*/
|
|
30
|
-
copy: (
|
|
33
|
+
copy: (data: string | Blob, options?: CopyOptions) => Promise<boolean>;
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
33
36
|
* Clipboard writes with optional toast feedback.
|
|
@@ -34,15 +34,25 @@ function writeLegacy(text) {
|
|
|
34
34
|
active?.focus?.({ preventScroll: true });
|
|
35
35
|
return ok;
|
|
36
36
|
}
|
|
37
|
+
async function writeBlob(blob) {
|
|
38
|
+
if (typeof navigator === "undefined" || !navigator.clipboard?.write || typeof ClipboardItem === "undefined") return false;
|
|
39
|
+
try {
|
|
40
|
+
await navigator.clipboard.write([new ClipboardItem({ [blob.type || "image/png"]: blob })]);
|
|
41
|
+
return true;
|
|
42
|
+
} catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
37
46
|
const COPIED_MS = 1400;
|
|
38
47
|
function useClipboard() {
|
|
39
48
|
const copied = ref(false);
|
|
40
49
|
const { success, error } = useToast();
|
|
41
50
|
let timer;
|
|
42
|
-
async function copy(
|
|
51
|
+
async function copy(data, options = {}) {
|
|
43
52
|
const { toast = false, errorToast = false } = options;
|
|
44
53
|
try {
|
|
45
|
-
|
|
54
|
+
const written = typeof data === "string" ? await writeAsync(data) || writeLegacy(data) : await writeBlob(data);
|
|
55
|
+
if (!written) throw new Error("clipboard unavailable");
|
|
46
56
|
copied.value = true;
|
|
47
57
|
clearTimeout(timer);
|
|
48
58
|
timer = setTimeout(() => copied.value = false, COPIED_MS);
|
|
@@ -36,3 +36,16 @@ export interface FieldControlState {
|
|
|
36
36
|
export declare function useFieldControl(own: () => FieldControlState): ComputedRef<Omit<FieldContext, "id"> & {
|
|
37
37
|
id?: string;
|
|
38
38
|
}>;
|
|
39
|
+
/**
|
|
40
|
+
* Whether a focusout leaves the whole control, not just moves between its own
|
|
41
|
+
* parts (a trigger and a clear button, the segments of a time field, an input
|
|
42
|
+
* and its stepper). Composite controls emit their `blur` only then: focus
|
|
43
|
+
* events do not bubble, so a consumer's `@blur` on the wrapper never fired, and
|
|
44
|
+
* `useForm().field()` could not mark such a field touched.
|
|
45
|
+
*/
|
|
46
|
+
export declare function focusLeft(event: FocusEvent): boolean;
|
|
47
|
+
/** Trigger and portalled content share a boundary for the control's public blur. */
|
|
48
|
+
export declare function useFieldBlur(blur: (event: FocusEvent) => void): {
|
|
49
|
+
partId: string;
|
|
50
|
+
onFocusOut: (event: FocusEvent) => void;
|
|
51
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { useId, computed, provide, inject } from "vue";
|
|
1
|
+
import { useId, computed, provide, onScopeDispose, inject } from "vue";
|
|
2
2
|
const LP_FIELD = /* @__PURE__ */ Symbol.for("lp-field");
|
|
3
3
|
function provideField(context) {
|
|
4
4
|
provide(LP_FIELD, context);
|
|
@@ -36,10 +36,35 @@ function useFieldControl(own) {
|
|
|
36
36
|
};
|
|
37
37
|
});
|
|
38
38
|
}
|
|
39
|
+
function focusLeft(event) {
|
|
40
|
+
const next = event.relatedTarget;
|
|
41
|
+
return !(next instanceof Node && event.currentTarget?.contains(next));
|
|
42
|
+
}
|
|
43
|
+
function useFieldBlur(blur) {
|
|
44
|
+
const partId = `lp-field-${useId()}`;
|
|
45
|
+
let cancelPending;
|
|
46
|
+
const inside = (target) => !!target?.closest?.(`[data-lp-field-part="${partId}"]`);
|
|
47
|
+
function onFocusOut(event) {
|
|
48
|
+
cancelPending?.();
|
|
49
|
+
if (inside(event.relatedTarget)) return;
|
|
50
|
+
if (event.relatedTarget) return blur(event);
|
|
51
|
+
const doc = event.target.ownerDocument;
|
|
52
|
+
const view = doc.defaultView;
|
|
53
|
+
const frame = view.requestAnimationFrame(() => {
|
|
54
|
+
cancelPending = void 0;
|
|
55
|
+
if (!inside(doc.activeElement)) blur(event);
|
|
56
|
+
});
|
|
57
|
+
cancelPending = () => view.cancelAnimationFrame(frame);
|
|
58
|
+
}
|
|
59
|
+
onScopeDispose(() => cancelPending?.());
|
|
60
|
+
return { partId, onFocusOut };
|
|
61
|
+
}
|
|
39
62
|
export {
|
|
40
63
|
LP_FIELD,
|
|
41
64
|
fieldMessageId,
|
|
65
|
+
focusLeft,
|
|
42
66
|
provideField,
|
|
43
67
|
useField,
|
|
68
|
+
useFieldBlur,
|
|
44
69
|
useFieldControl
|
|
45
70
|
};
|
|
@@ -30,6 +30,8 @@ function useForm(options) {
|
|
|
30
30
|
const submitting = ref(false);
|
|
31
31
|
const submitCount = ref(0);
|
|
32
32
|
const runs = /* @__PURE__ */ new Map();
|
|
33
|
+
let validationEpoch = 0;
|
|
34
|
+
const fromForm = /* @__PURE__ */ new Map();
|
|
33
35
|
const baseVersion = ref(0);
|
|
34
36
|
const keys = () => Object.keys(plain());
|
|
35
37
|
const dirty = computed(() => {
|
|
@@ -50,7 +52,7 @@ function useForm(options) {
|
|
|
50
52
|
return void 0;
|
|
51
53
|
}
|
|
52
54
|
async function runField(name) {
|
|
53
|
-
const run =
|
|
55
|
+
const run = /* @__PURE__ */ Symbol();
|
|
54
56
|
runs.set(name, run);
|
|
55
57
|
const found = await checkField(name);
|
|
56
58
|
if (runs.get(name) !== run) return !errors[name];
|
|
@@ -60,26 +62,34 @@ function useForm(options) {
|
|
|
60
62
|
}
|
|
61
63
|
async function runForm() {
|
|
62
64
|
if (!options.validate) return true;
|
|
63
|
-
const run =
|
|
65
|
+
const run = /* @__PURE__ */ Symbol();
|
|
64
66
|
runs.set("form", run);
|
|
65
67
|
const found = await options.validate(plain()) ?? {};
|
|
66
68
|
if (runs.get("form") !== run) return true;
|
|
69
|
+
for (const [name, text] of fromForm) if (errors[name] === text) delete errors[name];
|
|
70
|
+
fromForm.clear();
|
|
67
71
|
let ok = true;
|
|
68
72
|
for (const [name, text] of Object.entries(found)) {
|
|
69
73
|
if (!text) continue;
|
|
70
74
|
ok = false;
|
|
71
|
-
if (
|
|
75
|
+
if (errors[name]) continue;
|
|
76
|
+
errors[name] = text;
|
|
77
|
+
fromForm.set(name, text);
|
|
72
78
|
}
|
|
73
79
|
return ok;
|
|
74
80
|
}
|
|
75
81
|
async function validate(name) {
|
|
82
|
+
const epoch = validationEpoch;
|
|
76
83
|
validating.value = true;
|
|
77
84
|
try {
|
|
78
|
-
if (name !== void 0)
|
|
79
|
-
|
|
85
|
+
if (name !== void 0) {
|
|
86
|
+
const valid2 = await runField(name);
|
|
87
|
+
return epoch === validationEpoch && valid2;
|
|
88
|
+
}
|
|
80
89
|
const fields = await Promise.all(keys().map(runField));
|
|
90
|
+
if (epoch !== validationEpoch) return false;
|
|
81
91
|
const form = await runForm();
|
|
82
|
-
return fields.every(Boolean) && form && !Object.values(external).some(Boolean);
|
|
92
|
+
return epoch === validationEpoch && fields.every(Boolean) && form && !Object.values(external).some(Boolean);
|
|
83
93
|
} finally {
|
|
84
94
|
validating.value = false;
|
|
85
95
|
}
|
|
@@ -95,10 +105,12 @@ function useForm(options) {
|
|
|
95
105
|
for (const [k, v] of Object.entries(next)) set(k, v);
|
|
96
106
|
}
|
|
97
107
|
function clearState() {
|
|
108
|
+
validationEpoch++;
|
|
98
109
|
for (const k of Object.keys(errors)) delete errors[k];
|
|
99
110
|
for (const k of Object.keys(external)) delete external[k];
|
|
100
111
|
for (const k of Object.keys(touched)) delete touched[k];
|
|
101
112
|
runs.clear();
|
|
113
|
+
fromForm.clear();
|
|
102
114
|
submitCount.value = 0;
|
|
103
115
|
}
|
|
104
116
|
function adopt(next) {
|
|
@@ -125,17 +137,25 @@ function useForm(options) {
|
|
|
125
137
|
},
|
|
126
138
|
{ deep: true }
|
|
127
139
|
);
|
|
140
|
+
async function recheck(names) {
|
|
141
|
+
const epoch = validationEpoch;
|
|
142
|
+
await Promise.all(names.map((name) => validate(name)));
|
|
143
|
+
if (epoch !== validationEpoch) return;
|
|
144
|
+
if (fromForm.size || submitCount.value) await runForm();
|
|
145
|
+
}
|
|
128
146
|
let snapshot = clone(plain());
|
|
129
147
|
watch(
|
|
130
148
|
plain,
|
|
131
149
|
() => {
|
|
132
150
|
const now = clone(plain());
|
|
151
|
+
const changed = [];
|
|
133
152
|
for (const name of Object.keys(now)) {
|
|
134
153
|
if (deepEqual(now[name], snapshot[name])) continue;
|
|
135
154
|
if (external[name]) delete external[name];
|
|
136
|
-
if (touched[name] || submitCount.value)
|
|
155
|
+
if (touched[name] || submitCount.value) changed.push(name);
|
|
137
156
|
}
|
|
138
157
|
snapshot = now;
|
|
158
|
+
if (changed.length) void recheck(changed);
|
|
139
159
|
},
|
|
140
160
|
{ deep: true }
|
|
141
161
|
);
|
|
@@ -168,8 +188,11 @@ function useForm(options) {
|
|
|
168
188
|
try {
|
|
169
189
|
submitCount.value++;
|
|
170
190
|
for (const name of keys()) touched[name] = true;
|
|
171
|
-
|
|
172
|
-
|
|
191
|
+
let submitted;
|
|
192
|
+
do {
|
|
193
|
+
submitted = clone(plain());
|
|
194
|
+
if (!await validate()) return;
|
|
195
|
+
} while (!deepEqual(plain(), submitted));
|
|
173
196
|
await fn(submitted);
|
|
174
197
|
if (deepEqual(plain(), submitted)) {
|
|
175
198
|
baseline = submitted;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Ref } from "vue";
|
|
2
|
+
export interface UseInView {
|
|
3
|
+
/** Attach to the element to watch. */
|
|
4
|
+
el: Ref<Element | null>;
|
|
5
|
+
/** On screen and the page visible. */
|
|
6
|
+
inView: Ref<boolean>;
|
|
7
|
+
}
|
|
8
|
+
export declare function useInView(options?: {
|
|
9
|
+
rootMargin?: string;
|
|
10
|
+
threshold?: number;
|
|
11
|
+
}): UseInView;
|