@leavepulse/ui 0.69.0 → 0.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +49 -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/LpRepeater-C1Cw27hj.css +21 -0
  11. package/dist/assets/{LpRollingText-BGnE6q9j.css → LpRollingText-dyOXedGO.css} +7 -0
  12. package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
  13. package/dist/assets/LpStatus-430OGTZY.css +17 -0
  14. package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
  15. package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
  16. package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
  17. package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
  18. package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
  19. package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
  20. package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-6kxEivBI.js} +11 -5
  21. package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
  22. package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
  23. package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
  24. package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
  25. package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
  26. package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
  27. package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
  28. package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
  29. package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-Chv_Xf8q.js} +7 -7
  30. package/dist/chunks/LpAlert-C5igj802.js +119 -0
  31. package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-BiWByLmt.js} +15 -16
  32. package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
  33. package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
  34. package/dist/chunks/LpBadge-BBq1Er9T.js +126 -0
  35. package/dist/chunks/LpBreadcrumbs-JKEi_yFF.js +144 -0
  36. package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
  37. package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
  38. package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
  39. package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
  40. package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
  41. package/dist/chunks/LpCodeDisplay-CbJMs-IK.js +189 -0
  42. package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
  43. package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-B7HSIFmn.js} +11 -6
  44. package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
  45. package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
  46. package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-Cj96ENDC.js} +16 -7
  47. package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
  48. package/dist/chunks/LpCountdown-BQnmB4gq.js +231 -0
  49. package/dist/chunks/LpDataList-CHNYQw7h.js +121 -0
  50. package/dist/chunks/LpDatePicker-ac1_6o5P.js +169 -0
  51. package/dist/chunks/LpDateRangePicker-B15gYrZJ.js +127 -0
  52. package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
  53. package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
  54. package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-R4aYVtVV.js} +14 -6
  55. package/dist/chunks/LpEditable-Ws3DNQHn.js +238 -0
  56. package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
  57. package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
  58. package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DDNg34tJ.js} +5 -3
  59. package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-DmPuYNZ_.js} +42 -55
  60. package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
  61. package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
  62. package/dist/chunks/LpGauge-C14Z9503.js +204 -0
  63. package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
  64. package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
  65. package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-HvwUA5Ec.js} +27 -14
  66. package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-DxbPKOzQ.js} +3 -3
  67. package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
  68. package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
  69. package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
  70. package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-D64hywJI.js} +39 -25
  71. package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
  72. package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
  73. package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
  74. package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-DKK4ySZl.js} +225 -129
  75. package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
  76. package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
  77. package/dist/chunks/LpMasonry--k0571qG.js +185 -0
  78. package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-rmI1DjKN.js} +3 -3
  79. package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
  80. package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-DiyFCHiZ.js} +4 -4
  81. package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-D-WhE5m2.js} +32 -48
  82. package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
  83. package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
  84. package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
  85. package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
  86. package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
  87. package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-GL2KOFK8.js} +26 -22
  88. package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
  89. package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-BgXZ3xmm.js} +159 -48
  90. package/dist/chunks/LpPipeline-B31h41Mu.js +329 -0
  91. package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-DmZ3wUtP.js} +13 -7
  92. package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
  93. package/dist/chunks/LpQuota-DaL8TgNe.js +162 -0
  94. package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
  95. package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
  96. package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
  97. package/dist/chunks/LpRelativeTime-yin9uQP7.js +73 -0
  98. package/dist/chunks/LpRepeater-D0S7jjwr.js +180 -0
  99. package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
  100. package/dist/chunks/{LpRollingText-DB7upf-5.js → LpRollingText-DiL717LK.js} +4 -3
  101. package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
  102. package/dist/chunks/LpSecretField-CfWyHv9m.js +316 -0
  103. package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
  104. package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
  105. package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-C_8cJtj6.js} +91 -111
  106. package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
  107. package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
  108. package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-CZRXtvem.js} +5 -3
  109. package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DBg1U1oW.js} +3 -3
  110. package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
  111. package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
  112. package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
  113. package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-DFKlPJgy.js} +38 -35
  114. package/dist/chunks/LpStatus-BsGLrpor.js +86 -0
  115. package/dist/chunks/LpStepMark-TrzOioa9.js +101 -0
  116. package/dist/chunks/LpStepper-BbnS5jUr.js +76 -0
  117. package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
  118. package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
  119. package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
  120. package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
  121. package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DZg80W-B.js} +68 -71
  122. package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
  123. package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
  124. package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
  125. package/dist/chunks/LpThemeStudio-DxVZMtzN.js +416 -0
  126. package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
  127. package/dist/chunks/LpThemeSwitcher-CadVBTBn.js +278 -0
  128. package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
  129. package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
  130. package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
  131. package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-C17A1XCb.js} +1 -1
  132. package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-CY2bFXge.js} +24 -18
  133. package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
  134. package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
  135. package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-Tew1Ykx4.js} +10 -9
  136. package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
  137. package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
  138. package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
  139. package/dist/chunks/PickerField-DoHv0WMH.js +125 -0
  140. package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
  141. package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
  142. package/dist/chunks/TourCard-BJ8i7dk0.js +123 -0
  143. package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
  144. package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
  145. package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
  146. package/dist/component-names.d.ts +1 -1
  147. package/dist/components/AttentionDot.vue.d.ts +9 -0
  148. package/dist/components/AttentionDot.vue.js +4 -0
  149. package/dist/components/ContextMenuItems.vue.js +1 -1
  150. package/dist/components/DropzoneLinkField.vue.js +1 -1
  151. package/dist/components/FieldWrapper.vue.d.ts +25 -0
  152. package/dist/components/FieldWrapper.vue.js +4 -0
  153. package/dist/components/LayoutCanvas.vue.js +1 -1
  154. package/dist/components/LayoutNode.vue.d.ts +4 -4
  155. package/dist/components/LayoutNode.vue.js +1 -1
  156. package/dist/components/LegendSwatch.vue.d.ts +6 -0
  157. package/dist/components/LegendSwatch.vue.js +4 -0
  158. package/dist/components/LoaderMark.vue.d.ts +12 -0
  159. package/dist/components/LoaderMark.vue.js +4 -0
  160. package/dist/components/LpActionBar.vue.js +1 -1
  161. package/dist/components/LpActivityLine.vue.d.ts +58 -0
  162. package/dist/components/LpActivityLine.vue.js +4 -0
  163. package/dist/components/LpAddressInput.vue.js +1 -1
  164. package/dist/components/LpAlert.vue.d.ts +2 -2
  165. package/dist/components/LpAlert.vue.js +1 -1
  166. package/dist/components/LpAppShell.vue.d.ts +8 -7
  167. package/dist/components/LpAppShell.vue.js +1 -1
  168. package/dist/components/LpAutocomplete.vue.js +1 -1
  169. package/dist/components/LpAvatar.vue.d.ts +16 -0
  170. package/dist/components/LpAvatar.vue.js +1 -1
  171. package/dist/components/LpBadge.vue.d.ts +19 -5
  172. package/dist/components/LpBadge.vue.js +1 -1
  173. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  174. package/dist/components/LpButton.vue.d.ts +2 -2
  175. package/dist/components/LpButton.vue.js +1 -1
  176. package/dist/components/LpCalendar.vue.js +1 -1
  177. package/dist/components/LpCard.vue.d.ts +24 -0
  178. package/dist/components/LpCard.vue.js +1 -1
  179. package/dist/components/LpChart.vue.js +131 -160
  180. package/dist/components/LpCheckbox.vue.d.ts +2 -2
  181. package/dist/components/LpCheckbox.vue.js +1 -1
  182. package/dist/components/LpCodeBlock.vue.js +1 -1
  183. package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
  184. package/dist/components/LpCodeDisplay.vue.js +4 -0
  185. package/dist/components/LpCollapse.vue.d.ts +58 -0
  186. package/dist/components/LpCollapse.vue.js +4 -0
  187. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  188. package/dist/components/LpColorPicker.vue.js +1 -1
  189. package/dist/components/LpCommandPalette.vue.js +34 -23
  190. package/dist/components/LpConfirmDialog.vue.js +1 -1
  191. package/dist/components/LpConfirmHost.vue.js +1 -1
  192. package/dist/components/LpContextMenu.vue.js +1 -1
  193. package/dist/components/LpCopyButton.vue.d.ts +82 -0
  194. package/dist/components/LpCopyButton.vue.js +4 -0
  195. package/dist/components/LpCountdown.vue.d.ts +100 -0
  196. package/dist/components/LpCountdown.vue.js +4 -0
  197. package/dist/components/LpDataList.vue.d.ts +66 -0
  198. package/dist/components/LpDataList.vue.js +4 -0
  199. package/dist/components/LpDatePicker.vue.d.ts +3 -1
  200. package/dist/components/LpDatePicker.vue.js +1 -1
  201. package/dist/components/LpDateRangePicker.vue.d.ts +3 -1
  202. package/dist/components/LpDateRangePicker.vue.js +1 -1
  203. package/dist/components/LpDisclosure.vue.js +1 -1
  204. package/dist/components/LpDock.vue.d.ts +74 -0
  205. package/dist/components/LpDock.vue.js +204 -0
  206. package/dist/components/LpDrawer.vue.js +1 -1
  207. package/dist/components/LpDropdownMenu.vue.js +1 -1
  208. package/dist/components/LpDropzone.vue.d.ts +8 -1
  209. package/dist/components/LpDropzone.vue.js +36 -15
  210. package/dist/components/LpEditable.vue.d.ts +85 -0
  211. package/dist/components/LpEditable.vue.js +4 -0
  212. package/dist/components/LpEmptyState.vue.js +1 -1
  213. package/dist/components/LpFieldNotice.vue.js +1 -1
  214. package/dist/components/LpFileTree.vue.js +1 -1
  215. package/dist/components/LpFileTreeNode.vue.js +1 -1
  216. package/dist/components/LpFormField.vue.js +1 -1
  217. package/dist/components/LpFrame.vue.d.ts +22 -0
  218. package/dist/components/LpFrame.vue.js +4 -0
  219. package/dist/components/LpGauge.vue.d.ts +116 -0
  220. package/dist/components/LpGauge.vue.js +4 -0
  221. package/dist/components/LpGlowBorder.vue.d.ts +47 -0
  222. package/dist/components/LpGlowBorder.vue.js +4 -0
  223. package/dist/components/LpHintExample.vue.d.ts +2 -2
  224. package/dist/components/LpHintExample.vue.js +1 -1
  225. package/dist/components/LpHintLayer.vue.js +1 -1
  226. package/dist/components/LpHints.vue.js +1 -1
  227. package/dist/components/LpHoverCard.vue.d.ts +60 -0
  228. package/dist/components/LpHoverCard.vue.js +4 -0
  229. package/dist/components/LpIcon.vue.js +1 -1
  230. package/dist/components/LpIdenticon.vue.d.ts +37 -0
  231. package/dist/components/LpIdenticon.vue.js +4 -0
  232. package/dist/components/LpImageEditor.vue.js +13 -19
  233. package/dist/components/LpInfraNode.vue.js +1 -1
  234. package/dist/components/LpInput.vue.d.ts +10 -0
  235. package/dist/components/LpInput.vue.js +1 -1
  236. package/dist/components/LpLightbox.vue.js +1 -1
  237. package/dist/components/LpLoader.vue.d.ts +106 -0
  238. package/dist/components/LpLoader.vue.js +4 -0
  239. package/dist/components/LpLogViewer.vue.js +1 -1
  240. package/dist/components/LpMagnetic.vue.d.ts +28 -0
  241. package/dist/components/LpMagnetic.vue.js +4 -0
  242. package/dist/components/LpMapPicker.vue.js +1 -1
  243. package/dist/components/LpMasonry.vue.d.ts +42 -0
  244. package/dist/components/LpMasonry.vue.js +4 -0
  245. package/dist/components/LpMediaGallery.vue.js +1 -1
  246. package/dist/components/LpModal.vue.js +1 -1
  247. package/dist/components/LpModalNav.vue.js +1 -1
  248. package/dist/components/LpNotificationBell.vue.d.ts +15 -6
  249. package/dist/components/LpNotificationBell.vue.js +1 -1
  250. package/dist/components/LpNumberField.vue.d.ts +57 -0
  251. package/dist/components/LpNumberField.vue.js +1 -1
  252. package/dist/components/LpNumberFlow.vue.js +1 -1
  253. package/dist/components/LpOtpInput.vue.d.ts +12 -4
  254. package/dist/components/LpOtpInput.vue.js +1 -1
  255. package/dist/components/LpPagination.vue.js +1 -1
  256. package/dist/components/LpPaletteFacts.vue.js +2 -2
  257. package/dist/components/LpPaletteHeader.vue.js +2 -2
  258. package/dist/components/LpPalettePreview.vue.js +1 -1
  259. package/dist/components/LpPaletteStats.vue.js +2 -2
  260. package/dist/components/LpPasswordInput.vue.d.ts +19 -2
  261. package/dist/components/LpPasswordInput.vue.js +1 -1
  262. package/dist/components/LpPhoneInput.vue.js +1 -1
  263. package/dist/components/LpPie.vue.d.ts +3 -1
  264. package/dist/components/LpPie.vue.js +1 -1
  265. package/dist/components/LpPipeline.vue.d.ts +91 -0
  266. package/dist/components/LpPipeline.vue.js +4 -0
  267. package/dist/components/LpPopover.vue.d.ts +2 -2
  268. package/dist/components/LpPopover.vue.js +1 -1
  269. package/dist/components/LpProgress.vue.d.ts +11 -4
  270. package/dist/components/LpProgress.vue.js +1 -1
  271. package/dist/components/LpQuota.vue.d.ts +68 -0
  272. package/dist/components/LpQuota.vue.js +4 -0
  273. package/dist/components/LpRadioGroup.vue.js +1 -1
  274. package/dist/components/LpRangeCalendar.vue.js +1 -1
  275. package/dist/components/LpRangeSlider.vue.js +1 -1
  276. package/dist/components/LpRelativeTime.vue.d.ts +41 -0
  277. package/dist/components/LpRelativeTime.vue.js +4 -0
  278. package/dist/components/LpRepeater.vue.d.ts +48 -0
  279. package/dist/components/LpRepeater.vue.js +4 -0
  280. package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
  281. package/dist/components/LpRevealOnScroll.vue.js +4 -0
  282. package/dist/components/LpRollingText.vue.d.ts +3 -1
  283. package/dist/components/LpRollingText.vue.js +1 -1
  284. package/dist/components/LpScramble.vue.d.ts +55 -0
  285. package/dist/components/LpScramble.vue.js +4 -0
  286. package/dist/components/LpScrollArea.vue.d.ts +1 -1
  287. package/dist/components/LpSecretField.vue.d.ts +108 -0
  288. package/dist/components/LpSecretField.vue.js +4 -0
  289. package/dist/components/LpSection.vue.js +1 -1
  290. package/dist/components/LpSegmented.vue.js +1 -1
  291. package/dist/components/LpSelect.vue.d.ts +2 -0
  292. package/dist/components/LpSelect.vue.js +1 -1
  293. package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
  294. package/dist/components/LpShaderBackdrop.vue.js +4 -0
  295. package/dist/components/LpShinyText.vue.d.ts +39 -0
  296. package/dist/components/LpShinyText.vue.js +4 -0
  297. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  298. package/dist/components/LpSidebar.vue.js +1 -1
  299. package/dist/components/LpSidebarNav.vue.js +1 -1
  300. package/dist/components/LpSlider.vue.js +1 -1
  301. package/dist/components/LpSparkline.vue.d.ts +4 -3
  302. package/dist/components/LpSparkline.vue.js +1 -1
  303. package/dist/components/LpSpotlight.vue.d.ts +37 -0
  304. package/dist/components/LpSpotlight.vue.js +4 -0
  305. package/dist/components/LpStat.vue.js +1 -1
  306. package/dist/components/LpStatus.vue.d.ts +65 -0
  307. package/dist/components/LpStatus.vue.js +4 -0
  308. package/dist/components/LpStepMark.vue.d.ts +31 -0
  309. package/dist/components/LpStepMark.vue.js +4 -0
  310. package/dist/components/LpStepper.vue.js +1 -1
  311. package/dist/components/LpSwap.vue.js +1 -1
  312. package/dist/components/LpSwitch.vue.d.ts +2 -2
  313. package/dist/components/LpSwitch.vue.js +1 -1
  314. package/dist/components/LpTable.vue.js +104 -120
  315. package/dist/components/LpTableFilter.vue.js +1 -1
  316. package/dist/components/LpTableOfContents.vue.d.ts +6 -1
  317. package/dist/components/LpTableOfContents.vue.js +1 -1
  318. package/dist/components/LpTabs.vue.d.ts +5 -5
  319. package/dist/components/LpTabs.vue.js +25 -33
  320. package/dist/components/LpTagsInput.vue.js +1 -1
  321. package/dist/components/LpTextReveal.vue.d.ts +58 -0
  322. package/dist/components/LpTextReveal.vue.js +4 -0
  323. package/dist/components/LpTextarea.vue.js +1 -1
  324. package/dist/components/LpThemeProvider.vue.js +1 -1
  325. package/dist/components/LpThemeStudio.vue.d.ts +54 -0
  326. package/dist/components/LpThemeStudio.vue.js +4 -0
  327. package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
  328. package/dist/components/LpThemeStudioSection.vue.js +4 -0
  329. package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
  330. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  331. package/dist/components/LpTimeField.vue.d.ts +2 -0
  332. package/dist/components/LpTimeField.vue.js +1 -1
  333. package/dist/components/LpToaster.vue.js +1 -1
  334. package/dist/components/LpTooltip.vue.d.ts +2 -2
  335. package/dist/components/LpTooltip.vue.js +1 -1
  336. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  337. package/dist/components/LpTour.vue.js +1 -1
  338. package/dist/components/LpTruncate.vue.d.ts +34 -0
  339. package/dist/components/LpTruncate.vue.js +4 -0
  340. package/dist/components/LpTypewriter.vue.d.ts +61 -0
  341. package/dist/components/LpTypewriter.vue.js +4 -0
  342. package/dist/components/LpUptimeBar.vue.js +1 -1
  343. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  344. package/dist/components/MenuTitle.vue.js +1 -1
  345. package/dist/components/OptionContent.vue.d.ts +7 -0
  346. package/dist/components/OptionContent.vue.js +4 -0
  347. package/dist/components/PickerField.vue.d.ts +45 -0
  348. package/dist/components/PickerField.vue.js +4 -0
  349. package/dist/components/RevealToggle.vue.d.ts +21 -0
  350. package/dist/components/RevealToggle.vue.js +4 -0
  351. package/dist/components/StepConnector.vue.d.ts +19 -0
  352. package/dist/components/StepConnector.vue.js +4 -0
  353. package/dist/components/TourCard.vue.js +1 -1
  354. package/dist/components/badge.d.ts +1 -0
  355. package/dist/components/badge.js +4 -0
  356. package/dist/components/chart.d.ts +5 -1
  357. package/dist/components/chart.js +2 -21
  358. package/dist/components/dateRange.d.ts +11 -0
  359. package/dist/components/dateRange.js +12 -0
  360. package/dist/components/dock.d.ts +19 -0
  361. package/dist/components/dock.js +16 -0
  362. package/dist/components/dropdown.d.ts +10 -1
  363. package/dist/components/dropdown.js +7 -2
  364. package/dist/components/fieldText.d.ts +38 -0
  365. package/dist/components/fieldText.js +53 -0
  366. package/dist/components/fileTree.d.ts +7 -3
  367. package/dist/components/fileTree.js +12 -18
  368. package/dist/components/format.d.ts +41 -0
  369. package/dist/components/format.js +67 -0
  370. package/dist/components/identicon.d.ts +38 -0
  371. package/dist/components/identicon.js +85 -0
  372. package/dist/components/masonry.d.ts +32 -0
  373. package/dist/components/masonry.js +40 -0
  374. package/dist/components/menuWhen.js +1 -1
  375. package/dist/components/meter.d.ts +64 -0
  376. package/dist/components/meter.js +53 -0
  377. package/dist/components/otp.d.ts +1 -1
  378. package/dist/components/otp.js +7 -2
  379. package/dist/components/pipeline.d.ts +55 -0
  380. package/dist/components/pipeline.js +51 -0
  381. package/dist/components/quota.d.ts +57 -0
  382. package/dist/components/quota.js +40 -0
  383. package/dist/components/relativeTime.d.ts +24 -0
  384. package/dist/components/relativeTime.js +56 -0
  385. package/dist/components/reveal.d.ts +18 -0
  386. package/dist/components/reveal.js +32 -0
  387. package/dist/components/scramble.d.ts +68 -0
  388. package/dist/components/scramble.js +58 -0
  389. package/dist/components/shaderBackdrop.d.ts +20 -0
  390. package/dist/components/shaderBackdrop.js +156 -0
  391. package/dist/components/slider.d.ts +5 -0
  392. package/dist/components/slider.js +24 -0
  393. package/dist/components/slotText.d.ts +2 -0
  394. package/dist/components/slotText.js +9 -0
  395. package/dist/components/status.d.ts +14 -0
  396. package/dist/components/status.js +22 -0
  397. package/dist/components/tableFacets.d.ts +8 -0
  398. package/dist/components/tableFacets.js +19 -0
  399. package/dist/components/textSplit.d.ts +17 -0
  400. package/dist/components/textSplit.js +24 -0
  401. package/dist/components/timeSpan.d.ts +78 -0
  402. package/dist/components/timeSpan.js +85 -0
  403. package/dist/components/tone.d.ts +43 -0
  404. package/dist/components/tone.js +82 -0
  405. package/dist/components/tour.js +3 -2
  406. package/dist/components/typewriter.d.ts +36 -0
  407. package/dist/components/typewriter.js +53 -0
  408. package/dist/components/videoBackdrop.js +5 -6
  409. package/dist/composables/easing.d.ts +22 -1
  410. package/dist/composables/easing.js +42 -1
  411. package/dist/composables/pseudoLocale.d.ts +15 -0
  412. package/dist/composables/pseudoLocale.js +96 -0
  413. package/dist/composables/scroll.js +5 -3
  414. package/dist/composables/useClipboard.d.ts +4 -1
  415. package/dist/composables/useClipboard.js +12 -2
  416. package/dist/composables/useField.d.ts +13 -0
  417. package/dist/composables/useField.js +26 -1
  418. package/dist/composables/useForm.js +32 -9
  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 +64 -0
  451. package/dist/icons-all.js +1 -1
  452. package/dist/index.d.ts +98 -1
  453. package/dist/index.js +263 -105
  454. package/dist/theme/define.d.ts +12 -0
  455. package/dist/theme/studio.d.ts +90 -0
  456. package/package.json +8 -2
  457. package/src/component-names.ts +33 -0
  458. package/src/components/AttentionDot.vue +27 -0
  459. package/src/components/ContextMenuItems.vue +5 -2
  460. package/src/components/FieldWrapper.vue +38 -0
  461. package/src/components/LayoutNode.vue +5 -9
  462. package/src/components/LegendSwatch.vue +15 -0
  463. package/src/components/LoaderMark.vue +90 -0
  464. package/src/components/LpActionBar.vue +12 -20
  465. package/src/components/LpActivityLine.vue +186 -0
  466. package/src/components/LpAlert.vue +54 -24
  467. package/src/components/LpAppShell.vue +7 -11
  468. package/src/components/LpAutocomplete.vue +16 -14
  469. package/src/components/LpAvatar.vue +17 -2
  470. package/src/components/LpBadge.vue +77 -13
  471. package/src/components/LpBreadcrumbs.vue +101 -35
  472. package/src/components/LpButton.vue +15 -3
  473. package/src/components/LpCard.vue +30 -7
  474. package/src/components/LpChart.vue +162 -171
  475. package/src/components/LpCheckbox.vue +10 -4
  476. package/src/components/LpCodeBlock.vue +11 -19
  477. package/src/components/LpCodeDisplay.vue +228 -0
  478. package/src/components/LpCollapse.vue +162 -0
  479. package/src/components/LpColorPicker.vue +10 -1
  480. package/src/components/LpCommandPalette.vue +38 -24
  481. package/src/components/LpContextMenu.vue +13 -3
  482. package/src/components/LpCopyButton.vue +185 -0
  483. package/src/components/LpCountdown.vue +308 -0
  484. package/src/components/LpDataList.vue +154 -0
  485. package/src/components/LpDatePicker.vue +55 -104
  486. package/src/components/LpDateRangePicker.vue +51 -95
  487. package/src/components/LpDisclosure.vue +58 -36
  488. package/src/components/LpDock.vue +274 -0
  489. package/src/components/LpDrawer.vue +10 -1
  490. package/src/components/LpDropdownMenu.vue +11 -2
  491. package/src/components/LpDropzone.vue +34 -13
  492. package/src/components/LpEditable.vue +295 -0
  493. package/src/components/LpFileTree.vue +5 -1
  494. package/src/components/LpFileTreeNode.vue +25 -50
  495. package/src/components/LpFormField.vue +22 -3
  496. package/src/components/LpFrame.vue +200 -0
  497. package/src/components/LpGauge.vue +287 -0
  498. package/src/components/LpGlowBorder.vue +60 -0
  499. package/src/components/LpHintExample.vue +9 -32
  500. package/src/components/LpHintLayer.vue +13 -3
  501. package/src/components/LpHoverCard.vue +175 -0
  502. package/src/components/LpIdenticon.vue +69 -0
  503. package/src/components/LpImageEditor.vue +15 -18
  504. package/src/components/LpInfraNode.vue +27 -16
  505. package/src/components/LpInput.vue +30 -16
  506. package/src/components/LpLightbox.vue +44 -23
  507. package/src/components/LpLoader.vue +145 -0
  508. package/src/components/LpLogViewer.vue +311 -82
  509. package/src/components/LpMagnetic.vue +97 -0
  510. package/src/components/LpMapPicker.vue +26 -28
  511. package/src/components/LpMasonry.vue +247 -0
  512. package/src/components/LpModal.vue +10 -1
  513. package/src/components/LpNotificationBell.vue +33 -49
  514. package/src/components/LpNumberField.vue +79 -14
  515. package/src/components/LpNumberFlow.vue +10 -35
  516. package/src/components/LpOtpInput.vue +7 -2
  517. package/src/components/LpPagination.vue +38 -4
  518. package/src/components/LpPalettePreview.vue +2 -7
  519. package/src/components/LpPasswordInput.vue +25 -18
  520. package/src/components/LpPhoneInput.vue +12 -3
  521. package/src/components/LpPie.vue +197 -36
  522. package/src/components/LpPipeline.vue +366 -0
  523. package/src/components/LpPopover.vue +14 -1
  524. package/src/components/LpProgress.vue +22 -84
  525. package/src/components/LpQuota.vue +197 -0
  526. package/src/components/LpRangeSlider.vue +5 -1
  527. package/src/components/LpRelativeTime.vue +90 -0
  528. package/src/components/LpRepeater.vue +131 -0
  529. package/src/components/LpRevealOnScroll.vue +125 -0
  530. package/src/components/LpRollingText.vue +12 -1
  531. package/src/components/LpScramble.vue +107 -0
  532. package/src/components/LpSecretField.vue +320 -0
  533. package/src/components/LpSegmented.vue +3 -10
  534. package/src/components/LpSelect.vue +74 -65
  535. package/src/components/LpShaderBackdrop.vue +434 -0
  536. package/src/components/LpShinyText.vue +139 -0
  537. package/src/components/LpSidebar.vue +2 -0
  538. package/src/components/LpSlider.vue +5 -1
  539. package/src/components/LpSparkline.vue +55 -37
  540. package/src/components/LpSpotlight.vue +51 -0
  541. package/src/components/LpStat.vue +6 -2
  542. package/src/components/LpStatus.vue +127 -0
  543. package/src/components/LpStepMark.vue +138 -0
  544. package/src/components/LpStepper.vue +37 -43
  545. package/src/components/LpSwap.vue +2 -2
  546. package/src/components/LpSwitch.vue +15 -22
  547. package/src/components/LpTable.vue +47 -63
  548. package/src/components/LpTableFilter.vue +1 -0
  549. package/src/components/LpTableOfContents.vue +53 -29
  550. package/src/components/LpTabs.vue +10 -21
  551. package/src/components/LpTagsInput.vue +53 -37
  552. package/src/components/LpTextReveal.vue +236 -0
  553. package/src/components/LpTextarea.vue +11 -11
  554. package/src/components/LpThemeStudio.vue +216 -0
  555. package/src/components/LpThemeStudioSection.vue +16 -0
  556. package/src/components/LpThemeSwitcher.vue +156 -47
  557. package/src/components/LpTimeField.vue +9 -1
  558. package/src/components/LpToaster.vue +63 -83
  559. package/src/components/LpTooltip.vue +10 -1
  560. package/src/components/LpTour.vue +24 -13
  561. package/src/components/LpTruncate.vue +135 -0
  562. package/src/components/LpTypewriter.vue +236 -0
  563. package/src/components/LpUptimeBar.vue +6 -5
  564. package/src/components/LpVideoBackdrop.vue +15 -13
  565. package/src/components/OptionContent.vue +17 -0
  566. package/src/components/PickerField.vue +59 -0
  567. package/src/components/RevealToggle.vue +51 -0
  568. package/src/components/StepConnector.vue +54 -0
  569. package/src/components/TourCard.vue +29 -16
  570. package/src/components/badge.ts +8 -0
  571. package/src/components/chart.ts +8 -23
  572. package/src/components/dateRange.ts +25 -0
  573. package/src/components/dock.ts +31 -0
  574. package/src/components/dropdown.ts +15 -3
  575. package/src/components/fieldText.ts +95 -0
  576. package/src/components/fileTree.ts +19 -21
  577. package/src/components/format.ts +136 -0
  578. package/src/components/identicon.ts +160 -0
  579. package/src/components/masonry.ts +73 -0
  580. package/src/components/meter.ts +122 -0
  581. package/src/components/otp.ts +14 -3
  582. package/src/components/pipeline.ts +101 -0
  583. package/src/components/quota.ts +111 -0
  584. package/src/components/relativeTime.ts +118 -0
  585. package/src/components/reveal.ts +56 -0
  586. package/src/components/scramble.ts +138 -0
  587. package/src/components/shaderBackdrop.ts +208 -0
  588. package/src/components/slider.ts +30 -0
  589. package/src/components/slotText.ts +13 -0
  590. package/src/components/status.ts +46 -0
  591. package/src/components/tableFacets.ts +25 -0
  592. package/src/components/textSplit.ts +55 -0
  593. package/src/components/timeSpan.ts +183 -0
  594. package/src/components/tone.ts +144 -0
  595. package/src/components/tour.ts +3 -2
  596. package/src/components/typewriter.ts +104 -0
  597. package/src/components/videoBackdrop.ts +7 -6
  598. package/src/composables/easing.ts +66 -1
  599. package/src/composables/pseudoLocale.ts +105 -0
  600. package/src/composables/scroll.ts +6 -3
  601. package/src/composables/useClipboard.ts +25 -3
  602. package/src/composables/useField.ts +38 -1
  603. package/src/composables/useForm.ts +41 -11
  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 +96 -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 {
@@ -196,7 +200,6 @@ const emit = defineEmits<{
196
200
  // simply have nothing to draw until the observer reports a real box.
197
201
  const root = ref<HTMLElement | null>(null)
198
202
  const width = ref(0)
199
- let ro: ResizeObserver | null = null
200
203
 
201
204
  /*
202
205
  * The wipe waits for the chart to be scrolled to. A chart is tall, so it is the
@@ -216,21 +219,9 @@ onMounted(() => {
216
219
  // wrapping the chart in a spare div just to carry a second ref.
217
220
  revealAnchor.value = root.value
218
221
  reduced.value = prefersReducedMotion()
219
- if (!root.value || typeof ResizeObserver === "undefined") return
220
- ro = new ResizeObserver(([entry]) => {
221
- width.value = entry.contentRect.width
222
- })
223
- ro.observe(root.value)
224
- width.value = root.value.clientWidth
225
222
  })
226
-
227
- onBeforeUnmount(() => {
228
- ro?.disconnect()
229
- ro = null
230
- if (presenceFrame) cancelAnimationFrame(presenceFrame)
231
- if (scaleFrame) cancelAnimationFrame(scaleFrame)
232
- if (rightFrame) cancelAnimationFrame(rightFrame)
233
- if (gutterFrame) cancelAnimationFrame(gutterFrame)
223
+ useResizeObserver(root, (entry, el) => (width.value = entry ? entry.contentRect.width : el.clientWidth), {
224
+ immediate: true,
234
225
  })
235
226
 
236
227
  // ── data ───────────────────────────────────────
@@ -282,11 +273,22 @@ const visible = computed(() => allSeries.value.filter((s) => !hidden.value.has(s
282
273
  a control responding. */
283
274
  const SETTLE_MS = 260
284
275
 
285
- const presence = ref(new Map<string, number>())
286
- 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
+ }
287
289
 
288
290
  /*
289
- * 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".
290
292
  *
291
293
  * Falling back to the hidden flag raced the animation it was meant to start:
292
294
  * the computed that draws the curve and the watcher that animates it both run
@@ -294,43 +296,87 @@ let presenceFrame: number | undefined
294
296
  * reported the end state — so a series being hidden jumped to the floor while
295
297
  * one being shown eased up from it.
296
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
+
297
314
  const presenceOf = (id: string) => presence.value.get(id) ?? 1
298
315
 
299
- watch(
300
- // A string, not the Set: `hidden` is replaced wholesale on every toggle, and a
301
- // watcher handed the object itself compares the new reference to the old one
302
- // and sees a change it cannot describe — or, with a stale copy in the array,
303
- // no change at all. The names that are currently off say it exactly.
304
- () =>
305
- allSeries.value.map((s) => `${s.id}:${hidden.value.has(s.id) ? 0 : 1}`).join(","),
306
- () => {
307
- const targets = new Map(allSeries.value.map((s) => [s.id, hidden.value.has(s.id) ? 0 : 1]))
308
- if (!props.animate || prefersReducedMotion()) {
309
- presence.value = targets
310
- return
311
- }
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
+ }
312
335
 
313
- const from = new Map(allSeries.value.map((s) => [s.id, presenceOf(s.id)]))
314
- 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
+ })
315
344
 
316
- const start = performance.now()
317
- 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
+ }
318
362
 
319
- const step = (now: number) => {
320
- const t = Math.min(1, (now - start) / SETTLE_MS)
321
- // Same curve as the axis: the curve and its scale travel together.
322
- const eased = easeTravel(t)
323
- const next = new Map<string, number>()
324
- for (const [name, to] of targets) {
325
- const a = from.get(name) ?? to
326
- next.set(name, a + (to - a) * eased)
327
- }
328
- presence.value = next
329
- presenceFrame = t < 1 ? requestAnimationFrame(step) : undefined
330
- }
331
- presenceFrame = requestAnimationFrame(step)
332
- },
333
- )
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
+ })
334
380
 
335
381
  const count = computed(() => pointCount(allSeries.value))
336
382
  const labels = computed(() => resolveLabels(source.value, props.labels, count.value))
@@ -443,40 +489,21 @@ const targetScale = computed(() =>
443
489
  * and `y2` on an SVG <line> never became CSS properties, so a gridline jumps
444
490
  * while the curve eases, which is the two-beat effect this avoids.
445
491
  */
446
- const scale = ref(targetScale.value)
447
- let scaleFrame: number | undefined
492
+ type Range = { min: number; max: number; step: number }
448
493
 
449
- watch(targetScale, (to, from) => {
450
- if (!props.animate || prefersReducedMotion() || !from) {
451
- scale.value = to
452
- return
453
- }
454
- if (from.min === to.min && from.max === to.max && from.step === to.step) return
455
-
456
- const start = performance.now()
457
- if (scaleFrame) cancelAnimationFrame(scaleFrame)
458
-
459
- const tick = (now: number) => {
460
- const t = Math.min(1, (now - start) / SETTLE_MS)
461
- /* easeTravel, not easeOut: an ease-out covers most of the range in the first
462
- frames, which on a big rescale (800 down to 40) looks like a snap with a
463
- slow tail rather than a scale moving. */
464
- const eased = easeTravel(t)
465
- scale.value =
466
- t < 1
467
- ? {
468
- min: from.min + (to.min - from.min) * eased,
469
- max: from.max + (to.max - from.max) * eased,
470
- /* The step stays the target's: it decides how many ticks there are,
471
- and a travelling one would add and drop labels mid-move. */
472
- step: to.step,
473
- }
474
- : to
475
- scaleFrame = t < 1 ? requestAnimationFrame(tick) : undefined
476
- }
477
- 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,
478
503
  })
479
504
 
505
+ const scale = useTween(() => targetScale.value, mixRange, { ...settle, equal: sameRange })
506
+
480
507
  /*
481
508
  * The right axis reuses the LEFT axis's tick COUNT so both sets of labels land
482
509
  * on the same gridlines. Two independent tick runs would draw two interleaved
@@ -501,34 +528,12 @@ const targetRightScale = computed(() => {
501
528
 
502
529
  // The right axis travels on the same clock as the left, or a series measured
503
530
  // against it arrives before the one beside it.
504
- const rightScale = ref(targetRightScale.value)
505
- let rightFrame: number | undefined
506
-
507
- watch(targetRightScale, (to, from) => {
508
- if (!to || !from || !props.animate || prefersReducedMotion()) {
509
- rightScale.value = to
510
- return
511
- }
512
- if (from.min === to.min && from.max === to.max && from.step === to.step) return
513
-
514
- const start = performance.now()
515
- if (rightFrame) cancelAnimationFrame(rightFrame)
516
-
517
- const tick = (now: number) => {
518
- const t = Math.min(1, (now - start) / SETTLE_MS)
519
- const eased = easeTravel(t)
520
- rightScale.value =
521
- t < 1
522
- ? {
523
- min: from.min + (to.min - from.min) * eased,
524
- max: from.max + (to.max - from.max) * eased,
525
- step: to.step,
526
- }
527
- : to
528
- rightFrame = t < 1 ? requestAnimationFrame(tick) : undefined
529
- }
530
- rightFrame = requestAnimationFrame(tick)
531
- })
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
+ )
532
537
 
533
538
  const fmtWith = (v: number, unit?: string, f?: (n: number) => string): string =>
534
539
  `${f ? f(v) : formatTick(v)}${unit ?? ""}`
@@ -583,33 +588,11 @@ const targetGutters = computed(() => ({
583
588
  right: props.showYAxis && rightLabels.value.length ? gutter(rightLabels.value) : 12,
584
589
  }))
585
590
 
586
- const gutters = ref(targetGutters.value)
587
- let gutterFrame: number | undefined
588
-
589
- watch(targetGutters, (to, from) => {
590
- if (!props.animate || prefersReducedMotion() || !from) {
591
- gutters.value = to
592
- return
593
- }
594
- if (from.left === to.left && from.right === to.right) return
595
-
596
- const start = performance.now()
597
- if (gutterFrame) cancelAnimationFrame(gutterFrame)
598
-
599
- const tick = (now: number) => {
600
- const t = Math.min(1, (now - start) / SETTLE_MS)
601
- const eased = easeTravel(t)
602
- gutters.value =
603
- t < 1
604
- ? {
605
- left: from.left + (to.left - from.left) * eased,
606
- right: from.right + (to.right - from.right) * eased,
607
- }
608
- : to
609
- gutterFrame = t < 1 ? requestAnimationFrame(tick) : undefined
610
- }
611
- gutterFrame = requestAnimationFrame(tick)
612
- })
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
+ )
613
596
 
614
597
  const box = computed<Box>(() => ({
615
598
  width: width.value,
@@ -705,9 +688,10 @@ const baseY = computed(() =>
705
688
  * what "stop showing this one" should look like.
706
689
  */
707
690
  const lines = computed(() =>
708
- allSeries.value.map((s) => {
691
+ drawnSeries.value.map((s) => {
709
692
  const g = geoOf(s)
710
- 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
711
695
  // Values pulled toward the axis floor, so the curve flattens into it.
712
696
  const base = Math.min(Math.max(0, g.min), g.max)
713
697
  const values = p === 1 ? s.values : s.values.map((v) => (v == null ? null : base + (v - base) * p))
@@ -755,9 +739,13 @@ const bars = computed(() => {
755
739
  const negTop = new Array(count.value).fill(0)
756
740
 
757
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)
758
745
  for (let i = 0; i < count.value; i++) {
759
- const v = s.values[i]
760
- 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)
761
749
  const centre = xAt(i, count.value, box.value, true)
762
750
  const x = props.stacked ? centre - inner / 2 : centre - inner / 2 + si * slot
763
751
  let y: number
@@ -894,12 +882,14 @@ const activePoints = computed(() => {
894
882
  .filter((r): r is { s: (typeof visible.value)[number]; v: number } => r.v != null)
895
883
  .map(({ s, v }) => {
896
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
897
887
  return {
898
888
  color: s.color,
899
889
  id: s.id,
900
890
  name: s.name,
901
891
  value: v,
902
- y: yAt(v, sc.min, sc.max, box.value),
892
+ y: yAt(at, sc.min, sc.max, box.value),
903
893
  }
904
894
  })
905
895
  })
@@ -948,13 +938,14 @@ const tooltipTarget = computed(() => {
948
938
  const floatTransition = usePillTransition("float")
949
939
 
950
940
  // ── animation ──────────────────────────────────
951
- // One clip rect wipes across the plot; re-keyed on data change so an update
952
- // 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.
953
943
  const revealKey = shallowRef(0)
954
- /* Keyed on the chart's SHAPE, not its values: a polled dashboard refreshing
955
- 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. */
956
947
  watch(
957
- () => `${props.type}|${count.value}|${allSeries.value.map((s) => s.id).join(",")}`,
948
+ () => props.type,
958
949
  () => {
959
950
  revealKey.value++
960
951
  },
@@ -1179,10 +1170,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
1179
1170
  :aria-pressed="!hidden.has(s.id)"
1180
1171
  @click="toggleSeries(s.id)"
1181
1172
  >
1182
- <span
1183
- class="size-2 shrink-0 rounded-full transition-transform duration-fast group-hover:scale-125"
1184
- :style="{ backgroundColor: s.color }"
1185
- />
1173
+ <LegendSwatch :color="s.color" />
1186
1174
  <span class="text-muted-strong group-hover:text-ink">{{ s.name }}</span>
1187
1175
  <span
1188
1176
  v-if="hasRightAxis && s.axis === 'right'"
@@ -1296,7 +1284,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
1296
1284
  <linearGradient
1297
1285
  v-for="(s, i) in lines"
1298
1286
  :id="gradientId(s.name, i)"
1299
- :key="s.id"
1287
+ :key="s.key"
1300
1288
  x1="0"
1301
1289
  y1="0"
1302
1290
  x2="0"
@@ -1415,7 +1403,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
1415
1403
  />
1416
1404
 
1417
1405
  <!-- one group per series, so hiding one drops only that curve -->
1418
- <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 }">
1419
1407
  <path
1420
1408
  v-show="type === 'area'"
1421
1409
  :d="s.fill"
@@ -1531,7 +1519,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
1531
1519
  <Motion
1532
1520
  v-if="active >= 0 && ready"
1533
1521
  as="div"
1534
- 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"
1535
1524
  :initial="{ opacity: 0, scale: 0.96 }"
1536
1525
  :animate="{
1537
1526
  opacity: 1,
@@ -1567,23 +1556,25 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
1567
1556
  </div>
1568
1557
  </LpContextMenu>
1569
1558
 
1570
- <table v-if="dataTable && ready" class="sr-only">
1571
- <caption v-if="title">{{ title }}</caption>
1572
- <thead>
1573
- <tr>
1574
- <th scope="col"></th>
1575
- <th v-for="s in allSeries" :key="s.id" scope="col">{{ s.name }}</th>
1576
- </tr>
1577
- </thead>
1578
- <tbody>
1579
- <tr v-for="(label, i) in labels" :key="i">
1580
- <th scope="row">{{ label }}</th>
1581
- <td v-for="s in allSeries" :key="s.id">
1582
- {{ s.values[i] == null ? "—" : fmtSeries(s, s.values[i] as number) }}
1583
- </td>
1584
- </tr>
1585
- </tbody>
1586
- </table>
1559
+ <div v-if="dataTable && ready" class="sr-only">
1560
+ <table>
1561
+ <caption v-if="title">{{ title }}</caption>
1562
+ <thead>
1563
+ <tr>
1564
+ <th scope="col"></th>
1565
+ <th v-for="s in allSeries" :key="s.id" scope="col">{{ s.name }}</th>
1566
+ </tr>
1567
+ </thead>
1568
+ <tbody>
1569
+ <tr v-for="(label, i) in labels" :key="i">
1570
+ <th scope="row">{{ label }}</th>
1571
+ <td v-for="s in allSeries" :key="s.id">
1572
+ {{ s.values[i] == null ? "—" : fmtSeries(s, s.values[i] as number) }}
1573
+ </td>
1574
+ </tr>
1575
+ </tbody>
1576
+ </table>
1577
+ </div>
1587
1578
  </div>
1588
1579
  </template>
1589
1580
 
@@ -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