@leavepulse/ui 0.69.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.js +107 -138
- 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/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 +143 -154
- 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 +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 +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/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,125 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export default { inheritAttrs: false }
|
|
3
|
+
</script>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
/*
|
|
7
|
+
* LpRevealOnScroll — content that arrives when it is first scrolled into view.
|
|
8
|
+
*
|
|
9
|
+
* <LpRevealOnScroll preset="rise" :stagger="60">
|
|
10
|
+
* <LpCard v-for="item in items" :key="item.id">…</LpCard>
|
|
11
|
+
* </LpRevealOnScroll>
|
|
12
|
+
*
|
|
13
|
+
* useReveal answers "has this been seen yet"; this is the entrance itself for
|
|
14
|
+
* content that has no animation of its own — a section of a landing page, a
|
|
15
|
+
* block of cards, a settings group further down a long page. Components that
|
|
16
|
+
* already animate their own arrival (charts, progress, number flows) gate it
|
|
17
|
+
* on useReveal themselves and need no wrapper.
|
|
18
|
+
*
|
|
19
|
+
* `stagger` animates the direct children one after another instead of the
|
|
20
|
+
* block as a whole — the wrapper is then just their parent, so put it where a
|
|
21
|
+
* grid or flex container would be and give it that layout through `class`.
|
|
22
|
+
*
|
|
23
|
+
* Plays once: content that scrolls away and back has already arrived. Reduced
|
|
24
|
+
* motion shows everything at once. Animations run through the Web Animations
|
|
25
|
+
* API on transform/opacity/filter only, so they never trigger layout.
|
|
26
|
+
*/
|
|
27
|
+
import { computed, onBeforeUnmount, ref, watch } from "vue"
|
|
28
|
+
import { easingToken, prefersReducedMotion } from "../composables/easing"
|
|
29
|
+
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
30
|
+
import { useReveal } from "../composables/useReveal"
|
|
31
|
+
import { revealFrom, revealTo, staggerDelay, type RevealDirection, type RevealPreset } from "./reveal"
|
|
32
|
+
|
|
33
|
+
const props = withDefaults(
|
|
34
|
+
defineProps<{
|
|
35
|
+
/** How the content appears. `rise` suits most blocks; `fade` is the quietest. */
|
|
36
|
+
preset?: RevealPreset
|
|
37
|
+
/** The way the content travels for `rise` and `blur`: `up` comes from below. */
|
|
38
|
+
direction?: RevealDirection
|
|
39
|
+
/** Travel distance in px. */
|
|
40
|
+
distance?: number
|
|
41
|
+
/** Milliseconds to wait after the block is seen. */
|
|
42
|
+
delay?: number
|
|
43
|
+
/** Milliseconds per entrance. */
|
|
44
|
+
duration?: number
|
|
45
|
+
/**
|
|
46
|
+
* Milliseconds between consecutive direct children. 0 animates the block
|
|
47
|
+
* as one piece. The steps stop growing after ten children, so long lists
|
|
48
|
+
* still finish quickly.
|
|
49
|
+
*/
|
|
50
|
+
stagger?: number
|
|
51
|
+
/** Show at once, without waiting or animating — for content already known to be on screen. */
|
|
52
|
+
immediate?: boolean
|
|
53
|
+
/** Fraction of the block that must be visible before it plays. */
|
|
54
|
+
threshold?: number
|
|
55
|
+
/** Element to render as. */
|
|
56
|
+
as?: string
|
|
57
|
+
}>(),
|
|
58
|
+
{
|
|
59
|
+
preset: "rise",
|
|
60
|
+
direction: "up",
|
|
61
|
+
distance: 16,
|
|
62
|
+
delay: 0,
|
|
63
|
+
duration: 520,
|
|
64
|
+
stagger: 0,
|
|
65
|
+
immediate: false,
|
|
66
|
+
threshold: 0.15,
|
|
67
|
+
as: "div",
|
|
68
|
+
},
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
const { el, revealed } = useReveal({ immediate: () => props.immediate, threshold: props.threshold })
|
|
72
|
+
const host = ref<HTMLElement | null>(null)
|
|
73
|
+
watch(host, (node) => (el.value = node))
|
|
74
|
+
|
|
75
|
+
const { class: classes, attrs: rest } = useMergedAttrs(() => undefined)
|
|
76
|
+
|
|
77
|
+
// Hidden only until the observer fires; `played` then keeps it visible for
|
|
78
|
+
// good, even if the props change afterwards.
|
|
79
|
+
const played = ref(false)
|
|
80
|
+
const hidden = computed(() => !played.value && !revealed.value)
|
|
81
|
+
|
|
82
|
+
const running: Animation[] = []
|
|
83
|
+
|
|
84
|
+
function play(node: HTMLElement) {
|
|
85
|
+
if (props.immediate || prefersReducedMotion() || typeof node.animate !== "function") return
|
|
86
|
+
const from = revealFrom(props.preset, props.direction, props.distance)
|
|
87
|
+
const frames = [from, revealTo(from)]
|
|
88
|
+
const easing = easingToken("ease-emphasized")
|
|
89
|
+
// `backwards` holds each target in its hidden state through its delay, so a
|
|
90
|
+
// staggered child does not flash in before its turn.
|
|
91
|
+
const targets = props.stagger > 0 ? Array.from(node.children) : [node]
|
|
92
|
+
targets.forEach((target, index) => {
|
|
93
|
+
running.push(
|
|
94
|
+
target.animate(frames, {
|
|
95
|
+
duration: props.duration,
|
|
96
|
+
delay: props.stagger > 0 ? staggerDelay(index, props.delay, props.stagger) : props.delay,
|
|
97
|
+
easing,
|
|
98
|
+
fill: "backwards",
|
|
99
|
+
}),
|
|
100
|
+
)
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
watch(
|
|
105
|
+
revealed,
|
|
106
|
+
(seen) => {
|
|
107
|
+
if (!seen || played.value) return
|
|
108
|
+
played.value = true
|
|
109
|
+
// Same tick as removing the hidden state: the animations start from the
|
|
110
|
+
// hidden frame before the browser paints the unhidden one.
|
|
111
|
+
if (host.value) play(host.value)
|
|
112
|
+
},
|
|
113
|
+
{ flush: "post", immediate: true },
|
|
114
|
+
)
|
|
115
|
+
|
|
116
|
+
onBeforeUnmount(() => {
|
|
117
|
+
for (const animation of running) animation.cancel()
|
|
118
|
+
})
|
|
119
|
+
</script>
|
|
120
|
+
|
|
121
|
+
<template>
|
|
122
|
+
<component :is="as" ref="host" :class="classes" :style="hidden ? { opacity: 0 } : undefined" v-bind="rest">
|
|
123
|
+
<slot />
|
|
124
|
+
</component>
|
|
125
|
+
</template>
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
// The root class is merged with the consumer's (useMergedAttrs).
|
|
3
|
+
export default { inheritAttrs: false }
|
|
4
|
+
</script>
|
|
5
|
+
|
|
6
|
+
<script setup lang="ts">
|
|
7
|
+
/*
|
|
8
|
+
* A value that "decrypts" into place: each character churns through random
|
|
9
|
+
* glyphs and settles, left to right or all at once.
|
|
10
|
+
*
|
|
11
|
+
* For values that are produced rather than read: a freshly generated API key,
|
|
12
|
+
* a hash a job returned, an invite code. Plain text that swaps says nothing
|
|
13
|
+
* about where it came from; the churn says "this was just made".
|
|
14
|
+
*
|
|
15
|
+
* <LpScramble :value="token" class="font-mono" />
|
|
16
|
+
* <LpScramble value="ACCESS GRANTED" trigger="hover" order="together" />
|
|
17
|
+
*
|
|
18
|
+
* The width holds still while it churns: every position is sized by the
|
|
19
|
+
* character it will settle on (an invisible copy), and the random glyph is
|
|
20
|
+
* drawn over it, so even a proportional font does not jitter. A value that
|
|
21
|
+
* changes length eases its width (LpShift). Monospace still reads best: the
|
|
22
|
+
* glyphs then fill their cells exactly.
|
|
23
|
+
*
|
|
24
|
+
* Screen readers get the value once, as text; the churning cells are hidden
|
|
25
|
+
* from them, so nobody hears forty random letters.
|
|
26
|
+
*
|
|
27
|
+
* The clock lives in `useScramble`, for a component that wants the effect on
|
|
28
|
+
* its own markup.
|
|
29
|
+
*/
|
|
30
|
+
import { onMounted, watch } from "vue"
|
|
31
|
+
import { prefersReducedMotion } from "../composables/easing"
|
|
32
|
+
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
33
|
+
import { useReveal } from "../composables/useReveal"
|
|
34
|
+
import { useScramble } from "../composables/useScramble"
|
|
35
|
+
import LpShift from "./LpShift.vue"
|
|
36
|
+
|
|
37
|
+
const props = withDefaults(
|
|
38
|
+
defineProps<{
|
|
39
|
+
/** The value the text settles on. */
|
|
40
|
+
value: string
|
|
41
|
+
/**
|
|
42
|
+
* What starts a scramble besides a change of `value`:
|
|
43
|
+
* `reveal` the first time it is on screen (a key below the fold decrypts
|
|
44
|
+
* when it is scrolled to), `mount` at once, `hover` each time the pointer
|
|
45
|
+
* comes in (a teaser), `none` only on changes and `play()`.
|
|
46
|
+
*/
|
|
47
|
+
trigger?: "reveal" | "mount" | "hover" | "none"
|
|
48
|
+
/** Scramble travel time in ms. */
|
|
49
|
+
duration?: number
|
|
50
|
+
/** `sequential` decodes left to right; `together` lands every position at the end. */
|
|
51
|
+
order?: "sequential" | "together"
|
|
52
|
+
/** Glyph pool to churn through. Defaults to upper case, digits and a few symbols. */
|
|
53
|
+
glyphs?: string
|
|
54
|
+
/** Scramble when `value` changes. Off: a new value lands at once. */
|
|
55
|
+
animateChanges?: boolean
|
|
56
|
+
/** Element to render. */
|
|
57
|
+
as?: string
|
|
58
|
+
}>(),
|
|
59
|
+
{ trigger: "reveal", duration: 900, order: "sequential", animateChanges: true, as: "span" },
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
const emit = defineEmits<{
|
|
63
|
+
/** A scramble landed on the value. */
|
|
64
|
+
done: []
|
|
65
|
+
}>()
|
|
66
|
+
|
|
67
|
+
const { class: rootClass, attrs: rest } = useMergedAttrs(() => "lp-scramble inline-block whitespace-pre align-baseline")
|
|
68
|
+
|
|
69
|
+
// Under reduced motion the value shows as is from the first paint, rather than
|
|
70
|
+
// a mask that is replaced a frame later.
|
|
71
|
+
const masked = (props.trigger === "reveal" || props.trigger === "mount") && !prefersReducedMotion()
|
|
72
|
+
const { cells, running, play } = useScramble(() => props.value, {
|
|
73
|
+
duration: () => props.duration,
|
|
74
|
+
order: () => props.order,
|
|
75
|
+
glyphs: () => props.glyphs,
|
|
76
|
+
onChange: () => props.animateChanges,
|
|
77
|
+
start: masked ? "masked" : "settled",
|
|
78
|
+
onDone: () => emit("done"),
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
const { el, revealed } = useReveal({ immediate: () => props.trigger !== "reveal" })
|
|
82
|
+
watch(revealed, (seen) => seen && props.trigger === "reveal" && play())
|
|
83
|
+
onMounted(() => {
|
|
84
|
+
if (props.trigger === "mount" || (props.trigger === "reveal" && revealed.value)) play()
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
function onEnter() {
|
|
88
|
+
if (props.trigger === "hover" && !running.value) play()
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
defineExpose({ play })
|
|
92
|
+
</script>
|
|
93
|
+
|
|
94
|
+
<template>
|
|
95
|
+
<component :is="as" ref="el" :class="rootClass" v-bind="rest" @pointerenter="onEnter">
|
|
96
|
+
<span class="sr-only">{{ value }}</span>
|
|
97
|
+
<LpShift axis="width" class="inline-block align-baseline" aria-hidden="true">
|
|
98
|
+
<template v-for="(cell, i) in cells" :key="i">
|
|
99
|
+
<template v-if="cell.settled">{{ cell.char }}</template>
|
|
100
|
+
<span v-else class="lp-scramble__cell relative inline-block"
|
|
101
|
+
><span class="invisible">{{ cell.sizer }}</span
|
|
102
|
+
><span class="absolute inset-0 text-center opacity-60">{{ cell.char }}</span></span
|
|
103
|
+
>
|
|
104
|
+
</template>
|
|
105
|
+
</LpShift>
|
|
106
|
+
</component>
|
|
107
|
+
</template>
|
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
export default { inheritAttrs: false }
|
|
3
|
+
|
|
4
|
+
export interface SecretFieldLabels extends Record<string, string> {
|
|
5
|
+
show: string
|
|
6
|
+
hide: string
|
|
7
|
+
regenerate: string
|
|
8
|
+
hidden: string
|
|
9
|
+
empty: string
|
|
10
|
+
hidesIn: string
|
|
11
|
+
}
|
|
12
|
+
</script>
|
|
13
|
+
|
|
14
|
+
<script setup lang="ts">
|
|
15
|
+
/*
|
|
16
|
+
* A value someone must be able to read and copy but should not have on screen
|
|
17
|
+
* by default: an API key, a bot token, a webhook secret, a recovery code.
|
|
18
|
+
*
|
|
19
|
+
* <LpSecretField label="Bot token" :value="token" :auto-hide="20" :regenerate="rotate" />
|
|
20
|
+
* <LpSecretField v-model="secret" input label="Webhook secret" />
|
|
21
|
+
*
|
|
22
|
+
* Masked by default, so a screen share or a shoulder sees dots. The mask is a
|
|
23
|
+
* fixed run of dots rather than one per character: the length of a secret is
|
|
24
|
+
* itself a hint about what it is. Copy works while masked — copying is the
|
|
25
|
+
* common reason to open the page, and the value need not appear to do it.
|
|
26
|
+
*
|
|
27
|
+
* `autoHide` folds the value away again after N seconds, with a thin bar
|
|
28
|
+
* running down so the person sees it is about to go; the page going to the
|
|
29
|
+
* background hides it at once, since nobody is looking at a tab they left.
|
|
30
|
+
*
|
|
31
|
+
* Two forms. The default is a read-only display: the value may wrap, can be
|
|
32
|
+
* selected, and fades between dots and text. `input` makes it an editable
|
|
33
|
+
* field — that one IS LpPasswordInput (same shell, same eye button), driven
|
|
34
|
+
* through its `visible` model so the timer and the copy button live here.
|
|
35
|
+
*/
|
|
36
|
+
import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
|
|
37
|
+
import { prefersReducedMotion } from "../composables/easing"
|
|
38
|
+
import { useScramble } from "../composables/useScramble"
|
|
39
|
+
import { useLabels } from "../composables/useLpConfig"
|
|
40
|
+
import { mergeClass } from "../composables/useMergedClass"
|
|
41
|
+
import FieldWrapper from "./FieldWrapper.vue"
|
|
42
|
+
import LpButton from "./LpButton.vue"
|
|
43
|
+
import LpCopyButton from "./LpCopyButton.vue"
|
|
44
|
+
import LpIcon from "./LpIcon.vue"
|
|
45
|
+
import LpPasswordInput from "./LpPasswordInput.vue"
|
|
46
|
+
import LpShift from "./LpShift.vue"
|
|
47
|
+
import LpTooltip from "./LpTooltip.vue"
|
|
48
|
+
import RevealToggle from "./RevealToggle.vue"
|
|
49
|
+
|
|
50
|
+
const props = withDefaults(
|
|
51
|
+
defineProps<{
|
|
52
|
+
/** The secret, for the read-only display. */
|
|
53
|
+
value?: string
|
|
54
|
+
/** The secret, for the `input` form (v-model). */
|
|
55
|
+
modelValue?: string
|
|
56
|
+
/** Editable field instead of a display. */
|
|
57
|
+
input?: boolean
|
|
58
|
+
label?: string
|
|
59
|
+
hint?: string
|
|
60
|
+
error?: string
|
|
61
|
+
placeholder?: string
|
|
62
|
+
size?: "sm" | "md" | "lg"
|
|
63
|
+
/** Show the copy button. On by default: copying is what a secret is shown for. */
|
|
64
|
+
copyable?: boolean
|
|
65
|
+
/** Offer the eye button. Off for a value that should only ever be copied, never shown. */
|
|
66
|
+
revealable?: boolean
|
|
67
|
+
/**
|
|
68
|
+
* Seconds after which a revealed value hides itself again. Unset keeps it
|
|
69
|
+
* shown until the person hides it.
|
|
70
|
+
*/
|
|
71
|
+
autoHide?: number
|
|
72
|
+
/**
|
|
73
|
+
* Rotates the secret. The button spins while it runs and a failure is
|
|
74
|
+
* toasted (LpButton's `action`); the new value arrives through `value`.
|
|
75
|
+
* For a custom action (with a confirm, say) use the `actions` slot.
|
|
76
|
+
*/
|
|
77
|
+
regenerate?: () => unknown
|
|
78
|
+
/** Let a long value wrap onto more lines instead of staying on one. Display form only. */
|
|
79
|
+
wrap?: boolean
|
|
80
|
+
disabled?: boolean
|
|
81
|
+
/** How many dots stand for the value while hidden. */
|
|
82
|
+
maskLength?: number
|
|
83
|
+
labels?: Partial<SecretFieldLabels>
|
|
84
|
+
}>(),
|
|
85
|
+
{ size: "md", copyable: true, revealable: true, maskLength: 24 },
|
|
86
|
+
)
|
|
87
|
+
|
|
88
|
+
const emit = defineEmits<{
|
|
89
|
+
(e: "update:modelValue", value: string): void
|
|
90
|
+
(e: "copied", text: string): void
|
|
91
|
+
}>()
|
|
92
|
+
|
|
93
|
+
/** Shown or hidden; bind it to drive the reveal from outside. */
|
|
94
|
+
const revealed = defineModel<boolean>("revealed", { default: false })
|
|
95
|
+
|
|
96
|
+
const text = useLabels<SecretFieldLabels>(
|
|
97
|
+
"secretField",
|
|
98
|
+
{
|
|
99
|
+
show: "Show",
|
|
100
|
+
hide: "Hide",
|
|
101
|
+
regenerate: "Regenerate",
|
|
102
|
+
hidden: "Hidden",
|
|
103
|
+
empty: "Not set",
|
|
104
|
+
hidesIn: "Hides automatically",
|
|
105
|
+
},
|
|
106
|
+
() => props.labels,
|
|
107
|
+
)
|
|
108
|
+
|
|
109
|
+
const secret = computed(() => (props.input ? props.modelValue : props.value) ?? "")
|
|
110
|
+
|
|
111
|
+
// Revealing decrypts the value into place, and a new value (a regenerated key)
|
|
112
|
+
// decrypts over the old one: the change is seen happening, not just swapped.
|
|
113
|
+
// Fed nothing while hidden, so every reveal plays from empty again.
|
|
114
|
+
const decrypt = useScramble(() => (revealed.value ? secret.value : ""), { onChange: true, duration: 650 })
|
|
115
|
+
const mask = computed(() => "•".repeat(props.maskLength))
|
|
116
|
+
|
|
117
|
+
// ── auto-hide ────────────────────────────────────────────────
|
|
118
|
+
let hideTimer: ReturnType<typeof setTimeout> | undefined
|
|
119
|
+
// Bumped on every reveal so the countdown bar restarts its run.
|
|
120
|
+
const run = ref(0)
|
|
121
|
+
watch(
|
|
122
|
+
[revealed, () => props.autoHide],
|
|
123
|
+
([on, seconds]) => {
|
|
124
|
+
clearTimeout(hideTimer)
|
|
125
|
+
if (!on || !seconds) return
|
|
126
|
+
run.value++
|
|
127
|
+
hideTimer = setTimeout(() => (revealed.value = false), seconds * 1000)
|
|
128
|
+
},
|
|
129
|
+
{ immediate: true },
|
|
130
|
+
)
|
|
131
|
+
// A new value (just regenerated) restarts the window rather than hiding it mid-read.
|
|
132
|
+
watch(secret, () => {
|
|
133
|
+
if (revealed.value && props.autoHide) {
|
|
134
|
+
clearTimeout(hideTimer)
|
|
135
|
+
run.value++
|
|
136
|
+
hideTimer = setTimeout(() => (revealed.value = false), props.autoHide * 1000)
|
|
137
|
+
}
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
function onVisibility() {
|
|
141
|
+
if (document.visibilityState === "hidden") revealed.value = false
|
|
142
|
+
}
|
|
143
|
+
onMounted(() => document.addEventListener("visibilitychange", onVisibility))
|
|
144
|
+
onBeforeUnmount(() => {
|
|
145
|
+
clearTimeout(hideTimer)
|
|
146
|
+
document.removeEventListener("visibilitychange", onVisibility)
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// ── input form: the field's text is not a node we can fade, so it gets a
|
|
150
|
+
// short blur-in on every switch instead of snapping between dots and text.
|
|
151
|
+
const field = ref<{ $el?: Element } | null>(null)
|
|
152
|
+
watch(revealed, () => {
|
|
153
|
+
if (!props.input || prefersReducedMotion()) return
|
|
154
|
+
const el = field.value?.$el
|
|
155
|
+
const input = el instanceof Element ? el.querySelector("input") : null
|
|
156
|
+
input?.animate([{ filter: "blur(4px)", opacity: 0.35 }, { filter: "blur(0)", opacity: 1 }], {
|
|
157
|
+
duration: 260,
|
|
158
|
+
easing: "cubic-bezier(0.2, 0, 0, 1)",
|
|
159
|
+
})
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
const id = useId()
|
|
163
|
+
const iconSize = computed(() => (props.size === "sm" ? 14 : 16))
|
|
164
|
+
const copySize = computed(() => (props.size === "lg" ? "sm" : "xs"))
|
|
165
|
+
|
|
166
|
+
const shell = computed(() =>
|
|
167
|
+
mergeClass(
|
|
168
|
+
"relative flex w-full items-center gap-1 overflow-hidden rounded-control border bg-surface-soft text-ink transition-colors duration-(--duration-fast)",
|
|
169
|
+
props.error ? "border-danger" : "border-line",
|
|
170
|
+
props.disabled ? "opacity-55" : "",
|
|
171
|
+
props.wrap ? "py-1.5" : "",
|
|
172
|
+
{ sm: "min-h-(--size-control-sm) pl-2.5 pr-1 text-xs", md: "min-h-(--size-control-md) pl-3 pr-1.5 text-sm", lg: "min-h-(--size-control-lg) pl-3.5 pr-1.5 text-sm" }[props.size],
|
|
173
|
+
),
|
|
174
|
+
)
|
|
175
|
+
</script>
|
|
176
|
+
|
|
177
|
+
<template>
|
|
178
|
+
<!-- Input form: LpPasswordInput itself, with the copy button beside its eye. -->
|
|
179
|
+
<LpPasswordInput
|
|
180
|
+
v-if="input"
|
|
181
|
+
ref="field"
|
|
182
|
+
v-bind="$attrs"
|
|
183
|
+
v-model:visible="revealed"
|
|
184
|
+
class="[&_input]:font-mono"
|
|
185
|
+
:model-value="modelValue"
|
|
186
|
+
:placeholder="placeholder"
|
|
187
|
+
:disabled="disabled"
|
|
188
|
+
:label="label"
|
|
189
|
+
:hint="hint"
|
|
190
|
+
:error="error"
|
|
191
|
+
:size="size"
|
|
192
|
+
:labels="{ show: text.show, hide: text.hide }"
|
|
193
|
+
@update:model-value="(v: string) => emit('update:modelValue', v)"
|
|
194
|
+
>
|
|
195
|
+
<template v-if="$slots.leading" #leading><slot name="leading" /></template>
|
|
196
|
+
<template #actions>
|
|
197
|
+
<LpCopyButton
|
|
198
|
+
v-if="copyable && secret"
|
|
199
|
+
:value="secret"
|
|
200
|
+
size="xs"
|
|
201
|
+
class="size-7"
|
|
202
|
+
:disabled="disabled"
|
|
203
|
+
@copied="(t: string) => emit('copied', t)"
|
|
204
|
+
/>
|
|
205
|
+
<slot name="actions" />
|
|
206
|
+
<LpButton
|
|
207
|
+
v-if="regenerate"
|
|
208
|
+
variant="ghost"
|
|
209
|
+
size="xs"
|
|
210
|
+
square
|
|
211
|
+
class="size-7"
|
|
212
|
+
:aria-label="text.regenerate"
|
|
213
|
+
:title="text.regenerate"
|
|
214
|
+
:action="regenerate"
|
|
215
|
+
:disabled="disabled"
|
|
216
|
+
>
|
|
217
|
+
<LpIcon name="lucide:refresh-cw" :size="iconSize" />
|
|
218
|
+
</LpButton>
|
|
219
|
+
</template>
|
|
220
|
+
</LpPasswordInput>
|
|
221
|
+
|
|
222
|
+
<!-- Display form. -->
|
|
223
|
+
<FieldWrapper
|
|
224
|
+
v-else
|
|
225
|
+
:wrapped="!!(label || hint || error)"
|
|
226
|
+
:id="id"
|
|
227
|
+
:label="label"
|
|
228
|
+
:hint="hint"
|
|
229
|
+
:error="error"
|
|
230
|
+
:class="$attrs.class"
|
|
231
|
+
:style="$attrs.style"
|
|
232
|
+
>
|
|
233
|
+
<div :class="mergeClass(shell, label || hint || error ? '' : ($attrs.class as string))" data-lp-secret>
|
|
234
|
+
<LpShift axis="height" class="min-w-0 flex-1">
|
|
235
|
+
<!-- `aria-labelledby` would need the label's id; the field context
|
|
236
|
+
gives the control `id`, which LpFormField points its label at. -->
|
|
237
|
+
<div :id="id" class="relative min-w-0 font-mono" :aria-label="label" role="group">
|
|
238
|
+
<Transition
|
|
239
|
+
mode="out-in"
|
|
240
|
+
enter-active-class="transition-[opacity,filter] duration-(--duration-medium) ease-(--ease-emphasized) motion-reduce:transition-none"
|
|
241
|
+
leave-active-class="transition-[opacity,filter] duration-(--duration-fast) ease-out motion-reduce:transition-none"
|
|
242
|
+
enter-from-class="opacity-0 blur-[4px]"
|
|
243
|
+
leave-to-class="opacity-0 blur-[4px]"
|
|
244
|
+
>
|
|
245
|
+
<span
|
|
246
|
+
v-if="!secret"
|
|
247
|
+
key="empty"
|
|
248
|
+
class="block truncate font-sans text-muted"
|
|
249
|
+
>{{ placeholder ?? text.empty }}</span>
|
|
250
|
+
<span v-else-if="revealed" key="shown" class="block select-all" :class="wrap ? 'break-all whitespace-pre-wrap' : 'truncate'">
|
|
251
|
+
<span aria-hidden="true">{{ decrypt.running.value ? decrypt.text.value : secret }}</span>
|
|
252
|
+
<span class="sr-only">{{ secret }}</span>
|
|
253
|
+
</span>
|
|
254
|
+
<span v-else key="hidden" class="block truncate tracking-[0.12em] text-muted select-none" aria-hidden="true">{{ mask }}</span>
|
|
255
|
+
</Transition>
|
|
256
|
+
<span v-if="secret && !revealed" class="sr-only">{{ text.hidden }}</span>
|
|
257
|
+
</div>
|
|
258
|
+
</LpShift>
|
|
259
|
+
|
|
260
|
+
<div class="flex shrink-0 items-center gap-0.5" :class="wrap ? 'self-start' : 'self-center'">
|
|
261
|
+
<RevealToggle
|
|
262
|
+
v-if="revealable && secret"
|
|
263
|
+
v-model="revealed"
|
|
264
|
+
:icon-size="iconSize"
|
|
265
|
+
:show-label="text.show"
|
|
266
|
+
:hide-label="text.hide"
|
|
267
|
+
:disabled="disabled"
|
|
268
|
+
:controls="id"
|
|
269
|
+
class="size-7"
|
|
270
|
+
/>
|
|
271
|
+
<LpCopyButton
|
|
272
|
+
v-if="copyable && secret"
|
|
273
|
+
:value="secret"
|
|
274
|
+
:size="copySize"
|
|
275
|
+
class="size-7 text-muted hover:text-ink"
|
|
276
|
+
:disabled="disabled"
|
|
277
|
+
@copied="(t: string) => emit('copied', t)"
|
|
278
|
+
/>
|
|
279
|
+
<slot name="actions" />
|
|
280
|
+
<LpTooltip v-if="regenerate" :content="text.regenerate" label>
|
|
281
|
+
<LpButton
|
|
282
|
+
variant="ghost"
|
|
283
|
+
size="xs"
|
|
284
|
+
square
|
|
285
|
+
class="size-7 text-muted hover:text-ink"
|
|
286
|
+
:action="regenerate"
|
|
287
|
+
:disabled="disabled"
|
|
288
|
+
>
|
|
289
|
+
<LpIcon name="lucide:refresh-cw" :size="iconSize" />
|
|
290
|
+
</LpButton>
|
|
291
|
+
</LpTooltip>
|
|
292
|
+
</div>
|
|
293
|
+
|
|
294
|
+
<!-- The auto-hide window running out, as a hairline along the bottom. -->
|
|
295
|
+
<Transition
|
|
296
|
+
enter-active-class="transition-opacity duration-(--duration-fast)"
|
|
297
|
+
leave-active-class="transition-opacity duration-(--duration-fast)"
|
|
298
|
+
enter-from-class="opacity-0"
|
|
299
|
+
leave-to-class="opacity-0"
|
|
300
|
+
>
|
|
301
|
+
<span
|
|
302
|
+
v-if="revealed && autoHide"
|
|
303
|
+
:key="run"
|
|
304
|
+
class="lp-drain pointer-events-none absolute inset-x-0 bottom-0 h-0.5 bg-brand/70"
|
|
305
|
+
:style="{ animationDuration: `${autoHide}s` }"
|
|
306
|
+
:title="text.hidesIn"
|
|
307
|
+
aria-hidden="true"
|
|
308
|
+
/>
|
|
309
|
+
</Transition>
|
|
310
|
+
</div>
|
|
311
|
+
</FieldWrapper>
|
|
312
|
+
</template>
|
|
313
|
+
|
|
@@ -19,6 +19,7 @@ import { ref, useId } from "vue"
|
|
|
19
19
|
import { useFieldControl } from "../composables/useField"
|
|
20
20
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
21
21
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
22
|
+
import AttentionDot from "./AttentionDot.vue"
|
|
22
23
|
import LpIcon from "./LpIcon.vue"
|
|
23
24
|
import type { LpOptionBase } from "./options"
|
|
24
25
|
|
|
@@ -140,18 +141,10 @@ function releaseFocusAfterPointer(event: PointerEvent) {
|
|
|
140
141
|
/>
|
|
141
142
|
<span v-if="opt.icon" class="relative z-10 inline-flex shrink-0">
|
|
142
143
|
<LpIcon :name="opt.icon" :size="size === 'lg' ? 16 : 14" />
|
|
143
|
-
<
|
|
144
|
-
v-if="opt.dot && !opt.label"
|
|
145
|
-
aria-hidden="true"
|
|
146
|
-
class="absolute -right-1 -top-0.5 size-2 rounded-full bg-accent"
|
|
147
|
-
/>
|
|
144
|
+
<AttentionDot v-if="opt.dot && !opt.label" corner />
|
|
148
145
|
</span>
|
|
149
146
|
<span v-if="opt.label" class="relative z-10">{{ opt.label }}</span>
|
|
150
|
-
<
|
|
151
|
-
v-if="opt.dot && opt.label"
|
|
152
|
-
aria-hidden="true"
|
|
153
|
-
class="relative z-10 size-1.5 self-start mt-1.5 rounded-full bg-accent"
|
|
154
|
-
/>
|
|
147
|
+
<AttentionDot v-if="opt.dot && opt.label" class="mt-1.5" />
|
|
155
148
|
</ToggleGroupItem>
|
|
156
149
|
</ToggleGroupRoot>
|
|
157
150
|
</template>
|