@leavepulse/ui 0.69.0 → 0.70.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +49 -0
- package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
- package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
- package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
- package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
- package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
- package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
- package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
- package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
- package/dist/assets/LpRepeater-C1Cw27hj.css +21 -0
- package/dist/assets/{LpRollingText-BGnE6q9j.css → LpRollingText-dyOXedGO.css} +7 -0
- package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
- package/dist/assets/LpStatus-430OGTZY.css +17 -0
- package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
- package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
- package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
- package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
- package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
- package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
- package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-6kxEivBI.js} +11 -5
- package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
- package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
- package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
- package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
- package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
- package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
- package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
- package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
- package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-Chv_Xf8q.js} +7 -7
- package/dist/chunks/LpAlert-C5igj802.js +119 -0
- package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-BiWByLmt.js} +15 -16
- package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
- package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
- package/dist/chunks/LpBadge-BBq1Er9T.js +126 -0
- package/dist/chunks/LpBreadcrumbs-JKEi_yFF.js +144 -0
- package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
- package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
- package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
- package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
- package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
- package/dist/chunks/LpCodeDisplay-CbJMs-IK.js +189 -0
- package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
- package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-B7HSIFmn.js} +11 -6
- package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
- package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
- package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-Cj96ENDC.js} +16 -7
- package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
- package/dist/chunks/LpCountdown-BQnmB4gq.js +231 -0
- package/dist/chunks/LpDataList-CHNYQw7h.js +121 -0
- package/dist/chunks/LpDatePicker-ac1_6o5P.js +169 -0
- package/dist/chunks/LpDateRangePicker-B15gYrZJ.js +127 -0
- package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
- package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
- package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-R4aYVtVV.js} +14 -6
- package/dist/chunks/LpEditable-Ws3DNQHn.js +238 -0
- package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
- package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DDNg34tJ.js} +5 -3
- package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-DmPuYNZ_.js} +42 -55
- package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
- package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
- package/dist/chunks/LpGauge-C14Z9503.js +204 -0
- package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
- package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
- package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-HvwUA5Ec.js} +27 -14
- package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-DxbPKOzQ.js} +3 -3
- package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
- package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
- package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
- package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-D64hywJI.js} +39 -25
- package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
- package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
- package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
- package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-DKK4ySZl.js} +225 -129
- package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
- package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
- package/dist/chunks/LpMasonry--k0571qG.js +185 -0
- package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-rmI1DjKN.js} +3 -3
- package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
- package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-DiyFCHiZ.js} +4 -4
- package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-D-WhE5m2.js} +32 -48
- package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
- package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
- package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
- package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
- package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
- package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-GL2KOFK8.js} +26 -22
- package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
- package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-BgXZ3xmm.js} +159 -48
- package/dist/chunks/LpPipeline-B31h41Mu.js +329 -0
- package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-DmZ3wUtP.js} +13 -7
- package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
- package/dist/chunks/LpQuota-DaL8TgNe.js +162 -0
- package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
- package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
- package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
- package/dist/chunks/LpRelativeTime-yin9uQP7.js +73 -0
- package/dist/chunks/LpRepeater-D0S7jjwr.js +180 -0
- package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
- package/dist/chunks/{LpRollingText-DB7upf-5.js → LpRollingText-DiL717LK.js} +4 -3
- package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
- package/dist/chunks/LpSecretField-CfWyHv9m.js +316 -0
- package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
- package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
- package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-C_8cJtj6.js} +91 -111
- package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
- package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
- package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-CZRXtvem.js} +5 -3
- package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DBg1U1oW.js} +3 -3
- package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
- package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
- package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
- package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-DFKlPJgy.js} +38 -35
- package/dist/chunks/LpStatus-BsGLrpor.js +86 -0
- package/dist/chunks/LpStepMark-TrzOioa9.js +101 -0
- package/dist/chunks/LpStepper-BbnS5jUr.js +76 -0
- package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
- package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
- package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
- package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
- package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DZg80W-B.js} +68 -71
- package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
- package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
- package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
- package/dist/chunks/LpThemeStudio-DxVZMtzN.js +416 -0
- package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
- package/dist/chunks/LpThemeSwitcher-CadVBTBn.js +278 -0
- package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
- package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
- package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
- package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-C17A1XCb.js} +1 -1
- package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-CY2bFXge.js} +24 -18
- package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
- package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
- package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-Tew1Ykx4.js} +10 -9
- package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
- package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
- package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
- package/dist/chunks/PickerField-DoHv0WMH.js +125 -0
- package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
- package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
- package/dist/chunks/TourCard-BJ8i7dk0.js +123 -0
- package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
- package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
- package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AttentionDot.vue.d.ts +9 -0
- package/dist/components/AttentionDot.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.d.ts +25 -0
- package/dist/components/FieldWrapper.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.d.ts +4 -4
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LegendSwatch.vue.d.ts +6 -0
- package/dist/components/LegendSwatch.vue.js +4 -0
- package/dist/components/LoaderMark.vue.d.ts +12 -0
- package/dist/components/LoaderMark.vue.js +4 -0
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.d.ts +58 -0
- package/dist/components/LpActivityLine.vue.js +4 -0
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.d.ts +2 -2
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +8 -7
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.d.ts +16 -0
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.d.ts +19 -5
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +2 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.d.ts +24 -0
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.js +131 -160
- package/dist/components/LpCheckbox.vue.d.ts +2 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
- package/dist/components/LpCodeDisplay.vue.js +4 -0
- package/dist/components/LpCollapse.vue.d.ts +58 -0
- package/dist/components/LpCollapse.vue.js +4 -0
- package/dist/components/LpColorPicker.vue.d.ts +2 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.js +34 -23
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.d.ts +82 -0
- package/dist/components/LpCopyButton.vue.js +4 -0
- package/dist/components/LpCountdown.vue.d.ts +100 -0
- package/dist/components/LpCountdown.vue.js +4 -0
- package/dist/components/LpDataList.vue.d.ts +66 -0
- package/dist/components/LpDataList.vue.js +4 -0
- package/dist/components/LpDatePicker.vue.d.ts +3 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +3 -1
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.d.ts +74 -0
- package/dist/components/LpDock.vue.js +204 -0
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.d.ts +8 -1
- package/dist/components/LpDropzone.vue.js +36 -15
- package/dist/components/LpEditable.vue.d.ts +85 -0
- package/dist/components/LpEditable.vue.js +4 -0
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.d.ts +22 -0
- package/dist/components/LpFrame.vue.js +4 -0
- package/dist/components/LpGauge.vue.d.ts +116 -0
- package/dist/components/LpGauge.vue.js +4 -0
- package/dist/components/LpGlowBorder.vue.d.ts +47 -0
- package/dist/components/LpGlowBorder.vue.js +4 -0
- package/dist/components/LpHintExample.vue.d.ts +2 -2
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.d.ts +60 -0
- package/dist/components/LpHoverCard.vue.js +4 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.d.ts +37 -0
- package/dist/components/LpIdenticon.vue.js +4 -0
- package/dist/components/LpImageEditor.vue.js +13 -19
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +10 -0
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +106 -0
- package/dist/components/LpLoader.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMagnetic.vue.d.ts +28 -0
- package/dist/components/LpMagnetic.vue.js +4 -0
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.d.ts +42 -0
- package/dist/components/LpMasonry.vue.js +4 -0
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +15 -6
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +57 -0
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.d.ts +12 -4
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +2 -2
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPalettePreview.vue.js +1 -1
- package/dist/components/LpPaletteStats.vue.js +2 -2
- package/dist/components/LpPasswordInput.vue.d.ts +19 -2
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +3 -1
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +91 -0
- package/dist/components/LpPipeline.vue.js +4 -0
- package/dist/components/LpPopover.vue.d.ts +2 -2
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +11 -4
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.d.ts +68 -0
- package/dist/components/LpQuota.vue.js +4 -0
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.d.ts +41 -0
- package/dist/components/LpRelativeTime.vue.js +4 -0
- package/dist/components/LpRepeater.vue.d.ts +48 -0
- package/dist/components/LpRepeater.vue.js +4 -0
- package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
- package/dist/components/LpRevealOnScroll.vue.js +4 -0
- package/dist/components/LpRollingText.vue.d.ts +3 -1
- package/dist/components/LpRollingText.vue.js +1 -1
- package/dist/components/LpScramble.vue.d.ts +55 -0
- package/dist/components/LpScramble.vue.js +4 -0
- package/dist/components/LpScrollArea.vue.d.ts +1 -1
- package/dist/components/LpSecretField.vue.d.ts +108 -0
- package/dist/components/LpSecretField.vue.js +4 -0
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.d.ts +2 -0
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
- package/dist/components/LpShaderBackdrop.vue.js +4 -0
- package/dist/components/LpShinyText.vue.d.ts +39 -0
- package/dist/components/LpShinyText.vue.js +4 -0
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +4 -3
- package/dist/components/LpSparkline.vue.js +1 -1
- package/dist/components/LpSpotlight.vue.d.ts +37 -0
- package/dist/components/LpSpotlight.vue.js +4 -0
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.d.ts +65 -0
- package/dist/components/LpStatus.vue.js +4 -0
- package/dist/components/LpStepMark.vue.d.ts +31 -0
- package/dist/components/LpStepMark.vue.js +4 -0
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.d.ts +2 -2
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.js +104 -120
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.d.ts +6 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +5 -5
- package/dist/components/LpTabs.vue.js +25 -33
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextReveal.vue.d.ts +58 -0
- package/dist/components/LpTextReveal.vue.js +4 -0
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.d.ts +54 -0
- package/dist/components/LpThemeStudio.vue.js +4 -0
- package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
- package/dist/components/LpThemeStudioSection.vue.js +4 -0
- package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.d.ts +2 -0
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.d.ts +2 -2
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.d.ts +34 -0
- package/dist/components/LpTruncate.vue.js +4 -0
- package/dist/components/LpTypewriter.vue.d.ts +61 -0
- package/dist/components/LpTypewriter.vue.js +4 -0
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.d.ts +7 -0
- package/dist/components/OptionContent.vue.js +4 -0
- package/dist/components/PickerField.vue.d.ts +45 -0
- package/dist/components/PickerField.vue.js +4 -0
- package/dist/components/RevealToggle.vue.d.ts +21 -0
- package/dist/components/RevealToggle.vue.js +4 -0
- package/dist/components/StepConnector.vue.d.ts +19 -0
- package/dist/components/StepConnector.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/badge.d.ts +1 -0
- package/dist/components/badge.js +4 -0
- package/dist/components/chart.d.ts +5 -1
- package/dist/components/chart.js +2 -21
- package/dist/components/dateRange.d.ts +11 -0
- package/dist/components/dateRange.js +12 -0
- package/dist/components/dock.d.ts +19 -0
- package/dist/components/dock.js +16 -0
- package/dist/components/dropdown.d.ts +10 -1
- package/dist/components/dropdown.js +7 -2
- package/dist/components/fieldText.d.ts +38 -0
- package/dist/components/fieldText.js +53 -0
- package/dist/components/fileTree.d.ts +7 -3
- package/dist/components/fileTree.js +12 -18
- package/dist/components/format.d.ts +41 -0
- package/dist/components/format.js +67 -0
- package/dist/components/identicon.d.ts +38 -0
- package/dist/components/identicon.js +85 -0
- package/dist/components/masonry.d.ts +32 -0
- package/dist/components/masonry.js +40 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.d.ts +64 -0
- package/dist/components/meter.js +53 -0
- package/dist/components/otp.d.ts +1 -1
- package/dist/components/otp.js +7 -2
- package/dist/components/pipeline.d.ts +55 -0
- package/dist/components/pipeline.js +51 -0
- package/dist/components/quota.d.ts +57 -0
- package/dist/components/quota.js +40 -0
- package/dist/components/relativeTime.d.ts +24 -0
- package/dist/components/relativeTime.js +56 -0
- package/dist/components/reveal.d.ts +18 -0
- package/dist/components/reveal.js +32 -0
- package/dist/components/scramble.d.ts +68 -0
- package/dist/components/scramble.js +58 -0
- package/dist/components/shaderBackdrop.d.ts +20 -0
- package/dist/components/shaderBackdrop.js +156 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.js +24 -0
- package/dist/components/slotText.d.ts +2 -0
- package/dist/components/slotText.js +9 -0
- package/dist/components/status.d.ts +14 -0
- package/dist/components/status.js +22 -0
- package/dist/components/tableFacets.d.ts +8 -0
- package/dist/components/tableFacets.js +19 -0
- package/dist/components/textSplit.d.ts +17 -0
- package/dist/components/textSplit.js +24 -0
- package/dist/components/timeSpan.d.ts +78 -0
- package/dist/components/timeSpan.js +85 -0
- package/dist/components/tone.d.ts +43 -0
- package/dist/components/tone.js +82 -0
- package/dist/components/tour.js +3 -2
- package/dist/components/typewriter.d.ts +36 -0
- package/dist/components/typewriter.js +53 -0
- package/dist/components/videoBackdrop.js +5 -6
- package/dist/composables/easing.d.ts +22 -1
- package/dist/composables/easing.js +42 -1
- package/dist/composables/pseudoLocale.d.ts +15 -0
- package/dist/composables/pseudoLocale.js +96 -0
- package/dist/composables/scroll.js +5 -3
- package/dist/composables/useClipboard.d.ts +4 -1
- package/dist/composables/useClipboard.js +12 -2
- package/dist/composables/useField.d.ts +13 -0
- package/dist/composables/useField.js +26 -1
- package/dist/composables/useForm.js +32 -9
- package/dist/composables/useInView.d.ts +11 -0
- package/dist/composables/useInView.js +39 -0
- package/dist/composables/useLoadingGate.d.ts +8 -0
- package/dist/composables/useLoadingGate.js +38 -0
- package/dist/composables/useLpConfig.d.ts +10 -0
- package/dist/composables/useLpConfig.js +11 -1
- package/dist/composables/useMediaQuery.js +3 -1
- package/dist/composables/useNow.d.ts +16 -0
- package/dist/composables/useNow.js +39 -0
- package/dist/composables/usePersisted.js +14 -7
- package/dist/composables/usePillTransition.d.ts +5 -2
- package/dist/composables/usePillTransition.js +4 -3
- package/dist/composables/usePointerFrame.d.ts +18 -0
- package/dist/composables/usePointerFrame.js +31 -0
- package/dist/composables/useReducedMotion.d.ts +2 -0
- package/dist/composables/useReducedMotion.js +7 -0
- package/dist/composables/useRepeater.d.ts +17 -0
- package/dist/composables/useRepeater.js +31 -0
- package/dist/composables/useResizeObserver.d.ts +8 -0
- package/dist/composables/useResizeObserver.js +33 -0
- package/dist/composables/useRevealedValue.d.ts +31 -0
- package/dist/composables/useRevealedValue.js +26 -0
- package/dist/composables/useScramble.d.ts +42 -0
- package/dist/composables/useScramble.js +76 -0
- package/dist/composables/useShift.js +2 -10
- package/dist/composables/useSpotlight.d.ts +18 -0
- package/dist/composables/useSpotlight.js +53 -0
- package/dist/composables/useTilt.js +26 -18
- package/dist/composables/useTween.d.ts +43 -0
- package/dist/composables/useTween.js +69 -0
- package/dist/composables/useView.d.ts +18 -0
- package/dist/composables/useView.js +64 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +98 -1
- package/dist/index.js +263 -105
- package/dist/theme/define.d.ts +12 -0
- package/dist/theme/studio.d.ts +90 -0
- package/package.json +8 -2
- package/src/component-names.ts +33 -0
- package/src/components/AttentionDot.vue +27 -0
- package/src/components/ContextMenuItems.vue +5 -2
- package/src/components/FieldWrapper.vue +38 -0
- package/src/components/LayoutNode.vue +5 -9
- package/src/components/LegendSwatch.vue +15 -0
- package/src/components/LoaderMark.vue +90 -0
- package/src/components/LpActionBar.vue +12 -20
- package/src/components/LpActivityLine.vue +186 -0
- package/src/components/LpAlert.vue +54 -24
- package/src/components/LpAppShell.vue +7 -11
- package/src/components/LpAutocomplete.vue +16 -14
- package/src/components/LpAvatar.vue +17 -2
- package/src/components/LpBadge.vue +77 -13
- package/src/components/LpBreadcrumbs.vue +101 -35
- package/src/components/LpButton.vue +15 -3
- package/src/components/LpCard.vue +30 -7
- package/src/components/LpChart.vue +162 -171
- package/src/components/LpCheckbox.vue +10 -4
- package/src/components/LpCodeBlock.vue +11 -19
- package/src/components/LpCodeDisplay.vue +228 -0
- package/src/components/LpCollapse.vue +162 -0
- package/src/components/LpColorPicker.vue +10 -1
- package/src/components/LpCommandPalette.vue +38 -24
- package/src/components/LpContextMenu.vue +13 -3
- package/src/components/LpCopyButton.vue +185 -0
- package/src/components/LpCountdown.vue +308 -0
- package/src/components/LpDataList.vue +154 -0
- package/src/components/LpDatePicker.vue +55 -104
- package/src/components/LpDateRangePicker.vue +51 -95
- package/src/components/LpDisclosure.vue +58 -36
- package/src/components/LpDock.vue +274 -0
- package/src/components/LpDrawer.vue +10 -1
- package/src/components/LpDropdownMenu.vue +11 -2
- package/src/components/LpDropzone.vue +34 -13
- package/src/components/LpEditable.vue +295 -0
- package/src/components/LpFileTree.vue +5 -1
- package/src/components/LpFileTreeNode.vue +25 -50
- package/src/components/LpFormField.vue +22 -3
- package/src/components/LpFrame.vue +200 -0
- package/src/components/LpGauge.vue +287 -0
- package/src/components/LpGlowBorder.vue +60 -0
- package/src/components/LpHintExample.vue +9 -32
- package/src/components/LpHintLayer.vue +13 -3
- package/src/components/LpHoverCard.vue +175 -0
- package/src/components/LpIdenticon.vue +69 -0
- package/src/components/LpImageEditor.vue +15 -18
- package/src/components/LpInfraNode.vue +27 -16
- package/src/components/LpInput.vue +30 -16
- package/src/components/LpLightbox.vue +44 -23
- package/src/components/LpLoader.vue +145 -0
- package/src/components/LpLogViewer.vue +311 -82
- package/src/components/LpMagnetic.vue +97 -0
- package/src/components/LpMapPicker.vue +26 -28
- package/src/components/LpMasonry.vue +247 -0
- package/src/components/LpModal.vue +10 -1
- package/src/components/LpNotificationBell.vue +33 -49
- package/src/components/LpNumberField.vue +79 -14
- package/src/components/LpNumberFlow.vue +10 -35
- package/src/components/LpOtpInput.vue +7 -2
- package/src/components/LpPagination.vue +38 -4
- package/src/components/LpPalettePreview.vue +2 -7
- package/src/components/LpPasswordInput.vue +25 -18
- package/src/components/LpPhoneInput.vue +12 -3
- package/src/components/LpPie.vue +197 -36
- package/src/components/LpPipeline.vue +366 -0
- package/src/components/LpPopover.vue +14 -1
- package/src/components/LpProgress.vue +22 -84
- package/src/components/LpQuota.vue +197 -0
- package/src/components/LpRangeSlider.vue +5 -1
- package/src/components/LpRelativeTime.vue +90 -0
- package/src/components/LpRepeater.vue +131 -0
- package/src/components/LpRevealOnScroll.vue +125 -0
- package/src/components/LpRollingText.vue +12 -1
- package/src/components/LpScramble.vue +107 -0
- package/src/components/LpSecretField.vue +320 -0
- package/src/components/LpSegmented.vue +3 -10
- package/src/components/LpSelect.vue +74 -65
- package/src/components/LpShaderBackdrop.vue +434 -0
- package/src/components/LpShinyText.vue +139 -0
- package/src/components/LpSidebar.vue +2 -0
- package/src/components/LpSlider.vue +5 -1
- package/src/components/LpSparkline.vue +55 -37
- package/src/components/LpSpotlight.vue +51 -0
- package/src/components/LpStat.vue +6 -2
- package/src/components/LpStatus.vue +127 -0
- package/src/components/LpStepMark.vue +138 -0
- package/src/components/LpStepper.vue +37 -43
- package/src/components/LpSwap.vue +2 -2
- package/src/components/LpSwitch.vue +15 -22
- package/src/components/LpTable.vue +47 -63
- package/src/components/LpTableFilter.vue +1 -0
- package/src/components/LpTableOfContents.vue +53 -29
- package/src/components/LpTabs.vue +10 -21
- package/src/components/LpTagsInput.vue +53 -37
- package/src/components/LpTextReveal.vue +236 -0
- package/src/components/LpTextarea.vue +11 -11
- package/src/components/LpThemeStudio.vue +216 -0
- package/src/components/LpThemeStudioSection.vue +16 -0
- package/src/components/LpThemeSwitcher.vue +156 -47
- package/src/components/LpTimeField.vue +9 -1
- package/src/components/LpToaster.vue +63 -83
- package/src/components/LpTooltip.vue +10 -1
- package/src/components/LpTour.vue +24 -13
- package/src/components/LpTruncate.vue +135 -0
- package/src/components/LpTypewriter.vue +236 -0
- package/src/components/LpUptimeBar.vue +6 -5
- package/src/components/LpVideoBackdrop.vue +15 -13
- package/src/components/OptionContent.vue +17 -0
- package/src/components/PickerField.vue +59 -0
- package/src/components/RevealToggle.vue +51 -0
- package/src/components/StepConnector.vue +54 -0
- package/src/components/TourCard.vue +29 -16
- package/src/components/badge.ts +8 -0
- package/src/components/chart.ts +8 -23
- package/src/components/dateRange.ts +25 -0
- package/src/components/dock.ts +31 -0
- package/src/components/dropdown.ts +15 -3
- package/src/components/fieldText.ts +95 -0
- package/src/components/fileTree.ts +19 -21
- package/src/components/format.ts +136 -0
- package/src/components/identicon.ts +160 -0
- package/src/components/masonry.ts +73 -0
- package/src/components/meter.ts +122 -0
- package/src/components/otp.ts +14 -3
- package/src/components/pipeline.ts +101 -0
- package/src/components/quota.ts +111 -0
- package/src/components/relativeTime.ts +118 -0
- package/src/components/reveal.ts +56 -0
- package/src/components/scramble.ts +138 -0
- package/src/components/shaderBackdrop.ts +208 -0
- package/src/components/slider.ts +30 -0
- package/src/components/slotText.ts +13 -0
- package/src/components/status.ts +46 -0
- package/src/components/tableFacets.ts +25 -0
- package/src/components/textSplit.ts +55 -0
- package/src/components/timeSpan.ts +183 -0
- package/src/components/tone.ts +144 -0
- package/src/components/tour.ts +3 -2
- package/src/components/typewriter.ts +104 -0
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/easing.ts +66 -1
- package/src/composables/pseudoLocale.ts +105 -0
- package/src/composables/scroll.ts +6 -3
- package/src/composables/useClipboard.ts +25 -3
- package/src/composables/useField.ts +38 -1
- package/src/composables/useForm.ts +41 -11
- package/src/composables/useInView.ts +61 -0
- package/src/composables/useLoadingGate.ts +63 -0
- package/src/composables/useLpConfig.ts +20 -1
- package/src/composables/useMediaQuery.ts +6 -2
- package/src/composables/useNow.ts +84 -0
- package/src/composables/usePersisted.ts +19 -8
- package/src/composables/usePillTransition.ts +21 -13
- package/src/composables/usePointerFrame.ts +72 -0
- package/src/composables/useReducedMotion.ts +22 -0
- package/src/composables/useRepeater.ts +44 -0
- package/src/composables/useResizeObserver.ts +59 -0
- package/src/composables/useRevealedValue.ts +84 -0
- package/src/composables/useScramble.ts +152 -0
- package/src/composables/useShift.ts +10 -16
- package/src/composables/useSpotlight.ts +82 -0
- package/src/composables/useTilt.ts +40 -23
- package/src/composables/useTween.ts +149 -0
- package/src/composables/useView.ts +96 -0
- package/src/index.css +1 -0
- package/src/index.ts +143 -1
- package/src/kit-icons.ts +1 -1
- package/src/theme/define.ts +65 -0
- package/src/theme/studio.ts +202 -0
- package/src/tokens/effects.css +151 -0
- package/src/tokens/tokens.css +131 -39
- package/src/tokens/utilities.css +81 -0
- package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
- package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
- package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
- package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
- package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
- package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
- package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
- package/dist/chunks/LpStepper-C2slwObu.js +0 -90
- package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
- package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
- package/dist/chunks/TourCard-BKI7X9-r.js +0 -105
|
@@ -13,11 +13,11 @@ import {
|
|
|
13
13
|
NumberFieldInput,
|
|
14
14
|
NumberFieldRoot,
|
|
15
15
|
} from "reka-ui"
|
|
16
|
-
import { computed, useId } from "vue"
|
|
16
|
+
import { computed, useAttrs, useId } from "vue"
|
|
17
17
|
import LpIcon from "./LpIcon.vue"
|
|
18
|
-
import { useFieldControl } from "../composables/useField"
|
|
18
|
+
import { focusLeft, useFieldControl } from "../composables/useField"
|
|
19
19
|
import { useLabels } from "../composables/useLpConfig"
|
|
20
|
-
import {
|
|
20
|
+
import { useMergedClass } from "../composables/useMergedClass"
|
|
21
21
|
|
|
22
22
|
export interface NumberFieldLabels extends Record<string, string> {
|
|
23
23
|
increase: string
|
|
@@ -30,7 +30,33 @@ const props = withDefaults(defineProps<{
|
|
|
30
30
|
modelValue?: number | null
|
|
31
31
|
min?: number
|
|
32
32
|
max?: number
|
|
33
|
+
/**
|
|
34
|
+
* What the steppers and arrow keys add. A typed value is snapped to the
|
|
35
|
+
* nearest step from `min` (or 0) when it is committed, unless `stepSnapping`
|
|
36
|
+
* is false: then 0.37 stays 0.37 in a field that steps by 0.5.
|
|
37
|
+
*/
|
|
33
38
|
step?: number
|
|
39
|
+
stepSnapping?: boolean
|
|
40
|
+
/**
|
|
41
|
+
* How the value is shown and, with it, how far it is rounded: the field
|
|
42
|
+
* commits the number it displays, so `{ maximumFractionDigits: 0 }` makes it
|
|
43
|
+
* an integer field. Intl options, read in `locale` (the document's by default).
|
|
44
|
+
*/
|
|
45
|
+
formatOptions?: Intl.NumberFormatOptions
|
|
46
|
+
locale?: string
|
|
47
|
+
/** Shown and focusable, not changed: typing, the steppers, arrows and the wheel all stop. */
|
|
48
|
+
readonly?: boolean
|
|
49
|
+
/** The wheel over a focused field steps the value unless this is set. */
|
|
50
|
+
disableWheelChange?: boolean
|
|
51
|
+
invertWheelChange?: boolean
|
|
52
|
+
/** A step from the buttons moves focus to the input (reka's default); false keeps it on the button. */
|
|
53
|
+
focusOnChange?: boolean
|
|
54
|
+
/**
|
|
55
|
+
* The − and + buttons. Off, the field is a plain numeric input; arrow keys
|
|
56
|
+
* still step. A field narrower than 8.5rem drops them by itself: two 32 px
|
|
57
|
+
* buttons left a 100 px column eleven pixels for the digits.
|
|
58
|
+
*/
|
|
59
|
+
steppers?: boolean
|
|
34
60
|
disabled?: boolean
|
|
35
61
|
// The unit the number is in ("mm", "W", "mA"). It sits inside the field
|
|
36
62
|
// rather than in the label, because a grid of bare boxes labelled "Width",
|
|
@@ -41,9 +67,15 @@ const props = withDefaults(defineProps<{
|
|
|
41
67
|
/** Control height, matching LpInput. */
|
|
42
68
|
size?: "sm" | "md" | "lg"
|
|
43
69
|
labels?: Partial<NumberFieldLabels>
|
|
44
|
-
}>(), { size: "md" })
|
|
70
|
+
}>(), { size: "md", stepSnapping: true, steppers: true, focusOnChange: true })
|
|
45
71
|
|
|
46
|
-
|
|
72
|
+
// The value is committed when the field loses focus or Enter is pressed, and on
|
|
73
|
+
// every step, not on each keystroke: "1." or "-" is not a number yet, and a
|
|
74
|
+
// model that followed the keys would flicker through them.
|
|
75
|
+
const emit = defineEmits<{
|
|
76
|
+
(e: "update:modelValue", value: number | null): void
|
|
77
|
+
(e: "blur", event: FocusEvent): void
|
|
78
|
+
}>()
|
|
47
79
|
|
|
48
80
|
// The unit is described to the input rather than merely placed beside it: on
|
|
49
81
|
// screen the two read as one field, and without this a reader announces "380"
|
|
@@ -64,15 +96,35 @@ const SIZE = {
|
|
|
64
96
|
lg: "h-(--size-control-lg) text-sm",
|
|
65
97
|
}
|
|
66
98
|
|
|
67
|
-
const
|
|
99
|
+
const attrs = useAttrs()
|
|
100
|
+
const field = useFieldControl(() => ({
|
|
101
|
+
wrapped: false,
|
|
102
|
+
id: typeof attrs.id === "string" ? attrs.id : undefined,
|
|
103
|
+
invalid: props.invalid,
|
|
104
|
+
disabled: props.disabled,
|
|
105
|
+
}))
|
|
68
106
|
const describedBy = computed(
|
|
69
107
|
() => [field.value.describedBy, props.unit ? unitId : undefined].filter(Boolean).join(" ") || undefined,
|
|
70
108
|
)
|
|
71
109
|
|
|
110
|
+
// The frame takes the consumer's class and style, and `name` goes to reka's
|
|
111
|
+
// hidden input, which submits the number itself rather than its formatted
|
|
112
|
+
// text and carries `required` for the form's own check; every other attribute
|
|
113
|
+
// (placeholder, name, aria-label, inputmode, listeners) belongs to the input,
|
|
114
|
+
// which is what a form, a reader and a test reach for.
|
|
115
|
+
const inputAttrs = computed(() => {
|
|
116
|
+
const { class: _c, style: _s, id: _i, name: _n, ...rest } = attrs
|
|
117
|
+
return rest
|
|
118
|
+
})
|
|
119
|
+
|
|
120
|
+
function onFocusOut(event: FocusEvent) {
|
|
121
|
+
if (focusLeft(event)) emit("blur", event)
|
|
122
|
+
}
|
|
123
|
+
|
|
72
124
|
// The field is full-width with its own control frame — the two things a consumer laying out a compact numeric column needs to change.
|
|
73
|
-
const
|
|
125
|
+
const rootClass = useMergedClass(() =>
|
|
74
126
|
[
|
|
75
|
-
"flex w-full items-center rounded-control border bg-surface-soft transition-colors duration-[var(--duration-fast)] focus-within:ring-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55",
|
|
127
|
+
"@container flex w-full items-center rounded-control border bg-surface-soft transition-colors duration-[var(--duration-fast)] focus-within:ring-2 data-[disabled]:cursor-not-allowed data-[disabled]:opacity-55",
|
|
76
128
|
SIZE[props.size],
|
|
77
129
|
field.value.invalid
|
|
78
130
|
? "border-danger focus-within:border-danger focus-within:ring-danger-soft"
|
|
@@ -87,16 +139,26 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
|
|
|
87
139
|
:min="min"
|
|
88
140
|
:max="max"
|
|
89
141
|
:step="step"
|
|
142
|
+
:step-snapping="stepSnapping"
|
|
143
|
+
:readonly="readonly"
|
|
144
|
+
:disable-wheel-change="disableWheelChange"
|
|
145
|
+
:invert-wheel-change="invertWheelChange"
|
|
146
|
+
:focus-on-change="focusOnChange"
|
|
147
|
+
:format-options="formatOptions"
|
|
148
|
+
:locale="locale"
|
|
90
149
|
:disabled="field.disabled"
|
|
91
150
|
:required="field.required"
|
|
92
151
|
data-lp-ring-owner
|
|
93
152
|
:class="rootClass"
|
|
94
|
-
|
|
95
|
-
|
|
153
|
+
:style="attrs.style"
|
|
154
|
+
:name="typeof attrs.name === 'string' ? attrs.name : undefined"
|
|
155
|
+
@update:model-value="(v) => emit('update:modelValue', Number.isNaN(v) ? null : (v ?? null))"
|
|
156
|
+
@focusout="onFocusOut"
|
|
96
157
|
>
|
|
97
158
|
<NumberFieldDecrement
|
|
159
|
+
v-if="steppers"
|
|
98
160
|
:aria-label="text.decrease"
|
|
99
|
-
class="group grid h-full w-8 place-items-center text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
|
|
161
|
+
class="group grid h-full w-8 shrink-0 place-items-center @max-[8.5rem]:hidden text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
|
|
100
162
|
>
|
|
101
163
|
<LpIcon
|
|
102
164
|
name="lucide:minus"
|
|
@@ -105,18 +167,21 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
|
|
|
105
167
|
/>
|
|
106
168
|
</NumberFieldDecrement>
|
|
107
169
|
<NumberFieldInput
|
|
170
|
+
v-bind="inputAttrs"
|
|
108
171
|
:id="field.id"
|
|
109
172
|
:aria-describedby="describedBy"
|
|
110
173
|
:aria-invalid="field.invalid || undefined"
|
|
111
|
-
class="min-w-0 flex-1 bg-transparent text-
|
|
174
|
+
class="min-w-0 flex-1 bg-transparent text-ink outline-none placeholder:text-muted [appearance:textfield] [&::-webkit-inner-spin-button]:appearance-none"
|
|
175
|
+
:class="steppers ? 'text-center @max-[8.5rem]:px-3 @max-[8.5rem]:text-left' : 'px-3'"
|
|
112
176
|
/>
|
|
113
177
|
<!-- The unit sits between the value and the increment button, so a long one
|
|
114
178
|
narrows the field rather than covering the digits. Not focusable and
|
|
115
179
|
not part of the value: it is read, never typed. -->
|
|
116
|
-
<span v-if="unit" :id="unitId" class="shrink-0 pr-1 text-xs text-muted">{{ unit }}</span>
|
|
180
|
+
<span v-if="unit" :id="unitId" class="shrink-0 pr-1 text-xs text-muted" :class="!steppers && 'pr-3'">{{ unit }}</span>
|
|
117
181
|
<NumberFieldIncrement
|
|
182
|
+
v-if="steppers"
|
|
118
183
|
:aria-label="text.increase"
|
|
119
|
-
class="group grid h-full w-8 place-items-center text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
|
|
184
|
+
class="group grid h-full w-8 shrink-0 place-items-center @max-[8.5rem]:hidden text-muted transition-colors duration-[var(--duration-fast)] hover:text-ink disabled:opacity-40"
|
|
120
185
|
>
|
|
121
186
|
<LpIcon
|
|
122
187
|
name="lucide:plus"
|
|
@@ -28,7 +28,8 @@
|
|
|
28
28
|
*/
|
|
29
29
|
import { computed, onBeforeUnmount, ref, watch } from "vue"
|
|
30
30
|
import { easeOut, prefersReducedMotion } from "../composables/easing"
|
|
31
|
-
import {
|
|
31
|
+
import { useRevealedValue } from "../composables/useRevealedValue"
|
|
32
|
+
import { compactNumber } from "./format"
|
|
32
33
|
|
|
33
34
|
const props = withDefaults(
|
|
34
35
|
defineProps<{
|
|
@@ -213,40 +214,14 @@ const travel = (to: number) => {
|
|
|
213
214
|
* page is news, and it should roll whether or not it is in view — the reveal
|
|
214
215
|
* governs the FIRST reading only.
|
|
215
216
|
*/
|
|
216
|
-
const { el: revealAnchor,
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
}, { immediate: true })
|
|
217
|
+
const { el: revealAnchor, target } = useRevealedValue(() => props.value, {
|
|
218
|
+
animateOnMount: () => props.animateOnMount,
|
|
219
|
+
holdChanges: false,
|
|
220
|
+
})
|
|
221
221
|
|
|
222
|
-
watch(
|
|
222
|
+
watch(target, travel)
|
|
223
223
|
onBeforeUnmount(stop)
|
|
224
224
|
|
|
225
|
-
const UNITS = [
|
|
226
|
-
{ limit: 1e9, suffix: "B" },
|
|
227
|
-
{ limit: 1e6, suffix: "M" },
|
|
228
|
-
{ limit: 1e3, suffix: "k" },
|
|
229
|
-
] as const
|
|
230
|
-
|
|
231
|
-
const scaleFor = (v: number) => {
|
|
232
|
-
const abs = Math.abs(v)
|
|
233
|
-
let at = UNITS.findIndex((u) => abs >= u.limit)
|
|
234
|
-
// 999 950 at one place reads "1000.0k"; that is the next unit up.
|
|
235
|
-
if (at > 0 && Math.abs(Number((v / UNITS[at].limit).toFixed(1))) >= 1000) at--
|
|
236
|
-
if (at === -1 && abs >= 999.5) at = UNITS.length - 1
|
|
237
|
-
const unit = UNITS[at]
|
|
238
|
-
if (!unit) return { divisor: 1, suffix: "", decimals: 0 }
|
|
239
|
-
// One decimal is what makes 1.2k readable; a value that lands exactly on the
|
|
240
|
-
// unit (5M) keeps none, matching how these are written by hand.
|
|
241
|
-
const scaled = v / unit.limit
|
|
242
|
-
return {
|
|
243
|
-
divisor: unit.limit,
|
|
244
|
-
suffix: unit.suffix,
|
|
245
|
-
decimals: Number.isInteger(scaled) ? 0 : 1,
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
|
|
250
225
|
const formatted = computed(() => formatAt(round(displayed.value), !settled.value))
|
|
251
226
|
|
|
252
227
|
// Rounded first by the caller: every branch should render the shape the
|
|
@@ -264,10 +239,10 @@ function formatAt(v: number, padded: boolean): string {
|
|
|
264
239
|
*
|
|
265
240
|
* The decimal count is what stays fixed: one place whenever a unit is in
|
|
266
241
|
* play, so the row's shape only changes at a rollover, not on every frame.
|
|
242
|
+
* No locale here: the cells below find the fraction by its ".", and a
|
|
243
|
+
* locale's "," would turn the fraction's columns into integer ones.
|
|
267
244
|
*/
|
|
268
|
-
|
|
269
|
-
const places = divisor === 1 ? 0 : 1
|
|
270
|
-
return `${(v / divisor).toFixed(places)}${suffix}`
|
|
245
|
+
return compactNumber(v, { plainDecimals: 0, fixed: true })
|
|
271
246
|
}
|
|
272
247
|
const pad = padded ? Math.max(1, padTo.value) : 1
|
|
273
248
|
if (props.grouped)
|
|
@@ -42,8 +42,12 @@ const props = withDefaults(
|
|
|
42
42
|
* compared without regard to case; pass `false` for a case-sensitive code.
|
|
43
43
|
*/
|
|
44
44
|
uppercase?: boolean
|
|
45
|
-
/**
|
|
46
|
-
|
|
45
|
+
/**
|
|
46
|
+
* Draw a separator after every `group` cells (e.g. 3 for "123-456"), or
|
|
47
|
+
* after blocks of the exact sizes given (`[4, 6, 5]`), as LpCodeDisplay's
|
|
48
|
+
* `groups` splits the printed code.
|
|
49
|
+
*/
|
|
50
|
+
group?: number | number[]
|
|
47
51
|
/** Error state — tints the cells red (e.g. wrong code). */
|
|
48
52
|
invalid?: boolean
|
|
49
53
|
size?: "sm" | "md" | "lg"
|
|
@@ -151,6 +155,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
151
155
|
:type="alphanumeric ? 'text' : 'number'"
|
|
152
156
|
:mask="mask"
|
|
153
157
|
:disabled="field.disabled"
|
|
158
|
+
:required="field.required"
|
|
154
159
|
otp
|
|
155
160
|
:class="rootClass"
|
|
156
161
|
v-bind="rest"
|
|
@@ -18,11 +18,12 @@ export default { inheritAttrs: false }
|
|
|
18
18
|
* motion-v's shared layoutId with zero list-animation conflicts.
|
|
19
19
|
*/
|
|
20
20
|
import { Motion } from "motion-v"
|
|
21
|
-
import { computed, useId } from "vue"
|
|
21
|
+
import { computed, ref, useId } from "vue"
|
|
22
22
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
23
23
|
import LpIcon from "./LpIcon.vue"
|
|
24
24
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
25
25
|
import { useLabels } from "../composables/useLpConfig"
|
|
26
|
+
import { useResizeObserver } from "../composables/useResizeObserver"
|
|
26
27
|
|
|
27
28
|
const props = withDefaults(
|
|
28
29
|
defineProps<{
|
|
@@ -73,10 +74,42 @@ const current = computed(() =>
|
|
|
73
74
|
// stable as the user pages through.
|
|
74
75
|
type Slot = { kind: "page"; page: number } | { kind: "gap" }
|
|
75
76
|
|
|
77
|
+
// The row gives up siblings, down to none, when the room it is given is too
|
|
78
|
+
// narrow for them: on a phone nine slots and two arrows ran past the screen.
|
|
79
|
+
// The room is the parent's width, not the row's own, so dropping siblings
|
|
80
|
+
// cannot make the row look wide enough to bring them back.
|
|
81
|
+
const root = ref<HTMLElement | null>(null)
|
|
82
|
+
const room = ref(Infinity)
|
|
83
|
+
const slotWidth = ref(32)
|
|
84
|
+
const gap = ref(6)
|
|
85
|
+
function measure() {
|
|
86
|
+
const nav = root.value
|
|
87
|
+
if (!nav || !nav.children.length) return
|
|
88
|
+
gap.value = parseFloat(getComputedStyle(nav).columnGap) || 0
|
|
89
|
+
const items = nav.children.length
|
|
90
|
+
const used = [...nav.children].reduce((sum, el) => sum + (el as HTMLElement).offsetWidth, 0)
|
|
91
|
+
slotWidth.value = used / items
|
|
92
|
+
}
|
|
93
|
+
useResizeObserver(
|
|
94
|
+
() => root.value?.parentElement,
|
|
95
|
+
(entry) => {
|
|
96
|
+
measure()
|
|
97
|
+
if (entry) room.value = entry.contentRect.width
|
|
98
|
+
},
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
const siblings = computed(() => {
|
|
102
|
+
for (let n = props.siblings; n > 0; n--) {
|
|
103
|
+
const items = Math.min(n * 2 + 1 + 4, count.value) + 2
|
|
104
|
+
if (items * slotWidth.value + (items - 1) * gap.value <= room.value) return n
|
|
105
|
+
}
|
|
106
|
+
return 0
|
|
107
|
+
})
|
|
108
|
+
|
|
76
109
|
const slots = computed<Slot[]>(() => {
|
|
77
110
|
const c = count.value
|
|
78
111
|
const cur = current.value
|
|
79
|
-
const inner =
|
|
112
|
+
const inner = siblings.value * 2 + 1 // pages shown around (and including) current
|
|
80
113
|
// Total = first + leftGap + inner + rightGap + last. Constant for a given
|
|
81
114
|
// count, so the row width never changes as you page through.
|
|
82
115
|
const total = inner + 4
|
|
@@ -88,8 +121,8 @@ const slots = computed<Slot[]>(() => {
|
|
|
88
121
|
|
|
89
122
|
// Inner window [lo..hi] of length `inner`, clamped into [3 .. c-2] so there's
|
|
90
123
|
// always a slot for first(1)+page 2 on the left and page c-1+last(c) on right.
|
|
91
|
-
let lo = cur -
|
|
92
|
-
let hi = cur +
|
|
124
|
+
let lo = cur - siblings.value
|
|
125
|
+
let hi = cur + siblings.value
|
|
93
126
|
if (lo < 3) {
|
|
94
127
|
hi += 3 - lo
|
|
95
128
|
lo = 3
|
|
@@ -137,6 +170,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
137
170
|
|
|
138
171
|
<template>
|
|
139
172
|
<nav
|
|
173
|
+
ref="root"
|
|
140
174
|
:class="rootClass"
|
|
141
175
|
v-bind="rest" :aria-label="text.nav">
|
|
142
176
|
<button
|
|
@@ -49,7 +49,8 @@ withDefaults(
|
|
|
49
49
|
}
|
|
50
50
|
.lp-palette-preview > * {
|
|
51
51
|
min-width: 0;
|
|
52
|
-
|
|
52
|
+
--rise: 4px;
|
|
53
|
+
animation: rise-in 260ms var(--ease-emphasized, ease-out) both;
|
|
53
54
|
}
|
|
54
55
|
.lp-palette-preview > :nth-child(2) {
|
|
55
56
|
animation-delay: 40ms;
|
|
@@ -63,12 +64,6 @@ withDefaults(
|
|
|
63
64
|
.lp-palette-preview > :nth-child(n + 5) {
|
|
64
65
|
animation-delay: 160ms;
|
|
65
66
|
}
|
|
66
|
-
@keyframes lp-palette-in {
|
|
67
|
-
from {
|
|
68
|
-
opacity: 0;
|
|
69
|
-
transform: translateY(4px);
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
67
|
@media (prefers-reduced-motion: reduce) {
|
|
73
68
|
.lp-palette-preview > * {
|
|
74
69
|
animation: none;
|
|
@@ -10,16 +10,21 @@ export interface PasswordInputLabels extends Record<string, string> {
|
|
|
10
10
|
<script setup lang="ts">
|
|
11
11
|
// Password field = LpInput + a show/hide toggle in its trailing slot.
|
|
12
12
|
// No duplicated field styling — the shell lives in LpInput.
|
|
13
|
+
// LpSecretField's input form is this same field: it drives `visible` (to hide
|
|
14
|
+
// again on a timer) and puts its copy button in `actions`.
|
|
13
15
|
import { ref } from "vue"
|
|
16
|
+
import { useFieldControl } from "../composables/useField"
|
|
14
17
|
import { useLabels } from "../composables/useLpConfig"
|
|
15
|
-
import LpIcon from "./LpIcon.vue"
|
|
16
18
|
import LpInput from "./LpInput.vue"
|
|
19
|
+
import RevealToggle from "./RevealToggle.vue"
|
|
17
20
|
|
|
18
|
-
const props = defineProps<{
|
|
21
|
+
const props = withDefaults(defineProps<{
|
|
19
22
|
modelValue?: string
|
|
20
23
|
placeholder?: string
|
|
21
24
|
invalid?: boolean
|
|
22
25
|
disabled?: boolean
|
|
26
|
+
/** Offer the show/hide button. When false, the field stays masked. */
|
|
27
|
+
revealable?: boolean
|
|
23
28
|
// Field wrapping mirrors LpInput: passing any of these wraps the control in
|
|
24
29
|
// LpFormField, so a password field labels itself like every other field.
|
|
25
30
|
label?: string
|
|
@@ -29,15 +34,17 @@ const props = defineProps<{
|
|
|
29
34
|
/** Control height, as on LpInput. */
|
|
30
35
|
size?: "sm" | "md" | "lg"
|
|
31
36
|
labels?: Partial<PasswordInputLabels>
|
|
32
|
-
}>()
|
|
37
|
+
}>(), { revealable: true })
|
|
33
38
|
defineEmits<{ (e: "update:modelValue", value: string): void }>()
|
|
39
|
+
/** Whether the text shows; bind it to reveal or hide from outside. */
|
|
40
|
+
const visible = defineModel<boolean>("visible", { default: false })
|
|
41
|
+
const field = useFieldControl(() => ({ wrapped: false, disabled: props.disabled }))
|
|
34
42
|
|
|
35
43
|
const text = useLabels<PasswordInputLabels>(
|
|
36
44
|
"passwordInput",
|
|
37
45
|
{ show: "Show password", hide: "Hide password" },
|
|
38
46
|
() => props.labels,
|
|
39
47
|
)
|
|
40
|
-
const visible = ref(false)
|
|
41
48
|
const inner = ref<InstanceType<typeof LpInput> | null>(null)
|
|
42
49
|
defineExpose({
|
|
43
50
|
focus: (options?: FocusOptions) => inner.value?.focus(options),
|
|
@@ -51,10 +58,10 @@ defineExpose({
|
|
|
51
58
|
ref="inner"
|
|
52
59
|
v-bind="$attrs"
|
|
53
60
|
:model-value="modelValue"
|
|
54
|
-
:type="visible ? 'text' : 'password'"
|
|
61
|
+
:type="revealable && visible ? 'text' : 'password'"
|
|
55
62
|
:placeholder="placeholder"
|
|
56
63
|
:invalid="invalid"
|
|
57
|
-
:disabled="disabled"
|
|
64
|
+
:disabled="field.disabled"
|
|
58
65
|
:label="label"
|
|
59
66
|
:hint="hint"
|
|
60
67
|
:error="error"
|
|
@@ -64,18 +71,18 @@ defineExpose({
|
|
|
64
71
|
>
|
|
65
72
|
<template v-if="$slots.leading" #leading><slot name="leading" /></template>
|
|
66
73
|
<template #trailing>
|
|
67
|
-
<
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
74
|
+
<slot name="actions" />
|
|
75
|
+
<!-- Sized to the icon with a hair of padding, as the field's other
|
|
76
|
+
trailing controls are, rather than to a full square button. -->
|
|
77
|
+
<RevealToggle
|
|
78
|
+
v-if="revealable"
|
|
79
|
+
v-model="visible"
|
|
80
|
+
:icon-size="size === 'sm' ? 14 : 16"
|
|
81
|
+
:show-label="text.show"
|
|
82
|
+
:hide-label="text.hide"
|
|
83
|
+
:disabled="field.disabled"
|
|
84
|
+
class="size-auto rounded-inner p-1 hover:bg-transparent"
|
|
85
|
+
/>
|
|
79
86
|
</template>
|
|
80
87
|
</LpInput>
|
|
81
88
|
</template>
|
|
@@ -53,7 +53,7 @@ import { useFieldNotice, type FieldNoticeOptions } from "../composables/useField
|
|
|
53
53
|
import { useInputFilter } from "../composables/useInputFilter"
|
|
54
54
|
import { useLabels } from "../composables/useLpConfig"
|
|
55
55
|
import { type Country, filterCountries, flagEmoji, loadCountries, matchCountryByValue } from "./countries"
|
|
56
|
-
import { OPTION_ITEM, POPOVER_PANEL } from "./dropdown"
|
|
56
|
+
import { OPTION_ITEM, optionStagger, POPOVER_PANEL } from "./dropdown"
|
|
57
57
|
import LpFieldNotice from "./LpFieldNotice.vue"
|
|
58
58
|
import LpIcon from "./LpIcon.vue"
|
|
59
59
|
import {
|
|
@@ -66,6 +66,7 @@ import {
|
|
|
66
66
|
type PhoneLib,
|
|
67
67
|
} from "./phone"
|
|
68
68
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
69
|
+
import { useOutsideGuard, usePortalTarget } from "../composables/useView"
|
|
69
70
|
|
|
70
71
|
export interface PhoneDetail {
|
|
71
72
|
/** Matched country, or undefined when the prefix matches none. */
|
|
@@ -359,6 +360,12 @@ const inputAttrs = computed(() => {
|
|
|
359
360
|
const { style: _s, ...others } = rest.value
|
|
360
361
|
return others
|
|
361
362
|
})
|
|
363
|
+
|
|
364
|
+
// Overlays open in the window this component renders in (an LpFrame's, inside one).
|
|
365
|
+
const portalTo = usePortalTarget()
|
|
366
|
+
// What happens in another document (the page around a frame, or a frame in
|
|
367
|
+
// the page) is not "outside" for this layer.
|
|
368
|
+
const guardOutside = useOutsideGuard()
|
|
362
369
|
</script>
|
|
363
370
|
|
|
364
371
|
<template>
|
|
@@ -395,8 +402,10 @@ const inputAttrs = computed(() => {
|
|
|
395
402
|
</ComboboxTrigger>
|
|
396
403
|
</ComboboxAnchor>
|
|
397
404
|
|
|
398
|
-
<ComboboxPortal>
|
|
405
|
+
<ComboboxPortal :to="portalTo">
|
|
399
406
|
<ComboboxContent
|
|
407
|
+
@interact-outside="guardOutside"
|
|
408
|
+
@escape-key-down="guardOutside"
|
|
400
409
|
:collision-padding="8"
|
|
401
410
|
position="popper"
|
|
402
411
|
align="start"
|
|
@@ -427,7 +436,7 @@ const inputAttrs = computed(() => {
|
|
|
427
436
|
v-for="(c, i) in filtered"
|
|
428
437
|
:key="c.iso2"
|
|
429
438
|
:value="c.iso2"
|
|
430
|
-
:style="
|
|
439
|
+
:style="optionStagger(i)"
|
|
431
440
|
:class="[OPTION_ITEM, 'gap-2.5']"
|
|
432
441
|
@select.prevent="chooseCountry(c)"
|
|
433
442
|
>
|