@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
@@ -0,0 +1,125 @@
1
+ <script lang="ts">
2
+ export default { inheritAttrs: false }
3
+ </script>
4
+
5
+ <script setup lang="ts">
6
+ /*
7
+ * LpRevealOnScroll — content that arrives when it is first scrolled into view.
8
+ *
9
+ * <LpRevealOnScroll preset="rise" :stagger="60">
10
+ * <LpCard v-for="item in items" :key="item.id">…</LpCard>
11
+ * </LpRevealOnScroll>
12
+ *
13
+ * useReveal answers "has this been seen yet"; this is the entrance itself for
14
+ * content that has no animation of its own — a section of a landing page, a
15
+ * block of cards, a settings group further down a long page. Components that
16
+ * already animate their own arrival (charts, progress, number flows) gate it
17
+ * on useReveal themselves and need no wrapper.
18
+ *
19
+ * `stagger` animates the direct children one after another instead of the
20
+ * block as a whole — the wrapper is then just their parent, so put it where a
21
+ * grid or flex container would be and give it that layout through `class`.
22
+ *
23
+ * Plays once: content that scrolls away and back has already arrived. Reduced
24
+ * motion shows everything at once. Animations run through the Web Animations
25
+ * API on transform/opacity/filter only, so they never trigger layout.
26
+ */
27
+ import { computed, onBeforeUnmount, ref, watch } from "vue"
28
+ import { easingToken, prefersReducedMotion } from "../composables/easing"
29
+ import { useMergedAttrs } from "../composables/useMergedClass"
30
+ import { useReveal } from "../composables/useReveal"
31
+ import { revealFrom, revealTo, staggerDelay, type RevealDirection, type RevealPreset } from "./reveal"
32
+
33
+ const props = withDefaults(
34
+ defineProps<{
35
+ /** How the content appears. `rise` suits most blocks; `fade` is the quietest. */
36
+ preset?: RevealPreset
37
+ /** The way the content travels for `rise` and `blur`: `up` comes from below. */
38
+ direction?: RevealDirection
39
+ /** Travel distance in px. */
40
+ distance?: number
41
+ /** Milliseconds to wait after the block is seen. */
42
+ delay?: number
43
+ /** Milliseconds per entrance. */
44
+ duration?: number
45
+ /**
46
+ * Milliseconds between consecutive direct children. 0 animates the block
47
+ * as one piece. The steps stop growing after ten children, so long lists
48
+ * still finish quickly.
49
+ */
50
+ stagger?: number
51
+ /** Show at once, without waiting or animating — for content already known to be on screen. */
52
+ immediate?: boolean
53
+ /** Fraction of the block that must be visible before it plays. */
54
+ threshold?: number
55
+ /** Element to render as. */
56
+ as?: string
57
+ }>(),
58
+ {
59
+ preset: "rise",
60
+ direction: "up",
61
+ distance: 16,
62
+ delay: 0,
63
+ duration: 520,
64
+ stagger: 0,
65
+ immediate: false,
66
+ threshold: 0.15,
67
+ as: "div",
68
+ },
69
+ )
70
+
71
+ const { el, revealed } = useReveal({ immediate: () => props.immediate, threshold: props.threshold })
72
+ const host = ref<HTMLElement | null>(null)
73
+ watch(host, (node) => (el.value = node))
74
+
75
+ const { class: classes, attrs: rest } = useMergedAttrs(() => undefined)
76
+
77
+ // Hidden only until the observer fires; `played` then keeps it visible for
78
+ // good, even if the props change afterwards.
79
+ const played = ref(false)
80
+ const hidden = computed(() => !played.value && !revealed.value)
81
+
82
+ const running: Animation[] = []
83
+
84
+ function play(node: HTMLElement) {
85
+ if (props.immediate || prefersReducedMotion() || typeof node.animate !== "function") return
86
+ const from = revealFrom(props.preset, props.direction, props.distance)
87
+ const frames = [from, revealTo(from)]
88
+ const easing = easingToken("ease-emphasized")
89
+ // `backwards` holds each target in its hidden state through its delay, so a
90
+ // staggered child does not flash in before its turn.
91
+ const targets = props.stagger > 0 ? Array.from(node.children) : [node]
92
+ targets.forEach((target, index) => {
93
+ running.push(
94
+ target.animate(frames, {
95
+ duration: props.duration,
96
+ delay: props.stagger > 0 ? staggerDelay(index, props.delay, props.stagger) : props.delay,
97
+ easing,
98
+ fill: "backwards",
99
+ }),
100
+ )
101
+ })
102
+ }
103
+
104
+ watch(
105
+ revealed,
106
+ (seen) => {
107
+ if (!seen || played.value) return
108
+ played.value = true
109
+ // Same tick as removing the hidden state: the animations start from the
110
+ // hidden frame before the browser paints the unhidden one.
111
+ if (host.value) play(host.value)
112
+ },
113
+ { flush: "post", immediate: true },
114
+ )
115
+
116
+ onBeforeUnmount(() => {
117
+ for (const animation of running) animation.cancel()
118
+ })
119
+ </script>
120
+
121
+ <template>
122
+ <component :is="as" ref="host" :class="classes" :style="hidden ? { opacity: 0 } : undefined" v-bind="rest">
123
+ <slot />
124
+ </component>
125
+ </template>
@@ -0,0 +1,107 @@
1
+ <script lang="ts">
2
+ // The root class is merged with the consumer's (useMergedAttrs).
3
+ export default { inheritAttrs: false }
4
+ </script>
5
+
6
+ <script setup lang="ts">
7
+ /*
8
+ * A value that "decrypts" into place: each character churns through random
9
+ * glyphs and settles, left to right or all at once.
10
+ *
11
+ * For values that are produced rather than read: a freshly generated API key,
12
+ * a hash a job returned, an invite code. Plain text that swaps says nothing
13
+ * about where it came from; the churn says "this was just made".
14
+ *
15
+ * <LpScramble :value="token" class="font-mono" />
16
+ * <LpScramble value="ACCESS GRANTED" trigger="hover" order="together" />
17
+ *
18
+ * The width holds still while it churns: every position is sized by the
19
+ * character it will settle on (an invisible copy), and the random glyph is
20
+ * drawn over it, so even a proportional font does not jitter. A value that
21
+ * changes length eases its width (LpShift). Monospace still reads best: the
22
+ * glyphs then fill their cells exactly.
23
+ *
24
+ * Screen readers get the value once, as text; the churning cells are hidden
25
+ * from them, so nobody hears forty random letters.
26
+ *
27
+ * The clock lives in `useScramble`, for a component that wants the effect on
28
+ * its own markup.
29
+ */
30
+ import { onMounted, watch } from "vue"
31
+ import { prefersReducedMotion } from "../composables/easing"
32
+ import { useMergedAttrs } from "../composables/useMergedClass"
33
+ import { useReveal } from "../composables/useReveal"
34
+ import { useScramble } from "../composables/useScramble"
35
+ import LpShift from "./LpShift.vue"
36
+
37
+ const props = withDefaults(
38
+ defineProps<{
39
+ /** The value the text settles on. */
40
+ value: string
41
+ /**
42
+ * What starts a scramble besides a change of `value`:
43
+ * `reveal` the first time it is on screen (a key below the fold decrypts
44
+ * when it is scrolled to), `mount` at once, `hover` each time the pointer
45
+ * comes in (a teaser), `none` only on changes and `play()`.
46
+ */
47
+ trigger?: "reveal" | "mount" | "hover" | "none"
48
+ /** Scramble travel time in ms. */
49
+ duration?: number
50
+ /** `sequential` decodes left to right; `together` lands every position at the end. */
51
+ order?: "sequential" | "together"
52
+ /** Glyph pool to churn through. Defaults to upper case, digits and a few symbols. */
53
+ glyphs?: string
54
+ /** Scramble when `value` changes. Off: a new value lands at once. */
55
+ animateChanges?: boolean
56
+ /** Element to render. */
57
+ as?: string
58
+ }>(),
59
+ { trigger: "reveal", duration: 900, order: "sequential", animateChanges: true, as: "span" },
60
+ )
61
+
62
+ const emit = defineEmits<{
63
+ /** A scramble landed on the value. */
64
+ done: []
65
+ }>()
66
+
67
+ const { class: rootClass, attrs: rest } = useMergedAttrs(() => "lp-scramble inline-block whitespace-pre align-baseline")
68
+
69
+ // Under reduced motion the value shows as is from the first paint, rather than
70
+ // a mask that is replaced a frame later.
71
+ const masked = (props.trigger === "reveal" || props.trigger === "mount") && !prefersReducedMotion()
72
+ const { cells, running, play } = useScramble(() => props.value, {
73
+ duration: () => props.duration,
74
+ order: () => props.order,
75
+ glyphs: () => props.glyphs,
76
+ onChange: () => props.animateChanges,
77
+ start: masked ? "masked" : "settled",
78
+ onDone: () => emit("done"),
79
+ })
80
+
81
+ const { el, revealed } = useReveal({ immediate: () => props.trigger !== "reveal" })
82
+ watch(revealed, (seen) => seen && props.trigger === "reveal" && play())
83
+ onMounted(() => {
84
+ if (props.trigger === "mount" || (props.trigger === "reveal" && revealed.value)) play()
85
+ })
86
+
87
+ function onEnter() {
88
+ if (props.trigger === "hover" && !running.value) play()
89
+ }
90
+
91
+ defineExpose({ play })
92
+ </script>
93
+
94
+ <template>
95
+ <component :is="as" ref="el" :class="rootClass" v-bind="rest" @pointerenter="onEnter">
96
+ <span class="sr-only">{{ value }}</span>
97
+ <LpShift axis="width" class="inline-block align-baseline" aria-hidden="true">
98
+ <template v-for="(cell, i) in cells" :key="i">
99
+ <template v-if="cell.settled">{{ cell.char }}</template>
100
+ <span v-else class="lp-scramble__cell relative inline-block"
101
+ ><span class="invisible">{{ cell.sizer }}</span
102
+ ><span class="absolute inset-0 text-center opacity-60">{{ cell.char }}</span></span
103
+ >
104
+ </template>
105
+ </LpShift>
106
+ </component>
107
+ </template>
@@ -0,0 +1,313 @@
1
+ <script lang="ts">
2
+ export default { inheritAttrs: false }
3
+
4
+ export interface SecretFieldLabels extends Record<string, string> {
5
+ show: string
6
+ hide: string
7
+ regenerate: string
8
+ hidden: string
9
+ empty: string
10
+ hidesIn: string
11
+ }
12
+ </script>
13
+
14
+ <script setup lang="ts">
15
+ /*
16
+ * A value someone must be able to read and copy but should not have on screen
17
+ * by default: an API key, a bot token, a webhook secret, a recovery code.
18
+ *
19
+ * <LpSecretField label="Bot token" :value="token" :auto-hide="20" :regenerate="rotate" />
20
+ * <LpSecretField v-model="secret" input label="Webhook secret" />
21
+ *
22
+ * Masked by default, so a screen share or a shoulder sees dots. The mask is a
23
+ * fixed run of dots rather than one per character: the length of a secret is
24
+ * itself a hint about what it is. Copy works while masked — copying is the
25
+ * common reason to open the page, and the value need not appear to do it.
26
+ *
27
+ * `autoHide` folds the value away again after N seconds, with a thin bar
28
+ * running down so the person sees it is about to go; the page going to the
29
+ * background hides it at once, since nobody is looking at a tab they left.
30
+ *
31
+ * Two forms. The default is a read-only display: the value may wrap, can be
32
+ * selected, and fades between dots and text. `input` makes it an editable
33
+ * field — that one IS LpPasswordInput (same shell, same eye button), driven
34
+ * through its `visible` model so the timer and the copy button live here.
35
+ */
36
+ import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
37
+ import { prefersReducedMotion } from "../composables/easing"
38
+ import { useScramble } from "../composables/useScramble"
39
+ import { useLabels } from "../composables/useLpConfig"
40
+ import { mergeClass } from "../composables/useMergedClass"
41
+ import FieldWrapper from "./FieldWrapper.vue"
42
+ import LpButton from "./LpButton.vue"
43
+ import LpCopyButton from "./LpCopyButton.vue"
44
+ import LpIcon from "./LpIcon.vue"
45
+ import LpPasswordInput from "./LpPasswordInput.vue"
46
+ import LpShift from "./LpShift.vue"
47
+ import LpTooltip from "./LpTooltip.vue"
48
+ import RevealToggle from "./RevealToggle.vue"
49
+
50
+ const props = withDefaults(
51
+ defineProps<{
52
+ /** The secret, for the read-only display. */
53
+ value?: string
54
+ /** The secret, for the `input` form (v-model). */
55
+ modelValue?: string
56
+ /** Editable field instead of a display. */
57
+ input?: boolean
58
+ label?: string
59
+ hint?: string
60
+ error?: string
61
+ placeholder?: string
62
+ size?: "sm" | "md" | "lg"
63
+ /** Show the copy button. On by default: copying is what a secret is shown for. */
64
+ copyable?: boolean
65
+ /** Offer the eye button. Off for a value that should only ever be copied, never shown. */
66
+ revealable?: boolean
67
+ /**
68
+ * Seconds after which a revealed value hides itself again. Unset keeps it
69
+ * shown until the person hides it.
70
+ */
71
+ autoHide?: number
72
+ /**
73
+ * Rotates the secret. The button spins while it runs and a failure is
74
+ * toasted (LpButton's `action`); the new value arrives through `value`.
75
+ * For a custom action (with a confirm, say) use the `actions` slot.
76
+ */
77
+ regenerate?: () => unknown
78
+ /** Let a long value wrap onto more lines instead of staying on one. Display form only. */
79
+ wrap?: boolean
80
+ disabled?: boolean
81
+ /** How many dots stand for the value while hidden. */
82
+ maskLength?: number
83
+ labels?: Partial<SecretFieldLabels>
84
+ }>(),
85
+ { size: "md", copyable: true, revealable: true, maskLength: 24 },
86
+ )
87
+
88
+ const emit = defineEmits<{
89
+ (e: "update:modelValue", value: string): void
90
+ (e: "copied", text: string): void
91
+ }>()
92
+
93
+ /** Shown or hidden; bind it to drive the reveal from outside. */
94
+ const revealed = defineModel<boolean>("revealed", { default: false })
95
+
96
+ const text = useLabels<SecretFieldLabels>(
97
+ "secretField",
98
+ {
99
+ show: "Show",
100
+ hide: "Hide",
101
+ regenerate: "Regenerate",
102
+ hidden: "Hidden",
103
+ empty: "Not set",
104
+ hidesIn: "Hides automatically",
105
+ },
106
+ () => props.labels,
107
+ )
108
+
109
+ const secret = computed(() => (props.input ? props.modelValue : props.value) ?? "")
110
+
111
+ // Revealing decrypts the value into place, and a new value (a regenerated key)
112
+ // decrypts over the old one: the change is seen happening, not just swapped.
113
+ // Fed nothing while hidden, so every reveal plays from empty again.
114
+ const decrypt = useScramble(() => (revealed.value ? secret.value : ""), { onChange: true, duration: 650 })
115
+ const mask = computed(() => "•".repeat(props.maskLength))
116
+
117
+ // ── auto-hide ────────────────────────────────────────────────
118
+ let hideTimer: ReturnType<typeof setTimeout> | undefined
119
+ // Bumped on every reveal so the countdown bar restarts its run.
120
+ const run = ref(0)
121
+ watch(
122
+ [revealed, () => props.autoHide],
123
+ ([on, seconds]) => {
124
+ clearTimeout(hideTimer)
125
+ if (!on || !seconds) return
126
+ run.value++
127
+ hideTimer = setTimeout(() => (revealed.value = false), seconds * 1000)
128
+ },
129
+ { immediate: true },
130
+ )
131
+ // A new value (just regenerated) restarts the window rather than hiding it mid-read.
132
+ watch(secret, () => {
133
+ if (revealed.value && props.autoHide) {
134
+ clearTimeout(hideTimer)
135
+ run.value++
136
+ hideTimer = setTimeout(() => (revealed.value = false), props.autoHide * 1000)
137
+ }
138
+ })
139
+
140
+ function onVisibility() {
141
+ if (document.visibilityState === "hidden") revealed.value = false
142
+ }
143
+ onMounted(() => document.addEventListener("visibilitychange", onVisibility))
144
+ onBeforeUnmount(() => {
145
+ clearTimeout(hideTimer)
146
+ document.removeEventListener("visibilitychange", onVisibility)
147
+ })
148
+
149
+ // ── input form: the field's text is not a node we can fade, so it gets a
150
+ // short blur-in on every switch instead of snapping between dots and text.
151
+ const field = ref<{ $el?: Element } | null>(null)
152
+ watch(revealed, () => {
153
+ if (!props.input || prefersReducedMotion()) return
154
+ const el = field.value?.$el
155
+ const input = el instanceof Element ? el.querySelector("input") : null
156
+ input?.animate([{ filter: "blur(4px)", opacity: 0.35 }, { filter: "blur(0)", opacity: 1 }], {
157
+ duration: 260,
158
+ easing: "cubic-bezier(0.2, 0, 0, 1)",
159
+ })
160
+ })
161
+
162
+ const id = useId()
163
+ const iconSize = computed(() => (props.size === "sm" ? 14 : 16))
164
+ const copySize = computed(() => (props.size === "lg" ? "sm" : "xs"))
165
+
166
+ const shell = computed(() =>
167
+ mergeClass(
168
+ "relative flex w-full items-center gap-1 overflow-hidden rounded-control border bg-surface-soft text-ink transition-colors duration-(--duration-fast)",
169
+ props.error ? "border-danger" : "border-line",
170
+ props.disabled ? "opacity-55" : "",
171
+ props.wrap ? "py-1.5" : "",
172
+ { sm: "min-h-(--size-control-sm) pl-2.5 pr-1 text-xs", md: "min-h-(--size-control-md) pl-3 pr-1.5 text-sm", lg: "min-h-(--size-control-lg) pl-3.5 pr-1.5 text-sm" }[props.size],
173
+ ),
174
+ )
175
+ </script>
176
+
177
+ <template>
178
+ <!-- Input form: LpPasswordInput itself, with the copy button beside its eye. -->
179
+ <LpPasswordInput
180
+ v-if="input"
181
+ ref="field"
182
+ v-bind="$attrs"
183
+ v-model:visible="revealed"
184
+ class="[&_input]:font-mono"
185
+ :model-value="modelValue"
186
+ :placeholder="placeholder"
187
+ :disabled="disabled"
188
+ :label="label"
189
+ :hint="hint"
190
+ :error="error"
191
+ :size="size"
192
+ :labels="{ show: text.show, hide: text.hide }"
193
+ @update:model-value="(v: string) => emit('update:modelValue', v)"
194
+ >
195
+ <template v-if="$slots.leading" #leading><slot name="leading" /></template>
196
+ <template #actions>
197
+ <LpCopyButton
198
+ v-if="copyable && secret"
199
+ :value="secret"
200
+ size="xs"
201
+ class="size-7"
202
+ :disabled="disabled"
203
+ @copied="(t: string) => emit('copied', t)"
204
+ />
205
+ <slot name="actions" />
206
+ <LpButton
207
+ v-if="regenerate"
208
+ variant="ghost"
209
+ size="xs"
210
+ square
211
+ class="size-7"
212
+ :aria-label="text.regenerate"
213
+ :title="text.regenerate"
214
+ :action="regenerate"
215
+ :disabled="disabled"
216
+ >
217
+ <LpIcon name="lucide:refresh-cw" :size="iconSize" />
218
+ </LpButton>
219
+ </template>
220
+ </LpPasswordInput>
221
+
222
+ <!-- Display form. -->
223
+ <FieldWrapper
224
+ v-else
225
+ :wrapped="!!(label || hint || error)"
226
+ :id="id"
227
+ :label="label"
228
+ :hint="hint"
229
+ :error="error"
230
+ :class="$attrs.class"
231
+ :style="$attrs.style"
232
+ >
233
+ <div :class="mergeClass(shell, label || hint || error ? '' : ($attrs.class as string))" data-lp-secret>
234
+ <LpShift axis="height" class="min-w-0 flex-1">
235
+ <!-- `aria-labelledby` would need the label's id; the field context
236
+ gives the control `id`, which LpFormField points its label at. -->
237
+ <div :id="id" class="relative min-w-0 font-mono" :aria-label="label" role="group">
238
+ <Transition
239
+ mode="out-in"
240
+ enter-active-class="transition-[opacity,filter] duration-(--duration-medium) ease-(--ease-emphasized) motion-reduce:transition-none"
241
+ leave-active-class="transition-[opacity,filter] duration-(--duration-fast) ease-out motion-reduce:transition-none"
242
+ enter-from-class="opacity-0 blur-[4px]"
243
+ leave-to-class="opacity-0 blur-[4px]"
244
+ >
245
+ <span
246
+ v-if="!secret"
247
+ key="empty"
248
+ class="block truncate font-sans text-muted"
249
+ >{{ placeholder ?? text.empty }}</span>
250
+ <span v-else-if="revealed" key="shown" class="block select-all" :class="wrap ? 'break-all whitespace-pre-wrap' : 'truncate'">
251
+ <span aria-hidden="true">{{ decrypt.running.value ? decrypt.text.value : secret }}</span>
252
+ <span class="sr-only">{{ secret }}</span>
253
+ </span>
254
+ <span v-else key="hidden" class="block truncate tracking-[0.12em] text-muted select-none" aria-hidden="true">{{ mask }}</span>
255
+ </Transition>
256
+ <span v-if="secret && !revealed" class="sr-only">{{ text.hidden }}</span>
257
+ </div>
258
+ </LpShift>
259
+
260
+ <div class="flex shrink-0 items-center gap-0.5" :class="wrap ? 'self-start' : 'self-center'">
261
+ <RevealToggle
262
+ v-if="revealable && secret"
263
+ v-model="revealed"
264
+ :icon-size="iconSize"
265
+ :show-label="text.show"
266
+ :hide-label="text.hide"
267
+ :disabled="disabled"
268
+ :controls="id"
269
+ class="size-7"
270
+ />
271
+ <LpCopyButton
272
+ v-if="copyable && secret"
273
+ :value="secret"
274
+ :size="copySize"
275
+ class="size-7 text-muted hover:text-ink"
276
+ :disabled="disabled"
277
+ @copied="(t: string) => emit('copied', t)"
278
+ />
279
+ <slot name="actions" />
280
+ <LpTooltip v-if="regenerate" :content="text.regenerate" label>
281
+ <LpButton
282
+ variant="ghost"
283
+ size="xs"
284
+ square
285
+ class="size-7 text-muted hover:text-ink"
286
+ :action="regenerate"
287
+ :disabled="disabled"
288
+ >
289
+ <LpIcon name="lucide:refresh-cw" :size="iconSize" />
290
+ </LpButton>
291
+ </LpTooltip>
292
+ </div>
293
+
294
+ <!-- The auto-hide window running out, as a hairline along the bottom. -->
295
+ <Transition
296
+ enter-active-class="transition-opacity duration-(--duration-fast)"
297
+ leave-active-class="transition-opacity duration-(--duration-fast)"
298
+ enter-from-class="opacity-0"
299
+ leave-to-class="opacity-0"
300
+ >
301
+ <span
302
+ v-if="revealed && autoHide"
303
+ :key="run"
304
+ class="lp-drain pointer-events-none absolute inset-x-0 bottom-0 h-0.5 bg-brand/70"
305
+ :style="{ animationDuration: `${autoHide}s` }"
306
+ :title="text.hidesIn"
307
+ aria-hidden="true"
308
+ />
309
+ </Transition>
310
+ </div>
311
+ </FieldWrapper>
312
+ </template>
313
+
@@ -19,6 +19,7 @@ import { ref, useId } from "vue"
19
19
  import { useFieldControl } from "../composables/useField"
