@leavepulse/ui 0.68.0 → 0.70.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
- package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
- package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
- package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
- package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
- package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
- package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
- package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
- package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
- package/dist/assets/LpStatus-430OGTZY.css +17 -0
- package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
- package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
- package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
- package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
- package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
- package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
- package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-B5uE8Znw.js} +1 -1
- package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
- package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
- package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
- package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
- package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
- package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
- package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
- package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
- package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-CNnLTDZg.js} +7 -7
- package/dist/chunks/LpAlert-C5igj802.js +119 -0
- package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-CEUAB8kK.js} +15 -16
- package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
- package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
- package/dist/chunks/LpBadge-HOEPBYmi.js +126 -0
- package/dist/chunks/LpBreadcrumbs-DYoPc3P4.js +144 -0
- package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
- package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
- package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
- package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
- package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
- package/dist/chunks/LpCodeDisplay-CIKKT2iW.js +189 -0
- package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
- package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-DFugXNUi.js} +10 -5
- package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
- package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
- package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-COwOwRgI.js} +13 -5
- package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
- package/dist/chunks/LpCountdown-Dtq1ihlJ.js +231 -0
- package/dist/chunks/LpDataList-B-5nHfNw.js +120 -0
- package/dist/chunks/LpDatePicker-BUe1VUC0.js +168 -0
- package/dist/chunks/LpDateRangePicker-C_k65vGR.js +126 -0
- package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
- package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
- package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-CRgrhdAH.js} +10 -5
- package/dist/chunks/LpEditable-DTqLt2lT.js +236 -0
- package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
- package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
- package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DMISXVHC.js} +5 -3
- package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-CPXB_Yy3.js} +42 -55
- package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
- package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
- package/dist/chunks/LpGauge-Bk8TwJj0.js +204 -0
- package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
- package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
- package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-p4hqzdyA.js} +27 -14
- package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-CCrhRfy9.js} +3 -3
- package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
- package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
- package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
- package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-CUC3t4na.js} +39 -25
- package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
- package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
- package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
- package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-elZHbj85.js} +225 -129
- package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
- package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
- package/dist/chunks/LpMasonry--k0571qG.js +185 -0
- package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-D5swlmZ_.js} +3 -3
- package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
- package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-D4Z0wVHR.js} +4 -4
- package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-DPZmP5dM.js} +32 -48
- package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
- package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
- package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
- package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
- package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
- package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-DTV18FIh.js} +20 -20
- package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
- package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-CFuV7pZv.js} +158 -47
- package/dist/chunks/LpPipeline-D81yh_NX.js +329 -0
- package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-BEIcqb9p.js} +8 -3
- package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
- package/dist/chunks/LpQuota-2Sw_gqcJ.js +162 -0
- package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
- package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
- package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
- package/dist/chunks/LpRelativeTime-CKzVqAo9.js +73 -0
- package/dist/chunks/LpRepeater-D0VjmD6y.js +140 -0
- package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
- package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
- package/dist/chunks/LpSecretField-DMfdJ1cQ.js +307 -0
- package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
- package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
- package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-B4f_yRi5.js} +93 -108
- package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
- package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
- package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-D-M0Y_7U.js} +5 -3
- package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DF-TYxOV.js} +3 -3
- package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
- package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
- package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
- package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-B2ix1Q7t.js} +38 -35
- package/dist/chunks/LpStatus-C7kx5PKE.js +86 -0
- package/dist/chunks/LpStepMark-DK-5BKAt.js +101 -0
- package/dist/chunks/LpStepper-DRFfdJaq.js +76 -0
- package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
- package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
- package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
- package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
- package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DgpBFRV2.js} +68 -71
- package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
- package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
- package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
- package/dist/chunks/LpThemeStudio-DguwHdGt.js +416 -0
- package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
- package/dist/chunks/LpThemeSwitcher-D5uz0MhK.js +278 -0
- package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
- package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
- package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
- package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-ZhKthfgz.js} +1 -1
- package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-NfRJNEIP.js} +24 -18
- package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
- package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
- package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-DWegV2p6.js} +9 -8
- package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
- package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
- package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
- package/dist/chunks/PickerField-CHRS1h7K.js +116 -0
- package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
- package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
- package/dist/chunks/TourCard-BXuVHsfn.js +123 -0
- package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
- package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
- package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
- package/dist/component-names.d.ts +1 -1
- package/dist/components/AttentionDot.vue.d.ts +9 -0
- package/dist/components/AttentionDot.vue.js +4 -0
- package/dist/components/ContextMenuItems.vue.js +1 -1
- package/dist/components/DropzoneLinkField.vue.js +1 -1
- package/dist/components/FieldWrapper.vue.d.ts +25 -0
- package/dist/components/FieldWrapper.vue.js +4 -0
- package/dist/components/LayoutCanvas.vue.js +1 -1
- package/dist/components/LayoutNode.vue.d.ts +4 -4
- package/dist/components/LayoutNode.vue.js +1 -1
- package/dist/components/LegendSwatch.vue.d.ts +6 -0
- package/dist/components/LegendSwatch.vue.js +4 -0
- package/dist/components/LoaderMark.vue.d.ts +12 -0
- package/dist/components/LoaderMark.vue.js +4 -0
- package/dist/components/LpActionBar.vue.js +1 -1
- package/dist/components/LpActivityLine.vue.d.ts +58 -0
- package/dist/components/LpActivityLine.vue.js +4 -0
- package/dist/components/LpAddressInput.vue.js +1 -1
- package/dist/components/LpAlert.vue.d.ts +2 -2
- package/dist/components/LpAlert.vue.js +1 -1
- package/dist/components/LpAppShell.vue.d.ts +8 -7
- package/dist/components/LpAppShell.vue.js +1 -1
- package/dist/components/LpAutocomplete.vue.js +1 -1
- package/dist/components/LpAvatar.vue.d.ts +16 -0
- package/dist/components/LpAvatar.vue.js +1 -1
- package/dist/components/LpBadge.vue.d.ts +19 -5
- package/dist/components/LpBadge.vue.js +1 -1
- package/dist/components/LpBreadcrumbs.vue.js +1 -1
- package/dist/components/LpButton.vue.d.ts +2 -2
- package/dist/components/LpButton.vue.js +1 -1
- package/dist/components/LpCalendar.vue.js +1 -1
- package/dist/components/LpCard.vue.d.ts +24 -0
- package/dist/components/LpCard.vue.js +1 -1
- package/dist/components/LpChart.vue.d.ts +10 -0
- package/dist/components/LpChart.vue.js +122 -142
- package/dist/components/LpCheckbox.vue.d.ts +2 -2
- package/dist/components/LpCheckbox.vue.js +1 -1
- package/dist/components/LpCodeBlock.vue.js +1 -1
- package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
- package/dist/components/LpCodeDisplay.vue.js +4 -0
- package/dist/components/LpCollapse.vue.d.ts +58 -0
- package/dist/components/LpCollapse.vue.js +4 -0
- package/dist/components/LpColorPicker.vue.d.ts +2 -2
- package/dist/components/LpColorPicker.vue.js +1 -1
- package/dist/components/LpCommandPalette.vue.js +34 -23
- package/dist/components/LpConfirmDialog.vue.js +1 -1
- package/dist/components/LpConfirmHost.vue.js +1 -1
- package/dist/components/LpContextMenu.vue.js +1 -1
- package/dist/components/LpCopyButton.vue.d.ts +82 -0
- package/dist/components/LpCopyButton.vue.js +4 -0
- package/dist/components/LpCountdown.vue.d.ts +100 -0
- package/dist/components/LpCountdown.vue.js +4 -0
- package/dist/components/LpDataList.vue.d.ts +66 -0
- package/dist/components/LpDataList.vue.js +4 -0
- package/dist/components/LpDatePicker.vue.d.ts +1 -1
- package/dist/components/LpDatePicker.vue.js +1 -1
- package/dist/components/LpDateRangePicker.vue.d.ts +1 -1
- package/dist/components/LpDateRangePicker.vue.js +1 -1
- package/dist/components/LpDisclosure.vue.js +1 -1
- package/dist/components/LpDock.vue.d.ts +74 -0
- package/dist/components/LpDock.vue.js +204 -0
- package/dist/components/LpDrawer.vue.js +1 -1
- package/dist/components/LpDropdownMenu.vue.js +1 -1
- package/dist/components/LpDropzone.vue.d.ts +8 -1
- package/dist/components/LpDropzone.vue.js +36 -15
- package/dist/components/LpEditable.vue.d.ts +85 -0
- package/dist/components/LpEditable.vue.js +4 -0
- package/dist/components/LpEmptyState.vue.js +1 -1
- package/dist/components/LpFieldNotice.vue.js +1 -1
- package/dist/components/LpFileTree.vue.js +1 -1
- package/dist/components/LpFileTreeNode.vue.js +1 -1
- package/dist/components/LpFormField.vue.js +1 -1
- package/dist/components/LpFrame.vue.d.ts +22 -0
- package/dist/components/LpFrame.vue.js +4 -0
- package/dist/components/LpGauge.vue.d.ts +116 -0
- package/dist/components/LpGauge.vue.js +4 -0
- package/dist/components/LpGlowBorder.vue.d.ts +47 -0
- package/dist/components/LpGlowBorder.vue.js +4 -0
- package/dist/components/LpHintExample.vue.d.ts +2 -2
- package/dist/components/LpHintExample.vue.js +1 -1
- package/dist/components/LpHintLayer.vue.js +1 -1
- package/dist/components/LpHints.vue.js +1 -1
- package/dist/components/LpHoverCard.vue.d.ts +60 -0
- package/dist/components/LpHoverCard.vue.js +4 -0
- package/dist/components/LpIcon.vue.js +1 -1
- package/dist/components/LpIdenticon.vue.d.ts +37 -0
- package/dist/components/LpIdenticon.vue.js +4 -0
- package/dist/components/LpImageEditor.vue.js +13 -19
- package/dist/components/LpInfraNode.vue.js +1 -1
- package/dist/components/LpInput.vue.d.ts +10 -0
- package/dist/components/LpInput.vue.js +1 -1
- package/dist/components/LpLightbox.vue.js +1 -1
- package/dist/components/LpLoader.vue.d.ts +106 -0
- package/dist/components/LpLoader.vue.js +4 -0
- package/dist/components/LpLogViewer.vue.js +1 -1
- package/dist/components/LpMagnetic.vue.d.ts +28 -0
- package/dist/components/LpMagnetic.vue.js +4 -0
- package/dist/components/LpMapPicker.vue.js +1 -1
- package/dist/components/LpMasonry.vue.d.ts +42 -0
- package/dist/components/LpMasonry.vue.js +4 -0
- package/dist/components/LpMediaGallery.vue.js +1 -1
- package/dist/components/LpModal.vue.js +1 -1
- package/dist/components/LpModalNav.vue.js +1 -1
- package/dist/components/LpNotificationBell.vue.d.ts +15 -6
- package/dist/components/LpNotificationBell.vue.js +1 -1
- package/dist/components/LpNumberField.vue.d.ts +57 -0
- package/dist/components/LpNumberField.vue.js +1 -1
- package/dist/components/LpNumberFlow.vue.js +1 -1
- package/dist/components/LpOtpInput.vue.d.ts +12 -4
- package/dist/components/LpOtpInput.vue.js +1 -1
- package/dist/components/LpPagination.vue.js +1 -1
- package/dist/components/LpPaletteFacts.vue.js +1 -1
- package/dist/components/LpPaletteHeader.vue.js +2 -2
- package/dist/components/LpPalettePreview.vue.js +1 -1
- package/dist/components/LpPaletteStats.vue.js +1 -1
- package/dist/components/LpPasswordInput.vue.d.ts +12 -1
- package/dist/components/LpPasswordInput.vue.js +1 -1
- package/dist/components/LpPhoneInput.vue.js +1 -1
- package/dist/components/LpPie.vue.d.ts +3 -1
- package/dist/components/LpPie.vue.js +1 -1
- package/dist/components/LpPipeline.vue.d.ts +91 -0
- package/dist/components/LpPipeline.vue.js +4 -0
- package/dist/components/LpPopover.vue.d.ts +2 -2
- package/dist/components/LpPopover.vue.js +1 -1
- package/dist/components/LpProgress.vue.d.ts +11 -4
- package/dist/components/LpProgress.vue.js +1 -1
- package/dist/components/LpQuota.vue.d.ts +68 -0
- package/dist/components/LpQuota.vue.js +4 -0
- package/dist/components/LpRadioGroup.vue.js +1 -1
- package/dist/components/LpRangeCalendar.vue.js +1 -1
- package/dist/components/LpRangeSlider.vue.js +1 -1
- package/dist/components/LpRelativeTime.vue.d.ts +41 -0
- package/dist/components/LpRelativeTime.vue.js +4 -0
- package/dist/components/LpRepeater.vue.d.ts +48 -0
- package/dist/components/LpRepeater.vue.js +4 -0
- package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
- package/dist/components/LpRevealOnScroll.vue.js +4 -0
- package/dist/components/LpRollingText.vue.d.ts +1 -1
- package/dist/components/LpScramble.vue.d.ts +55 -0
- package/dist/components/LpScramble.vue.js +4 -0
- package/dist/components/LpScrollArea.vue.d.ts +1 -1
- package/dist/components/LpSecretField.vue.d.ts +108 -0
- package/dist/components/LpSecretField.vue.js +4 -0
- package/dist/components/LpSection.vue.js +1 -1
- package/dist/components/LpSegmented.vue.js +1 -1
- package/dist/components/LpSelect.vue.d.ts +2 -0
- package/dist/components/LpSelect.vue.js +1 -1
- package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
- package/dist/components/LpShaderBackdrop.vue.js +4 -0
- package/dist/components/LpShinyText.vue.d.ts +39 -0
- package/dist/components/LpShinyText.vue.js +4 -0
- package/dist/components/LpShortcutsDialog.vue.js +1 -1
- package/dist/components/LpSidebar.vue.js +1 -1
- package/dist/components/LpSidebarNav.vue.js +1 -1
- package/dist/components/LpSlider.vue.js +1 -1
- package/dist/components/LpSparkline.vue.d.ts +4 -3
- package/dist/components/LpSparkline.vue.js +1 -1
- package/dist/components/LpSpotlight.vue.d.ts +37 -0
- package/dist/components/LpSpotlight.vue.js +4 -0
- package/dist/components/LpStat.vue.js +1 -1
- package/dist/components/LpStatus.vue.d.ts +65 -0
- package/dist/components/LpStatus.vue.js +4 -0
- package/dist/components/LpStepMark.vue.d.ts +31 -0
- package/dist/components/LpStepMark.vue.js +4 -0
- package/dist/components/LpStepper.vue.js +1 -1
- package/dist/components/LpSwap.vue.js +1 -1
- package/dist/components/LpSwitch.vue.d.ts +2 -2
- package/dist/components/LpSwitch.vue.js +1 -1
- package/dist/components/LpTable.vue.js +104 -120
- package/dist/components/LpTableFilter.vue.js +1 -1
- package/dist/components/LpTableOfContents.vue.d.ts +6 -1
- package/dist/components/LpTableOfContents.vue.js +1 -1
- package/dist/components/LpTabs.vue.d.ts +5 -5
- package/dist/components/LpTabs.vue.js +25 -33
- package/dist/components/LpTagsInput.vue.js +1 -1
- package/dist/components/LpTextReveal.vue.d.ts +58 -0
- package/dist/components/LpTextReveal.vue.js +4 -0
- package/dist/components/LpTextarea.vue.js +1 -1
- package/dist/components/LpThemeProvider.vue.js +1 -1
- package/dist/components/LpThemeStudio.vue.d.ts +54 -0
- package/dist/components/LpThemeStudio.vue.js +4 -0
- package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
- package/dist/components/LpThemeStudioSection.vue.js +4 -0
- package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
- package/dist/components/LpThemeSwitcher.vue.js +1 -1
- package/dist/components/LpTimeField.vue.d.ts +2 -0
- package/dist/components/LpTimeField.vue.js +1 -1
- package/dist/components/LpToaster.vue.js +1 -1
- package/dist/components/LpTooltip.vue.d.ts +2 -2
- package/dist/components/LpTooltip.vue.js +1 -1
- package/dist/components/LpTopologyCanvas.vue.js +1 -1
- package/dist/components/LpTour.vue.js +1 -1
- package/dist/components/LpTruncate.vue.d.ts +34 -0
- package/dist/components/LpTruncate.vue.js +4 -0
- package/dist/components/LpTypewriter.vue.d.ts +61 -0
- package/dist/components/LpTypewriter.vue.js +4 -0
- package/dist/components/LpUptimeBar.vue.js +1 -1
- package/dist/components/LpVideoBackdrop.vue.js +1 -1
- package/dist/components/MenuTitle.vue.js +1 -1
- package/dist/components/OptionContent.vue.d.ts +7 -0
- package/dist/components/OptionContent.vue.js +4 -0
- package/dist/components/PickerField.vue.d.ts +43 -0
- package/dist/components/PickerField.vue.js +4 -0
- package/dist/components/RevealToggle.vue.d.ts +21 -0
- package/dist/components/RevealToggle.vue.js +4 -0
- package/dist/components/StepConnector.vue.d.ts +19 -0
- package/dist/components/StepConnector.vue.js +4 -0
- package/dist/components/TourCard.vue.js +1 -1
- package/dist/components/badge.d.ts +1 -0
- package/dist/components/badge.js +4 -0
- package/dist/components/chart.d.ts +5 -1
- package/dist/components/chart.js +2 -21
- package/dist/components/dateRange.d.ts +11 -0
- package/dist/components/dateRange.js +12 -0
- package/dist/components/dock.d.ts +19 -0
- package/dist/components/dock.js +16 -0
- package/dist/components/dropdown.d.ts +10 -1
- package/dist/components/dropdown.js +7 -2
- package/dist/components/fieldText.d.ts +38 -0
- package/dist/components/fieldText.js +53 -0
- package/dist/components/fileTree.d.ts +7 -3
- package/dist/components/fileTree.js +12 -18
- package/dist/components/format.d.ts +41 -0
- package/dist/components/format.js +67 -0
- package/dist/components/identicon.d.ts +38 -0
- package/dist/components/identicon.js +85 -0
- package/dist/components/masonry.d.ts +32 -0
- package/dist/components/masonry.js +40 -0
- package/dist/components/menuWhen.js +1 -1
- package/dist/components/meter.d.ts +64 -0
- package/dist/components/meter.js +53 -0
- package/dist/components/otp.d.ts +1 -1
- package/dist/components/otp.js +7 -2
- package/dist/components/pipeline.d.ts +55 -0
- package/dist/components/pipeline.js +51 -0
- package/dist/components/quota.d.ts +57 -0
- package/dist/components/quota.js +40 -0
- package/dist/components/relativeTime.d.ts +24 -0
- package/dist/components/relativeTime.js +56 -0
- package/dist/components/reveal.d.ts +18 -0
- package/dist/components/reveal.js +32 -0
- package/dist/components/scramble.d.ts +68 -0
- package/dist/components/scramble.js +58 -0
- package/dist/components/shaderBackdrop.d.ts +20 -0
- package/dist/components/shaderBackdrop.js +156 -0
- package/dist/components/slider.d.ts +5 -0
- package/dist/components/slider.js +24 -0
- package/dist/components/slotText.d.ts +2 -0
- package/dist/components/slotText.js +9 -0
- package/dist/components/status.d.ts +14 -0
- package/dist/components/status.js +22 -0
- package/dist/components/tableFacets.d.ts +8 -0
- package/dist/components/tableFacets.js +19 -0
- package/dist/components/textSplit.d.ts +17 -0
- package/dist/components/textSplit.js +24 -0
- package/dist/components/timeSpan.d.ts +78 -0
- package/dist/components/timeSpan.js +85 -0
- package/dist/components/tone.d.ts +43 -0
- package/dist/components/tone.js +82 -0
- package/dist/components/tour.js +3 -2
- package/dist/components/typewriter.d.ts +36 -0
- package/dist/components/typewriter.js +53 -0
- package/dist/components/videoBackdrop.js +5 -6
- package/dist/composables/easing.d.ts +22 -1
- package/dist/composables/easing.js +42 -1
- package/dist/composables/pseudoLocale.d.ts +15 -0
- package/dist/composables/pseudoLocale.js +96 -0
- package/dist/composables/scroll.js +5 -3
- package/dist/composables/useClipboard.d.ts +4 -1
- package/dist/composables/useClipboard.js +12 -2
- package/dist/composables/useField.d.ts +8 -0
- package/dist/composables/useField.js +5 -0
- package/dist/composables/useForm.js +19 -5
- package/dist/composables/useHintSystem.d.ts +4 -0
- package/dist/composables/useHintSystem.js +33 -1
- package/dist/composables/useHints.js +9 -3
- package/dist/composables/useInView.d.ts +11 -0
- package/dist/composables/useInView.js +39 -0
- package/dist/composables/useLoadingGate.d.ts +8 -0
- package/dist/composables/useLoadingGate.js +38 -0
- package/dist/composables/useLpConfig.d.ts +10 -0
- package/dist/composables/useLpConfig.js +11 -1
- package/dist/composables/useMediaQuery.js +3 -1
- package/dist/composables/useNow.d.ts +16 -0
- package/dist/composables/useNow.js +39 -0
- package/dist/composables/usePersisted.js +14 -7
- package/dist/composables/usePillTransition.d.ts +5 -2
- package/dist/composables/usePillTransition.js +4 -3
- package/dist/composables/usePointerFrame.d.ts +18 -0
- package/dist/composables/usePointerFrame.js +31 -0
- package/dist/composables/useReducedMotion.d.ts +2 -0
- package/dist/composables/useReducedMotion.js +7 -0
- package/dist/composables/useRepeater.d.ts +17 -0
- package/dist/composables/useRepeater.js +31 -0
- package/dist/composables/useResizeObserver.d.ts +8 -0
- package/dist/composables/useResizeObserver.js +33 -0
- package/dist/composables/useRevealedValue.d.ts +31 -0
- package/dist/composables/useRevealedValue.js +26 -0
- package/dist/composables/useScramble.d.ts +42 -0
- package/dist/composables/useScramble.js +76 -0
- package/dist/composables/useShift.js +2 -10
- package/dist/composables/useSpotlight.d.ts +18 -0
- package/dist/composables/useSpotlight.js +53 -0
- package/dist/composables/useTilt.js +26 -18
- package/dist/composables/useTween.d.ts +43 -0
- package/dist/composables/useTween.js +69 -0
- package/dist/composables/useView.d.ts +18 -0
- package/dist/composables/useView.js +61 -0
- package/dist/icons-all.js +1 -1
- package/dist/index.d.ts +98 -1
- package/dist/index.js +262 -104
- package/dist/theme/define.d.ts +12 -0
- package/dist/theme/studio.d.ts +90 -0
- package/package.json +5 -2
- package/src/component-names.ts +33 -0
- package/src/components/AttentionDot.vue +27 -0
- package/src/components/FieldWrapper.vue +38 -0
- package/src/components/LayoutNode.vue +5 -9
- package/src/components/LegendSwatch.vue +15 -0
- package/src/components/LoaderMark.vue +90 -0
- package/src/components/LpActionBar.vue +12 -20
- package/src/components/LpActivityLine.vue +186 -0
- package/src/components/LpAlert.vue +54 -24
- package/src/components/LpAppShell.vue +7 -11
- package/src/components/LpAutocomplete.vue +16 -14
- package/src/components/LpAvatar.vue +17 -2
- package/src/components/LpBadge.vue +77 -13
- package/src/components/LpBreadcrumbs.vue +101 -35
- package/src/components/LpButton.vue +15 -3
- package/src/components/LpCard.vue +30 -7
- package/src/components/LpChart.vue +152 -156
- package/src/components/LpCheckbox.vue +10 -4
- package/src/components/LpCodeBlock.vue +11 -19
- package/src/components/LpCodeDisplay.vue +228 -0
- package/src/components/LpCollapse.vue +162 -0
- package/src/components/LpColorPicker.vue +10 -1
- package/src/components/LpCommandPalette.vue +38 -24
- package/src/components/LpContextMenu.vue +10 -1
- package/src/components/LpCopyButton.vue +185 -0
- package/src/components/LpCountdown.vue +308 -0
- package/src/components/LpDataList.vue +154 -0
- package/src/components/LpDatePicker.vue +53 -104
- package/src/components/LpDateRangePicker.vue +49 -95
- package/src/components/LpDisclosure.vue +58 -36
- package/src/components/LpDock.vue +274 -0
- package/src/components/LpDrawer.vue +10 -1
- package/src/components/LpDropdownMenu.vue +10 -1
- package/src/components/LpDropzone.vue +34 -13
- package/src/components/LpEditable.vue +293 -0
- package/src/components/LpFileTree.vue +5 -1
- package/src/components/LpFileTreeNode.vue +25 -50
- package/src/components/LpFormField.vue +22 -3
- package/src/components/LpFrame.vue +200 -0
- package/src/components/LpGauge.vue +287 -0
- package/src/components/LpGlowBorder.vue +60 -0
- package/src/components/LpHintExample.vue +14 -38
- package/src/components/LpHintLayer.vue +13 -3
- package/src/components/LpHoverCard.vue +175 -0
- package/src/components/LpIdenticon.vue +69 -0
- package/src/components/LpImageEditor.vue +15 -18
- package/src/components/LpInfraNode.vue +27 -16
- package/src/components/LpInput.vue +30 -16
- package/src/components/LpLightbox.vue +44 -23
- package/src/components/LpLoader.vue +145 -0
- package/src/components/LpLogViewer.vue +311 -82
- package/src/components/LpMagnetic.vue +97 -0
- package/src/components/LpMapPicker.vue +26 -28
- package/src/components/LpMasonry.vue +247 -0
- package/src/components/LpModal.vue +10 -1
- package/src/components/LpNotificationBell.vue +33 -49
- package/src/components/LpNumberField.vue +79 -14
- package/src/components/LpNumberFlow.vue +10 -35
- package/src/components/LpOtpInput.vue +7 -2
- package/src/components/LpPagination.vue +38 -4
- package/src/components/LpPalettePreview.vue +2 -7
- package/src/components/LpPasswordInput.vue +16 -14
- package/src/components/LpPhoneInput.vue +12 -3
- package/src/components/LpPie.vue +197 -36
- package/src/components/LpPipeline.vue +366 -0
- package/src/components/LpPopover.vue +10 -1
- package/src/components/LpProgress.vue +22 -84
- package/src/components/LpQuota.vue +197 -0
- package/src/components/LpRangeSlider.vue +5 -1
- package/src/components/LpRelativeTime.vue +90 -0
- package/src/components/LpRepeater.vue +80 -0
- package/src/components/LpRevealOnScroll.vue +125 -0
- package/src/components/LpScramble.vue +107 -0
- package/src/components/LpSecretField.vue +313 -0
- package/src/components/LpSegmented.vue +3 -10
- package/src/components/LpSelect.vue +78 -64
- package/src/components/LpShaderBackdrop.vue +434 -0
- package/src/components/LpShinyText.vue +139 -0
- package/src/components/LpSidebar.vue +2 -0
- package/src/components/LpSlider.vue +5 -1
- package/src/components/LpSparkline.vue +55 -37
- package/src/components/LpSpotlight.vue +51 -0
- package/src/components/LpStat.vue +6 -2
- package/src/components/LpStatus.vue +127 -0
- package/src/components/LpStepMark.vue +138 -0
- package/src/components/LpStepper.vue +37 -43
- package/src/components/LpSwap.vue +2 -2
- package/src/components/LpSwitch.vue +15 -22
- package/src/components/LpTable.vue +47 -63
- package/src/components/LpTableFilter.vue +1 -0
- package/src/components/LpTableOfContents.vue +53 -29
- package/src/components/LpTabs.vue +10 -21
- package/src/components/LpTagsInput.vue +53 -37
- package/src/components/LpTextReveal.vue +236 -0
- package/src/components/LpTextarea.vue +11 -11
- package/src/components/LpThemeStudio.vue +216 -0
- package/src/components/LpThemeStudioSection.vue +16 -0
- package/src/components/LpThemeSwitcher.vue +156 -47
- package/src/components/LpTimeField.vue +9 -1
- package/src/components/LpToaster.vue +63 -83
- package/src/components/LpTooltip.vue +10 -1
- package/src/components/LpTour.vue +24 -13
- package/src/components/LpTruncate.vue +135 -0
- package/src/components/LpTypewriter.vue +236 -0
- package/src/components/LpUptimeBar.vue +6 -5
- package/src/components/LpVideoBackdrop.vue +15 -13
- package/src/components/OptionContent.vue +17 -0
- package/src/components/PickerField.vue +58 -0
- package/src/components/RevealToggle.vue +51 -0
- package/src/components/StepConnector.vue +54 -0
- package/src/components/TourCard.vue +29 -16
- package/src/components/badge.ts +8 -0
- package/src/components/chart.ts +8 -23
- package/src/components/dateRange.ts +25 -0
- package/src/components/dock.ts +31 -0
- package/src/components/dropdown.ts +15 -3
- package/src/components/fieldText.ts +95 -0
- package/src/components/fileTree.ts +19 -21
- package/src/components/format.ts +136 -0
- package/src/components/identicon.ts +160 -0
- package/src/components/masonry.ts +73 -0
- package/src/components/meter.ts +122 -0
- package/src/components/otp.ts +14 -3
- package/src/components/pipeline.ts +101 -0
- package/src/components/quota.ts +111 -0
- package/src/components/relativeTime.ts +118 -0
- package/src/components/reveal.ts +56 -0
- package/src/components/scramble.ts +138 -0
- package/src/components/shaderBackdrop.ts +208 -0
- package/src/components/slider.ts +30 -0
- package/src/components/slotText.ts +13 -0
- package/src/components/status.ts +46 -0
- package/src/components/tableFacets.ts +25 -0
- package/src/components/textSplit.ts +55 -0
- package/src/components/timeSpan.ts +183 -0
- package/src/components/tone.ts +144 -0
- package/src/components/tour.ts +3 -2
- package/src/components/typewriter.ts +104 -0
- package/src/components/videoBackdrop.ts +7 -6
- package/src/composables/easing.ts +66 -1
- package/src/composables/pseudoLocale.ts +105 -0
- package/src/composables/scroll.ts +6 -3
- package/src/composables/useClipboard.ts +25 -3
- package/src/composables/useField.ts +12 -0
- package/src/composables/useForm.ts +27 -6
- package/src/composables/useHintSystem.ts +40 -0
- package/src/composables/useHints.ts +14 -3
- package/src/composables/useInView.ts +61 -0
- package/src/composables/useLoadingGate.ts +63 -0
- package/src/composables/useLpConfig.ts +20 -1
- package/src/composables/useMediaQuery.ts +6 -2
- package/src/composables/useNow.ts +84 -0
- package/src/composables/usePersisted.ts +19 -8
- package/src/composables/usePillTransition.ts +21 -13
- package/src/composables/usePointerFrame.ts +72 -0
- package/src/composables/useReducedMotion.ts +22 -0
- package/src/composables/useRepeater.ts +44 -0
- package/src/composables/useResizeObserver.ts +59 -0
- package/src/composables/useRevealedValue.ts +84 -0
- package/src/composables/useScramble.ts +152 -0
- package/src/composables/useShift.ts +10 -16
- package/src/composables/useSpotlight.ts +82 -0
- package/src/composables/useTilt.ts +40 -23
- package/src/composables/useTween.ts +149 -0
- package/src/composables/useView.ts +93 -0
- package/src/index.css +1 -0
- package/src/index.ts +143 -1
- package/src/kit-icons.ts +1 -1
- package/src/theme/define.ts +65 -0
- package/src/theme/studio.ts +202 -0
- package/src/tokens/effects.css +151 -0
- package/src/tokens/tokens.css +131 -39
- package/src/tokens/utilities.css +81 -0
- package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
- package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
- package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
- package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
- package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
- package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
- package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
- package/dist/chunks/LpStepper-C2slwObu.js +0 -90
- package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
- package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
- package/dist/chunks/TourCard-BKI7X9-r.js +0 -105
|
@@ -17,11 +17,12 @@ export default { inheritAttrs: false }
|
|
|
17
17
|
* hover per line.
|
|
18
18
|
*/
|
|
19
19
|
import { Motion } from "motion-v"
|
|
20
|
-
import { computed, ref, shallowRef, watch, onMounted
|
|
20
|
+
import { computed, ref, shallowRef, watch, onMounted } from "vue"
|
|
21
21
|
import { useLabels } from "../composables/useLpConfig"
|
|
22
22
|
import { easeTravel, prefersReducedMotion } from "../composables/easing"
|
|
23
23
|
import { usePillTransition } from "../composables/usePillTransition"
|
|
24
24
|
import { useReveal } from "../composables/useReveal"
|
|
25
|
+
import { lerp, mixValues, resample, useTween } from "../composables/useTween"
|
|
25
26
|
import {
|
|
26
27
|
areaPath,
|
|
27
28
|
axisTicks,
|
|
@@ -46,6 +47,8 @@ import {
|
|
|
46
47
|
type ChartSeries,
|
|
47
48
|
type ChartThreshold,
|
|
48
49
|
} from "./chart"
|
|
50
|
+
import { PANEL_SURFACE } from "./dropdown"
|
|
51
|
+
import LegendSwatch from "./LegendSwatch.vue"
|
|
49
52
|
import LpContextMenu, { type ContextMenuItemDef } from "./LpContextMenu.vue"
|
|
50
53
|
import LpEmptyState from "./LpEmptyState.vue"
|
|
51
54
|
import LpShift from "./LpShift.vue"
|
|
@@ -55,6 +58,7 @@ import { sampleValues, skeletonHeights, skeletonWave } from "./chartSkeleton"
|
|
|
55
58
|
import HintSampleTag from "./HintSampleTag.vue"
|
|
56
59
|
import { useSample } from "../composables/useSample"
|
|
57
60
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
61
|
+
import { useResizeObserver } from "../composables/useResizeObserver"
|
|
58
62
|
import { backgroundOf, downloadFile, fileStem, resolveCssColor, svgToPng, toCsv, type CsvOptions } from "./exportData"
|
|
59
63
|
|
|
60
64
|
export interface ChartText {
|
|
@@ -125,6 +129,10 @@ const props = withDefaults(
|
|
|
125
129
|
animate?: boolean
|
|
126
130
|
/** Shown when every series is empty. */
|
|
127
131
|
emptyLabel?: string
|
|
132
|
+
/** Second line of the empty state: why it is empty, what period it covers. */
|
|
133
|
+
emptyDescription?: string
|
|
134
|
+
/** Icon of the empty state. The `empty` slot puts an action under it ("Show 90 days"). */
|
|
135
|
+
emptyIcon?: string
|
|
128
136
|
/**
|
|
129
137
|
* Inside a `v-hint` element with nothing to draw, a tour step on that hint
|
|
130
138
|
* draws made-up data here instead of the empty state, tagged "Example".
|
|
@@ -192,7 +200,6 @@ const emit = defineEmits<{
|
|
|
192
200
|
// simply have nothing to draw until the observer reports a real box.
|
|
193
201
|
const root = ref<HTMLElement | null>(null)
|
|
194
202
|
const width = ref(0)
|
|
195
|
-
let ro: ResizeObserver | null = null
|
|
196
203
|
|
|
197
204
|
/*
|
|
198
205
|
* The wipe waits for the chart to be scrolled to. A chart is tall, so it is the
|
|
@@ -212,21 +219,9 @@ onMounted(() => {
|
|
|
212
219
|
// wrapping the chart in a spare div just to carry a second ref.
|
|
213
220
|
revealAnchor.value = root.value
|
|
214
221
|
reduced.value = prefersReducedMotion()
|
|
215
|
-
if (!root.value || typeof ResizeObserver === "undefined") return
|
|
216
|
-
ro = new ResizeObserver(([entry]) => {
|
|
217
|
-
width.value = entry.contentRect.width
|
|
218
|
-
})
|
|
219
|
-
ro.observe(root.value)
|
|
220
|
-
width.value = root.value.clientWidth
|
|
221
222
|
})
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
ro?.disconnect()
|
|
225
|
-
ro = null
|
|
226
|
-
if (presenceFrame) cancelAnimationFrame(presenceFrame)
|
|
227
|
-
if (scaleFrame) cancelAnimationFrame(scaleFrame)
|
|
228
|
-
if (rightFrame) cancelAnimationFrame(rightFrame)
|
|
229
|
-
if (gutterFrame) cancelAnimationFrame(gutterFrame)
|
|
223
|
+
useResizeObserver(root, (entry, el) => (width.value = entry ? entry.contentRect.width : el.clientWidth), {
|
|
224
|
+
immediate: true,
|
|
230
225
|
})
|
|
231
226
|
|
|
232
227
|
// ── data ───────────────────────────────────────
|
|
@@ -278,11 +273,22 @@ const visible = computed(() => allSeries.value.filter((s) => !hidden.value.has(s
|
|
|
278
273
|
a control responding. */
|
|
279
274
|
const SETTLE_MS = 260
|
|
280
275
|
|
|
281
|
-
|
|
282
|
-
|
|
276
|
+
/*
|
|
277
|
+
* Every value the chart moves — presence, both axes, the gutters, the readings
|
|
278
|
+
* themselves — travels on this one clock, so a change reads as one gesture
|
|
279
|
+
* rather than as several things settling at their own pace. The curve is
|
|
280
|
+
* `--ease-travel`'s: an ease-out covers most of a big rescale (800 down to 40)
|
|
281
|
+
* in its first frames and then creeps, which looks like a snap with a slow
|
|
282
|
+
* tail rather than a scale moving.
|
|
283
|
+
*/
|
|
284
|
+
const settle = {
|
|
285
|
+
duration: SETTLE_MS,
|
|
286
|
+
ease: easeTravel,
|
|
287
|
+
enabled: () => props.animate,
|
|
288
|
+
}
|
|
283
289
|
|
|
284
290
|
/*
|
|
285
|
-
* A series with no entry
|
|
291
|
+
* A series with no entry is fully present, NOT "0 because it is hidden".
|
|
286
292
|
*
|
|
287
293
|
* Falling back to the hidden flag raced the animation it was meant to start:
|
|
288
294
|
* the computed that draws the curve and the watcher that animates it both run
|
|
@@ -290,43 +296,87 @@ let presenceFrame: number | undefined
|
|
|
290
296
|
* reported the end state — so a series being hidden jumped to the floor while
|
|
291
297
|
* one being shown eased up from it.
|
|
292
298
|
*/
|
|
299
|
+
const presenceTargets = computed(
|
|
300
|
+
() => new Map(allSeries.value.map((s) => [s.id, hidden.value.has(s.id) ? 0 : 1])),
|
|
301
|
+
)
|
|
302
|
+
|
|
303
|
+
const presence = useTween(
|
|
304
|
+
() => presenceTargets.value,
|
|
305
|
+
(from, to, t) => new Map([...to].map(([id, v]) => [id, lerp(from.get(id) ?? v, v, t)])),
|
|
306
|
+
{
|
|
307
|
+
...settle,
|
|
308
|
+
// `hidden` is replaced wholesale on every toggle, and the map is rebuilt on
|
|
309
|
+
// every data change; only a different set of levels is a change worth moving.
|
|
310
|
+
equal: (a, b) => a.size === b.size && [...b].every(([id, v]) => a.get(id) === v),
|
|
311
|
+
},
|
|
312
|
+
)
|
|
313
|
+
|
|
293
314
|
const presenceOf = (id: string) => presence.value.get(id) ?? 1
|
|
294
315
|
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
316
|
+
/*
|
|
317
|
+
* The readings as DRAWN: each series travelling from its last values to its
|
|
318
|
+
* new ones, so a refresh moves the curve rather than replacing it.
|
|
319
|
+
*
|
|
320
|
+
* Matched by name, not by `id`: the id carries the series' position, and a
|
|
321
|
+
* series dropped from the front would shift every other one onto a new id and
|
|
322
|
+
* make them all look new. A series that arrives grows up out of the baseline;
|
|
323
|
+
* one that is gone stays in the drawing, collapsing onto it, until the move
|
|
324
|
+
* ends. The axis is on the same clock (`settle`), so each frame is a
|
|
325
|
+
* consistent picture: readings partway, on a scale partway.
|
|
326
|
+
*
|
|
327
|
+
* Only what is drawn moves. Hover, the tooltip's figures, the legend and the
|
|
328
|
+
* exports read the data as it now is.
|
|
329
|
+
*/
|
|
330
|
+
type DrawnSeries = (typeof allSeries.value)[number] & {
|
|
331
|
+
key: string
|
|
332
|
+
/** 0 → 1 for a series arriving, 1 → 0 for one leaving; 1 otherwise. */
|
|
333
|
+
enter: number
|
|
334
|
+
}
|
|
308
335
|
|
|
309
|
-
|
|
310
|
-
|
|
336
|
+
const targetDrawn = computed<DrawnSeries[]>(() => {
|
|
337
|
+
const seen = new Map<string, number>()
|
|
338
|
+
return allSeries.value.map((s) => {
|
|
339
|
+
const n = seen.get(s.name) ?? 0
|
|
340
|
+
seen.set(s.name, n + 1)
|
|
341
|
+
return { ...s, key: `${s.name}#${n}`, enter: 1 }
|
|
342
|
+
})
|
|
343
|
+
})
|
|
311
344
|
|
|
312
|
-
|
|
313
|
-
|
|
345
|
+
const mixDrawn = (from: DrawnSeries[], to: DrawnSeries[], t: number): DrawnSeries[] => {
|
|
346
|
+
const before = new Map(from.map((s) => [s.key, s]))
|
|
347
|
+
const after = new Set(to.map((s) => s.key))
|
|
348
|
+
const out = to.map((s) => {
|
|
349
|
+
const was = before.get(s.key)
|
|
350
|
+
return was
|
|
351
|
+
? { ...s, values: mixValues(was.values, s.values, t), enter: lerp(was.enter, 1, t) }
|
|
352
|
+
: { ...s, enter: t }
|
|
353
|
+
})
|
|
354
|
+
// Laid on the new x positions too, or a leaving curve drawn with the old
|
|
355
|
+
// point count would stop short of (or run past) the plot while it collapses.
|
|
356
|
+
const points = count.value
|
|
357
|
+
for (const s of from)
|
|
358
|
+
if (!after.has(s.key))
|
|
359
|
+
out.push({ ...s, values: resample(s.values, points), enter: s.enter * (1 - t) })
|
|
360
|
+
return out
|
|
361
|
+
}
|
|
314
362
|
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
)
|
|
363
|
+
const drawnSeries = useTween(() => targetDrawn.value, mixDrawn, {
|
|
364
|
+
...settle,
|
|
365
|
+
/*
|
|
366
|
+
* Only a plot already on screen morphs. While the wipe is still to come, or
|
|
367
|
+
* while the placeholder stands in (no svg yet), the data that follows draws
|
|
368
|
+
* itself in on its own entrance — a morph from readings nobody saw would
|
|
369
|
+
* only muddy it.
|
|
370
|
+
*/
|
|
371
|
+
enabled: () => props.animate && revealed.value && !!svgEl.value,
|
|
372
|
+
})
|
|
373
|
+
|
|
374
|
+
/** The drawn copy of each current series, by id, for marks built from `visible`. */
|
|
375
|
+
const drawnById = computed(() => {
|
|
376
|
+
const out = new Map<string, DrawnSeries>()
|
|
377
|
+
for (const s of drawnSeries.value) if (!out.has(s.id)) out.set(s.id, s)
|
|
378
|
+
return out
|
|
379
|
+
})
|
|
330
380
|
|
|
331
381
|
const count = computed(() => pointCount(allSeries.value))
|
|
332
382
|
const labels = computed(() => resolveLabels(source.value, props.labels, count.value))
|
|
@@ -439,40 +489,21 @@ const targetScale = computed(() =>
|
|
|
439
489
|
* and `y2` on an SVG <line> never became CSS properties, so a gridline jumps
|
|
440
490
|
* while the curve eases, which is the two-beat effect this avoids.
|
|
441
491
|
*/
|
|
442
|
-
|
|
443
|
-
let scaleFrame: number | undefined
|
|
492
|
+
type Range = { min: number; max: number; step: number }
|
|
444
493
|
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
const tick = (now: number) => {
|
|
456
|
-
const t = Math.min(1, (now - start) / SETTLE_MS)
|
|
457
|
-
/* easeTravel, not easeOut: an ease-out covers most of the range in the first
|
|
458
|
-
frames, which on a big rescale (800 down to 40) looks like a snap with a
|
|
459
|
-
slow tail rather than a scale moving. */
|
|
460
|
-
const eased = easeTravel(t)
|
|
461
|
-
scale.value =
|
|
462
|
-
t < 1
|
|
463
|
-
? {
|
|
464
|
-
min: from.min + (to.min - from.min) * eased,
|
|
465
|
-
max: from.max + (to.max - from.max) * eased,
|
|
466
|
-
/* The step stays the target's: it decides how many ticks there are,
|
|
467
|
-
and a travelling one would add and drop labels mid-move. */
|
|
468
|
-
step: to.step,
|
|
469
|
-
}
|
|
470
|
-
: to
|
|
471
|
-
scaleFrame = t < 1 ? requestAnimationFrame(tick) : undefined
|
|
472
|
-
}
|
|
473
|
-
scaleFrame = requestAnimationFrame(tick)
|
|
494
|
+
const sameRange = (a: Range | null, b: Range | null) =>
|
|
495
|
+
a === b || (!!a && !!b && a.min === b.min && a.max === b.max && a.step === b.step)
|
|
496
|
+
|
|
497
|
+
const mixRange = (from: Range, to: Range, t: number): Range => ({
|
|
498
|
+
min: lerp(from.min, to.min, t),
|
|
499
|
+
max: lerp(from.max, to.max, t),
|
|
500
|
+
/* The step stays the target's: it decides how many ticks there are, and a
|
|
501
|
+
travelling one would add and drop labels mid-move. */
|
|
502
|
+
step: to.step,
|
|
474
503
|
})
|
|
475
504
|
|
|
505
|
+
const scale = useTween(() => targetScale.value, mixRange, { ...settle, equal: sameRange })
|
|
506
|
+
|
|
476
507
|
/*
|
|
477
508
|
* The right axis reuses the LEFT axis's tick COUNT so both sets of labels land
|
|
478
509
|
* on the same gridlines. Two independent tick runs would draw two interleaved
|
|
@@ -497,34 +528,12 @@ const targetRightScale = computed(() => {
|
|
|
497
528
|
|
|
498
529
|
// The right axis travels on the same clock as the left, or a series measured
|
|
499
530
|
// against it arrives before the one beside it.
|
|
500
|
-
const rightScale =
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
return
|
|
507
|
-
}
|
|
508
|
-
if (from.min === to.min && from.max === to.max && from.step === to.step) return
|
|
509
|
-
|
|
510
|
-
const start = performance.now()
|
|
511
|
-
if (rightFrame) cancelAnimationFrame(rightFrame)
|
|
512
|
-
|
|
513
|
-
const tick = (now: number) => {
|
|
514
|
-
const t = Math.min(1, (now - start) / SETTLE_MS)
|
|
515
|
-
const eased = easeTravel(t)
|
|
516
|
-
rightScale.value =
|
|
517
|
-
t < 1
|
|
518
|
-
? {
|
|
519
|
-
min: from.min + (to.min - from.min) * eased,
|
|
520
|
-
max: from.max + (to.max - from.max) * eased,
|
|
521
|
-
step: to.step,
|
|
522
|
-
}
|
|
523
|
-
: to
|
|
524
|
-
rightFrame = t < 1 ? requestAnimationFrame(tick) : undefined
|
|
525
|
-
}
|
|
526
|
-
rightFrame = requestAnimationFrame(tick)
|
|
527
|
-
})
|
|
531
|
+
const rightScale = useTween(
|
|
532
|
+
() => targetRightScale.value,
|
|
533
|
+
// An axis that appears or goes has no range to travel from or to.
|
|
534
|
+
(from, to, t) => (from && to ? mixRange(from, to, t) : to),
|
|
535
|
+
{ ...settle, equal: sameRange },
|
|
536
|
+
)
|
|
528
537
|
|
|
529
538
|
const fmtWith = (v: number, unit?: string, f?: (n: number) => string): string =>
|
|
530
539
|
`${f ? f(v) : formatTick(v)}${unit ?? ""}`
|
|
@@ -579,33 +588,11 @@ const targetGutters = computed(() => ({
|
|
|
579
588
|
right: props.showYAxis && rightLabels.value.length ? gutter(rightLabels.value) : 12,
|
|
580
589
|
}))
|
|
581
590
|
|
|
582
|
-
const gutters =
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
gutters.value = to
|
|
588
|
-
return
|
|
589
|
-
}
|
|
590
|
-
if (from.left === to.left && from.right === to.right) return
|
|
591
|
-
|
|
592
|
-
const start = performance.now()
|
|
593
|
-
if (gutterFrame) cancelAnimationFrame(gutterFrame)
|
|
594
|
-
|
|
595
|
-
const tick = (now: number) => {
|
|
596
|
-
const t = Math.min(1, (now - start) / SETTLE_MS)
|
|
597
|
-
const eased = easeTravel(t)
|
|
598
|
-
gutters.value =
|
|
599
|
-
t < 1
|
|
600
|
-
? {
|
|
601
|
-
left: from.left + (to.left - from.left) * eased,
|
|
602
|
-
right: from.right + (to.right - from.right) * eased,
|
|
603
|
-
}
|
|
604
|
-
: to
|
|
605
|
-
gutterFrame = t < 1 ? requestAnimationFrame(tick) : undefined
|
|
606
|
-
}
|
|
607
|
-
gutterFrame = requestAnimationFrame(tick)
|
|
608
|
-
})
|
|
591
|
+
const gutters = useTween(
|
|
592
|
+
() => targetGutters.value,
|
|
593
|
+
(from, to, t) => ({ left: lerp(from.left, to.left, t), right: lerp(from.right, to.right, t) }),
|
|
594
|
+
{ ...settle, equal: (a, b) => a.left === b.left && a.right === b.right },
|
|
595
|
+
)
|
|
609
596
|
|
|
610
597
|
const box = computed<Box>(() => ({
|
|
611
598
|
width: width.value,
|
|
@@ -701,9 +688,10 @@ const baseY = computed(() =>
|
|
|
701
688
|
* what "stop showing this one" should look like.
|
|
702
689
|
*/
|
|
703
690
|
const lines = computed(() =>
|
|
704
|
-
|
|
691
|
+
drawnSeries.value.map((s) => {
|
|
705
692
|
const g = geoOf(s)
|
|
706
|
-
|
|
693
|
+
// A series leaving the data collapses exactly as one being hidden does.
|
|
694
|
+
const p = presenceOf(s.id) * s.enter
|
|
707
695
|
// Values pulled toward the axis floor, so the curve flattens into it.
|
|
708
696
|
const base = Math.min(Math.max(0, g.min), g.max)
|
|
709
697
|
const values = p === 1 ? s.values : s.values.map((v) => (v == null ? null : base + (v - base) * p))
|
|
@@ -751,9 +739,13 @@ const bars = computed(() => {
|
|
|
751
739
|
const negTop = new Array(count.value).fill(0)
|
|
752
740
|
|
|
753
741
|
visible.value.forEach((s, si) => {
|
|
742
|
+
// Heights from the drawn copy, so bars grow and shrink to their new values;
|
|
743
|
+
// a series just arriving rises from the baseline.
|
|
744
|
+
const drawn = drawnById.value.get(s.id)
|
|
754
745
|
for (let i = 0; i < count.value; i++) {
|
|
755
|
-
const
|
|
756
|
-
if (
|
|
746
|
+
const raw = drawn ? drawn.values[i] : s.values[i]
|
|
747
|
+
if (raw == null) continue
|
|
748
|
+
const v = raw * (drawn?.enter ?? 1)
|
|
757
749
|
const centre = xAt(i, count.value, box.value, true)
|
|
758
750
|
const x = props.stacked ? centre - inner / 2 : centre - inner / 2 + si * slot
|
|
759
751
|
let y: number
|
|
@@ -890,12 +882,14 @@ const activePoints = computed(() => {
|
|
|
890
882
|
.filter((r): r is { s: (typeof visible.value)[number]; v: number } => r.v != null)
|
|
891
883
|
.map(({ s, v }) => {
|
|
892
884
|
const sc = scaleOf(s)
|
|
885
|
+
// The dot rides the curve as drawn; the figure is the reading itself.
|
|
886
|
+
const at = drawnById.value.get(s.id)?.values[active.value] ?? v
|
|
893
887
|
return {
|
|
894
888
|
color: s.color,
|
|
895
889
|
id: s.id,
|
|
896
890
|
name: s.name,
|
|
897
891
|
value: v,
|
|
898
|
-
y: yAt(
|
|
892
|
+
y: yAt(at, sc.min, sc.max, box.value),
|
|
899
893
|
}
|
|
900
894
|
})
|
|
901
895
|
})
|
|
@@ -944,13 +938,14 @@ const tooltipTarget = computed(() => {
|
|
|
944
938
|
const floatTransition = usePillTransition("float")
|
|
945
939
|
|
|
946
940
|
// ── animation ──────────────────────────────────
|
|
947
|
-
// One clip rect wipes across the plot; re-keyed
|
|
948
|
-
//
|
|
941
|
+
// One clip rect wipes across the plot; re-keyed when the chart changes KIND so
|
|
942
|
+
// a line turned into bars is drawn in afresh rather than snapping.
|
|
949
943
|
const revealKey = shallowRef(0)
|
|
950
|
-
/*
|
|
951
|
-
|
|
944
|
+
/* Only the type: new values, a new point count and series coming or going all
|
|
945
|
+
morph (see `drawnSeries`), and a polled dashboard refreshing its numbers
|
|
946
|
+
must not re-wipe on every tick. */
|
|
952
947
|
watch(
|
|
953
|
-
() =>
|
|
948
|
+
() => props.type,
|
|
954
949
|
() => {
|
|
955
950
|
revealKey.value++
|
|
956
951
|
},
|
|
@@ -1175,10 +1170,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
1175
1170
|
:aria-pressed="!hidden.has(s.id)"
|
|
1176
1171
|
@click="toggleSeries(s.id)"
|
|
1177
1172
|
>
|
|
1178
|
-
<
|
|
1179
|
-
class="size-2 shrink-0 rounded-full transition-transform duration-fast group-hover:scale-125"
|
|
1180
|
-
:style="{ backgroundColor: s.color }"
|
|
1181
|
-
/>
|
|
1173
|
+
<LegendSwatch :color="s.color" />
|
|
1182
1174
|
<span class="text-muted-strong group-hover:text-ink">{{ s.name }}</span>
|
|
1183
1175
|
<span
|
|
1184
1176
|
v-if="hasRightAxis && s.axis === 'right'"
|
|
@@ -1267,11 +1259,14 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
1267
1259
|
<LpEmptyState
|
|
1268
1260
|
v-else-if="!hasData"
|
|
1269
1261
|
compact
|
|
1270
|
-
icon="lucide:chart-no-axes-column"
|
|
1262
|
+
:icon="emptyIcon ?? 'lucide:chart-no-axes-column'"
|
|
1271
1263
|
:title="emptyLabel ?? strings.empty"
|
|
1264
|
+
:description="emptyDescription"
|
|
1272
1265
|
class="justify-center rounded-control border border-dashed border-line py-0"
|
|
1273
1266
|
:style="{ height: `${height}px` }"
|
|
1274
|
-
|
|
1267
|
+
>
|
|
1268
|
+
<template v-if="$slots.empty" #default><slot name="empty" /></template>
|
|
1269
|
+
</LpEmptyState>
|
|
1275
1270
|
|
|
1276
1271
|
<svg
|
|
1277
1272
|
v-else-if="width > 0"
|
|
@@ -1289,7 +1284,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
1289
1284
|
<linearGradient
|
|
1290
1285
|
v-for="(s, i) in lines"
|
|
1291
1286
|
:id="gradientId(s.name, i)"
|
|
1292
|
-
:key="s.
|
|
1287
|
+
:key="s.key"
|
|
1293
1288
|
x1="0"
|
|
1294
1289
|
y1="0"
|
|
1295
1290
|
x2="0"
|
|
@@ -1408,7 +1403,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
1408
1403
|
/>
|
|
1409
1404
|
|
|
1410
1405
|
<!-- one group per series, so hiding one drops only that curve -->
|
|
1411
|
-
<g v-for="(s, i) in lines" :key="`s-${s.
|
|
1406
|
+
<g v-for="(s, i) in lines" :key="`s-${s.key}`" :style="{ opacity: s.alpha }">
|
|
1412
1407
|
<path
|
|
1413
1408
|
v-show="type === 'area'"
|
|
1414
1409
|
:d="s.fill"
|
|
@@ -1524,7 +1519,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
1524
1519
|
<Motion
|
|
1525
1520
|
v-if="active >= 0 && ready"
|
|
1526
1521
|
as="div"
|
|
1527
|
-
class="pointer-events-none absolute left-0 top-0 z-(--z-tooltip) min-w-32
|
|
1522
|
+
class="pointer-events-none absolute left-0 top-0 z-(--z-tooltip) min-w-32 px-2.5 py-2 group-data-[state=open]/plot:hidden"
|
|
1523
|
+
:class="PANEL_SURFACE"
|
|
1528
1524
|
:initial="{ opacity: 0, scale: 0.96 }"
|
|
1529
1525
|
:animate="{
|
|
1530
1526
|
opacity: 1,
|
|
@@ -9,6 +9,7 @@ export default { inheritAttrs: false }
|
|
|
9
9
|
import { CheckboxIndicator, CheckboxRoot } from "reka-ui"
|
|
10
10
|
import { computed, useId } from "vue"
|
|
11
11
|
import LpIcon from "./LpIcon.vue"
|
|
12
|
+
import LpLoader from "./LpLoader.vue"
|
|
12
13
|
import { useFieldControl } from "../composables/useField"
|
|
13
14
|
import { useOptimisticToggle } from "../composables/useOptimisticToggle"
|
|
14
15
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
@@ -73,6 +74,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
|
|
|
73
74
|
:name="name"
|
|
74
75
|
:model-value="indeterminate ? 'indeterminate' : modelValue"
|
|
75
76
|
:disabled="field.disabled"
|
|
77
|
+
:required="field.required"
|
|
76
78
|
:aria-describedby="describedBy"
|
|
77
79
|
:aria-busy="pending || undefined"
|
|
78
80
|
:class="description ? 'mt-px' : ''"
|
|
@@ -84,11 +86,15 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
|
|
|
84
86
|
>
|
|
85
87
|
<LpIcon :name="indeterminate ? 'lucide:minus' : 'lucide:check'" :size="13" :class="pending && 'opacity-0'" />
|
|
86
88
|
</CheckboxIndicator>
|
|
87
|
-
|
|
89
|
+
<!-- At once, since the check already gave way to it, and hidden from
|
|
90
|
+
screen readers: the box says aria-busy, and a "Loading…" inside it
|
|
91
|
+
would become part of its name. -->
|
|
92
|
+
<LpLoader
|
|
88
93
|
v-if="pending"
|
|
89
|
-
|
|
90
|
-
:
|
|
91
|
-
|
|
94
|
+
size="inline"
|
|
95
|
+
:delay="0"
|
|
96
|
+
aria-hidden="true"
|
|
97
|
+
class="absolute text-[12px]"
|
|
92
98
|
:class="modelValue ? 'text-ink-inverse' : 'text-muted'"
|
|
93
99
|
/>
|
|
94
100
|
</CheckboxRoot>
|
|
@@ -23,9 +23,9 @@ export default { inheritAttrs: false }
|
|
|
23
23
|
* set `region:open` (e.g. `// #region label open`) to start expanded.
|
|
24
24
|
*/
|
|
25
25
|
import { computed, reactive, ref, watch } from "vue"
|
|
26
|
-
import { useClipboard } from "../composables/useClipboard"
|
|
27
26
|
import { type CodeLang, tokenizeLines } from "./codeHighlight"
|
|
28
27
|
import { useLabels } from "../composables/useLpConfig"
|
|
28
|
+
import LpCopyButton from "./LpCopyButton.vue"
|
|
29
29
|
import LpIcon from "./LpIcon.vue"
|
|
30
30
|
import { useMergedAttrs } from "../composables/useMergedClass"
|
|
31
31
|
|
|
@@ -206,12 +206,6 @@ const showHeader = computed(
|
|
|
206
206
|
() => Boolean(props.title || props.lang !== "plain" || props.copyable || props.lockToggle),
|
|
207
207
|
)
|
|
208
208
|
|
|
209
|
-
// ── copy ─────────────────────────────────────────────────────
|
|
210
|
-
// The tick on the button is the whole confirmation here, so no toast: the
|
|
211
|
-
// header is right next to the pointer that just clicked it.
|
|
212
|
-
const { copied, copy: writeClipboard } = useClipboard()
|
|
213
|
-
const copy = () => writeClipboard(copyText.value)
|
|
214
|
-
|
|
215
209
|
function toggleLock() {
|
|
216
210
|
emit("update:locked", !props.locked)
|
|
217
211
|
}
|
|
@@ -253,19 +247,17 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
|
|
|
253
247
|
class="transition-transform duration-[var(--duration-fast)] ease-[var(--ease-emphasized)] group-active/lock:scale-90"
|
|
254
248
|
/>
|
|
255
249
|
</button>
|
|
256
|
-
|
|
250
|
+
<!-- The kit's copy button, trimmed to the header's compact row (the
|
|
251
|
+
lock toggle's box beside it). Its tick is the whole confirmation,
|
|
252
|
+
so no toast: the header is right under the pointer that clicked. -->
|
|
253
|
+
<LpCopyButton
|
|
257
254
|
v-if="copyable"
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
:name="copied ? 'lucide:check' : 'lucide:copy'"
|
|
265
|
-
:size="13"
|
|
266
|
-
:class="copied ? 'text-action' : ''"
|
|
267
|
-
/>
|
|
268
|
-
</button>
|
|
255
|
+
:value="copyText"
|
|
256
|
+
size="xs"
|
|
257
|
+
variant="muted"
|
|
258
|
+
class="size-auto aspect-auto rounded-small px-1.5 py-1 font-normal hover:bg-transparent"
|
|
259
|
+
:labels="{ copy: text.copy, copied: text.copied }"
|
|
260
|
+
/>
|
|
269
261
|
</div>
|
|
270
262
|
</div>
|
|
271
263
|
|