@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,21 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** Glyph size in px. The button's own size comes from the caller's class. */
|
|
3
|
+
iconSize: number;
|
|
4
|
+
/** What the button says while the value is hidden, and while it is shown. */
|
|
5
|
+
showLabel: string;
|
|
6
|
+
hideLabel: string;
|
|
7
|
+
disabled?: boolean;
|
|
8
|
+
/** Id of the element whose content this reveals. */
|
|
9
|
+
controls?: string;
|
|
10
|
+
};
|
|
11
|
+
type __VLS_ModelProps = {
|
|
12
|
+
modelValue?: boolean;
|
|
13
|
+
};
|
|
14
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
15
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
16
|
+
"update:modelValue": (value: boolean) => any;
|
|
17
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
18
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
19
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
20
|
+
declare const _default: typeof __VLS_export;
|
|
21
|
+
export default _default;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
declare const _default: typeof __VLS_export;
|
|
2
|
+
export default _default;
|
|
3
|
+
declare const __VLS_export: import("vue").DefineComponent<{
|
|
4
|
+
filled: boolean;
|
|
5
|
+
orientation?: "horizontal" | "vertical";
|
|
6
|
+
/** The fill's colour class: what the travelled part says (passed, skipped, done). */
|
|
7
|
+
fill?: string;
|
|
8
|
+
flowing?: boolean;
|
|
9
|
+
}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{
|
|
10
|
+
filled: boolean;
|
|
11
|
+
orientation?: "horizontal" | "vertical";
|
|
12
|
+
/** The fill's colour class: what the travelled part says (passed, skipped, done). */
|
|
13
|
+
fill?: string;
|
|
14
|
+
flowing?: boolean;
|
|
15
|
+
}> & Readonly<{}>, {
|
|
16
|
+
fill: string;
|
|
17
|
+
orientation: "horizontal" | "vertical";
|
|
18
|
+
flowing: boolean;
|
|
19
|
+
}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const BADGE_REMOVE = "grid size-4 shrink-0 place-items-center rounded-pill text-muted outline-none transition-colors duration-fast hover:bg-ink/10 hover:text-ink focus-visible:ring-2 focus-visible:ring-ring";
|
|
@@ -218,6 +218,10 @@ elbow: number,
|
|
|
218
218
|
run: number,
|
|
219
219
|
/** Minimum vertical gap between two labels on the same side. */
|
|
220
220
|
spacing: number, height: number) => CalloutLabel[];
|
|
221
|
-
/**
|
|
221
|
+
/**
|
|
222
|
+
* Compact default tick formatting: 1.2k, 3.4M — never 1200.0000001 or 1000k.
|
|
223
|
+
* One argument on purpose: it is handed around as a formatter, and an index
|
|
224
|
+
* passed by `map` must not land in an options slot.
|
|
225
|
+
*/
|
|
222
226
|
export declare const formatTick: (v: number) => string;
|
|
223
227
|
export {};
|
package/dist/components/chart.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { compactNumber } from "./format.js";
|
|
1
2
|
const markerIndex = (at, labels, count) => {
|
|
2
3
|
if (typeof at === "number") return Number.isInteger(at) && at >= 0 && at < count ? at : -1;
|
|
3
4
|
return labels.indexOf(at);
|
|
@@ -359,27 +360,7 @@ const calloutLabels = (angles, cx, cy, radius, elbow, run, spacing, height) => {
|
|
|
359
360
|
}
|
|
360
361
|
return out;
|
|
361
362
|
};
|
|
362
|
-
const formatTick = (v) =>
|
|
363
|
-
if (!Number.isFinite(v)) return String(v);
|
|
364
|
-
const units = [
|
|
365
|
-
[1e3, "k"],
|
|
366
|
-
[1e6, "M"],
|
|
367
|
-
[1e9, "B"],
|
|
368
|
-
[1e12, "T"]
|
|
369
|
-
];
|
|
370
|
-
const abs = Math.abs(v);
|
|
371
|
-
let i = units.length - 1;
|
|
372
|
-
while (i >= 0 && abs < units[i][0]) i--;
|
|
373
|
-
if (i < 0) {
|
|
374
|
-
const plain = Number(v.toFixed(2));
|
|
375
|
-
return Math.abs(plain) >= 1e3 ? formatTick(Math.sign(v) * 1e3) : String(plain);
|
|
376
|
-
}
|
|
377
|
-
const scaled = Number((v / units[i][0]).toFixed(1));
|
|
378
|
-
if (Math.abs(scaled) >= 1e3 && i < units.length - 1) {
|
|
379
|
-
return `${Number((v / units[i + 1][0]).toFixed(1))}${units[i + 1][1]}`;
|
|
380
|
-
}
|
|
381
|
-
return `${scaled}${units[i][1]}`;
|
|
382
|
-
};
|
|
363
|
+
const formatTick = (v) => compactNumber(v);
|
|
383
364
|
export {
|
|
384
365
|
CHART_PALETTE,
|
|
385
366
|
arcPath,
|
|
@@ -65,3 +65,14 @@ export interface DayRules {
|
|
|
65
65
|
* a lie.
|
|
66
66
|
*/
|
|
67
67
|
export declare function dayAllowed(iso: string, rules?: DayRules): boolean;
|
|
68
|
+
export interface RangeRules extends DayRules {
|
|
69
|
+
/** Longest range, in days, counting both ends. */
|
|
70
|
+
maximumDays?: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* A preset's range under the same rules as one picked on the calendar: trimmed
|
|
74
|
+
* to min/max, then refused if either end is a disabled day, it is longer than
|
|
75
|
+
* maximumDays, or a day inside it is unavailable. A preset that breaks them is
|
|
76
|
+
* shown disabled instead of writing a range the calendar would never allow.
|
|
77
|
+
*/
|
|
78
|
+
export declare function allowedRange(range: DateRange, rules?: RangeRules): DateRange | undefined;
|
|
@@ -81,7 +81,19 @@ function dayAllowed(iso, rules = {}) {
|
|
|
81
81
|
if (rules.isDisabled?.(value)) return false;
|
|
82
82
|
return !rules.isDateUnavailable?.(value);
|
|
83
83
|
}
|
|
84
|
+
function allowedRange(range, rules = {}) {
|
|
85
|
+
const trimmed = clampRange(range, rules.min, rules.max);
|
|
86
|
+
if (!trimmed) return void 0;
|
|
87
|
+
const end = (iso) => !rules.isDisabled?.(iso);
|
|
88
|
+
if (!end(trimmed.start)) return void 0;
|
|
89
|
+
return reshapeRange(trimmed.start, trimmed.end, {
|
|
90
|
+
allowed: end,
|
|
91
|
+
unavailable: rules.isDateUnavailable,
|
|
92
|
+
maximumDays: rules.maximumDays
|
|
93
|
+
}) ?? void 0;
|
|
94
|
+
}
|
|
84
95
|
export {
|
|
96
|
+
allowedRange,
|
|
85
97
|
clampRange,
|
|
86
98
|
dayAllowed,
|
|
87
99
|
defaultDatePresets,
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Size of an item whose centre is `distance` px from the pointer.
|
|
3
|
+
*
|
|
4
|
+
* A raised cosine: full size right under the pointer, falling smoothly to the
|
|
5
|
+
* resting size at `radius` and flat beyond it. A linear falloff has a corner
|
|
6
|
+
* at the peak, which shows as the hovered icon "ticking" between sizes while
|
|
7
|
+
* the pointer crosses it.
|
|
8
|
+
*/
|
|
9
|
+
export declare function dockSize(base: number, max: number, distance: number, radius: number): number;
|
|
10
|
+
/**
|
|
11
|
+
* Offset of a magnetic element toward a pointer at (`dx`, `dy`) px from its
|
|
12
|
+
* centre (LpMagnetic). Zero beyond `reach`; inside it the pull is a fraction
|
|
13
|
+
* of the distance that fades out toward the edge of the field, so the element
|
|
14
|
+
* lets go gradually instead of snapping back at an invisible line.
|
|
15
|
+
*/
|
|
16
|
+
export declare function magneticOffset(dx: number, dy: number, reach: number, strength: number): {
|
|
17
|
+
x: number;
|
|
18
|
+
y: number;
|
|
19
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
function dockSize(base, max, distance, radius) {
|
|
2
|
+
const d = Math.abs(distance);
|
|
3
|
+
if (radius <= 0 || d >= radius) return base;
|
|
4
|
+
return base + (max - base) * ((Math.cos(Math.PI * d / radius) + 1) / 2);
|
|
5
|
+
}
|
|
6
|
+
function magneticOffset(dx, dy, reach, strength) {
|
|
7
|
+
const distance = Math.hypot(dx, dy);
|
|
8
|
+
if (reach <= 0 || distance >= reach) return { x: 0, y: 0 };
|
|
9
|
+
const falloff = 1 - distance / reach;
|
|
10
|
+
const pull = Math.max(0, strength) * falloff;
|
|
11
|
+
return { x: dx * pull, y: dy * pull };
|
|
12
|
+
}
|
|
13
|
+
export {
|
|
14
|
+
dockSize,
|
|
15
|
+
magneticOffset
|
|
16
|
+
};
|
|
@@ -18,9 +18,18 @@ export declare const POPOVER_PANEL: string;
|
|
|
18
18
|
* A selectable option row: layout, highlight state, and the staggered cascade.
|
|
19
19
|
* Cascades downward by default and upward when the panel is flipped above the
|
|
20
20
|
* trigger (group-data-[side=top]). Pair with an inline animationDelay for the
|
|
21
|
-
* stagger. `flex` + gap are included; add justify/extra layout if needed.
|
|
21
|
+
* stagger (optionStagger). `flex` + gap are included; add justify/extra layout if needed.
|
|
22
22
|
*/
|
|
23
23
|
export declare const OPTION_ITEM: string;
|
|
24
|
+
/**
|
|
25
|
+
* The cascade's delay for the option at `index`, as an inline style for the
|
|
26
|
+
* row: 22 ms apart, and from the 12th on every option arrives together, so a
|
|
27
|
+
* long list still lands at once. Select, Autocomplete, PhoneInput and
|
|
28
|
+
* TagsInput each had this formula written out.
|
|
29
|
+
*/
|
|
30
|
+
export declare const optionStagger: (index: number) => {
|
|
31
|
+
animationDelay: string;
|
|
32
|
+
};
|
|
24
33
|
/**
|
|
25
34
|
* Micro-animation for a close / clear "✕" icon: a quarter-turn on hover and a
|
|
26
35
|
* dip on press. Put on the <LpIcon>, with `group` on its button. Shared by
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { staggerDelay } from "./reveal.js";
|
|
1
2
|
const POPOVER_ANIM = "data-[state=open]:animate-[popover-in_140ms_var(--ease-emphasized)] data-[state=closed]:animate-[popover-out_120ms_ease] data-[side=top]:data-[state=open]:animate-[popover-in-up_140ms_var(--ease-emphasized)] data-[side=top]:data-[state=closed]:animate-[popover-out-up_120ms_ease]";
|
|
2
3
|
const TOOLTIP_ANIM = "data-[state=delayed-open]:animate-[popover-in_120ms_var(--ease-emphasized)] data-[state=closed]:animate-[popover-out_100ms_ease] data-[side=top]:data-[state=delayed-open]:animate-[popover-in-up_120ms_var(--ease-emphasized)] data-[side=top]:data-[state=closed]:animate-[popover-out-up_100ms_ease]";
|
|
3
4
|
const PANEL_SURFACE = "group rounded-control border border-line bg-surface-overlay shadow-panel backdrop-blur";
|
|
4
5
|
const POPOVER_PANEL = PANEL_SURFACE + " " + POPOVER_ANIM;
|
|
5
|
-
const OPTION_ITEM = "flex cursor-pointer items-center gap-2 rounded-inner px-2.5 py-1.5 text-sm text-ink outline-none animate-[
|
|
6
|
+
const OPTION_ITEM = "flex cursor-pointer items-center gap-2 rounded-inner px-2.5 py-1.5 text-sm text-ink outline-none animate-[rise-in_180ms_var(--ease-emphasized)_both] [--rise:-6px] group-data-[side=top]:[--rise:6px] data-[highlighted]:bg-brand-soft data-[highlighted]:text-brand";
|
|
7
|
+
const optionStagger = (index) => ({
|
|
8
|
+
animationDelay: `${staggerDelay(index, 0, 22, 12)}ms`
|
|
9
|
+
});
|
|
6
10
|
const CLOSE_ICON = "transition-transform duration-medium ease-[var(--ease-emphasized)] group-hover:rotate-90 group-active:scale-90 motion-reduce:group-hover:rotate-0";
|
|
7
11
|
export {
|
|
8
12
|
CLOSE_ICON,
|
|
@@ -10,5 +14,6 @@ export {
|
|
|
10
14
|
PANEL_SURFACE,
|
|
11
15
|
POPOVER_ANIM,
|
|
12
16
|
POPOVER_PANEL,
|
|
13
|
-
TOOLTIP_ANIM
|
|
17
|
+
TOOLTIP_ANIM,
|
|
18
|
+
optionStagger
|
|
14
19
|
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a code into the groups a person reads it in.
|
|
3
|
+
*
|
|
4
|
+
* `groups` is either one size for every group ("4" → `ABCD EFGH IJ`) or the
|
|
5
|
+
* exact sizes in order (`[3, 3]` → `123 456`), the latter for formats whose
|
|
6
|
+
* groups differ (a licence key `5-5-5-5`, a card `4-6-5`). Characters past
|
|
7
|
+
* the listed sizes form one last group rather than being dropped: a code is
|
|
8
|
+
* never shown shorter than it is. Without `groups`, short codes read best in
|
|
9
|
+
* threes (6 → 3+3, 8 → 4+4) and longer ones in fours.
|
|
10
|
+
*/
|
|
11
|
+
export declare function groupCode(code: string, groups?: number | number[]): string[];
|
|
12
|
+
/** Strips what people and copy-paste add to a code: spaces, dashes, dots. */
|
|
13
|
+
export declare function normalizeCode(code: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* A remaining time the way a countdown shows it: `0:42`, `4:05`, `1:02:03`.
|
|
16
|
+
* Rounded UP to the second, so "0:00" only ever appears once time is out.
|
|
17
|
+
*
|
|
18
|
+
* @deprecated LpCountdown's own formatting, kept for apps that imported it:
|
|
19
|
+
* use `formatTime(ceilToSecond(ms), "clock")` from the time-span helpers.
|
|
20
|
+
*/
|
|
21
|
+
export declare function formatRemaining(ms: number): string;
|
|
22
|
+
/**
|
|
23
|
+
* The longest `start…end` cut of `text` that `fits`, keeping both ends.
|
|
24
|
+
*
|
|
25
|
+
* For identifiers whose meaning sits at both ends: a path's root and file
|
|
26
|
+
* name, a hash's first and last characters people compare, a server id's
|
|
27
|
+
* prefix and number. An ellipsis at the end would throw away exactly the part
|
|
28
|
+
* that tells two of them apart.
|
|
29
|
+
*
|
|
30
|
+
* `tail` pins how many characters the end keeps (an extension, the last
|
|
31
|
+
* digits); without it both ends shrink evenly. `fits` is the measurement —
|
|
32
|
+
* the component passes a canvas measure of its own font — so the search
|
|
33
|
+
* itself stays a pure binary search over how many characters survive.
|
|
34
|
+
*/
|
|
35
|
+
export declare function middleTruncate(text: string, fits: (candidate: string) => boolean, options?: {
|
|
36
|
+
tail?: number;
|
|
37
|
+
ellipsis?: string;
|
|
38
|
+
}): string;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { formatTime, ceilToSecond } from "./timeSpan.js";
|
|
2
|
+
function groupCode(code, groups) {
|
|
3
|
+
const chars = Array.from(code);
|
|
4
|
+
if (!chars.length) return [];
|
|
5
|
+
const sizes = Array.isArray(groups) ? groups.filter((n) => n > 0) : [groups && groups > 0 ? groups : autoGroup(chars.length)];
|
|
6
|
+
const out = [];
|
|
7
|
+
let at = 0;
|
|
8
|
+
let i = 0;
|
|
9
|
+
while (at < chars.length) {
|
|
10
|
+
const size = Array.isArray(groups) ? sizes[i] ?? chars.length - at : sizes[0];
|
|
11
|
+
out.push(chars.slice(at, at + size).join(""));
|
|
12
|
+
at += size;
|
|
13
|
+
i++;
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
function autoGroup(length) {
|
|
18
|
+
if (length <= 4) return length;
|
|
19
|
+
if (length === 6 || length === 9) return 3;
|
|
20
|
+
if (length % 4 === 0) return 4;
|
|
21
|
+
if (length % 3 === 0) return 3;
|
|
22
|
+
return 4;
|
|
23
|
+
}
|
|
24
|
+
function normalizeCode(code) {
|
|
25
|
+
return code.replace(/[\s\-_.·]/g, "");
|
|
26
|
+
}
|
|
27
|
+
function formatRemaining(ms) {
|
|
28
|
+
return formatTime(ceilToSecond(ms), "clock");
|
|
29
|
+
}
|
|
30
|
+
function middleTruncate(text, fits, options = {}) {
|
|
31
|
+
const ellipsis = options.ellipsis ?? "…";
|
|
32
|
+
const chars = Array.from(text);
|
|
33
|
+
if (fits(text)) return text;
|
|
34
|
+
const cut = (keep) => {
|
|
35
|
+
const tail = options.tail !== void 0 ? Math.min(options.tail, keep) : Math.floor(keep / 2);
|
|
36
|
+
const head = keep - tail;
|
|
37
|
+
return chars.slice(0, head).join("") + ellipsis + (tail ? chars.slice(chars.length - tail).join("") : "");
|
|
38
|
+
};
|
|
39
|
+
let lo = 0;
|
|
40
|
+
let hi = chars.length - 1;
|
|
41
|
+
while (lo < hi) {
|
|
42
|
+
const mid = Math.ceil((lo + hi) / 2);
|
|
43
|
+
if (fits(cut(mid))) lo = mid;
|
|
44
|
+
else hi = mid - 1;
|
|
45
|
+
}
|
|
46
|
+
return cut(lo);
|
|
47
|
+
}
|
|
48
|
+
export {
|
|
49
|
+
formatRemaining,
|
|
50
|
+
groupCode,
|
|
51
|
+
middleTruncate,
|
|
52
|
+
normalizeCode
|
|
53
|
+
};
|
|
@@ -28,10 +28,14 @@ export interface FileNode {
|
|
|
28
28
|
export declare function fileIcon(node: FileNode, expanded?: boolean): string;
|
|
29
29
|
/** Directories first, then case-insensitive by name — the file-manager order. */
|
|
30
30
|
export declare function sortNodes(nodes: FileNode[]): FileNode[];
|
|
31
|
-
/**
|
|
32
|
-
|
|
31
|
+
/**
|
|
32
|
+
* Human-readable byte size for the size column (`formatBytes`, binary units,
|
|
33
|
+
* matching what file managers show). The decimal is kept even when it is zero
|
|
34
|
+
* ("1.0 MB") so the column holds one shape from row to row.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatSize(bytes: number, locale?: string): string;
|
|
33
37
|
/** Short local date-time for the modified column; passes strings through. */
|
|
34
|
-
export declare function formatModified(value: Date | number | string): string;
|
|
38
|
+
export declare function formatModified(value: Date | number | string, locale?: string): string;
|
|
35
39
|
/**
|
|
36
40
|
* Total size of a subtree: a directory's own `size` when the caller computed one
|
|
37
41
|
* (the common case for a server-side listing), otherwise the sum of its loaded
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { formatBytes } from "./format.js";
|
|
1
2
|
const EXT_ICONS = {
|
|
2
3
|
json: "lucide:file-json",
|
|
3
4
|
jsonc: "lucide:file-json",
|
|
@@ -69,28 +70,21 @@ function sortNodes(nodes) {
|
|
|
69
70
|
return NAME_COLLATOR.compare(a.name, b.name);
|
|
70
71
|
});
|
|
71
72
|
}
|
|
72
|
-
function formatSize(bytes) {
|
|
73
|
-
|
|
74
|
-
if (bytes < 1024) return `${bytes} B`;
|
|
75
|
-
const units = ["KB", "MB", "GB", "TB", "PB"];
|
|
76
|
-
let value = bytes / 1024;
|
|
77
|
-
let i = 0;
|
|
78
|
-
while (Math.round(value) >= 1024 && i < units.length - 1) {
|
|
79
|
-
value /= 1024;
|
|
80
|
-
i++;
|
|
81
|
-
}
|
|
82
|
-
return `${value < 10 ? value.toFixed(1) : Math.round(value)} ${units[i]}`;
|
|
73
|
+
function formatSize(bytes, locale) {
|
|
74
|
+
return formatBytes(bytes, locale, { fixed: true });
|
|
83
75
|
}
|
|
84
|
-
|
|
76
|
+
const modifiedFormats = /* @__PURE__ */ new Map();
|
|
77
|
+
function formatModified(value, locale) {
|
|
85
78
|
if (typeof value === "string") return value;
|
|
86
79
|
const date = value instanceof Date ? value : new Date(value);
|
|
87
80
|
if (Number.isNaN(date.getTime())) return "—";
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
hour: "2-digit",
|
|
92
|
-
|
|
93
|
-
}
|
|
81
|
+
const key = locale ?? "";
|
|
82
|
+
let format = modifiedFormats.get(key);
|
|
83
|
+
if (!format) {
|
|
84
|
+
format = new Intl.DateTimeFormat(locale, { day: "2-digit", month: "short", hour: "2-digit", minute: "2-digit" });
|
|
85
|
+
modifiedFormats.set(key, format);
|
|
86
|
+
}
|
|
87
|
+
return format.format(date);
|
|
94
88
|
}
|
|
95
89
|
function subtreeSize(node) {
|
|
96
90
|
if (node.kind === "file") return node.size;
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
export interface FormatBytesOptions {
|
|
2
|
+
/**
|
|
3
|
+
* Keep the decimal place a value under 10 gets even when it is zero
|
|
4
|
+
* ("1.0 MB" rather than "1 MB"), so a column of sizes keeps one shape.
|
|
5
|
+
*/
|
|
6
|
+
fixed?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* A byte count in the largest unit that keeps it readable: 1 536 → "1.5 kB".
|
|
10
|
+
* Binary steps, the way file managers and storage limits show sizes. Unit
|
|
11
|
+
* names come from Intl, so a Russian app reads "1,5 МБ" without a table of
|
|
12
|
+
* its own. One decimal under 10 (2.4 MB), none above (240 MB). Negative or
|
|
13
|
+
* non-finite input is "—": there is no size to show.
|
|
14
|
+
*/
|
|
15
|
+
export declare function formatBytes(bytes: number, locale?: string, options?: FormatBytesOptions): string;
|
|
16
|
+
export interface CompactNumberOptions {
|
|
17
|
+
/**
|
|
18
|
+
* Writes the decimal separator the locale's way ("1,2k" in Russian). The
|
|
19
|
+
* k/M/B/T suffixes stay: Intl's own compact notation changes the shape of
|
|
20
|
+
* the figure per locale ("1,2 тыс."), which a tick label or a rolling
|
|
21
|
+
* counter cannot absorb. Unset keeps a plain "." whatever the browser says.
|
|
22
|
+
*/
|
|
23
|
+
locale?: string;
|
|
24
|
+
/** Places for a figure below a thousand (12.25). Default 2. */
|
|
25
|
+
plainDecimals?: number;
|
|
26
|
+
/** Places once a unit is in play (1.2k). Default 1. */
|
|
27
|
+
decimals?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Keep trailing zeros ("5.0M", "1.0k") so the figure's shape only changes
|
|
30
|
+
* at a rollover. Off, they are dropped ("5M"), the way a label is written.
|
|
31
|
+
*/
|
|
32
|
+
fixed?: boolean;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* A figure shortened with k/M/B/T: 1 200 → "1.2k", 3 400 000 → "3.4M".
|
|
36
|
+
*
|
|
37
|
+
* The unit is picked by what will PRINT, not by the raw size: 999 950 at one
|
|
38
|
+
* place rounds to "1000k", which reads as the next unit up, so it becomes
|
|
39
|
+
* "1M"; 999.999 with two places would be "1000", so it becomes "1k".
|
|
40
|
+
*/
|
|
41
|
+
export declare function compactNumber(value: number, options?: CompactNumberOptions): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
const numberFormats = /* @__PURE__ */ new Map();
|
|
2
|
+
function numberFormat(locale, options) {
|
|
3
|
+
const key = `${locale ?? ""}|${JSON.stringify(options)}`;
|
|
4
|
+
let format = numberFormats.get(key);
|
|
5
|
+
if (!format) {
|
|
6
|
+
format = new Intl.NumberFormat(locale, options);
|
|
7
|
+
numberFormats.set(key, format);
|
|
8
|
+
}
|
|
9
|
+
return format;
|
|
10
|
+
}
|
|
11
|
+
const BYTE_UNITS = ["byte", "kilobyte", "megabyte", "gigabyte", "terabyte", "petabyte"];
|
|
12
|
+
function formatBytes(bytes, locale, options = {}) {
|
|
13
|
+
if (!Number.isFinite(bytes) || bytes < 0) return "—";
|
|
14
|
+
let scaled = bytes;
|
|
15
|
+
let step = 0;
|
|
16
|
+
while (Math.round(scaled) >= 1024 && step < BYTE_UNITS.length - 1) {
|
|
17
|
+
scaled /= 1024;
|
|
18
|
+
step += 1;
|
|
19
|
+
}
|
|
20
|
+
const places = step > 0 && Number(scaled.toFixed(1)) < 10 ? 1 : 0;
|
|
21
|
+
const parts = numberFormat(locale, {
|
|
22
|
+
style: "unit",
|
|
23
|
+
unit: BYTE_UNITS[step],
|
|
24
|
+
unitDisplay: "narrow",
|
|
25
|
+
// A figure here never passes 1023 below petabytes, and "1,023 kB" reads as
|
|
26
|
+
// a decimal in half the world.
|
|
27
|
+
useGrouping: false,
|
|
28
|
+
minimumFractionDigits: options.fixed ? places : 0,
|
|
29
|
+
maximumFractionDigits: places
|
|
30
|
+
}).formatToParts(scaled);
|
|
31
|
+
const unit = parts.filter((p) => p.type === "unit").map((p) => p.value).join("");
|
|
32
|
+
const figure = parts.filter((p) => p.type !== "unit" && p.type !== "literal").map((p) => p.value).join("");
|
|
33
|
+
return unit ? `${figure} ${unit}` : figure;
|
|
34
|
+
}
|
|
35
|
+
const COMPACT_UNITS = [
|
|
36
|
+
[1, ""],
|
|
37
|
+
[1e3, "k"],
|
|
38
|
+
[1e6, "M"],
|
|
39
|
+
[1e9, "B"],
|
|
40
|
+
[1e12, "T"]
|
|
41
|
+
];
|
|
42
|
+
function compactNumber(value, options = {}) {
|
|
43
|
+
if (!Number.isFinite(value)) return String(value);
|
|
44
|
+
const { locale, plainDecimals = 2, decimals = 1, fixed = false } = options;
|
|
45
|
+
const abs = Math.abs(value);
|
|
46
|
+
let i = COMPACT_UNITS.length - 1;
|
|
47
|
+
while (i > 0 && abs < COMPACT_UNITS[i][0]) i--;
|
|
48
|
+
const placesAt = (at) => at === 0 ? plainDecimals : decimals;
|
|
49
|
+
const roundAt = (at) => Number((value / COMPACT_UNITS[at][0]).toFixed(placesAt(at)));
|
|
50
|
+
let scaled = roundAt(i);
|
|
51
|
+
if (Math.abs(scaled) >= 1e3 && i < COMPACT_UNITS.length - 1) {
|
|
52
|
+
i++;
|
|
53
|
+
scaled = roundAt(i);
|
|
54
|
+
}
|
|
55
|
+
const places = placesAt(i);
|
|
56
|
+
if (scaled === 0) scaled = 0;
|
|
57
|
+
const number = locale === void 0 ? fixed ? scaled.toFixed(places) : String(scaled) : numberFormat(locale, {
|
|
58
|
+
minimumFractionDigits: fixed ? places : 0,
|
|
59
|
+
maximumFractionDigits: places,
|
|
60
|
+
useGrouping: false
|
|
61
|
+
}).format(scaled);
|
|
62
|
+
return `${number}${COMPACT_UNITS[i][1]}`;
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
compactNumber,
|
|
66
|
+
formatBytes
|
|
67
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface IdenticonOptions {
|
|
2
|
+
/** Cells per side. 5 is the familiar look; more cells, busier shapes. */
|
|
3
|
+
grid?: number;
|
|
4
|
+
/** Saturation range, percent. Kept in the middle so the colour holds on any theme. */
|
|
5
|
+
saturation?: readonly [number, number];
|
|
6
|
+
/** Lightness range, percent: dark enough for a light theme, light enough for a dark one. */
|
|
7
|
+
lightness?: readonly [number, number];
|
|
8
|
+
}
|
|
9
|
+
export interface Identicon {
|
|
10
|
+
/** Rows of cells, `true` filled. Mirrored left to right. */
|
|
11
|
+
cells: boolean[][];
|
|
12
|
+
/** The hue the seed picked, 0–360. */
|
|
13
|
+
hue: number;
|
|
14
|
+
/** The shape's colour as a CSS `hsl()`. */
|
|
15
|
+
color: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function hashString(seed: string): number;
|
|
18
|
+
/** The grid and colour for a seed. */
|
|
19
|
+
export declare function identicon(seed: string, options?: IdenticonOptions): Identicon;
|
|
20
|
+
/** The filled cells as rectangles, merged along each row: fewer nodes than one per cell. */
|
|
21
|
+
export declare function identiconRects(cells: boolean[][]): {
|
|
22
|
+
x: number;
|
|
23
|
+
y: number;
|
|
24
|
+
w: number;
|
|
25
|
+
}[];
|
|
26
|
+
export interface IdenticonSvgOptions extends IdenticonOptions {
|
|
27
|
+
/** Pixel size of the square image. */
|
|
28
|
+
size?: number;
|
|
29
|
+
/** Fill behind the pattern, any CSS colour; transparent when unset. */
|
|
30
|
+
background?: string;
|
|
31
|
+
/** Empty margin around the grid, as a share of the side. */
|
|
32
|
+
padding?: number;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* The identicon as standalone SVG markup, for places a component cannot go:
|
|
36
|
+
* a favicon, a canvas, a notification icon (`data:image/svg+xml,…`).
|
|
37
|
+
*/
|
|
38
|
+
export declare function identiconSvg(seed: string, options?: IdenticonSvgOptions): string;
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
function hashString(seed) {
|
|
2
|
+
let h = 2166136261;
|
|
3
|
+
for (let i = 0; i < seed.length; i++) {
|
|
4
|
+
h ^= seed.charCodeAt(i);
|
|
5
|
+
h = Math.imul(h, 16777619);
|
|
6
|
+
}
|
|
7
|
+
return h >>> 0;
|
|
8
|
+
}
|
|
9
|
+
function generator(seed) {
|
|
10
|
+
let a = seed;
|
|
11
|
+
return () => {
|
|
12
|
+
a = a + 1831565813 | 0;
|
|
13
|
+
let t = Math.imul(a ^ a >>> 15, 1 | a);
|
|
14
|
+
t = t + Math.imul(t ^ t >>> 7, 61 | t) ^ t;
|
|
15
|
+
return ((t ^ t >>> 14) >>> 0) / 4294967296;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function identicon(seed, options = {}) {
|
|
19
|
+
const size = Math.max(3, Math.min(12, Math.round(options.grid ?? 5)));
|
|
20
|
+
const [sMin, sMax] = options.saturation ?? [55, 72];
|
|
21
|
+
const [lMin, lMax] = options.lightness ?? [48, 60];
|
|
22
|
+
const next = generator(hashString(seed));
|
|
23
|
+
const hue = Math.floor(next() * 360);
|
|
24
|
+
const saturation = Math.round(sMin + next() * (sMax - sMin));
|
|
25
|
+
const lightness = Math.round(lMin + next() * (lMax - lMin));
|
|
26
|
+
const half = Math.ceil(size / 2);
|
|
27
|
+
const cells = [];
|
|
28
|
+
let filled = 0;
|
|
29
|
+
for (let y = 0; y < size; y++) {
|
|
30
|
+
const row = new Array(size).fill(false);
|
|
31
|
+
for (let x = 0; x < half; x++) {
|
|
32
|
+
const on = next() < 0.5;
|
|
33
|
+
row[x] = on;
|
|
34
|
+
row[size - 1 - x] = on;
|
|
35
|
+
if (on) filled++;
|
|
36
|
+
}
|
|
37
|
+
cells.push(row);
|
|
38
|
+
}
|
|
39
|
+
const total = half * size;
|
|
40
|
+
const low = Math.ceil(total / 3);
|
|
41
|
+
const high = Math.floor(total * 2 / 3);
|
|
42
|
+
while (filled < low || filled > high) {
|
|
43
|
+
const y = Math.floor(next() * size);
|
|
44
|
+
const x = Math.floor(next() * half);
|
|
45
|
+
const on = cells[y][x];
|
|
46
|
+
if (filled < low && on || filled > high && !on) continue;
|
|
47
|
+
cells[y][x] = !on;
|
|
48
|
+
cells[y][size - 1 - x] = !on;
|
|
49
|
+
filled += on ? -1 : 1;
|
|
50
|
+
}
|
|
51
|
+
return { cells, hue, color: `hsl(${hue} ${saturation}% ${lightness}%)` };
|
|
52
|
+
}
|
|
53
|
+
function identiconRects(cells) {
|
|
54
|
+
const rects = [];
|
|
55
|
+
cells.forEach((row, y) => {
|
|
56
|
+
let x = 0;
|
|
57
|
+
while (x < row.length) {
|
|
58
|
+
if (!row[x]) {
|
|
59
|
+
x++;
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
let w = 1;
|
|
63
|
+
while (x + w < row.length && row[x + w]) w++;
|
|
64
|
+
rects.push({ x, y, w });
|
|
65
|
+
x += w;
|
|
66
|
+
}
|
|
67
|
+
});
|
|
68
|
+
return rects;
|
|
69
|
+
}
|
|
70
|
+
function identiconSvg(seed, options = {}) {
|
|
71
|
+
const { cells, color } = identicon(seed, options);
|
|
72
|
+
const n = cells.length;
|
|
73
|
+
const pad = n * Math.max(0, Math.min(0.4, options.padding ?? 0.12));
|
|
74
|
+
const view = n + pad * 2;
|
|
75
|
+
const px = options.size ?? 64;
|
|
76
|
+
const bg = options.background ? `<rect width="${view}" height="${view}" fill="${options.background}"/>` : "";
|
|
77
|
+
const shapes = identiconRects(cells).map((r) => `<rect x="${r.x + pad}" y="${r.y + pad}" width="${r.w}" height="1"/>`).join("");
|
|
78
|
+
return `<svg xmlns="http://www.w3.org/2000/svg" width="${px}" height="${px}" viewBox="0 0 ${view} ${view}" shape-rendering="crispEdges">${bg}<g fill="${color}">${shapes}</g></svg>`;
|
|
79
|
+
}
|
|
80
|
+
export {
|
|
81
|
+
hashString,
|
|
82
|
+
identicon,
|
|
83
|
+
identiconRects,
|
|
84
|
+
identiconSvg
|
|
85
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
export interface MasonryColumns {
|
|
2
|
+
/**
|
|
3
|
+
* Fixed count, or a table of minimum container widths to counts
|
|
4
|
+
* (`{ 0: 1, 480: 2, 900: 3 }`). Omit to derive the count from `minColumnWidth`.
|
|
5
|
+
*/
|
|
6
|
+
columns?: number | Record<number, number>;
|
|
7
|
+
/** Narrowest a column may get when the count is derived. */
|
|
8
|
+
minColumnWidth: number;
|
|
9
|
+
/** Upper bound for a derived count, so a wide screen does not shred cards into slivers. */
|
|
10
|
+
maxColumns?: number;
|
|
11
|
+
gap: number;
|
|
12
|
+
}
|
|
13
|
+
/** How many columns fit a container `width` px wide. Always at least one. */
|
|
14
|
+
export declare function masonryColumnCount(width: number, options: MasonryColumns): number;
|
|
15
|
+
export interface MasonryPlacement {
|
|
16
|
+
/** Left edge of each item, in px, in input order. */
|
|
17
|
+
x: number[];
|
|
18
|
+
/** Top edge of each item, in px, in input order. */
|
|
19
|
+
y: number[];
|
|
20
|
+
/** Column each item went to. */
|
|
21
|
+
column: number[];
|
|
22
|
+
/** Width every item is laid out at. */
|
|
23
|
+
columnWidth: number;
|
|
24
|
+
/** Height of the tallest column: the container's height. */
|
|
25
|
+
height: number;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Places items in order, each into the column that is currently shortest
|
|
29
|
+
* (leftmost on a tie). In order, so the first items stay at the top and an
|
|
30
|
+
* item added at the end never reshuffles the ones before it.
|
|
31
|
+
*/
|
|
32
|
+
export declare function placeMasonry(heights: number[], count: number, width: number, gap: number): MasonryPlacement;
|