20
20
  import { useMergedAttrs } from "../composables/useMergedClass"
21
21
  import { usePillTransition } from "../composables/usePillTransition"
22
+ import AttentionDot from "./AttentionDot.vue"
22
23
  import LpIcon from "./LpIcon.vue"
23
24
  import type { LpOptionBase } from "./options"
24
25
 
@@ -140,18 +141,10 @@ function releaseFocusAfterPointer(event: PointerEvent) {
140
141
  />
141
142
  <span v-if="opt.icon" class="relative z-10 inline-flex shrink-0">
142
143
  <LpIcon :name="opt.icon" :size="size === 'lg' ? 16 : 14" />
143
- <span
144
- v-if="opt.dot && !opt.label"
145
- aria-hidden="true"
146
- class="absolute -right-1 -top-0.5 size-2 rounded-full bg-accent"
147
- />
144
+ <AttentionDot v-if="opt.dot && !opt.label" corner />
148
145
  </span>
149
146
  <span v-if="opt.label" class="relative z-10">{{ opt.label }}</span>
150
- <span
151
- v-if="opt.dot && opt.label"
152
- aria-hidden="true"
153
- class="relative z-10 size-1.5 self-start mt-1.5 rounded-full bg-accent"
154
- />
147
+ <AttentionDot v-if="opt.dot && opt.label" class="mt-1.5" />
155
148
  </ToggleGroupItem>
156
149
  </ToggleGroupRoot>
157
150
  </template>