@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.
Files changed (640) hide show
  1. package/README.md +37 -0
  2. package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
  3. package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
  4. package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
  5. package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
  6. package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
  7. package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
  8. package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
  9. package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
  10. package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
  11. package/dist/assets/LpStatus-430OGTZY.css +17 -0
  12. package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
  13. package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
  14. package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
  15. package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
  16. package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
  17. package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
  18. package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-B5uE8Znw.js} +1 -1
  19. package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
  20. package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
  21. package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
  22. package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
  23. package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
  24. package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
  25. package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
  26. package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
  27. package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-CNnLTDZg.js} +7 -7
  28. package/dist/chunks/LpAlert-C5igj802.js +119 -0
  29. package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-CEUAB8kK.js} +15 -16
  30. package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
  31. package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
  32. package/dist/chunks/LpBadge-HOEPBYmi.js +126 -0
  33. package/dist/chunks/LpBreadcrumbs-DYoPc3P4.js +144 -0
  34. package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
  35. package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
  36. package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
  37. package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
  38. package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
  39. package/dist/chunks/LpCodeDisplay-CIKKT2iW.js +189 -0
  40. package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
  41. package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-DFugXNUi.js} +10 -5
  42. package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
  43. package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
  44. package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-COwOwRgI.js} +13 -5
  45. package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
  46. package/dist/chunks/LpCountdown-Dtq1ihlJ.js +231 -0
  47. package/dist/chunks/LpDataList-B-5nHfNw.js +120 -0
  48. package/dist/chunks/LpDatePicker-BUe1VUC0.js +168 -0
  49. package/dist/chunks/LpDateRangePicker-C_k65vGR.js +126 -0
  50. package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
  51. package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
  52. package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-CRgrhdAH.js} +10 -5
  53. package/dist/chunks/LpEditable-DTqLt2lT.js +236 -0
  54. package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
  55. package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
  56. package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DMISXVHC.js} +5 -3
  57. package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-CPXB_Yy3.js} +42 -55
  58. package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
  59. package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
  60. package/dist/chunks/LpGauge-Bk8TwJj0.js +204 -0
  61. package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
  62. package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
  63. package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-p4hqzdyA.js} +27 -14
  64. package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-CCrhRfy9.js} +3 -3
  65. package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
  66. package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
  67. package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
  68. package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-CUC3t4na.js} +39 -25
  69. package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
  70. package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
  71. package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
  72. package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-elZHbj85.js} +225 -129
  73. package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
  74. package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
  75. package/dist/chunks/LpMasonry--k0571qG.js +185 -0
  76. package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-D5swlmZ_.js} +3 -3
  77. package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
  78. package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-D4Z0wVHR.js} +4 -4
  79. package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-DPZmP5dM.js} +32 -48
  80. package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
  81. package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
  82. package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
  83. package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
  84. package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
  85. package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-DTV18FIh.js} +20 -20
  86. package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
  87. package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-CFuV7pZv.js} +158 -47
  88. package/dist/chunks/LpPipeline-D81yh_NX.js +329 -0
  89. package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-BEIcqb9p.js} +8 -3
  90. package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
  91. package/dist/chunks/LpQuota-2Sw_gqcJ.js +162 -0
  92. package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
  93. package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
  94. package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
  95. package/dist/chunks/LpRelativeTime-CKzVqAo9.js +73 -0
  96. package/dist/chunks/LpRepeater-D0VjmD6y.js +140 -0
  97. package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
  98. package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
  99. package/dist/chunks/LpSecretField-DMfdJ1cQ.js +307 -0
  100. package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
  101. package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
  102. package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-B4f_yRi5.js} +93 -108
  103. package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
  104. package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
  105. package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-D-M0Y_7U.js} +5 -3
  106. package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DF-TYxOV.js} +3 -3
  107. package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
  108. package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
  109. package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
  110. package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-B2ix1Q7t.js} +38 -35
  111. package/dist/chunks/LpStatus-C7kx5PKE.js +86 -0
  112. package/dist/chunks/LpStepMark-DK-5BKAt.js +101 -0
  113. package/dist/chunks/LpStepper-DRFfdJaq.js +76 -0
  114. package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
  115. package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
  116. package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
  117. package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
  118. package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DgpBFRV2.js} +68 -71
  119. package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
  120. package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
  121. package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
  122. package/dist/chunks/LpThemeStudio-DguwHdGt.js +416 -0
  123. package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
  124. package/dist/chunks/LpThemeSwitcher-D5uz0MhK.js +278 -0
  125. package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
  126. package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
  127. package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
  128. package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-ZhKthfgz.js} +1 -1
  129. package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-NfRJNEIP.js} +24 -18
  130. package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
  131. package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
  132. package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-DWegV2p6.js} +9 -8
  133. package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
  134. package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
  135. package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
  136. package/dist/chunks/PickerField-CHRS1h7K.js +116 -0
  137. package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
  138. package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
  139. package/dist/chunks/TourCard-BXuVHsfn.js +123 -0
  140. package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
  141. package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
  142. package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
  143. package/dist/component-names.d.ts +1 -1
  144. package/dist/components/AttentionDot.vue.d.ts +9 -0
  145. package/dist/components/AttentionDot.vue.js +4 -0
  146. package/dist/components/ContextMenuItems.vue.js +1 -1
  147. package/dist/components/DropzoneLinkField.vue.js +1 -1
  148. package/dist/components/FieldWrapper.vue.d.ts +25 -0
  149. package/dist/components/FieldWrapper.vue.js +4 -0
  150. package/dist/components/LayoutCanvas.vue.js +1 -1
  151. package/dist/components/LayoutNode.vue.d.ts +4 -4
  152. package/dist/components/LayoutNode.vue.js +1 -1
  153. package/dist/components/LegendSwatch.vue.d.ts +6 -0
  154. package/dist/components/LegendSwatch.vue.js +4 -0
  155. package/dist/components/LoaderMark.vue.d.ts +12 -0
  156. package/dist/components/LoaderMark.vue.js +4 -0
  157. package/dist/components/LpActionBar.vue.js +1 -1
  158. package/dist/components/LpActivityLine.vue.d.ts +58 -0
  159. package/dist/components/LpActivityLine.vue.js +4 -0
  160. package/dist/components/LpAddressInput.vue.js +1 -1
  161. package/dist/components/LpAlert.vue.d.ts +2 -2
  162. package/dist/components/LpAlert.vue.js +1 -1
  163. package/dist/components/LpAppShell.vue.d.ts +8 -7
  164. package/dist/components/LpAppShell.vue.js +1 -1
  165. package/dist/components/LpAutocomplete.vue.js +1 -1
  166. package/dist/components/LpAvatar.vue.d.ts +16 -0
  167. package/dist/components/LpAvatar.vue.js +1 -1
  168. package/dist/components/LpBadge.vue.d.ts +19 -5
  169. package/dist/components/LpBadge.vue.js +1 -1
  170. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  171. package/dist/components/LpButton.vue.d.ts +2 -2
  172. package/dist/components/LpButton.vue.js +1 -1
  173. package/dist/components/LpCalendar.vue.js +1 -1
  174. package/dist/components/LpCard.vue.d.ts +24 -0
  175. package/dist/components/LpCard.vue.js +1 -1
  176. package/dist/components/LpChart.vue.d.ts +10 -0
  177. package/dist/components/LpChart.vue.js +122 -142
  178. package/dist/components/LpCheckbox.vue.d.ts +2 -2
  179. package/dist/components/LpCheckbox.vue.js +1 -1
  180. package/dist/components/LpCodeBlock.vue.js +1 -1
  181. package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
  182. package/dist/components/LpCodeDisplay.vue.js +4 -0
  183. package/dist/components/LpCollapse.vue.d.ts +58 -0
  184. package/dist/components/LpCollapse.vue.js +4 -0
  185. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  186. package/dist/components/LpColorPicker.vue.js +1 -1
  187. package/dist/components/LpCommandPalette.vue.js +34 -23
  188. package/dist/components/LpConfirmDialog.vue.js +1 -1
  189. package/dist/components/LpConfirmHost.vue.js +1 -1
  190. package/dist/components/LpContextMenu.vue.js +1 -1
  191. package/dist/components/LpCopyButton.vue.d.ts +82 -0
  192. package/dist/components/LpCopyButton.vue.js +4 -0
  193. package/dist/components/LpCountdown.vue.d.ts +100 -0
  194. package/dist/components/LpCountdown.vue.js +4 -0
  195. package/dist/components/LpDataList.vue.d.ts +66 -0
  196. package/dist/components/LpDataList.vue.js +4 -0
  197. package/dist/components/LpDatePicker.vue.d.ts +1 -1
  198. package/dist/components/LpDatePicker.vue.js +1 -1
  199. package/dist/components/LpDateRangePicker.vue.d.ts +1 -1
  200. package/dist/components/LpDateRangePicker.vue.js +1 -1
  201. package/dist/components/LpDisclosure.vue.js +1 -1
  202. package/dist/components/LpDock.vue.d.ts +74 -0
  203. package/dist/components/LpDock.vue.js +204 -0
  204. package/dist/components/LpDrawer.vue.js +1 -1
  205. package/dist/components/LpDropdownMenu.vue.js +1 -1
  206. package/dist/components/LpDropzone.vue.d.ts +8 -1
  207. package/dist/components/LpDropzone.vue.js +36 -15
  208. package/dist/components/LpEditable.vue.d.ts +85 -0
  209. package/dist/components/LpEditable.vue.js +4 -0
  210. package/dist/components/LpEmptyState.vue.js +1 -1
  211. package/dist/components/LpFieldNotice.vue.js +1 -1
  212. package/dist/components/LpFileTree.vue.js +1 -1
  213. package/dist/components/LpFileTreeNode.vue.js +1 -1
  214. package/dist/components/LpFormField.vue.js +1 -1
  215. package/dist/components/LpFrame.vue.d.ts +22 -0
  216. package/dist/components/LpFrame.vue.js +4 -0
  217. package/dist/components/LpGauge.vue.d.ts +116 -0
  218. package/dist/components/LpGauge.vue.js +4 -0
  219. package/dist/components/LpGlowBorder.vue.d.ts +47 -0
  220. package/dist/components/LpGlowBorder.vue.js +4 -0
  221. package/dist/components/LpHintExample.vue.d.ts +2 -2
  222. package/dist/components/LpHintExample.vue.js +1 -1
  223. package/dist/components/LpHintLayer.vue.js +1 -1
  224. package/dist/components/LpHints.vue.js +1 -1
  225. package/dist/components/LpHoverCard.vue.d.ts +60 -0
  226. package/dist/components/LpHoverCard.vue.js +4 -0
  227. package/dist/components/LpIcon.vue.js +1 -1
  228. package/dist/components/LpIdenticon.vue.d.ts +37 -0
  229. package/dist/components/LpIdenticon.vue.js +4 -0
  230. package/dist/components/LpImageEditor.vue.js +13 -19
  231. package/dist/components/LpInfraNode.vue.js +1 -1
  232. package/dist/components/LpInput.vue.d.ts +10 -0
  233. package/dist/components/LpInput.vue.js +1 -1
  234. package/dist/components/LpLightbox.vue.js +1 -1
  235. package/dist/components/LpLoader.vue.d.ts +106 -0
  236. package/dist/components/LpLoader.vue.js +4 -0
  237. package/dist/components/LpLogViewer.vue.js +1 -1
  238. package/dist/components/LpMagnetic.vue.d.ts +28 -0
  239. package/dist/components/LpMagnetic.vue.js +4 -0
  240. package/dist/components/LpMapPicker.vue.js +1 -1
  241. package/dist/components/LpMasonry.vue.d.ts +42 -0
  242. package/dist/components/LpMasonry.vue.js +4 -0
  243. package/dist/components/LpMediaGallery.vue.js +1 -1
  244. package/dist/components/LpModal.vue.js +1 -1
  245. package/dist/components/LpModalNav.vue.js +1 -1
  246. package/dist/components/LpNotificationBell.vue.d.ts +15 -6
  247. package/dist/components/LpNotificationBell.vue.js +1 -1
  248. package/dist/components/LpNumberField.vue.d.ts +57 -0
  249. package/dist/components/LpNumberField.vue.js +1 -1
  250. package/dist/components/LpNumberFlow.vue.js +1 -1
  251. package/dist/components/LpOtpInput.vue.d.ts +12 -4
  252. package/dist/components/LpOtpInput.vue.js +1 -1
  253. package/dist/components/LpPagination.vue.js +1 -1
  254. package/dist/components/LpPaletteFacts.vue.js +1 -1
  255. package/dist/components/LpPaletteHeader.vue.js +2 -2
  256. package/dist/components/LpPalettePreview.vue.js +1 -1
  257. package/dist/components/LpPaletteStats.vue.js +1 -1
  258. package/dist/components/LpPasswordInput.vue.d.ts +12 -1
  259. package/dist/components/LpPasswordInput.vue.js +1 -1
  260. package/dist/components/LpPhoneInput.vue.js +1 -1
  261. package/dist/components/LpPie.vue.d.ts +3 -1
  262. package/dist/components/LpPie.vue.js +1 -1
  263. package/dist/components/LpPipeline.vue.d.ts +91 -0
  264. package/dist/components/LpPipeline.vue.js +4 -0
  265. package/dist/components/LpPopover.vue.d.ts +2 -2
  266. package/dist/components/LpPopover.vue.js +1 -1
  267. package/dist/components/LpProgress.vue.d.ts +11 -4
  268. package/dist/components/LpProgress.vue.js +1 -1
  269. package/dist/components/LpQuota.vue.d.ts +68 -0
  270. package/dist/components/LpQuota.vue.js +4 -0
  271. package/dist/components/LpRadioGroup.vue.js +1 -1
  272. package/dist/components/LpRangeCalendar.vue.js +1 -1
  273. package/dist/components/LpRangeSlider.vue.js +1 -1
  274. package/dist/components/LpRelativeTime.vue.d.ts +41 -0
  275. package/dist/components/LpRelativeTime.vue.js +4 -0
  276. package/dist/components/LpRepeater.vue.d.ts +48 -0
  277. package/dist/components/LpRepeater.vue.js +4 -0
  278. package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
  279. package/dist/components/LpRevealOnScroll.vue.js +4 -0
  280. package/dist/components/LpRollingText.vue.d.ts +1 -1
  281. package/dist/components/LpScramble.vue.d.ts +55 -0
  282. package/dist/components/LpScramble.vue.js +4 -0
  283. package/dist/components/LpScrollArea.vue.d.ts +1 -1
  284. package/dist/components/LpSecretField.vue.d.ts +108 -0
  285. package/dist/components/LpSecretField.vue.js +4 -0
  286. package/dist/components/LpSection.vue.js +1 -1
  287. package/dist/components/LpSegmented.vue.js +1 -1
  288. package/dist/components/LpSelect.vue.d.ts +2 -0
  289. package/dist/components/LpSelect.vue.js +1 -1
  290. package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
  291. package/dist/components/LpShaderBackdrop.vue.js +4 -0
  292. package/dist/components/LpShinyText.vue.d.ts +39 -0
  293. package/dist/components/LpShinyText.vue.js +4 -0
  294. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  295. package/dist/components/LpSidebar.vue.js +1 -1
  296. package/dist/components/LpSidebarNav.vue.js +1 -1
  297. package/dist/components/LpSlider.vue.js +1 -1
  298. package/dist/components/LpSparkline.vue.d.ts +4 -3
  299. package/dist/components/LpSparkline.vue.js +1 -1
  300. package/dist/components/LpSpotlight.vue.d.ts +37 -0
  301. package/dist/components/LpSpotlight.vue.js +4 -0
  302. package/dist/components/LpStat.vue.js +1 -1
  303. package/dist/components/LpStatus.vue.d.ts +65 -0
  304. package/dist/components/LpStatus.vue.js +4 -0
  305. package/dist/components/LpStepMark.vue.d.ts +31 -0
  306. package/dist/components/LpStepMark.vue.js +4 -0
  307. package/dist/components/LpStepper.vue.js +1 -1
  308. package/dist/components/LpSwap.vue.js +1 -1
  309. package/dist/components/LpSwitch.vue.d.ts +2 -2
  310. package/dist/components/LpSwitch.vue.js +1 -1
  311. package/dist/components/LpTable.vue.js +104 -120
  312. package/dist/components/LpTableFilter.vue.js +1 -1
  313. package/dist/components/LpTableOfContents.vue.d.ts +6 -1
  314. package/dist/components/LpTableOfContents.vue.js +1 -1
  315. package/dist/components/LpTabs.vue.d.ts +5 -5
  316. package/dist/components/LpTabs.vue.js +25 -33
  317. package/dist/components/LpTagsInput.vue.js +1 -1
  318. package/dist/components/LpTextReveal.vue.d.ts +58 -0
  319. package/dist/components/LpTextReveal.vue.js +4 -0
  320. package/dist/components/LpTextarea.vue.js +1 -1
  321. package/dist/components/LpThemeProvider.vue.js +1 -1
  322. package/dist/components/LpThemeStudio.vue.d.ts +54 -0
  323. package/dist/components/LpThemeStudio.vue.js +4 -0
  324. package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
  325. package/dist/components/LpThemeStudioSection.vue.js +4 -0
  326. package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
  327. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  328. package/dist/components/LpTimeField.vue.d.ts +2 -0
  329. package/dist/components/LpTimeField.vue.js +1 -1
  330. package/dist/components/LpToaster.vue.js +1 -1
  331. package/dist/components/LpTooltip.vue.d.ts +2 -2
  332. package/dist/components/LpTooltip.vue.js +1 -1
  333. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  334. package/dist/components/LpTour.vue.js +1 -1
  335. package/dist/components/LpTruncate.vue.d.ts +34 -0
  336. package/dist/components/LpTruncate.vue.js +4 -0
  337. package/dist/components/LpTypewriter.vue.d.ts +61 -0
  338. package/dist/components/LpTypewriter.vue.js +4 -0
  339. package/dist/components/LpUptimeBar.vue.js +1 -1
  340. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  341. package/dist/components/MenuTitle.vue.js +1 -1
  342. package/dist/components/OptionContent.vue.d.ts +7 -0
  343. package/dist/components/OptionContent.vue.js +4 -0
  344. package/dist/components/PickerField.vue.d.ts +43 -0
  345. package/dist/components/PickerField.vue.js +4 -0
  346. package/dist/components/RevealToggle.vue.d.ts +21 -0
  347. package/dist/components/RevealToggle.vue.js +4 -0
  348. package/dist/components/StepConnector.vue.d.ts +19 -0
  349. package/dist/components/StepConnector.vue.js +4 -0
  350. package/dist/components/TourCard.vue.js +1 -1
  351. package/dist/components/badge.d.ts +1 -0
  352. package/dist/components/badge.js +4 -0
  353. package/dist/components/chart.d.ts +5 -1
  354. package/dist/components/chart.js +2 -21
  355. package/dist/components/dateRange.d.ts +11 -0
  356. package/dist/components/dateRange.js +12 -0
  357. package/dist/components/dock.d.ts +19 -0
  358. package/dist/components/dock.js +16 -0
  359. package/dist/components/dropdown.d.ts +10 -1
  360. package/dist/components/dropdown.js +7 -2
  361. package/dist/components/fieldText.d.ts +38 -0
  362. package/dist/components/fieldText.js +53 -0
  363. package/dist/components/fileTree.d.ts +7 -3
  364. package/dist/components/fileTree.js +12 -18
  365. package/dist/components/format.d.ts +41 -0
  366. package/dist/components/format.js +67 -0
  367. package/dist/components/identicon.d.ts +38 -0
  368. package/dist/components/identicon.js +85 -0
  369. package/dist/components/masonry.d.ts +32 -0
  370. package/dist/components/masonry.js +40 -0
  371. package/dist/components/menuWhen.js +1 -1
  372. package/dist/components/meter.d.ts +64 -0
  373. package/dist/components/meter.js +53 -0
  374. package/dist/components/otp.d.ts +1 -1
  375. package/dist/components/otp.js +7 -2
  376. package/dist/components/pipeline.d.ts +55 -0
  377. package/dist/components/pipeline.js +51 -0
  378. package/dist/components/quota.d.ts +57 -0
  379. package/dist/components/quota.js +40 -0
  380. package/dist/components/relativeTime.d.ts +24 -0
  381. package/dist/components/relativeTime.js +56 -0
  382. package/dist/components/reveal.d.ts +18 -0
  383. package/dist/components/reveal.js +32 -0
  384. package/dist/components/scramble.d.ts +68 -0
  385. package/dist/components/scramble.js +58 -0
  386. package/dist/components/shaderBackdrop.d.ts +20 -0
  387. package/dist/components/shaderBackdrop.js +156 -0
  388. package/dist/components/slider.d.ts +5 -0
  389. package/dist/components/slider.js +24 -0
  390. package/dist/components/slotText.d.ts +2 -0
  391. package/dist/components/slotText.js +9 -0
  392. package/dist/components/status.d.ts +14 -0
  393. package/dist/components/status.js +22 -0
  394. package/dist/components/tableFacets.d.ts +8 -0
  395. package/dist/components/tableFacets.js +19 -0
  396. package/dist/components/textSplit.d.ts +17 -0
  397. package/dist/components/textSplit.js +24 -0
  398. package/dist/components/timeSpan.d.ts +78 -0
  399. package/dist/components/timeSpan.js +85 -0
  400. package/dist/components/tone.d.ts +43 -0
  401. package/dist/components/tone.js +82 -0
  402. package/dist/components/tour.js +3 -2
  403. package/dist/components/typewriter.d.ts +36 -0
  404. package/dist/components/typewriter.js +53 -0
  405. package/dist/components/videoBackdrop.js +5 -6
  406. package/dist/composables/easing.d.ts +22 -1
  407. package/dist/composables/easing.js +42 -1
  408. package/dist/composables/pseudoLocale.d.ts +15 -0
  409. package/dist/composables/pseudoLocale.js +96 -0
  410. package/dist/composables/scroll.js +5 -3
  411. package/dist/composables/useClipboard.d.ts +4 -1
  412. package/dist/composables/useClipboard.js +12 -2
  413. package/dist/composables/useField.d.ts +8 -0
  414. package/dist/composables/useField.js +5 -0
  415. package/dist/composables/useForm.js +19 -5
  416. package/dist/composables/useHintSystem.d.ts +4 -0
  417. package/dist/composables/useHintSystem.js +33 -1
  418. package/dist/composables/useHints.js +9 -3
  419. package/dist/composables/useInView.d.ts +11 -0
  420. package/dist/composables/useInView.js +39 -0
  421. package/dist/composables/useLoadingGate.d.ts +8 -0
  422. package/dist/composables/useLoadingGate.js +38 -0
  423. package/dist/composables/useLpConfig.d.ts +10 -0
  424. package/dist/composables/useLpConfig.js +11 -1
  425. package/dist/composables/useMediaQuery.js +3 -1
  426. package/dist/composables/useNow.d.ts +16 -0
  427. package/dist/composables/useNow.js +39 -0
  428. package/dist/composables/usePersisted.js +14 -7
  429. package/dist/composables/usePillTransition.d.ts +5 -2
  430. package/dist/composables/usePillTransition.js +4 -3
  431. package/dist/composables/usePointerFrame.d.ts +18 -0
  432. package/dist/composables/usePointerFrame.js +31 -0
  433. package/dist/composables/useReducedMotion.d.ts +2 -0
  434. package/dist/composables/useReducedMotion.js +7 -0
  435. package/dist/composables/useRepeater.d.ts +17 -0
  436. package/dist/composables/useRepeater.js +31 -0
  437. package/dist/composables/useResizeObserver.d.ts +8 -0
  438. package/dist/composables/useResizeObserver.js +33 -0
  439. package/dist/composables/useRevealedValue.d.ts +31 -0
  440. package/dist/composables/useRevealedValue.js +26 -0
  441. package/dist/composables/useScramble.d.ts +42 -0
  442. package/dist/composables/useScramble.js +76 -0
  443. package/dist/composables/useShift.js +2 -10
  444. package/dist/composables/useSpotlight.d.ts +18 -0
  445. package/dist/composables/useSpotlight.js +53 -0
  446. package/dist/composables/useTilt.js +26 -18
  447. package/dist/composables/useTween.d.ts +43 -0
  448. package/dist/composables/useTween.js +69 -0
  449. package/dist/composables/useView.d.ts +18 -0
  450. package/dist/composables/useView.js +61 -0
  451. package/dist/icons-all.js +1 -1
  452. package/dist/index.d.ts +98 -1
  453. package/dist/index.js +262 -104
  454. package/dist/theme/define.d.ts +12 -0
  455. package/dist/theme/studio.d.ts +90 -0
  456. package/package.json +5 -2
  457. package/src/component-names.ts +33 -0
  458. package/src/components/AttentionDot.vue +27 -0
  459. package/src/components/FieldWrapper.vue +38 -0
  460. package/src/components/LayoutNode.vue +5 -9
  461. package/src/components/LegendSwatch.vue +15 -0
  462. package/src/components/LoaderMark.vue +90 -0
  463. package/src/components/LpActionBar.vue +12 -20
  464. package/src/components/LpActivityLine.vue +186 -0
  465. package/src/components/LpAlert.vue +54 -24
  466. package/src/components/LpAppShell.vue +7 -11
  467. package/src/components/LpAutocomplete.vue +16 -14
  468. package/src/components/LpAvatar.vue +17 -2
  469. package/src/components/LpBadge.vue +77 -13
  470. package/src/components/LpBreadcrumbs.vue +101 -35
  471. package/src/components/LpButton.vue +15 -3
  472. package/src/components/LpCard.vue +30 -7
  473. package/src/components/LpChart.vue +152 -156
  474. package/src/components/LpCheckbox.vue +10 -4
  475. package/src/components/LpCodeBlock.vue +11 -19
  476. package/src/components/LpCodeDisplay.vue +228 -0
  477. package/src/components/LpCollapse.vue +162 -0
  478. package/src/components/LpColorPicker.vue +10 -1
  479. package/src/components/LpCommandPalette.vue +38 -24
  480. package/src/components/LpContextMenu.vue +10 -1
  481. package/src/components/LpCopyButton.vue +185 -0
  482. package/src/components/LpCountdown.vue +308 -0
  483. package/src/components/LpDataList.vue +154 -0
  484. package/src/components/LpDatePicker.vue +53 -104
  485. package/src/components/LpDateRangePicker.vue +49 -95
  486. package/src/components/LpDisclosure.vue +58 -36
  487. package/src/components/LpDock.vue +274 -0
  488. package/src/components/LpDrawer.vue +10 -1
  489. package/src/components/LpDropdownMenu.vue +10 -1
  490. package/src/components/LpDropzone.vue +34 -13
  491. package/src/components/LpEditable.vue +293 -0
  492. package/src/components/LpFileTree.vue +5 -1
  493. package/src/components/LpFileTreeNode.vue +25 -50
  494. package/src/components/LpFormField.vue +22 -3
  495. package/src/components/LpFrame.vue +200 -0
  496. package/src/components/LpGauge.vue +287 -0
  497. package/src/components/LpGlowBorder.vue +60 -0
  498. package/src/components/LpHintExample.vue +14 -38
  499. package/src/components/LpHintLayer.vue +13 -3
  500. package/src/components/LpHoverCard.vue +175 -0
  501. package/src/components/LpIdenticon.vue +69 -0
  502. package/src/components/LpImageEditor.vue +15 -18
  503. package/src/components/LpInfraNode.vue +27 -16
  504. package/src/components/LpInput.vue +30 -16
  505. package/src/components/LpLightbox.vue +44 -23
  506. package/src/components/LpLoader.vue +145 -0
  507. package/src/components/LpLogViewer.vue +311 -82
  508. package/src/components/LpMagnetic.vue +97 -0
  509. package/src/components/LpMapPicker.vue +26 -28
  510. package/src/components/LpMasonry.vue +247 -0
  511. package/src/components/LpModal.vue +10 -1
  512. package/src/components/LpNotificationBell.vue +33 -49
  513. package/src/components/LpNumberField.vue +79 -14
  514. package/src/components/LpNumberFlow.vue +10 -35
  515. package/src/components/LpOtpInput.vue +7 -2
  516. package/src/components/LpPagination.vue +38 -4
  517. package/src/components/LpPalettePreview.vue +2 -7
  518. package/src/components/LpPasswordInput.vue +16 -14
  519. package/src/components/LpPhoneInput.vue +12 -3
  520. package/src/components/LpPie.vue +197 -36
  521. package/src/components/LpPipeline.vue +366 -0
  522. package/src/components/LpPopover.vue +10 -1
  523. package/src/components/LpProgress.vue +22 -84
  524. package/src/components/LpQuota.vue +197 -0
  525. package/src/components/LpRangeSlider.vue +5 -1
  526. package/src/components/LpRelativeTime.vue +90 -0
  527. package/src/components/LpRepeater.vue +80 -0
  528. package/src/components/LpRevealOnScroll.vue +125 -0
  529. package/src/components/LpScramble.vue +107 -0
  530. package/src/components/LpSecretField.vue +313 -0
  531. package/src/components/LpSegmented.vue +3 -10
  532. package/src/components/LpSelect.vue +78 -64
  533. package/src/components/LpShaderBackdrop.vue +434 -0
  534. package/src/components/LpShinyText.vue +139 -0
  535. package/src/components/LpSidebar.vue +2 -0
  536. package/src/components/LpSlider.vue +5 -1
  537. package/src/components/LpSparkline.vue +55 -37
  538. package/src/components/LpSpotlight.vue +51 -0
  539. package/src/components/LpStat.vue +6 -2
  540. package/src/components/LpStatus.vue +127 -0
  541. package/src/components/LpStepMark.vue +138 -0
  542. package/src/components/LpStepper.vue +37 -43
  543. package/src/components/LpSwap.vue +2 -2
  544. package/src/components/LpSwitch.vue +15 -22
  545. package/src/components/LpTable.vue +47 -63
  546. package/src/components/LpTableFilter.vue +1 -0
  547. package/src/components/LpTableOfContents.vue +53 -29
  548. package/src/components/LpTabs.vue +10 -21
  549. package/src/components/LpTagsInput.vue +53 -37
  550. package/src/components/LpTextReveal.vue +236 -0
  551. package/src/components/LpTextarea.vue +11 -11
  552. package/src/components/LpThemeStudio.vue +216 -0
  553. package/src/components/LpThemeStudioSection.vue +16 -0
  554. package/src/components/LpThemeSwitcher.vue +156 -47
  555. package/src/components/LpTimeField.vue +9 -1
  556. package/src/components/LpToaster.vue +63 -83
  557. package/src/components/LpTooltip.vue +10 -1
  558. package/src/components/LpTour.vue +24 -13
  559. package/src/components/LpTruncate.vue +135 -0
  560. package/src/components/LpTypewriter.vue +236 -0
  561. package/src/components/LpUptimeBar.vue +6 -5
  562. package/src/components/LpVideoBackdrop.vue +15 -13
  563. package/src/components/OptionContent.vue +17 -0
  564. package/src/components/PickerField.vue +58 -0
  565. package/src/components/RevealToggle.vue +51 -0
  566. package/src/components/StepConnector.vue +54 -0
  567. package/src/components/TourCard.vue +29 -16
  568. package/src/components/badge.ts +8 -0
  569. package/src/components/chart.ts +8 -23
  570. package/src/components/dateRange.ts +25 -0
  571. package/src/components/dock.ts +31 -0
  572. package/src/components/dropdown.ts +15 -3
  573. package/src/components/fieldText.ts +95 -0
  574. package/src/components/fileTree.ts +19 -21
  575. package/src/components/format.ts +136 -0
  576. package/src/components/identicon.ts +160 -0
  577. package/src/components/masonry.ts +73 -0
  578. package/src/components/meter.ts +122 -0
  579. package/src/components/otp.ts +14 -3
  580. package/src/components/pipeline.ts +101 -0
  581. package/src/components/quota.ts +111 -0
  582. package/src/components/relativeTime.ts +118 -0
  583. package/src/components/reveal.ts +56 -0
  584. package/src/components/scramble.ts +138 -0
  585. package/src/components/shaderBackdrop.ts +208 -0
  586. package/src/components/slider.ts +30 -0
  587. package/src/components/slotText.ts +13 -0
  588. package/src/components/status.ts +46 -0
  589. package/src/components/tableFacets.ts +25 -0
  590. package/src/components/textSplit.ts +55 -0
  591. package/src/components/timeSpan.ts +183 -0
  592. package/src/components/tone.ts +144 -0
  593. package/src/components/tour.ts +3 -2
  594. package/src/components/typewriter.ts +104 -0
  595. package/src/components/videoBackdrop.ts +7 -6
  596. package/src/composables/easing.ts +66 -1
  597. package/src/composables/pseudoLocale.ts +105 -0
  598. package/src/composables/scroll.ts +6 -3
  599. package/src/composables/useClipboard.ts +25 -3
  600. package/src/composables/useField.ts +12 -0
  601. package/src/composables/useForm.ts +27 -6
  602. package/src/composables/useHintSystem.ts +40 -0
  603. package/src/composables/useHints.ts +14 -3
  604. package/src/composables/useInView.ts +61 -0
  605. package/src/composables/useLoadingGate.ts +63 -0
  606. package/src/composables/useLpConfig.ts +20 -1
  607. package/src/composables/useMediaQuery.ts +6 -2
  608. package/src/composables/useNow.ts +84 -0
  609. package/src/composables/usePersisted.ts +19 -8
  610. package/src/composables/usePillTransition.ts +21 -13
  611. package/src/composables/usePointerFrame.ts +72 -0
  612. package/src/composables/useReducedMotion.ts +22 -0
  613. package/src/composables/useRepeater.ts +44 -0
  614. package/src/composables/useResizeObserver.ts +59 -0
  615. package/src/composables/useRevealedValue.ts +84 -0
  616. package/src/composables/useScramble.ts +152 -0
  617. package/src/composables/useShift.ts +10 -16
  618. package/src/composables/useSpotlight.ts +82 -0
  619. package/src/composables/useTilt.ts +40 -23
  620. package/src/composables/useTween.ts +149 -0
  621. package/src/composables/useView.ts +93 -0
  622. package/src/index.css +1 -0
  623. package/src/index.ts +143 -1
  624. package/src/kit-icons.ts +1 -1
  625. package/src/theme/define.ts +65 -0
  626. package/src/theme/studio.ts +202 -0
  627. package/src/tokens/effects.css +151 -0
  628. package/src/tokens/tokens.css +131 -39
  629. package/src/tokens/utilities.css +81 -0
  630. package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
  631. package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
  632. package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
  633. package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
  634. package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
  635. package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
  636. package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
  637. package/dist/chunks/LpStepper-C2slwObu.js +0 -90
  638. package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
  639. package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
  640. 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, onBeforeUnmount } from "vue"
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
- onBeforeUnmount(() => {
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
- const presence = ref(new Map<string, number>())
282
- let presenceFrame: number | undefined
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 yet is fully present, NOT "0 because it is hidden".
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
- watch(
296
- // A string, not the Set: `hidden` is replaced wholesale on every toggle, and a
297
- // watcher handed the object itself compares the new reference to the old one
298
- // and sees a change it cannot describe — or, with a stale copy in the array,
299
- // no change at all. The names that are currently off say it exactly.
300
- () =>
301
- allSeries.value.map((s) => `${s.id}:${hidden.value.has(s.id) ? 0 : 1}`).join(","),
302
- () => {
303
- const targets = new Map(allSeries.value.map((s) => [s.id, hidden.value.has(s.id) ? 0 : 1]))
304
- if (!props.animate || prefersReducedMotion()) {
305
- presence.value = targets
306
- return
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
- const from = new Map(allSeries.value.map((s) => [s.id, presenceOf(s.id)]))
310
- if ([...targets].every(([name, to]) => from.get(name) === to)) return
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
- const start = performance.now()
313
- if (presenceFrame) cancelAnimationFrame(presenceFrame)
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
- const step = (now: number) => {
316
- const t = Math.min(1, (now - start) / SETTLE_MS)
317
- // Same curve as the axis: the curve and its scale travel together.
318
- const eased = easeTravel(t)
319
- const next = new Map<string, number>()
320
- for (const [name, to] of targets) {
321
- const a = from.get(name) ?? to
322
- next.set(name, a + (to - a) * eased)
323
- }
324
- presence.value = next
325
- presenceFrame = t < 1 ? requestAnimationFrame(step) : undefined
326
- }
327
- presenceFrame = requestAnimationFrame(step)
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
- const scale = ref(targetScale.value)
443
- let scaleFrame: number | undefined
492
+ type Range = { min: number; max: number; step: number }
444
493
 
445
- watch(targetScale, (to, from) => {
446
- if (!props.animate || prefersReducedMotion() || !from) {
447
- scale.value = to
448
- return
449
- }
450
- if (from.min === to.min && from.max === to.max && from.step === to.step) return
451
-
452
- const start = performance.now()
453
- if (scaleFrame) cancelAnimationFrame(scaleFrame)
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 = ref(targetRightScale.value)
501
- let rightFrame: number | undefined
502
-
503
- watch(targetRightScale, (to, from) => {
504
- if (!to || !from || !props.animate || prefersReducedMotion()) {
505
- rightScale.value = to
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 = ref(targetGutters.value)
583
- let gutterFrame: number | undefined
584
-
585
- watch(targetGutters, (to, from) => {
586
- if (!props.animate || prefersReducedMotion() || !from) {
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
- allSeries.value.map((s) => {
691
+ drawnSeries.value.map((s) => {
705
692
  const g = geoOf(s)
706
- const p = presenceOf(s.id)
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 v = s.values[i]
756
- if (v == null) continue
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(v, sc.min, sc.max, box.value),
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 on data change so an update
948
- // replays the reveal instead of snapping.
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
- /* Keyed on the chart's SHAPE, not its values: a polled dashboard refreshing
951
- its numbers every few seconds must not re-wipe on every tick. */
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
- () => `${props.type}|${count.value}|${allSeries.value.map((s) => s.id).join(",")}`,
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
- <span
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.id"
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.id}`" :style="{ opacity: s.alpha }">
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 rounded-control border border-line bg-surface-overlay px-2.5 py-2 shadow-panel backdrop-blur group-data-[state=open]/plot:hidden"
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
- <LpIcon
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
- name="lucide:loader-circle"
90
- :size="12"
91
- class="absolute animate-spin motion-reduce:animate-none"
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
- <button
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
- type="button"
259
- class="group/copy flex items-center gap-1 rounded-small px-1.5 py-1 outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring"
260
- :aria-label="copied ? text.copied : text.copy"
261
- @click="copy"
262
- >
263
- <LpIcon
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