@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,36 @@
1
+ import type { Random } from "./scramble";
2
+ export interface TypewriterState {
3
+ /** The string being shown. */
4
+ index: number;
5
+ /** How many of its characters are shown. */
6
+ length: number;
7
+ phase: "typing" | "holding" | "erasing" | "done";
8
+ /** The string to type once erasing has gone far enough. */
9
+ to: number;
10
+ }
11
+ export interface TypewriterOptions {
12
+ /** Ms per typed character, before variance. */
13
+ speed: number;
14
+ /** Ms per erased character. Erasing is steady: nobody holds backspace unevenly. */
15
+ eraseSpeed: number;
16
+ /** Ms a finished string stays before it is erased. */
17
+ hold: number;
18
+ /** Start over after the last string instead of stopping on it. */
19
+ loop: boolean;
20
+ }
21
+ export interface TypewriterStep {
22
+ state: TypewriterState;
23
+ /** Ms until the next call. Infinity: nothing more to do. */
24
+ wait: number;
25
+ /** Set when this step finished typing a string: its index. */
26
+ typed?: number;
27
+ }
28
+ export declare const typewriterStart: () => TypewriterState;
29
+ /**
30
+ * A keystroke's delay: the base speed with some unevenness, and a pause after
31
+ * punctuation, which is where a person typing actually stops.
32
+ */
33
+ export declare function keystrokeDelay(char: string, speed: number, random: Random): number;
34
+ /** Characters two strings share at the start: erasing stops there and typing goes on from it. */
35
+ export declare function sharedPrefix(a: string[], b: string[]): number;
36
+ export declare function typewriterNext(state: TypewriterState, strings: string[][], options: TypewriterOptions, random?: Random): TypewriterStep;
@@ -0,0 +1,53 @@
1
+ const typewriterStart = () => ({ index: 0, length: 0, phase: "typing", to: 0 });
2
+ function keystrokeDelay(char, speed, random) {
3
+ const jitter = speed * (0.55 + 0.9 * random());
4
+ if (/[.!?…]/.test(char)) return jitter + speed * 5;
5
+ if (/[,;:]/.test(char)) return jitter + speed * 2.5;
6
+ return jitter;
7
+ }
8
+ function sharedPrefix(a, b) {
9
+ let n = 0;
10
+ while (n < a.length && n < b.length && a[n] === b[n]) n++;
11
+ return n;
12
+ }
13
+ function typewriterNext(state, strings, options, random = Math.random) {
14
+ const count = strings.length;
15
+ if (!count) return { state: { ...state, phase: "done" }, wait: Infinity };
16
+ const current = strings[state.index] ?? [];
17
+ switch (state.phase) {
18
+ case "typing": {
19
+ if (state.length >= current.length) return finish(state, count, options);
20
+ const length = state.length + 1;
21
+ const next = { ...state, length };
22
+ if (length < current.length) return { state: next, wait: keystrokeDelay(current[length - 1], options.speed, random) };
23
+ return finish(next, count, options);
24
+ }
25
+ case "holding": {
26
+ const to = (state.index + 1) % count;
27
+ return erase({ ...state, phase: "erasing", to }, strings, options);
28
+ }
29
+ case "erasing":
30
+ return erase(state, strings, options);
31
+ case "done":
32
+ return { state, wait: Infinity };
33
+ }
34
+ }
35
+ function finish(state, count, options) {
36
+ const last = state.index === count - 1;
37
+ if (last && !options.loop) return { state: { ...state, phase: "done" }, wait: Infinity, typed: state.index };
38
+ return { state: { ...state, phase: "holding" }, wait: options.hold, typed: state.index };
39
+ }
40
+ function erase(state, strings, options) {
41
+ const keep = sharedPrefix(strings[state.index] ?? [], strings[state.to] ?? []);
42
+ if (state.length > keep) {
43
+ const length = state.length - 1;
44
+ return { state: { ...state, length }, wait: length > keep ? options.eraseSpeed : options.speed * 4 };
45
+ }
46
+ return { state: { index: state.to, length: state.length, phase: "typing", to: state.to }, wait: 0 };
47
+ }
48
+ export {
49
+ keystrokeDelay,
50
+ sharedPrefix,
51
+ typewriterNext,
52
+ typewriterStart
53
+ };
@@ -1,3 +1,4 @@
1
+ import { splitTime } from "./timeSpan.js";
1
2
  function planLoop(duration, options = {}) {
2
3
  if (!Number.isFinite(duration) || duration <= 0) return { from: 0, to: 0, fade: 0 };
3
4
  const clamp = (value) => Math.min(duration, Math.max(0, value));
@@ -23,12 +24,10 @@ function isNativeLoop(plan, duration) {
23
24
  return plan.fade === 0 && plan.from === 0 && plan.to >= duration;
24
25
  }
25
26
  function formatClipTime(seconds, precise = false) {
26
- const safe = Math.max(0, Number.isFinite(seconds) ? seconds : 0);
27
- const minutes = Math.floor(safe / 60);
28
- const rest = safe - minutes * 60;
29
- const whole = Math.floor(rest);
30
- const tenth = Math.floor((rest - whole) * 10);
31
- const secs = String(whole).padStart(2, "0");
27
+ const t = splitTime(Number.isFinite(seconds) ? seconds * 1e3 : 0);
28
+ const minutes = (t.days * 24 + t.hours) * 60 + t.minutes;
29
+ const secs = String(t.seconds).padStart(2, "0");
30
+ const tenth = Math.floor(t.ms / 100);
32
31
  return precise && tenth ? `${minutes}:${secs}.${tenth}` : `${minutes}:${secs}`;
33
32
  }
34
33
  export {
@@ -7,7 +7,7 @@
7
7
  *
8
8
  * A plain function, not a reactive composable: it is read at the moment an
9
9
  * animation starts, and a component that also needs to RE-RENDER when the
10
- * setting changes mid-session should use motion-v's `useReducedMotion`.
10
+ * setting changes mid-session should use `usePrefersReducedMotion`.
11
11
  */
12
12
  export declare const prefersReducedMotion: () => boolean;
13
13
  /**
@@ -50,3 +50,24 @@ export declare const easeOut: (t: number) => number;
50
50
  * the tail short.
51
51
  */
52
52
  export declare const easeTravel: (t: number) => number;
53
+ /**
54
+ * A cubic-bezier as a function of time, solved per call.
55
+ *
56
+ * The curves above are hand-shaped stand-ins for tokens a component reaches for
57
+ * by feel. A tween that has to match a CSS transition running beside it (a
58
+ * slice's arc easing while its colour and lift move on `--ease-emphasized`)
59
+ * needs the token's actual curve, and a theme may retune it — so this reads the
60
+ * four numbers and solves for them rather than approximating one fixed shape.
61
+ *
62
+ * Newton's method on x(s) = t, falling back to bisection where the slope is
63
+ * too flat to step on; a handful of iterations is far below a pixel.
64
+ */
65
+ export declare const cubicBezier: (x1: number, y1: number, x2: number, y2: number) => (t: number) => number;
66
+ /**
67
+ * An easing token as a function, for a value tweened in script.
68
+ *
69
+ * Anything the token does not spell as a `cubic-bezier()` (a keyword, a
70
+ * `linear()` list) falls back to `easeOut`, which has the same "arrives and
71
+ * settles" intent as every curve the kit defines.
72
+ */
73
+ export declare const tokenEase: (name: "ease-emphasized" | "ease-travel" | "ease-settle") => ((t: number) => number);
@@ -21,10 +21,51 @@ const easeTravel = (t) => {
21
21
  const head = EDGE * EDGE / (2 * EDGE) + EDGE * 0.1;
22
22
  return head + (t - EDGE) / (1 - 2 * EDGE) * (1 - 2 * head);
23
23
  };
24
+ const cubicBezier = (x1, y1, x2, y2) => {
25
+ const cx = 3 * x1;
26
+ const bx = 3 * (x2 - x1) - cx;
27
+ const ax = 1 - cx - bx;
28
+ const cy = 3 * y1;
29
+ const by = 3 * (y2 - y1) - cy;
30
+ const ay = 1 - cy - by;
31
+ const x = (s) => ((ax * s + bx) * s + cx) * s;
32
+ const y = (s) => ((ay * s + by) * s + cy) * s;
33
+ const dx = (s) => (3 * ax * s + 2 * bx) * s + cx;
34
+ return (t) => {
35
+ if (t <= 0) return 0;
36
+ if (t >= 1) return 1;
37
+ let s = t;
38
+ for (let i = 0; i < 6; i++) {
39
+ const err = x(s) - t;
40
+ if (Math.abs(err) < 1e-5) return y(s);
41
+ const slope = dx(s);
42
+ if (Math.abs(slope) < 1e-6) break;
43
+ s -= err / slope;
44
+ }
45
+ let lo = 0;
46
+ let hi = 1;
47
+ s = t;
48
+ for (let i = 0; i < 20; i++) {
49
+ const v = x(s);
50
+ if (Math.abs(v - t) < 1e-5) break;
51
+ if (v < t) lo = s;
52
+ else hi = s;
53
+ s = (lo + hi) / 2;
54
+ }
55
+ return y(s);
56
+ };
57
+ };
58
+ const tokenEase = (name) => {
59
+ const match = /cubic-bezier\(([^)]+)\)/.exec(easingToken(name));
60
+ const n = match?.[1].split(",").map((p) => Number.parseFloat(p));
61
+ return n && n.length === 4 && n.every(Number.isFinite) ? cubicBezier(n[0], n[1], n[2], n[3]) : easeOut;
62
+ };
24
63
  export {
64
+ cubicBezier,
25
65
  durationToken,
26
66
  easeOut,
27
67
  easeTravel,
28
68
  easingToken,
29
- prefersReducedMotion
69
+ prefersReducedMotion,
70
+ tokenEase
30
71
  };
@@ -0,0 +1,15 @@
1
+ export interface PseudoOptions {
2
+ /**
3
+ * Extra length as a share of the text's letters: 0.35 adds about a third.
4
+ * Spread over the vowels, so the text grows the way a longer word does
5
+ * rather than gaining a tail that wraps somewhere convenient.
6
+ */
7
+ expand?: number;
8
+ /**
9
+ * Markers around the whole string. `true` uses square brackets, a pair of
10
+ * strings picks others, `false` drops them.
11
+ */
12
+ brackets?: boolean | readonly [string, string];
13
+ }
14
+ /** English text made to look translated and longer; see the module comment. */
15
+ export declare function pseudoLocalize(text: string, options?: PseudoOptions): string;
@@ -0,0 +1,96 @@
1
+ const ACCENTED = {
2
+ a: "å",
3
+ b: "ƀ",
4
+ c: "ç",
5
+ d: "ð",
6
+ e: "é",
7
+ f: "ƒ",
8
+ g: "ĝ",
9
+ h: "ĥ",
10
+ i: "î",
11
+ j: "ĵ",
12
+ k: "ķ",
13
+ l: "ļ",
14
+ m: "ɱ",
15
+ n: "ñ",
16
+ o: "ö",
17
+ p: "þ",
18
+ q: "ǫ",
19
+ r: "ŕ",
20
+ s: "š",
21
+ t: "ţ",
22
+ u: "û",
23
+ v: "ṽ",
24
+ w: "ŵ",
25
+ x: "ẋ",
26
+ y: "ý",
27
+ z: "ž",
28
+ A: "Å",
29
+ B: "Ɓ",
30
+ C: "Ç",
31
+ D: "Ð",
32
+ E: "É",
33
+ F: "Ƒ",
34
+ G: "Ĝ",
35
+ H: "Ĥ",
36
+ I: "Î",
37
+ J: "Ĵ",
38
+ K: "Ķ",
39
+ L: "Ļ",
40
+ M: "Ṁ",
41
+ N: "Ñ",
42
+ O: "Ö",
43
+ P: "Þ",
44
+ Q: "Ǫ",
45
+ R: "Ŕ",
46
+ S: "Š",
47
+ T: "Ţ",
48
+ U: "Û",
49
+ V: "Ṽ",
50
+ W: "Ŵ",
51
+ X: "Ẋ",
52
+ Y: "Ý",
53
+ Z: "Ž"
54
+ };
55
+ const VOWEL = /[aeiouyAEIOUY]/;
56
+ const PROTECTED = /\{\{[^}]*\}\}|\{[^{}]*\}|%(?:\d+\$)?[-+ 0#]*\d*(?:\.\d+)?[sdifoxXeEgGc%]|<[^>]+>|&[a-zA-Z#0-9]+;/g;
57
+ function pseudoLocalize(text, options = {}) {
58
+ if (!text.trim()) return text;
59
+ const expand = Math.max(0, options.expand ?? 0.35);
60
+ const brackets = options.brackets ?? true;
61
+ const [open, close] = brackets === true ? ["[", "]"] : brackets === false ? ["", ""] : brackets;
62
+ const runs = [];
63
+ let last = 0;
64
+ for (const match of text.matchAll(PROTECTED)) {
65
+ const at = match.index ?? 0;
66
+ if (at > last) runs.push({ text: text.slice(last, at), code: false });
67
+ runs.push({ text: match[0], code: true });
68
+ last = at + match[0].length;
69
+ }
70
+ if (last < text.length) runs.push({ text: text.slice(last), code: false });
71
+ const letters = runs.reduce((n, run) => run.code ? n : n + (run.text.match(/[a-zA-Z]/g)?.length ?? 0), 0);
72
+ const vowels = runs.reduce((n, run) => run.code ? n : n + (run.text.match(/[aeiouyAEIOUY]/g)?.length ?? 0), 0);
73
+ let extra = Math.round(letters * expand);
74
+ const per = vowels ? Math.floor(extra / vowels) : 0;
75
+ let rest = vowels ? extra % vowels : 0;
76
+ if (vowels) extra = 0;
77
+ const out = runs.map((run) => {
78
+ if (run.code) return run.text;
79
+ let s = "";
80
+ for (const ch of run.text) {
81
+ const mapped = ACCENTED[ch] ?? ch;
82
+ s += mapped;
83
+ if (VOWEL.test(ch)) {
84
+ const times = per + (rest > 0 ? 1 : 0);
85
+ if (rest > 0) rest--;
86
+ s += mapped.toLowerCase().repeat(times);
87
+ }
88
+ }
89
+ return s;
90
+ }).join("");
91
+ const tail = extra > 0 ? "·".repeat(extra) : "";
92
+ return `${open}${out}${tail}${close}`;
93
+ }
94
+ export {
95
+ pseudoLocalize
96
+ };
@@ -1,7 +1,7 @@
1
1
  const SCROLLS = /(auto|scroll|overlay)/;
2
2
  function scrollParent(el, { axis = "y", self = false } = {}) {
3
3
  for (let node = self ? el : el?.parentElement; node; node = node.parentElement) {
4
- if (node === document.body || node === document.documentElement) return null;
4
+ if (node === node.ownerDocument.body || node === node.ownerDocument.documentElement) return null;
5
5
  const style = getComputedStyle(node);
6
6
  const y = axis !== "x" && SCROLLS.test(style.overflowY) && node.scrollHeight > node.clientHeight;
7
7
  const x = axis !== "y" && SCROLLS.test(style.overflowX) && node.scrollWidth > node.clientWidth;
@@ -11,9 +11,11 @@ function scrollParent(el, { axis = "y", self = false } = {}) {
11
11
  }
12
12
  function scrollToElement(el, { block = "nearest", behavior = "auto", margin = 0 } = {}) {
13
13
  if (!el) return;
14
- const box = scrollParent(el) ?? document.scrollingElement;
14
+ const doc = el.ownerDocument;
15
+ const win = doc.defaultView ?? window;
16
+ const box = scrollParent(el) ?? doc.scrollingElement;
15
17
  if (!box) return;
16
- const outer = box === document.scrollingElement ? new DOMRect(0, 0, window.innerWidth, window.innerHeight) : box.getBoundingClientRect();
18
+ const outer = box === doc.scrollingElement ? new DOMRect(0, 0, win.innerWidth, win.innerHeight) : box.getBoundingClientRect();
17
19
  const inner = el.getBoundingClientRect();
18
20
  const top = inner.top - outer.top + box.scrollTop;
19
21
  let target = box.scrollTop;
@@ -26,8 +26,11 @@ export interface UseClipboard {
26
26
  * Writes `text` to the clipboard. Resolves true on success, false when the
27
27
  * clipboard was unavailable or refused — it never rejects, so `await copy(x)`
28
28
  * is safe to call bare from an event handler.
29
+ *
30
+ * A `Blob` is written as itself under its own type (an image as a PNG blob),
31
+ * for "copy image" next to "copy link".
29
32
  */
30
- copy: (text: string, options?: CopyOptions) => Promise<boolean>;
33
+ copy: (data: string | Blob, options?: CopyOptions) => Promise<boolean>;
31
34
  }
32
35
  /**
33
36
  * Clipboard writes with optional toast feedback.
@@ -34,15 +34,25 @@ function writeLegacy(text) {
34
34
  active?.focus?.({ preventScroll: true });
35
35
  return ok;
36
36
  }
37
+ async function writeBlob(blob) {
38
+ if (typeof navigator === "undefined" || !navigator.clipboard?.write || typeof ClipboardItem === "undefined") return false;
39
+ try {
40
+ await navigator.clipboard.write([new ClipboardItem({ [blob.type || "image/png"]: blob })]);
41
+ return true;
42
+ } catch {
43
+ return false;
44
+ }
45
+ }
37
46
  const COPIED_MS = 1400;
38
47
  function useClipboard() {
39
48
  const copied = ref(false);
40
49
  const { success, error } = useToast();
41
50
  let timer;
42
- async function copy(text, options = {}) {
51
+ async function copy(data, options = {}) {
43
52
  const { toast = false, errorToast = false } = options;
44
53
  try {
45
- if (!await writeAsync(text) && !writeLegacy(text)) throw new Error("clipboard unavailable");
54
+ const written = typeof data === "string" ? await writeAsync(data) || writeLegacy(data) : await writeBlob(data);
55
+ if (!written) throw new Error("clipboard unavailable");
46
56
  copied.value = true;
47
57
  clearTimeout(timer);
48
58
  timer = setTimeout(() => copied.value = false, COPIED_MS);
@@ -36,3 +36,11 @@ export interface FieldControlState {
36
36
  export declare function useFieldControl(own: () => FieldControlState): ComputedRef<Omit<FieldContext, "id"> & {
37
37
  id?: string;
38
38
  }>;
39
+ /**
40
+ * Whether a focusout leaves the whole control, not just moves between its own
41
+ * parts (a trigger and a clear button, the segments of a time field, an input
42
+ * and its stepper). Composite controls emit their `blur` only then: focus
43
+ * events do not bubble, so a consumer's `@blur` on the wrapper never fired, and
44
+ * `useForm().field()` could not mark such a field touched.
45
+ */
46
+ export declare function focusLeft(event: FocusEvent): boolean;
@@ -36,9 +36,14 @@ function useFieldControl(own) {
36
36
  };
37
37
  });
38
38
  }
39
+ function focusLeft(event) {
40
+ const next = event.relatedTarget;
41
+ return !(next instanceof Node && event.currentTarget?.contains(next));
42
+ }
39
43
  export {
40
44
  LP_FIELD,
41
45
  fieldMessageId,
46
+ focusLeft,
42
47
  provideField,
43
48
  useField,
44
49
  useFieldControl
@@ -30,6 +30,7 @@ function useForm(options) {
30
30
  const submitting = ref(false);
31
31
  const submitCount = ref(0);
32
32
  const runs = /* @__PURE__ */ new Map();
33
+ const fromForm = /* @__PURE__ */ new Map();
33
34
  const baseVersion = ref(0);
34
35
  const keys = () => Object.keys(plain());
35
36
  const dirty = computed(() => {
@@ -64,11 +65,15 @@ function useForm(options) {
64
65
  runs.set("form", run);
65
66
  const found = await options.validate(plain()) ?? {};
66
67
  if (runs.get("form") !== run) return true;
68
+ for (const [name, text] of fromForm) if (errors[name] === text) delete errors[name];
69
+ fromForm.clear();
67
70
  let ok = true;
68
71
  for (const [name, text] of Object.entries(found)) {
69
72
  if (!text) continue;
70
73
  ok = false;
71
- if (!errors[name]) errors[name] = text;
74
+ if (errors[name]) continue;
75
+ errors[name] = text;
76
+ fromForm.set(name, text);
72
77
  }
73
78
  return ok;
74
79
  }
@@ -76,7 +81,6 @@ function useForm(options) {
76
81
  validating.value = true;
77
82
  try {
78
83
  if (name !== void 0) return await runField(name);
79
- if (errors.form) delete errors.form;
80
84
  const fields = await Promise.all(keys().map(runField));
81
85
  const form = await runForm();
82
86
  return fields.every(Boolean) && form && !Object.values(external).some(Boolean);
@@ -99,6 +103,7 @@ function useForm(options) {
99
103
  for (const k of Object.keys(external)) delete external[k];
100
104
  for (const k of Object.keys(touched)) delete touched[k];
101
105
  runs.clear();
106
+ fromForm.clear();
102
107
  submitCount.value = 0;
103
108
  }
104
109
  function adopt(next) {
@@ -125,17 +130,23 @@ function useForm(options) {
125
130
  },
126
131
  { deep: true }
127
132
  );
133
+ async function recheck(names) {
134
+ await Promise.all(names.map((name) => validate(name)));
135
+ if (fromForm.size || submitCount.value) await runForm();
136
+ }
128
137
  let snapshot = clone(plain());
129
138
  watch(
130
139
  plain,
131
140
  () => {
132
141
  const now = clone(plain());
142
+ const changed = [];
133
143
  for (const name of Object.keys(now)) {
134
144
  if (deepEqual(now[name], snapshot[name])) continue;
135
145
  if (external[name]) delete external[name];
136
- if (touched[name] || submitCount.value) void validate(name);
146
+ if (touched[name] || submitCount.value) changed.push(name);
137
147
  }
138
148
  snapshot = now;
149
+ if (changed.length) void recheck(changed);
139
150
  },
140
151
  { deep: true }
141
152
  );
@@ -168,8 +179,11 @@ function useForm(options) {
168
179
  try {
169
180
  submitCount.value++;
170
181
  for (const name of keys()) touched[name] = true;
171
- if (!await validate()) return;
172
- const submitted = clone(plain());
182
+ let submitted;
183
+ do {
184
+ submitted = clone(plain());
185
+ if (!await validate()) return;
186
+ } while (!deepEqual(plain(), submitted));
173
187
  await fn(submitted);
174
188
  if (deepEqual(plain(), submitted)) {
175
189
  baseline = submitted;
@@ -130,6 +130,8 @@ export interface HintTiming {
130
130
  freshLimit: number;
131
131
  nudgeAgain: number;
132
132
  flush: number;
133
+ /** How long a news item opened from a feed waits for its page and feature, ms. */
134
+ newsWait: number;
133
135
  }
134
136
  export interface HintSystemOptions {
135
137
  features: Record<string, HintFeature>;
@@ -284,6 +286,8 @@ export declare function createHintSystem(options: HintSystemOptions): {
284
286
  markIntent(): void;
285
287
  unreadNews: (page?: string) => HintNews[];
286
288
  readNews: (page: string) => void;
289
+ /** Open one news item from a feed: mark it read and show its feature once the app is on its page. */
290
+ showNews: (id: string) => void;
287
291
  pageTitle: (page: string) => string;
288
292
  readFresh(id: string): void;
289
293
  tourShown(index: number): void;
@@ -101,7 +101,8 @@ const DEFAULT_TIMING = {
101
101
  offersMax: 2,
102
102
  freshLimit: 3,
103
103
  nudgeAgain: 7 * DAY,
104
- flush: 2e3
104
+ flush: 2e3,
105
+ newsWait: 8e3
105
106
  };
106
107
  function localHintStorage(key = "lp-hints") {
107
108
  const read = () => {
@@ -284,6 +285,35 @@ function createHintSystem(options) {
284
285
  function readNews(page) {
285
286
  for (const n of unread(page)) record(newsKey(n.id), { state: "explained" });
286
287
  }
288
+ let pendingNews = null;
289
+ function showNews(id) {
290
+ const item = news.find((n) => n.id === id);
291
+ if (!item) return;
292
+ record(newsKey(item.id), { state: "explained" });
293
+ const feature = item.feature;
294
+ if (!feature) return;
295
+ pendingNews?.();
296
+ let done = false;
297
+ let stopWatch;
298
+ const finish = () => {
299
+ done = true;
300
+ clearTimeout(timer);
301
+ stopWatch?.();
302
+ if (pendingNews === finish) pendingNews = null;
303
+ };
304
+ const timer = setTimeout(finish, timing.newsWait);
305
+ pendingNews = finish;
306
+ stopWatch = watch(
307
+ () => state.page === item.page && showable(feature) && !state.tour.open,
308
+ (ready) => {
309
+ if (!ready || done) return;
310
+ finish();
311
+ startTour(item.page, [feature]);
312
+ },
313
+ { immediate: true }
314
+ );
315
+ if (done) stopWatch();
316
+ }
287
317
  function considerOffer() {
288
318
  const page = state.page;
289
319
  const ready = state.loaded && !state.tour.open && !state.offer && !anyModalOpen() && !typing() && Date.now() - state.settledAt > timing.settle;
@@ -416,6 +446,8 @@ function createHintSystem(options) {
416
446
  },
417
447
  unreadNews: (page) => unread(page),
418
448
  readNews,
449
+ /** Open one news item from a feed: mark it read and show its feature once the app is on its page. */
450
+ showNews,
419
451
  pageTitle: (page) => pages[page]?.title ?? page,
420
452
  readFresh(id) {
421
453
  record(featureKey(id), { state: "explained" });
@@ -76,14 +76,20 @@ function detach(el) {
76
76
  else mounted.delete(id);
77
77
  idOf.delete(el);
78
78
  }
79
+ function mark(el, id) {
80
+ if (!id) return;
81
+ if (el.closest("[data-lp-hint-example]")) el.dataset.lpHintPart = id;
82
+ else attach(el, id);
83
+ }
79
84
  const vHint = {
80
85
  mounted(el, binding) {
81
- if (binding.value) attach(el, binding.value);
86
+ mark(el, binding.value);
82
87
  },
83
88
  updated(el, binding) {
84
- if (binding.value === idOf.get(el)) return;
89
+ if (binding.value === (idOf.get(el) ?? el.dataset.lpHintPart)) return;
85
90
  detach(el);
86
- if (binding.value) attach(el, binding.value);
91
+ delete el.dataset.lpHintPart;
92
+ mark(el, binding.value);
87
93
  },
88
94
  beforeUnmount(el) {
89
95
  detach(el);
@@ -0,0 +1,11 @@
1
+ import { type Ref } from "vue";
2
+ export interface UseInView {
3
+ /** Attach to the element to watch. */
4
+ el: Ref<Element | null>;
5
+ /** On screen and the page visible. */
6
+ inView: Ref<boolean>;
7
+ }
8
+ export declare function useInView(options?: {
9
+ rootMargin?: string;
10
+ threshold?: number;
11
+ }): UseInView;
@@ -0,0 +1,39 @@
1
+ import { ref, watch, onBeforeUnmount } from "vue";
2
+ function useInView(options = {}) {
3
+ const el = ref(null);
4
+ const intersecting = ref(typeof IntersectionObserver === "undefined");
5
+ const pageVisible = ref(typeof document === "undefined" || document.visibilityState === "visible");
6
+ const inView = ref(false);
7
+ let observer = null;
8
+ const sync = () => inView.value = intersecting.value && pageVisible.value;
9
+ const onVisibility = () => {
10
+ pageVisible.value = document.visibilityState === "visible";
11
+ sync();
12
+ };
13
+ if (typeof document !== "undefined") document.addEventListener("visibilitychange", onVisibility);
14
+ watch(
15
+ el,
16
+ (node) => {
17
+ observer?.disconnect();
18
+ observer = null;
19
+ if (!node || typeof IntersectionObserver === "undefined") return sync();
20
+ observer = new IntersectionObserver(
21
+ (entries) => {
22
+ intersecting.value = entries.some((entry) => entry.isIntersecting);
23
+ sync();
24
+ },
25
+ { rootMargin: options.rootMargin ?? "0px", threshold: options.threshold ?? 0 }
26
+ );
27
+ observer.observe(node);
28
+ },
29
+ { immediate: true, flush: "post" }
30
+ );
31
+ onBeforeUnmount(() => {
32
+ observer?.disconnect();
33
+ if (typeof document !== "undefined") document.removeEventListener("visibilitychange", onVisibility);
34
+ });
35
+ return { el, inView };
36
+ }
37
+ export {
38
+ useInView
39
+ };
@@ -0,0 +1,8 @@
1
+ import { type MaybeRefOrGetter, type Ref } from "vue";
2
+ export interface LoadingGateOptions {
3
+ /** Ms of loading before the indicator appears. */
4
+ delay?: MaybeRefOrGetter<number>;
5
+ /** Ms the indicator stays once shown, even if loading ends sooner. */
6
+ minVisible?: MaybeRefOrGetter<number>;
7
+ }
8
+ export declare function useLoadingGate(active: MaybeRefOrGetter<boolean>, options?: LoadingGateOptions): Ref<boolean>;