@leavepulse/ui 0.68.0 → 0.70.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 +37 -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/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-B5uE8Znw.js} +1 -1
- 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-CNnLTDZg.js} +7 -7
- package/dist/chunks/LpAlert-C5igj802.js +119 -0
- package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-CEUAB8kK.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-HOEPBYmi.js +126 -0
- package/dist/chunks/LpBreadcrumbs-DYoPc3P4.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-CIKKT2iW.js +189 -0
- package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
- package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-DFugXNUi.js} +10 -5
- 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-COwOwRgI.js} +13 -5
- package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
- package/dist/chunks/LpCountdown-Dtq1ihlJ.js +231 -0
- package/dist/chunks/LpDataList-B-5nHfNw.js +120 -0
- package/dist/chunks/LpDatePicker-BUe1VUC0.js +168 -0
- package/dist/chunks/LpDateRangePicker-C_k65vGR.js +126 -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-CRgrhdAH.js} +10 -5
- package/dist/chunks/LpEditable-DTqLt2lT.js +236 -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-DMISXVHC.js} +5 -3
- package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-CPXB_Yy3.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-Bk8TwJj0.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-p4hqzdyA.js} +27 -14
- package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-CCrhRfy9.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-CUC3t4na.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-elZHbj85.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-D5swlmZ_.js} +3 -3
- package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
- package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-D4Z0wVHR.js} +4 -4
- package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-DPZmP5dM.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-DTV18FIh.js} +20 -20
- package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
- package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-CFuV7pZv.js} +158 -47
- package/dist/chunks/LpPipeline-D81yh_NX.js +329 -0
- package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-BEIcqb9p.js} +8 -3
- package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
- package/dist/chunks/LpQuota-2Sw_gqcJ.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-CKzVqAo9.js +73 -0
- package/dist/chunks/LpRepeater-D0VjmD6y.js +140 -0
- package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
- package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
- package/dist/chunks/LpSecretField-DMfdJ1cQ.js +307 -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-B4f_yRi5.js} +93 -108
- package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
- package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
- package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-D-M0Y_7U.js} +5 -3
- package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DF-TYxOV.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-B2ix1Q7t.js} +38 -35
- package/dist/chunks/LpStatus-C7kx5PKE.js +86 -0
- package/dist/chunks/LpStepMark-DK-5BKAt.js +101 -0
- package/dist/chunks/LpStepper-DRFfdJaq.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-DgpBFRV2.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-DguwHdGt.js +416 -0
- package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
- package/dist/chunks/LpThemeSwitcher-D5uz0MhK.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-ZhKthfgz.js} +1 -1
- package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-NfRJNEIP.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-DWegV2p6.js} +9 -8
- 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-CHRS1h7K.js +116 -0
- package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
- package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
- package/dist/chunks/TourCard-BXuVHsfn.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.d.ts +10 -0
- package/dist/components/LpChart.vue.js +122 -142
- 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 +1 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +1 -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 +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPalettePreview.vue.js +1 -1
- package/dist/components/LpPaletteStats.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.d.ts +12 -1
- 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 +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 +43 -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 +8 -0
- package/dist/composables/useField.js +5 -0
- package/dist/composables/useForm.js +19 -5
- package/dist/composables/useHintSystem.d.ts +4 -0
- package/dist/composables/useHintSystem.js +33 -1
- package/dist/composables/useHints.js +9 -3
- 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 +61 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +98 -1
- package/dist/index.js +262 -104
- package/dist/theme/define.d.ts +12 -0
- package/dist/theme/studio.d.ts +90 -0
- package/package.json +5 -2
- package/src/component-names.ts +33 -0
- package/src/components/AttentionDot.vue +27 -0
- 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 +152 -156
- 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 +10 -1
- 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 +53 -104
- package/src/components/LpDateRangePicker.vue +49 -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 +10 -1
- package/src/components/LpDropzone.vue +34 -13
- package/src/components/LpEditable.vue +293 -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 +14 -38
- 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 +16 -14
- 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 +10 -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 +80 -0
- package/src/components/LpRevealOnScroll.vue +125 -0
- package/src/components/LpScramble.vue +107 -0
- package/src/components/LpSecretField.vue +313 -0
- package/src/components/LpSegmented.vue +3 -10
- package/src/components/LpSelect.vue +78 -64
- 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 +58 -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 +12 -0
- package/src/composables/useForm.ts +27 -6
- package/src/composables/useHintSystem.ts +40 -0
- package/src/composables/useHints.ts +14 -3
- 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 +93 -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,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,11 @@ 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;
|
|
@@ -36,9 +36,14 @@ 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
|
+
}
|
|
39
43
|
export {
|
|
40
44
|
LP_FIELD,
|
|
41
45
|
fieldMessageId,
|
|
46
|
+
focusLeft,
|
|
42
47
|
provideField,
|
|
43
48
|
useField,
|
|
44
49
|
useFieldControl
|
|
@@ -30,6 +30,7 @@ function useForm(options) {
|
|
|
30
30
|
const submitting = ref(false);
|
|
31
31
|
const submitCount = ref(0);
|
|
32
32
|
const runs = /* @__PURE__ */ new Map();
|
|
33
|
+
const fromForm = /* @__PURE__ */ new Map();
|
|
33
34
|
const baseVersion = ref(0);
|
|
34
35
|
const keys = () => Object.keys(plain());
|
|
35
36
|
const dirty = computed(() => {
|
|
@@ -64,11 +65,15 @@ function useForm(options) {
|
|
|
64
65
|
runs.set("form", run);
|
|
65
66
|
const found = await options.validate(plain()) ?? {};
|
|
66
67
|
if (runs.get("form") !== run) return true;
|
|
68
|
+
for (const [name, text] of fromForm) if (errors[name] === text) delete errors[name];
|
|
69
|
+
fromForm.clear();
|
|
67
70
|
let ok = true;
|
|
68
71
|
for (const [name, text] of Object.entries(found)) {
|
|
69
72
|
if (!text) continue;
|
|
70
73
|
ok = false;
|
|
71
|
-
if (
|
|
74
|
+
if (errors[name]) continue;
|
|
75
|
+
errors[name] = text;
|
|
76
|
+
fromForm.set(name, text);
|
|
72
77
|
}
|
|
73
78
|
return ok;
|
|
74
79
|
}
|
|
@@ -76,7 +81,6 @@ function useForm(options) {
|
|
|
76
81
|
validating.value = true;
|
|
77
82
|
try {
|
|
78
83
|
if (name !== void 0) return await runField(name);
|
|
79
|
-
if (errors.form) delete errors.form;
|
|
80
84
|
const fields = await Promise.all(keys().map(runField));
|
|
81
85
|
const form = await runForm();
|
|
82
86
|
return fields.every(Boolean) && form && !Object.values(external).some(Boolean);
|
|
@@ -99,6 +103,7 @@ function useForm(options) {
|
|
|
99
103
|
for (const k of Object.keys(external)) delete external[k];
|
|
100
104
|
for (const k of Object.keys(touched)) delete touched[k];
|
|
101
105
|
runs.clear();
|
|
106
|
+
fromForm.clear();
|
|
102
107
|
submitCount.value = 0;
|
|
103
108
|
}
|
|
104
109
|
function adopt(next) {
|
|
@@ -125,17 +130,23 @@ function useForm(options) {
|
|
|
125
130
|
},
|
|
126
131
|
{ deep: true }
|
|
127
132
|
);
|
|
133
|
+
async function recheck(names) {
|
|
134
|
+
await Promise.all(names.map((name) => validate(name)));
|
|
135
|
+
if (fromForm.size || submitCount.value) await runForm();
|
|
136
|
+
}
|
|
128
137
|
let snapshot = clone(plain());
|
|
129
138
|
watch(
|
|
130
139
|
plain,
|
|
131
140
|
() => {
|
|
132
141
|
const now = clone(plain());
|
|
142
|
+
const changed = [];
|
|
133
143
|
for (const name of Object.keys(now)) {
|
|
134
144
|
if (deepEqual(now[name], snapshot[name])) continue;
|
|
135
145
|
if (external[name]) delete external[name];
|
|
136
|
-
if (touched[name] || submitCount.value)
|
|
146
|
+
if (touched[name] || submitCount.value) changed.push(name);
|
|
137
147
|
}
|
|
138
148
|
snapshot = now;
|
|
149
|
+
if (changed.length) void recheck(changed);
|
|
139
150
|
},
|
|
140
151
|
{ deep: true }
|
|
141
152
|
);
|
|
@@ -168,8 +179,11 @@ function useForm(options) {
|
|
|
168
179
|
try {
|
|
169
180
|
submitCount.value++;
|
|
170
181
|
for (const name of keys()) touched[name] = true;
|
|
171
|
-
|
|
172
|
-
|
|
182
|
+
let submitted;
|
|
183
|
+
do {
|
|
184
|
+
submitted = clone(plain());
|
|
185
|
+
if (!await validate()) return;
|
|
186
|
+
} while (!deepEqual(plain(), submitted));
|
|
173
187
|
await fn(submitted);
|
|
174
188
|
if (deepEqual(plain(), submitted)) {
|
|
175
189
|
baseline = submitted;
|
|
@@ -130,6 +130,8 @@ export interface HintTiming {
|
|
|
130
130
|
freshLimit: number;
|
|
131
131
|
nudgeAgain: number;
|
|
132
132
|
flush: number;
|
|
133
|
+
/** How long a news item opened from a feed waits for its page and feature, ms. */
|
|
134
|
+
newsWait: number;
|
|
133
135
|
}
|
|
134
136
|
export interface HintSystemOptions {
|
|
135
137
|
features: Record<string, HintFeature>;
|
|
@@ -284,6 +286,8 @@ export declare function createHintSystem(options: HintSystemOptions): {
|
|
|
284
286
|
markIntent(): void;
|
|
285
287
|
unreadNews: (page?: string) => HintNews[];
|
|
286
288
|
readNews: (page: string) => void;
|
|
289
|
+
/** Open one news item from a feed: mark it read and show its feature once the app is on its page. */
|
|
290
|
+
showNews: (id: string) => void;
|
|
287
291
|
pageTitle: (page: string) => string;
|
|
288
292
|
readFresh(id: string): void;
|
|
289
293
|
tourShown(index: number): void;
|
|
@@ -101,7 +101,8 @@ const DEFAULT_TIMING = {
|
|
|
101
101
|
offersMax: 2,
|
|
102
102
|
freshLimit: 3,
|
|
103
103
|
nudgeAgain: 7 * DAY,
|
|
104
|
-
flush: 2e3
|
|
104
|
+
flush: 2e3,
|
|
105
|
+
newsWait: 8e3
|
|
105
106
|
};
|
|
106
107
|
function localHintStorage(key = "lp-hints") {
|
|
107
108
|
const read = () => {
|
|
@@ -284,6 +285,35 @@ function createHintSystem(options) {
|
|
|
284
285
|
function readNews(page) {
|
|
285
286
|
for (const n of unread(page)) record(newsKey(n.id), { state: "explained" });
|
|
286
287
|
}
|
|
288
|
+
let pendingNews = null;
|
|
289
|
+
function showNews(id) {
|
|
290
|
+
const item = news.find((n) => n.id === id);
|
|
291
|
+
if (!item) return;
|
|
292
|
+
record(newsKey(item.id), { state: "explained" });
|
|
293
|
+
const feature = item.feature;
|
|
294
|
+
if (!feature) return;
|
|
295
|
+
pendingNews?.();
|
|
296
|
+
let done = false;
|
|
297
|
+
let stopWatch;
|
|
298
|
+
const finish = () => {
|
|
299
|
+
done = true;
|
|
300
|
+
clearTimeout(timer);
|
|
301
|
+
stopWatch?.();
|
|
302
|
+
if (pendingNews === finish) pendingNews = null;
|
|
303
|
+
};
|
|
304
|
+
const timer = setTimeout(finish, timing.newsWait);
|
|
305
|
+
pendingNews = finish;
|
|
306
|
+
stopWatch = watch(
|
|
307
|
+
() => state.page === item.page && showable(feature) && !state.tour.open,
|
|
308
|
+
(ready) => {
|
|
309
|
+
if (!ready || done) return;
|
|
310
|
+
finish();
|
|
311
|
+
startTour(item.page, [feature]);
|
|
312
|
+
},
|
|
313
|
+
{ immediate: true }
|
|
314
|
+
);
|
|
315
|
+
if (done) stopWatch();
|
|
316
|
+
}
|
|
287
317
|
function considerOffer() {
|
|
288
318
|
const page = state.page;
|
|
289
319
|
const ready = state.loaded && !state.tour.open && !state.offer && !anyModalOpen() && !typing() && Date.now() - state.settledAt > timing.settle;
|
|
@@ -416,6 +446,8 @@ function createHintSystem(options) {
|
|
|
416
446
|
},
|
|
417
447
|
unreadNews: (page) => unread(page),
|
|
418
448
|
readNews,
|
|
449
|
+
/** Open one news item from a feed: mark it read and show its feature once the app is on its page. */
|
|
450
|
+
showNews,
|
|
419
451
|
pageTitle: (page) => pages[page]?.title ?? page,
|
|
420
452
|
readFresh(id) {
|
|
421
453
|
record(featureKey(id), { state: "explained" });
|
|
@@ -76,14 +76,20 @@ function detach(el) {
|
|
|
76
76
|
else mounted.delete(id);
|
|
77
77
|
idOf.delete(el);
|
|
78
78
|
}
|
|
79
|
+
function mark(el, id) {
|
|
80
|
+
if (!id) return;
|
|
81
|
+
if (el.closest("[data-lp-hint-example]")) el.dataset.lpHintPart = id;
|
|
82
|
+
else attach(el, id);
|
|
83
|
+
}
|
|
79
84
|
const vHint = {
|
|
80
85
|
mounted(el, binding) {
|
|
81
|
-
|
|
86
|
+
mark(el, binding.value);
|
|
82
87
|
},
|
|
83
88
|
updated(el, binding) {
|
|
84
|
-
if (binding.value === idOf.get(el)) return;
|
|
89
|
+
if (binding.value === (idOf.get(el) ?? el.dataset.lpHintPart)) return;
|
|
85
90
|
detach(el);
|
|
86
|
-
|
|
91
|
+
delete el.dataset.lpHintPart;
|
|
92
|
+
mark(el, binding.value);
|
|
87
93
|
},
|
|
88
94
|
beforeUnmount(el) {
|
|
89
95
|
detach(el);
|
|
@@ -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;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { ref, watch, onBeforeUnmount } from "vue";
|
|
2
|
+
function useInView(options = {}) {
|
|
3
|
+
const el = ref(null);
|
|
4
|
+
const intersecting = ref(typeof IntersectionObserver === "undefined");
|
|
5
|
+
const pageVisible = ref(typeof document === "undefined" || document.visibilityState === "visible");
|
|
6
|
+
const inView = ref(false);
|
|
7
|
+
let observer = null;
|
|
8
|
+
const sync = () => inView.value = intersecting.value && pageVisible.value;
|
|
9
|
+
const onVisibility = () => {
|
|
10
|
+
pageVisible.value = document.visibilityState === "visible";
|
|
11
|
+
sync();
|
|
12
|
+
};
|
|
13
|
+
if (typeof document !== "undefined") document.addEventListener("visibilitychange", onVisibility);
|
|
14
|
+
watch(
|
|
15
|
+
el,
|
|
16
|
+
(node) => {
|
|
17
|
+
observer?.disconnect();
|
|
18
|
+
observer = null;
|
|
19
|
+
if (!node || typeof IntersectionObserver === "undefined") return sync();
|
|
20
|
+
observer = new IntersectionObserver(
|
|
21
|
+
(entries) => {
|
|
22
|
+
intersecting.value = entries.some((entry) => entry.isIntersecting);
|
|
23
|
+
sync();
|
|
24
|
+
},
|
|
25
|
+
{ rootMargin: options.rootMargin ?? "0px", threshold: options.threshold ?? 0 }
|
|
26
|
+
);
|
|
27
|
+
observer.observe(node);
|
|
28
|
+
},
|
|
29
|
+
{ immediate: true, flush: "post" }
|
|
30
|
+
);
|
|
31
|
+
onBeforeUnmount(() => {
|
|
32
|
+
observer?.disconnect();
|
|
33
|
+
if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibility);
|
|
34
|
+
});
|
|
35
|
+
return { el, inView };
|
|
36
|
+
}
|
|
37
|
+
export {
|
|
38
|
+
useInView
|
|
39
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type MaybeRefOrGetter, type Ref } from "vue";
|
|
2
|
+
export interface LoadingGateOptions {
|
|
3
|
+
/** Ms of loading before the indicator appears. */
|
|
4
|
+
delay?: MaybeRefOrGetter<number>;
|
|
5
|
+
/** Ms the indicator stays once shown, even if loading ends sooner. */
|
|
6
|
+
minVisible?: MaybeRefOrGetter<number>;
|
|
7
|
+
}
|
|
8
|
+
export declare function useLoadingGate(active: MaybeRefOrGetter<boolean>, options?: LoadingGateOptions): Ref<boolean>;
|