@leavepulse/ui 0.69.0 → 0.70.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (640) hide show
  1. package/README.md +49 -0
  2. package/dist/assets/LoaderMark-DxBV2iDJ.css +43 -0
  3. package/dist/assets/LpActivityLine-B3EwNQEB.css +33 -0
  4. package/dist/assets/{LpCommandPalette-DxyjhYn_.css → LpCommandPalette-u-zOxKWa.css} +21 -31
  5. package/dist/assets/LpDock-Cbh0wQUv.css +17 -0
  6. package/dist/assets/{LpDropzone-Qb8k7cg4.css → LpDropzone-Bb1vBTeU.css} +12 -17
  7. package/dist/assets/{LpImageEditor-CElPDzpF.css → LpImageEditor-XM5bAziW.css} +6 -6
  8. package/dist/assets/LpLogViewer-BDNW6P52.css +38 -0
  9. package/dist/assets/{LpPalettePreview-CJmAKgYW.css → LpPalettePreview-B9VKDrvA.css} +2 -7
  10. package/dist/assets/LpRepeater-C1Cw27hj.css +21 -0
  11. package/dist/assets/{LpRollingText-BGnE6q9j.css → LpRollingText-dyOXedGO.css} +7 -0
  12. package/dist/assets/LpShinyText-D69cBYDR.css +61 -0
  13. package/dist/assets/LpStatus-430OGTZY.css +17 -0
  14. package/dist/assets/LpStepMark-Drvx33Vg.css +10 -0
  15. package/dist/assets/{LpTable-BPERfJIk.css → LpTable-DHxEQ_-3.css} +19 -19
  16. package/dist/assets/LpTabs-BJ-nrJuI.css +18 -0
  17. package/dist/assets/LpTextReveal-DjI1MsDS.css +35 -0
  18. package/dist/assets/LpTypewriter-CXAm9Nca.css +27 -0
  19. package/dist/chunks/AttentionDot-DCBf4aWg.js +25 -0
  20. package/dist/chunks/{ContextMenuItems-B7XFHksm.js → ContextMenuItems-6kxEivBI.js} +11 -5
  21. package/dist/chunks/{DropzoneLinkField-CjkrpDqO.js → DropzoneLinkField-Bw8Flkhk.js} +2 -2
  22. package/dist/chunks/FieldWrapper-BiennROB.js +43 -0
  23. package/dist/chunks/{LayoutCanvas-DF9CovaK.js → LayoutCanvas-BsJIzhdd.js} +1 -1
  24. package/dist/chunks/{LayoutNode-D9bIFzk0.js → LayoutNode-DJVhkSGk.js} +6 -8
  25. package/dist/chunks/LegendSwatch-BhRjrtzv.js +18 -0
  26. package/dist/chunks/LoaderMark-C1dubiKn.js +85 -0
  27. package/dist/chunks/{LpActionBar-MPKMu3pz.js → LpActionBar-CzOFar5t.js} +14 -20
  28. package/dist/chunks/LpActivityLine-CJvzrNpj.js +95 -0
  29. package/dist/chunks/{LpAddressInput-DG0BTqdH.js → LpAddressInput-Chv_Xf8q.js} +7 -7
  30. package/dist/chunks/LpAlert-C5igj802.js +119 -0
  31. package/dist/chunks/{LpAppShell-DPh1756q.js → LpAppShell-BiWByLmt.js} +15 -16
  32. package/dist/chunks/{LpAutocomplete-Dgn6hw3p.js → LpAutocomplete-D92niDHE.js} +15 -32
  33. package/dist/chunks/{LpAvatar-Bs0Fb1lC.js → LpAvatar-CLPl-qOF.js} +18 -6
  34. package/dist/chunks/LpBadge-BBq1Er9T.js +126 -0
  35. package/dist/chunks/LpBreadcrumbs-JKEi_yFF.js +144 -0
  36. package/dist/chunks/{LpButton-DNR-YAq5.js → LpButton-CVxBfGjd.js} +12 -4
  37. package/dist/chunks/{LpCalendar-BLya39Fh.js → LpCalendar-pVL91-Pl.js} +1 -1
  38. package/dist/chunks/{LpCard-Bf71NXZq.js → LpCard-CqKLnEhl.js} +18 -8
  39. package/dist/chunks/{LpCheckbox-Da5oZPHo.js → LpCheckbox-DHc2bHDe.js} +9 -6
  40. package/dist/chunks/{LpCodeBlock-lLbmslfs.js → LpCodeBlock-BGsQhxw8.js} +24 -32
  41. package/dist/chunks/LpCodeDisplay-CbJMs-IK.js +189 -0
  42. package/dist/chunks/LpCollapse-CWS9M_lm.js +115 -0
  43. package/dist/chunks/{LpColorPicker-DtEfBAcK.js → LpColorPicker-B7HSIFmn.js} +11 -6
  44. package/dist/chunks/{LpConfirmDialog-D7s4jakB.js → LpConfirmDialog-CfGCux8m.js} +3 -3
  45. package/dist/chunks/{LpConfirmHost-DrYI5y1K.js → LpConfirmHost-exB7JmcO.js} +1 -1
  46. package/dist/chunks/{LpContextMenu-CRnjoqSt.js → LpContextMenu-Cj96ENDC.js} +16 -7
  47. package/dist/chunks/LpCopyButton-DzHjnFs0.js +133 -0
  48. package/dist/chunks/LpCountdown-BQnmB4gq.js +231 -0
  49. package/dist/chunks/LpDataList-CHNYQw7h.js +121 -0
  50. package/dist/chunks/LpDatePicker-ac1_6o5P.js +169 -0
  51. package/dist/chunks/LpDateRangePicker-B15gYrZJ.js +127 -0
  52. package/dist/chunks/{LpDisclosure-6AplYBub.js → LpDisclosure-DOarzlAG.js} +22 -11
  53. package/dist/chunks/{LpDrawer-Q4SOxM4s.js → LpDrawer-DGNKRsGq.js} +9 -4
  54. package/dist/chunks/{LpDropdownMenu-DWTt0ooM.js → LpDropdownMenu-R4aYVtVV.js} +14 -6
  55. package/dist/chunks/LpEditable-Ws3DNQHn.js +238 -0
  56. package/dist/chunks/{LpEmptyState-om1UnFjV.js → LpEmptyState-KTKipws2.js} +1 -1
  57. package/dist/chunks/{LpFieldNotice-CHuDeLjc.js → LpFieldNotice-CurbNuXI.js} +1 -1
  58. package/dist/chunks/{LpFileTree-CW24YsVX.js → LpFileTree-DDNg34tJ.js} +5 -3
  59. package/dist/chunks/{LpFileTreeNode-BXhTHaKW.js → LpFileTreeNode-DmPuYNZ_.js} +42 -55
  60. package/dist/chunks/{LpFormField-DPb47HEm.js → LpFormField-BWwgm1E4.js} +23 -9
  61. package/dist/chunks/LpFrame-BVQCQLDI.js +155 -0
  62. package/dist/chunks/LpGauge-C14Z9503.js +204 -0
  63. package/dist/chunks/LpGlowBorder-B8V-QzIl.js +40 -0
  64. package/dist/chunks/{LpHintExample-C1eKYdeL.js → LpHintExample-9Py0wc-L.js} +11 -34
  65. package/dist/chunks/{LpHintLayer-7UOdWQG3.js → LpHintLayer-HvwUA5Ec.js} +27 -14
  66. package/dist/chunks/{LpHints-BUtBp9-w.js → LpHints-DxbPKOzQ.js} +3 -3
  67. package/dist/chunks/LpHoverCard-spGxyw7T.js +130 -0
  68. package/dist/chunks/{LpIcon-6tSrZ3Zy.js → LpIcon-HJP5xMz4.js} +1 -1
  69. package/dist/chunks/LpIdenticon-BzdC_qz9.js +63 -0
  70. package/dist/chunks/{LpInfraNode-Ds_8SZgN.js → LpInfraNode-D64hywJI.js} +39 -25
  71. package/dist/chunks/{LpInput-CUyr6PIE.js → LpInput-CDuwODJG.js} +44 -18
  72. package/dist/chunks/{LpLightbox-B9J8rzsj.js → LpLightbox-XJ0LpTcZ.js} +69 -69
  73. package/dist/chunks/LpLoader-DjJEX8hL.js +92 -0
  74. package/dist/chunks/{LpLogViewer-4QFc-sVN.js → LpLogViewer-DKK4ySZl.js} +225 -129
  75. package/dist/chunks/LpMagnetic-CtXKLa2Y.js +62 -0
  76. package/dist/chunks/{LpMapPicker-BTbkFeSG.js → LpMapPicker-BtIl7NOM.js} +34 -31
  77. package/dist/chunks/LpMasonry--k0571qG.js +185 -0
  78. package/dist/chunks/{LpMediaGallery-CuPcscx3.js → LpMediaGallery-rmI1DjKN.js} +3 -3
  79. package/dist/chunks/{LpModal-hk1noDcr.js → LpModal-eBMt2Fqn.js} +8 -3
  80. package/dist/chunks/{LpModalNav-DQd2keZm.js → LpModalNav-DiyFCHiZ.js} +4 -4
  81. package/dist/chunks/{LpNotificationBell-X84PJIxD.js → LpNotificationBell-D-WhE5m2.js} +32 -48
  82. package/dist/chunks/LpNumberField-B9k-h2HE.js +140 -0
  83. package/dist/chunks/{LpNumberFlow-z4WPZcZu.js → LpNumberFlow-Cfyh033Q.js} +8 -28
  84. package/dist/chunks/{LpOtpInput-PbeNJ5In.js → LpOtpInput-CeBPsM7D.js} +2 -1
  85. package/dist/chunks/{LpPagination-Bx-VG4Ag.js → LpPagination-VNCX6pFC.js} +37 -6
  86. package/dist/chunks/{LpPalettePreview-CFav_7co.js → LpPalettePreview-BNB8T_MY.js} +1 -1
  87. package/dist/chunks/{LpPasswordInput-CbnXitAS.js → LpPasswordInput-GL2KOFK8.js} +26 -22
  88. package/dist/chunks/{LpPhoneInput-DP69HONS.js → LpPhoneInput-C60tx1tC.js} +12 -7
  89. package/dist/chunks/{LpPie-yLF9-aDR.js → LpPie-BgXZ3xmm.js} +159 -48
  90. package/dist/chunks/LpPipeline-B31h41Mu.js +329 -0
  91. package/dist/chunks/{LpPopover-DVnkHaOu.js → LpPopover-DmZ3wUtP.js} +13 -7
  92. package/dist/chunks/{LpProgress-CA86wxXu.js → LpProgress-CE-m5OpD.js} +23 -63
  93. package/dist/chunks/LpQuota-DaL8TgNe.js +162 -0
  94. package/dist/chunks/{LpRadioGroup-8S5hf8lE.js → LpRadioGroup-CGBr5nIp.js} +1 -1
  95. package/dist/chunks/{LpRangeCalendar-ByQi-WUz.js → LpRangeCalendar-c5qj7YcC.js} +1 -1
  96. package/dist/chunks/{LpRangeSlider-C1yF9-nP.js → LpRangeSlider-Dv6lNvHY.js} +6 -2
  97. package/dist/chunks/LpRelativeTime-yin9uQP7.js +73 -0
  98. package/dist/chunks/LpRepeater-D0S7jjwr.js +180 -0
  99. package/dist/chunks/LpRevealOnScroll-DcQjexLy.js +76 -0
  100. package/dist/chunks/{LpRollingText-DB7upf-5.js → LpRollingText-DiL717LK.js} +4 -3
  101. package/dist/chunks/LpScramble-TDO5Kdou.js +85 -0
  102. package/dist/chunks/LpSecretField-CfWyHv9m.js +316 -0
  103. package/dist/chunks/{LpSection-BmRXe6ZP.js → LpSection-BW4xJ-Li.js} +1 -1
  104. package/dist/chunks/{LpSegmented-CW3bFHM4.js → LpSegmented-BO99Sr4m.js} +11 -14
  105. package/dist/chunks/{LpSelect-BCyDYoih.js → LpSelect-C_8cJtj6.js} +91 -111
  106. package/dist/chunks/LpShaderBackdrop-Bote0iuy.js +332 -0
  107. package/dist/chunks/LpShinyText-DX2ajtWq.js +48 -0
  108. package/dist/chunks/{LpSidebar-DfIiS-lB.js → LpSidebar-CZRXtvem.js} +5 -3
  109. package/dist/chunks/{LpSidebarNav-C5FDNI0t.js → LpSidebarNav-DBg1U1oW.js} +3 -3
  110. package/dist/chunks/{LpSlider-Cuzmrd7p.js → LpSlider-DuoRpOrH.js} +6 -2
  111. package/dist/chunks/{LpSparkline-DXT4KrSi.js → LpSparkline-CExIRDb3.js} +32 -27
  112. package/dist/chunks/LpSpotlight-4F3NeUMY.js +41 -0
  113. package/dist/chunks/{LpStat-iBMF5QNk.js → LpStat-DFKlPJgy.js} +38 -35
  114. package/dist/chunks/LpStatus-BsGLrpor.js +86 -0
  115. package/dist/chunks/LpStepMark-TrzOioa9.js +101 -0
  116. package/dist/chunks/LpStepper-BbnS5jUr.js +76 -0
  117. package/dist/chunks/{LpSwap-D82jiecV.js → LpSwap-DzE6M3Mg.js} +1 -1
  118. package/dist/chunks/LpSwitch-DrzKrZZV.js +112 -0
  119. package/dist/chunks/{LpTableFilter-CuIbgdW0.js → LpTableFilter-DyvHGbOk.js} +3 -2
  120. package/dist/chunks/{LpTableOfContents-C_4VBktT.js → LpTableOfContents-rYvo8z5T.js} +34 -21
  121. package/dist/chunks/{LpTagsInput-DiXrpYeE.js → LpTagsInput-DZg80W-B.js} +68 -71
  122. package/dist/chunks/LpTextReveal-CtAnOUkp.js +140 -0
  123. package/dist/chunks/{LpTextarea-xoQd5Lnp.js → LpTextarea-DiWjeVoJ.js} +12 -11
  124. package/dist/chunks/{LpThemeProvider-CQ2jC9TA.js → LpThemeProvider-DcbfOxsU.js} +1 -1
  125. package/dist/chunks/LpThemeStudio-DxVZMtzN.js +416 -0
  126. package/dist/chunks/LpThemeStudioSection-BwhqYDLf.js +20 -0
  127. package/dist/chunks/LpThemeSwitcher-CadVBTBn.js +278 -0
  128. package/dist/chunks/{LpTimeField-MFgAsNc5.js → LpTimeField-BFQVf_PW.js} +13 -5
  129. package/dist/chunks/{LpToaster-C4zE9zB7.js → LpToaster-Wv9ksj4q.js} +49 -82
  130. package/dist/chunks/{LpTooltip-suFCM34F.js → LpTooltip-Cz8SQwRt.js} +8 -3
  131. package/dist/chunks/{LpTopologyCanvas-6ozNrQKh.js → LpTopologyCanvas-C17A1XCb.js} +1 -1
  132. package/dist/chunks/{LpTour-BUp3Jt2e.js → LpTour-CY2bFXge.js} +24 -18
  133. package/dist/chunks/LpTruncate-D_5Pfv5B.js +112 -0
  134. package/dist/chunks/LpTypewriter-BCL_a6wE.js +159 -0
  135. package/dist/chunks/{LpUptimeBar-B6kHw4Cj.js → LpUptimeBar-Tew1Ykx4.js} +10 -9
  136. package/dist/chunks/{LpVideoBackdrop-qWRYBOTQ.js → LpVideoBackdrop-DS1wGv-X.js} +7 -8
  137. package/dist/chunks/{MenuTitle-obgek0B7.js → MenuTitle-BjQZX8tQ.js} +1 -1
  138. package/dist/chunks/OptionContent-CmYUUeWj.js +40 -0
  139. package/dist/chunks/PickerField-DoHv0WMH.js +125 -0
  140. package/dist/chunks/RevealToggle-C-KzaQGJ.js +65 -0
  141. package/dist/chunks/StepConnector-37OgEOXA.js +41 -0
  142. package/dist/chunks/TourCard-BJ8i7dk0.js +123 -0
  143. package/dist/chunks/backdrop-Dkf2vM81.js +59 -0
  144. package/dist/chunks/{icons-DVhZ_plB.js → icons-4IywzkHk.js} +1 -1
  145. package/dist/chunks/{useTheme-2qHG8NEU.js → useTheme-BOV_-AiY.js} +9 -65
  146. package/dist/component-names.d.ts +1 -1
  147. package/dist/components/AttentionDot.vue.d.ts +9 -0
  148. package/dist/components/AttentionDot.vue.js +4 -0
  149. package/dist/components/ContextMenuItems.vue.js +1 -1
  150. package/dist/components/DropzoneLinkField.vue.js +1 -1
  151. package/dist/components/FieldWrapper.vue.d.ts +25 -0
  152. package/dist/components/FieldWrapper.vue.js +4 -0
  153. package/dist/components/LayoutCanvas.vue.js +1 -1
  154. package/dist/components/LayoutNode.vue.d.ts +4 -4
  155. package/dist/components/LayoutNode.vue.js +1 -1
  156. package/dist/components/LegendSwatch.vue.d.ts +6 -0
  157. package/dist/components/LegendSwatch.vue.js +4 -0
  158. package/dist/components/LoaderMark.vue.d.ts +12 -0
  159. package/dist/components/LoaderMark.vue.js +4 -0
  160. package/dist/components/LpActionBar.vue.js +1 -1
  161. package/dist/components/LpActivityLine.vue.d.ts +58 -0
  162. package/dist/components/LpActivityLine.vue.js +4 -0
  163. package/dist/components/LpAddressInput.vue.js +1 -1
  164. package/dist/components/LpAlert.vue.d.ts +2 -2
  165. package/dist/components/LpAlert.vue.js +1 -1
  166. package/dist/components/LpAppShell.vue.d.ts +8 -7
  167. package/dist/components/LpAppShell.vue.js +1 -1
  168. package/dist/components/LpAutocomplete.vue.js +1 -1
  169. package/dist/components/LpAvatar.vue.d.ts +16 -0
  170. package/dist/components/LpAvatar.vue.js +1 -1
  171. package/dist/components/LpBadge.vue.d.ts +19 -5
  172. package/dist/components/LpBadge.vue.js +1 -1
  173. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  174. package/dist/components/LpButton.vue.d.ts +2 -2
  175. package/dist/components/LpButton.vue.js +1 -1
  176. package/dist/components/LpCalendar.vue.js +1 -1
  177. package/dist/components/LpCard.vue.d.ts +24 -0
  178. package/dist/components/LpCard.vue.js +1 -1
  179. package/dist/components/LpChart.vue.js +131 -160
  180. package/dist/components/LpCheckbox.vue.d.ts +2 -2
  181. package/dist/components/LpCheckbox.vue.js +1 -1
  182. package/dist/components/LpCodeBlock.vue.js +1 -1
  183. package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
  184. package/dist/components/LpCodeDisplay.vue.js +4 -0
  185. package/dist/components/LpCollapse.vue.d.ts +58 -0
  186. package/dist/components/LpCollapse.vue.js +4 -0
  187. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  188. package/dist/components/LpColorPicker.vue.js +1 -1
  189. package/dist/components/LpCommandPalette.vue.js +34 -23
  190. package/dist/components/LpConfirmDialog.vue.js +1 -1
  191. package/dist/components/LpConfirmHost.vue.js +1 -1
  192. package/dist/components/LpContextMenu.vue.js +1 -1
  193. package/dist/components/LpCopyButton.vue.d.ts +82 -0
  194. package/dist/components/LpCopyButton.vue.js +4 -0
  195. package/dist/components/LpCountdown.vue.d.ts +100 -0
  196. package/dist/components/LpCountdown.vue.js +4 -0
  197. package/dist/components/LpDataList.vue.d.ts +66 -0
  198. package/dist/components/LpDataList.vue.js +4 -0
  199. package/dist/components/LpDatePicker.vue.d.ts +3 -1
  200. package/dist/components/LpDatePicker.vue.js +1 -1
  201. package/dist/components/LpDateRangePicker.vue.d.ts +3 -1
  202. package/dist/components/LpDateRangePicker.vue.js +1 -1
  203. package/dist/components/LpDisclosure.vue.js +1 -1
  204. package/dist/components/LpDock.vue.d.ts +74 -0
  205. package/dist/components/LpDock.vue.js +204 -0
  206. package/dist/components/LpDrawer.vue.js +1 -1
  207. package/dist/components/LpDropdownMenu.vue.js +1 -1
  208. package/dist/components/LpDropzone.vue.d.ts +8 -1
  209. package/dist/components/LpDropzone.vue.js +36 -15
  210. package/dist/components/LpEditable.vue.d.ts +85 -0
  211. package/dist/components/LpEditable.vue.js +4 -0
  212. package/dist/components/LpEmptyState.vue.js +1 -1
  213. package/dist/components/LpFieldNotice.vue.js +1 -1
  214. package/dist/components/LpFileTree.vue.js +1 -1
  215. package/dist/components/LpFileTreeNode.vue.js +1 -1
  216. package/dist/components/LpFormField.vue.js +1 -1
  217. package/dist/components/LpFrame.vue.d.ts +22 -0
  218. package/dist/components/LpFrame.vue.js +4 -0
  219. package/dist/components/LpGauge.vue.d.ts +116 -0
  220. package/dist/components/LpGauge.vue.js +4 -0
  221. package/dist/components/LpGlowBorder.vue.d.ts +47 -0
  222. package/dist/components/LpGlowBorder.vue.js +4 -0
  223. package/dist/components/LpHintExample.vue.d.ts +2 -2
  224. package/dist/components/LpHintExample.vue.js +1 -1
  225. package/dist/components/LpHintLayer.vue.js +1 -1
  226. package/dist/components/LpHints.vue.js +1 -1
  227. package/dist/components/LpHoverCard.vue.d.ts +60 -0
  228. package/dist/components/LpHoverCard.vue.js +4 -0
  229. package/dist/components/LpIcon.vue.js +1 -1
  230. package/dist/components/LpIdenticon.vue.d.ts +37 -0
  231. package/dist/components/LpIdenticon.vue.js +4 -0
  232. package/dist/components/LpImageEditor.vue.js +13 -19
  233. package/dist/components/LpInfraNode.vue.js +1 -1
  234. package/dist/components/LpInput.vue.d.ts +10 -0
  235. package/dist/components/LpInput.vue.js +1 -1
  236. package/dist/components/LpLightbox.vue.js +1 -1
  237. package/dist/components/LpLoader.vue.d.ts +106 -0
  238. package/dist/components/LpLoader.vue.js +4 -0
  239. package/dist/components/LpLogViewer.vue.js +1 -1
  240. package/dist/components/LpMagnetic.vue.d.ts +28 -0
  241. package/dist/components/LpMagnetic.vue.js +4 -0
  242. package/dist/components/LpMapPicker.vue.js +1 -1
  243. package/dist/components/LpMasonry.vue.d.ts +42 -0
  244. package/dist/components/LpMasonry.vue.js +4 -0
  245. package/dist/components/LpMediaGallery.vue.js +1 -1
  246. package/dist/components/LpModal.vue.js +1 -1
  247. package/dist/components/LpModalNav.vue.js +1 -1
  248. package/dist/components/LpNotificationBell.vue.d.ts +15 -6
  249. package/dist/components/LpNotificationBell.vue.js +1 -1
  250. package/dist/components/LpNumberField.vue.d.ts +57 -0
  251. package/dist/components/LpNumberField.vue.js +1 -1
  252. package/dist/components/LpNumberFlow.vue.js +1 -1
  253. package/dist/components/LpOtpInput.vue.d.ts +12 -4
  254. package/dist/components/LpOtpInput.vue.js +1 -1
  255. package/dist/components/LpPagination.vue.js +1 -1
  256. package/dist/components/LpPaletteFacts.vue.js +2 -2
  257. package/dist/components/LpPaletteHeader.vue.js +2 -2
  258. package/dist/components/LpPalettePreview.vue.js +1 -1
  259. package/dist/components/LpPaletteStats.vue.js +2 -2
  260. package/dist/components/LpPasswordInput.vue.d.ts +19 -2
  261. package/dist/components/LpPasswordInput.vue.js +1 -1
  262. package/dist/components/LpPhoneInput.vue.js +1 -1
  263. package/dist/components/LpPie.vue.d.ts +3 -1
  264. package/dist/components/LpPie.vue.js +1 -1
  265. package/dist/components/LpPipeline.vue.d.ts +91 -0
  266. package/dist/components/LpPipeline.vue.js +4 -0
  267. package/dist/components/LpPopover.vue.d.ts +2 -2
  268. package/dist/components/LpPopover.vue.js +1 -1
  269. package/dist/components/LpProgress.vue.d.ts +11 -4
  270. package/dist/components/LpProgress.vue.js +1 -1
  271. package/dist/components/LpQuota.vue.d.ts +68 -0
  272. package/dist/components/LpQuota.vue.js +4 -0
  273. package/dist/components/LpRadioGroup.vue.js +1 -1
  274. package/dist/components/LpRangeCalendar.vue.js +1 -1
  275. package/dist/components/LpRangeSlider.vue.js +1 -1
  276. package/dist/components/LpRelativeTime.vue.d.ts +41 -0
  277. package/dist/components/LpRelativeTime.vue.js +4 -0
  278. package/dist/components/LpRepeater.vue.d.ts +48 -0
  279. package/dist/components/LpRepeater.vue.js +4 -0
  280. package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
  281. package/dist/components/LpRevealOnScroll.vue.js +4 -0
  282. package/dist/components/LpRollingText.vue.d.ts +3 -1
  283. package/dist/components/LpRollingText.vue.js +1 -1
  284. package/dist/components/LpScramble.vue.d.ts +55 -0
  285. package/dist/components/LpScramble.vue.js +4 -0
  286. package/dist/components/LpScrollArea.vue.d.ts +1 -1
  287. package/dist/components/LpSecretField.vue.d.ts +108 -0
  288. package/dist/components/LpSecretField.vue.js +4 -0
  289. package/dist/components/LpSection.vue.js +1 -1
  290. package/dist/components/LpSegmented.vue.js +1 -1
  291. package/dist/components/LpSelect.vue.d.ts +2 -0
  292. package/dist/components/LpSelect.vue.js +1 -1
  293. package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
  294. package/dist/components/LpShaderBackdrop.vue.js +4 -0
  295. package/dist/components/LpShinyText.vue.d.ts +39 -0
  296. package/dist/components/LpShinyText.vue.js +4 -0
  297. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  298. package/dist/components/LpSidebar.vue.js +1 -1
  299. package/dist/components/LpSidebarNav.vue.js +1 -1
  300. package/dist/components/LpSlider.vue.js +1 -1
  301. package/dist/components/LpSparkline.vue.d.ts +4 -3
  302. package/dist/components/LpSparkline.vue.js +1 -1
  303. package/dist/components/LpSpotlight.vue.d.ts +37 -0
  304. package/dist/components/LpSpotlight.vue.js +4 -0
  305. package/dist/components/LpStat.vue.js +1 -1
  306. package/dist/components/LpStatus.vue.d.ts +65 -0
  307. package/dist/components/LpStatus.vue.js +4 -0
  308. package/dist/components/LpStepMark.vue.d.ts +31 -0
  309. package/dist/components/LpStepMark.vue.js +4 -0
  310. package/dist/components/LpStepper.vue.js +1 -1
  311. package/dist/components/LpSwap.vue.js +1 -1
  312. package/dist/components/LpSwitch.vue.d.ts +2 -2
  313. package/dist/components/LpSwitch.vue.js +1 -1
  314. package/dist/components/LpTable.vue.js +104 -120
  315. package/dist/components/LpTableFilter.vue.js +1 -1
  316. package/dist/components/LpTableOfContents.vue.d.ts +6 -1
  317. package/dist/components/LpTableOfContents.vue.js +1 -1
  318. package/dist/components/LpTabs.vue.d.ts +5 -5
  319. package/dist/components/LpTabs.vue.js +25 -33
  320. package/dist/components/LpTagsInput.vue.js +1 -1
  321. package/dist/components/LpTextReveal.vue.d.ts +58 -0
  322. package/dist/components/LpTextReveal.vue.js +4 -0
  323. package/dist/components/LpTextarea.vue.js +1 -1
  324. package/dist/components/LpThemeProvider.vue.js +1 -1
  325. package/dist/components/LpThemeStudio.vue.d.ts +54 -0
  326. package/dist/components/LpThemeStudio.vue.js +4 -0
  327. package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
  328. package/dist/components/LpThemeStudioSection.vue.js +4 -0
  329. package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
  330. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  331. package/dist/components/LpTimeField.vue.d.ts +2 -0
  332. package/dist/components/LpTimeField.vue.js +1 -1
  333. package/dist/components/LpToaster.vue.js +1 -1
  334. package/dist/components/LpTooltip.vue.d.ts +2 -2
  335. package/dist/components/LpTooltip.vue.js +1 -1
  336. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  337. package/dist/components/LpTour.vue.js +1 -1
  338. package/dist/components/LpTruncate.vue.d.ts +34 -0
  339. package/dist/components/LpTruncate.vue.js +4 -0
  340. package/dist/components/LpTypewriter.vue.d.ts +61 -0
  341. package/dist/components/LpTypewriter.vue.js +4 -0
  342. package/dist/components/LpUptimeBar.vue.js +1 -1
  343. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  344. package/dist/components/MenuTitle.vue.js +1 -1
  345. package/dist/components/OptionContent.vue.d.ts +7 -0
  346. package/dist/components/OptionContent.vue.js +4 -0
  347. package/dist/components/PickerField.vue.d.ts +45 -0
  348. package/dist/components/PickerField.vue.js +4 -0
  349. package/dist/components/RevealToggle.vue.d.ts +21 -0
  350. package/dist/components/RevealToggle.vue.js +4 -0
  351. package/dist/components/StepConnector.vue.d.ts +19 -0
  352. package/dist/components/StepConnector.vue.js +4 -0
  353. package/dist/components/TourCard.vue.js +1 -1
  354. package/dist/components/badge.d.ts +1 -0
  355. package/dist/components/badge.js +4 -0
  356. package/dist/components/chart.d.ts +5 -1
  357. package/dist/components/chart.js +2 -21
  358. package/dist/components/dateRange.d.ts +11 -0
  359. package/dist/components/dateRange.js +12 -0
  360. package/dist/components/dock.d.ts +19 -0
  361. package/dist/components/dock.js +16 -0
  362. package/dist/components/dropdown.d.ts +10 -1
  363. package/dist/components/dropdown.js +7 -2
  364. package/dist/components/fieldText.d.ts +38 -0
  365. package/dist/components/fieldText.js +53 -0
  366. package/dist/components/fileTree.d.ts +7 -3
  367. package/dist/components/fileTree.js +12 -18
  368. package/dist/components/format.d.ts +41 -0
  369. package/dist/components/format.js +67 -0
  370. package/dist/components/identicon.d.ts +38 -0
  371. package/dist/components/identicon.js +85 -0
  372. package/dist/components/masonry.d.ts +32 -0
  373. package/dist/components/masonry.js +40 -0
  374. package/dist/components/menuWhen.js +1 -1
  375. package/dist/components/meter.d.ts +64 -0
  376. package/dist/components/meter.js +53 -0
  377. package/dist/components/otp.d.ts +1 -1
  378. package/dist/components/otp.js +7 -2
  379. package/dist/components/pipeline.d.ts +55 -0
  380. package/dist/components/pipeline.js +51 -0
  381. package/dist/components/quota.d.ts +57 -0
  382. package/dist/components/quota.js +40 -0
  383. package/dist/components/relativeTime.d.ts +24 -0
  384. package/dist/components/relativeTime.js +56 -0
  385. package/dist/components/reveal.d.ts +18 -0
  386. package/dist/components/reveal.js +32 -0
  387. package/dist/components/scramble.d.ts +68 -0
  388. package/dist/components/scramble.js +58 -0
  389. package/dist/components/shaderBackdrop.d.ts +20 -0
  390. package/dist/components/shaderBackdrop.js +156 -0
  391. package/dist/components/slider.d.ts +5 -0
  392. package/dist/components/slider.js +24 -0
  393. package/dist/components/slotText.d.ts +2 -0
  394. package/dist/components/slotText.js +9 -0
  395. package/dist/components/status.d.ts +14 -0
  396. package/dist/components/status.js +22 -0
  397. package/dist/components/tableFacets.d.ts +8 -0
  398. package/dist/components/tableFacets.js +19 -0
  399. package/dist/components/textSplit.d.ts +17 -0
  400. package/dist/components/textSplit.js +24 -0
  401. package/dist/components/timeSpan.d.ts +78 -0
  402. package/dist/components/timeSpan.js +85 -0
  403. package/dist/components/tone.d.ts +43 -0
  404. package/dist/components/tone.js +82 -0
  405. package/dist/components/tour.js +3 -2
  406. package/dist/components/typewriter.d.ts +36 -0
  407. package/dist/components/typewriter.js +53 -0
  408. package/dist/components/videoBackdrop.js +5 -6
  409. package/dist/composables/easing.d.ts +22 -1
  410. package/dist/composables/easing.js +42 -1
  411. package/dist/composables/pseudoLocale.d.ts +15 -0
  412. package/dist/composables/pseudoLocale.js +96 -0
  413. package/dist/composables/scroll.js +5 -3
  414. package/dist/composables/useClipboard.d.ts +4 -1
  415. package/dist/composables/useClipboard.js +12 -2
  416. package/dist/composables/useField.d.ts +13 -0
  417. package/dist/composables/useField.js +26 -1
  418. package/dist/composables/useForm.js +32 -9
  419. package/dist/composables/useInView.d.ts +11 -0
  420. package/dist/composables/useInView.js +39 -0
  421. package/dist/composables/useLoadingGate.d.ts +8 -0
  422. package/dist/composables/useLoadingGate.js +38 -0
  423. package/dist/composables/useLpConfig.d.ts +10 -0
  424. package/dist/composables/useLpConfig.js +11 -1
  425. package/dist/composables/useMediaQuery.js +3 -1
  426. package/dist/composables/useNow.d.ts +16 -0
  427. package/dist/composables/useNow.js +39 -0
  428. package/dist/composables/usePersisted.js +14 -7
  429. package/dist/composables/usePillTransition.d.ts +5 -2
  430. package/dist/composables/usePillTransition.js +4 -3
  431. package/dist/composables/usePointerFrame.d.ts +18 -0
  432. package/dist/composables/usePointerFrame.js +31 -0
  433. package/dist/composables/useReducedMotion.d.ts +2 -0
  434. package/dist/composables/useReducedMotion.js +7 -0
  435. package/dist/composables/useRepeater.d.ts +17 -0
  436. package/dist/composables/useRepeater.js +31 -0
  437. package/dist/composables/useResizeObserver.d.ts +8 -0
  438. package/dist/composables/useResizeObserver.js +33 -0
  439. package/dist/composables/useRevealedValue.d.ts +31 -0
  440. package/dist/composables/useRevealedValue.js +26 -0
  441. package/dist/composables/useScramble.d.ts +42 -0
  442. package/dist/composables/useScramble.js +76 -0
  443. package/dist/composables/useShift.js +2 -10
  444. package/dist/composables/useSpotlight.d.ts +18 -0
  445. package/dist/composables/useSpotlight.js +53 -0
  446. package/dist/composables/useTilt.js +26 -18
  447. package/dist/composables/useTween.d.ts +43 -0
  448. package/dist/composables/useTween.js +69 -0
  449. package/dist/composables/useView.d.ts +18 -0
  450. package/dist/composables/useView.js +64 -0
  451. package/dist/icons-all.js +1 -1
  452. package/dist/index.d.ts +98 -1
  453. package/dist/index.js +263 -105
  454. package/dist/theme/define.d.ts +12 -0
  455. package/dist/theme/studio.d.ts +90 -0
  456. package/package.json +8 -2
  457. package/src/component-names.ts +33 -0
  458. package/src/components/AttentionDot.vue +27 -0
  459. package/src/components/ContextMenuItems.vue +5 -2
  460. package/src/components/FieldWrapper.vue +38 -0
  461. package/src/components/LayoutNode.vue +5 -9
  462. package/src/components/LegendSwatch.vue +15 -0
  463. package/src/components/LoaderMark.vue +90 -0
  464. package/src/components/LpActionBar.vue +12 -20
  465. package/src/components/LpActivityLine.vue +186 -0
  466. package/src/components/LpAlert.vue +54 -24
  467. package/src/components/LpAppShell.vue +7 -11
  468. package/src/components/LpAutocomplete.vue +16 -14
  469. package/src/components/LpAvatar.vue +17 -2
  470. package/src/components/LpBadge.vue +77 -13
  471. package/src/components/LpBreadcrumbs.vue +101 -35
  472. package/src/components/LpButton.vue +15 -3
  473. package/src/components/LpCard.vue +30 -7
  474. package/src/components/LpChart.vue +162 -171
  475. package/src/components/LpCheckbox.vue +10 -4
  476. package/src/components/LpCodeBlock.vue +11 -19
  477. package/src/components/LpCodeDisplay.vue +228 -0
  478. package/src/components/LpCollapse.vue +162 -0
  479. package/src/components/LpColorPicker.vue +10 -1
  480. package/src/components/LpCommandPalette.vue +38 -24
  481. package/src/components/LpContextMenu.vue +13 -3
  482. package/src/components/LpCopyButton.vue +185 -0
  483. package/src/components/LpCountdown.vue +308 -0
  484. package/src/components/LpDataList.vue +154 -0
  485. package/src/components/LpDatePicker.vue +55 -104
  486. package/src/components/LpDateRangePicker.vue +51 -95
  487. package/src/components/LpDisclosure.vue +58 -36
  488. package/src/components/LpDock.vue +274 -0
  489. package/src/components/LpDrawer.vue +10 -1
  490. package/src/components/LpDropdownMenu.vue +11 -2
  491. package/src/components/LpDropzone.vue +34 -13
  492. package/src/components/LpEditable.vue +295 -0
  493. package/src/components/LpFileTree.vue +5 -1
  494. package/src/components/LpFileTreeNode.vue +25 -50
  495. package/src/components/LpFormField.vue +22 -3
  496. package/src/components/LpFrame.vue +200 -0
  497. package/src/components/LpGauge.vue +287 -0
  498. package/src/components/LpGlowBorder.vue +60 -0
  499. package/src/components/LpHintExample.vue +9 -32
  500. package/src/components/LpHintLayer.vue +13 -3
  501. package/src/components/LpHoverCard.vue +175 -0
  502. package/src/components/LpIdenticon.vue +69 -0
  503. package/src/components/LpImageEditor.vue +15 -18
  504. package/src/components/LpInfraNode.vue +27 -16
  505. package/src/components/LpInput.vue +30 -16
  506. package/src/components/LpLightbox.vue +44 -23
  507. package/src/components/LpLoader.vue +145 -0
  508. package/src/components/LpLogViewer.vue +311 -82
  509. package/src/components/LpMagnetic.vue +97 -0
  510. package/src/components/LpMapPicker.vue +26 -28
  511. package/src/components/LpMasonry.vue +247 -0
  512. package/src/components/LpModal.vue +10 -1
  513. package/src/components/LpNotificationBell.vue +33 -49
  514. package/src/components/LpNumberField.vue +79 -14
  515. package/src/components/LpNumberFlow.vue +10 -35
  516. package/src/components/LpOtpInput.vue +7 -2
  517. package/src/components/LpPagination.vue +38 -4
  518. package/src/components/LpPalettePreview.vue +2 -7
  519. package/src/components/LpPasswordInput.vue +25 -18
  520. package/src/components/LpPhoneInput.vue +12 -3
  521. package/src/components/LpPie.vue +197 -36
  522. package/src/components/LpPipeline.vue +366 -0
  523. package/src/components/LpPopover.vue +14 -1
  524. package/src/components/LpProgress.vue +22 -84
  525. package/src/components/LpQuota.vue +197 -0
  526. package/src/components/LpRangeSlider.vue +5 -1
  527. package/src/components/LpRelativeTime.vue +90 -0
  528. package/src/components/LpRepeater.vue +131 -0
  529. package/src/components/LpRevealOnScroll.vue +125 -0
  530. package/src/components/LpRollingText.vue +12 -1
  531. package/src/components/LpScramble.vue +107 -0
  532. package/src/components/LpSecretField.vue +320 -0
  533. package/src/components/LpSegmented.vue +3 -10
  534. package/src/components/LpSelect.vue +74 -65
  535. package/src/components/LpShaderBackdrop.vue +434 -0
  536. package/src/components/LpShinyText.vue +139 -0
  537. package/src/components/LpSidebar.vue +2 -0
  538. package/src/components/LpSlider.vue +5 -1
  539. package/src/components/LpSparkline.vue +55 -37
  540. package/src/components/LpSpotlight.vue +51 -0
  541. package/src/components/LpStat.vue +6 -2
  542. package/src/components/LpStatus.vue +127 -0
  543. package/src/components/LpStepMark.vue +138 -0
  544. package/src/components/LpStepper.vue +37 -43
  545. package/src/components/LpSwap.vue +2 -2
  546. package/src/components/LpSwitch.vue +15 -22
  547. package/src/components/LpTable.vue +47 -63
  548. package/src/components/LpTableFilter.vue +1 -0
  549. package/src/components/LpTableOfContents.vue +53 -29
  550. package/src/components/LpTabs.vue +10 -21
  551. package/src/components/LpTagsInput.vue +53 -37
  552. package/src/components/LpTextReveal.vue +236 -0
  553. package/src/components/LpTextarea.vue +11 -11
  554. package/src/components/LpThemeStudio.vue +216 -0
  555. package/src/components/LpThemeStudioSection.vue +16 -0
  556. package/src/components/LpThemeSwitcher.vue +156 -47
  557. package/src/components/LpTimeField.vue +9 -1
  558. package/src/components/LpToaster.vue +63 -83
  559. package/src/components/LpTooltip.vue +10 -1
  560. package/src/components/LpTour.vue +24 -13
  561. package/src/components/LpTruncate.vue +135 -0
  562. package/src/components/LpTypewriter.vue +236 -0
  563. package/src/components/LpUptimeBar.vue +6 -5
  564. package/src/components/LpVideoBackdrop.vue +15 -13
  565. package/src/components/OptionContent.vue +17 -0
  566. package/src/components/PickerField.vue +59 -0
  567. package/src/components/RevealToggle.vue +51 -0
  568. package/src/components/StepConnector.vue +54 -0
  569. package/src/components/TourCard.vue +29 -16
  570. package/src/components/badge.ts +8 -0
  571. package/src/components/chart.ts +8 -23
  572. package/src/components/dateRange.ts +25 -0
  573. package/src/components/dock.ts +31 -0
  574. package/src/components/dropdown.ts +15 -3
  575. package/src/components/fieldText.ts +95 -0
  576. package/src/components/fileTree.ts +19 -21
  577. package/src/components/format.ts +136 -0
  578. package/src/components/identicon.ts +160 -0
  579. package/src/components/masonry.ts +73 -0
  580. package/src/components/meter.ts +122 -0
  581. package/src/components/otp.ts +14 -3
  582. package/src/components/pipeline.ts +101 -0
  583. package/src/components/quota.ts +111 -0
  584. package/src/components/relativeTime.ts +118 -0
  585. package/src/components/reveal.ts +56 -0
  586. package/src/components/scramble.ts +138 -0
  587. package/src/components/shaderBackdrop.ts +208 -0
  588. package/src/components/slider.ts +30 -0
  589. package/src/components/slotText.ts +13 -0
  590. package/src/components/status.ts +46 -0
  591. package/src/components/tableFacets.ts +25 -0
  592. package/src/components/textSplit.ts +55 -0
  593. package/src/components/timeSpan.ts +183 -0
  594. package/src/components/tone.ts +144 -0
  595. package/src/components/tour.ts +3 -2
  596. package/src/components/typewriter.ts +104 -0
  597. package/src/components/videoBackdrop.ts +7 -6
  598. package/src/composables/easing.ts +66 -1
  599. package/src/composables/pseudoLocale.ts +105 -0
  600. package/src/composables/scroll.ts +6 -3
  601. package/src/composables/useClipboard.ts +25 -3
  602. package/src/composables/useField.ts +38 -1
  603. package/src/composables/useForm.ts +41 -11
  604. package/src/composables/useInView.ts +61 -0
  605. package/src/composables/useLoadingGate.ts +63 -0
  606. package/src/composables/useLpConfig.ts +20 -1
  607. package/src/composables/useMediaQuery.ts +6 -2
  608. package/src/composables/useNow.ts +84 -0
  609. package/src/composables/usePersisted.ts +19 -8
  610. package/src/composables/usePillTransition.ts +21 -13
  611. package/src/composables/usePointerFrame.ts +72 -0
  612. package/src/composables/useReducedMotion.ts +22 -0
  613. package/src/composables/useRepeater.ts +44 -0
  614. package/src/composables/useResizeObserver.ts +59 -0
  615. package/src/composables/useRevealedValue.ts +84 -0
  616. package/src/composables/useScramble.ts +152 -0
  617. package/src/composables/useShift.ts +10 -16
  618. package/src/composables/useSpotlight.ts +82 -0
  619. package/src/composables/useTilt.ts +40 -23
  620. package/src/composables/useTween.ts +149 -0
  621. package/src/composables/useView.ts +96 -0
  622. package/src/index.css +1 -0
  623. package/src/index.ts +143 -1
  624. package/src/kit-icons.ts +1 -1
  625. package/src/theme/define.ts +65 -0
  626. package/src/theme/studio.ts +202 -0
  627. package/src/tokens/effects.css +151 -0
  628. package/src/tokens/tokens.css +131 -39
  629. package/src/tokens/utilities.css +81 -0
  630. package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
  631. package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
  632. package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
  633. package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
  634. package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
  635. package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
  636. package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
  637. package/dist/chunks/LpStepper-C2slwObu.js +0 -90
  638. package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
  639. package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
  640. package/dist/chunks/TourCard-BKI7X9-r.js +0 -105
@@ -0,0 +1,82 @@
1
+ const TONE_ALIASES = {
2
+ neutral: "neutral",
3
+ muted: "neutral",
4
+ brand: "brand",
5
+ info: "brand",
6
+ success: "success",
7
+ ok: "success",
8
+ action: "success",
9
+ warning: "warning",
10
+ accent: "warning",
11
+ danger: "danger",
12
+ error: "danger"
13
+ };
14
+ const TONES = {
15
+ neutral: {
16
+ color: "var(--color-muted)",
17
+ soft: "var(--color-surface-soft)",
18
+ text: "text-muted",
19
+ bg: "bg-muted",
20
+ softBg: "bg-surface-soft",
21
+ chip: "bg-surface-soft text-muted-strong",
22
+ border: "border-line-strong",
23
+ panel: "border-line bg-surface-soft",
24
+ selection: "selection:bg-muted/40"
25
+ },
26
+ brand: {
27
+ color: "var(--color-brand)",
28
+ soft: "var(--color-brand-soft)",
29
+ text: "text-brand",
30
+ bg: "bg-brand",
31
+ softBg: "bg-brand-soft",
32
+ chip: "bg-brand-soft text-[color-mix(in_oklab,var(--color-brand)_60%,var(--color-ink))]",
33
+ border: "border-brand",
34
+ panel: "border-brand/30 bg-brand/10",
35
+ selection: "selection:bg-brand/40"
36
+ },
37
+ success: {
38
+ color: "var(--color-action)",
39
+ soft: "var(--color-action-soft)",
40
+ text: "text-action",
41
+ bg: "bg-action",
42
+ softBg: "bg-action-soft",
43
+ chip: "bg-action-soft text-[color-mix(in_oklab,var(--color-action)_60%,var(--color-ink))]",
44
+ border: "border-action",
45
+ panel: "border-action/30 bg-action/10",
46
+ selection: "selection:bg-action/40"
47
+ },
48
+ warning: {
49
+ color: "var(--color-accent)",
50
+ soft: "var(--color-accent-soft)",
51
+ text: "text-accent",
52
+ bg: "bg-accent",
53
+ softBg: "bg-accent-soft",
54
+ chip: "bg-accent-soft text-[color-mix(in_oklab,var(--color-accent)_60%,var(--color-ink))]",
55
+ border: "border-accent",
56
+ panel: "border-accent/30 bg-accent/10",
57
+ selection: "selection:bg-accent/40"
58
+ },
59
+ danger: {
60
+ color: "var(--color-danger)",
61
+ soft: "var(--color-danger-soft)",
62
+ text: "text-danger",
63
+ bg: "bg-danger",
64
+ softBg: "bg-danger-soft",
65
+ chip: "bg-danger-soft text-[color-mix(in_oklab,var(--color-danger)_60%,var(--color-ink))]",
66
+ border: "border-danger",
67
+ panel: "border-danger/30 bg-danger/10",
68
+ selection: "selection:bg-danger/40"
69
+ }
70
+ };
71
+ function toneOf(name, fallback = "neutral") {
72
+ return name && TONE_ALIASES[name] || fallback;
73
+ }
74
+ function toneLook(name, fallback = "neutral") {
75
+ return TONES[toneOf(name, fallback)];
76
+ }
77
+ export {
78
+ TONES,
79
+ TONE_ALIASES,
80
+ toneLook,
81
+ toneOf
82
+ };
@@ -48,8 +48,9 @@ function openContextMenu(el) {
48
48
  );
49
49
  return () => {
50
50
  const outside = { bubbles: true, cancelable: true, clientX: 0, clientY: 0 };
51
- document.body.dispatchEvent(new PointerEvent("pointerdown", outside));
52
- document.body.dispatchEvent(new PointerEvent("pointerup", outside));
51
+ const body = el.ownerDocument.body;
52
+ body.dispatchEvent(new PointerEvent("pointerdown", outside));
53
+ body.dispatchEvent(new PointerEvent("pointerup", outside));
53
54
  };
54
55
  }
55
56
  export {
@@ -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,16 @@ 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;
47
+ /** Trigger and portalled content share a boundary for the control's public blur. */
48
+ export declare function useFieldBlur(blur: (event: FocusEvent) => void): {
49
+ partId: string;
50
+ onFocusOut: (event: FocusEvent) => void;
51
+ };
@@ -1,4 +1,4 @@
1
- import { useId, computed, provide, inject } from "vue";
1
+ import { useId, computed, provide, onScopeDispose, inject } from "vue";
2
2
  const LP_FIELD = /* @__PURE__ */ Symbol.for("lp-field");
3
3
  function provideField(context) {
4
4
  provide(LP_FIELD, context);
@@ -36,10 +36,35 @@ 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
+ }
43
+ function useFieldBlur(blur) {
44
+ const partId = `lp-field-${useId()}`;
45
+ let cancelPending;
46
+ const inside = (target) => !!target?.closest?.(`[data-lp-field-part="${partId}"]`);
47
+ function onFocusOut(event) {
48
+ cancelPending?.();
49
+ if (inside(event.relatedTarget)) return;
50
+ if (event.relatedTarget) return blur(event);
51
+ const doc = event.target.ownerDocument;
52
+ const view = doc.defaultView;
53
+ const frame = view.requestAnimationFrame(() => {
54
+ cancelPending = void 0;
55
+ if (!inside(doc.activeElement)) blur(event);
56
+ });
57
+ cancelPending = () => view.cancelAnimationFrame(frame);
58
+ }
59
+ onScopeDispose(() => cancelPending?.());
60
+ return { partId, onFocusOut };
61
+ }
39
62
  export {
40
63
  LP_FIELD,
41
64
  fieldMessageId,
65
+ focusLeft,
42
66
  provideField,
43
67
  useField,
68
+ useFieldBlur,
44
69
  useFieldControl
45
70
  };
@@ -30,6 +30,8 @@ function useForm(options) {
30
30
  const submitting = ref(false);
31
31
  const submitCount = ref(0);
32
32
  const runs = /* @__PURE__ */ new Map();
33
+ let validationEpoch = 0;
34
+ const fromForm = /* @__PURE__ */ new Map();
33
35
  const baseVersion = ref(0);
34
36
  const keys = () => Object.keys(plain());
35
37
  const dirty = computed(() => {
@@ -50,7 +52,7 @@ function useForm(options) {
50
52
  return void 0;
51
53
  }
52
54
  async function runField(name) {
53
- const run = (runs.get(name) ?? 0) + 1;
55
+ const run = /* @__PURE__ */ Symbol();
54
56
  runs.set(name, run);
55
57
  const found = await checkField(name);
56
58
  if (runs.get(name) !== run) return !errors[name];
@@ -60,26 +62,34 @@ function useForm(options) {
60
62
  }
61
63
  async function runForm() {
62
64
  if (!options.validate) return true;
63
- const run = (runs.get("form") ?? 0) + 1;
65
+ const run = /* @__PURE__ */ Symbol();
64
66
  runs.set("form", run);
65
67
  const found = await options.validate(plain()) ?? {};
66
68
  if (runs.get("form") !== run) return true;
69
+ for (const [name, text] of fromForm) if (errors[name] === text) delete errors[name];
70
+ fromForm.clear();
67
71
  let ok = true;
68
72
  for (const [name, text] of Object.entries(found)) {
69
73
  if (!text) continue;
70
74
  ok = false;
71
- if (!errors[name]) errors[name] = text;
75
+ if (errors[name]) continue;
76
+ errors[name] = text;
77
+ fromForm.set(name, text);
72
78
  }
73
79
  return ok;
74
80
  }
75
81
  async function validate(name) {
82
+ const epoch = validationEpoch;
76
83
  validating.value = true;
77
84
  try {
78
- if (name !== void 0) return await runField(name);
79
- if (errors.form) delete errors.form;
85
+ if (name !== void 0) {
86
+ const valid2 = await runField(name);
87
+ return epoch === validationEpoch && valid2;
88
+ }
80
89
  const fields = await Promise.all(keys().map(runField));
90
+ if (epoch !== validationEpoch) return false;
81
91
  const form = await runForm();
82
- return fields.every(Boolean) && form && !Object.values(external).some(Boolean);
92
+ return epoch === validationEpoch && fields.every(Boolean) && form && !Object.values(external).some(Boolean);
83
93
  } finally {
84
94
  validating.value = false;
85
95
  }
@@ -95,10 +105,12 @@ function useForm(options) {
95
105
  for (const [k, v] of Object.entries(next)) set(k, v);
96
106
  }
97
107
  function clearState() {
108
+ validationEpoch++;
98
109
  for (const k of Object.keys(errors)) delete errors[k];
99
110
  for (const k of Object.keys(external)) delete external[k];
100
111
  for (const k of Object.keys(touched)) delete touched[k];
101
112
  runs.clear();
113
+ fromForm.clear();
102
114
  submitCount.value = 0;
103
115
  }
104
116
  function adopt(next) {
@@ -125,17 +137,25 @@ function useForm(options) {
125
137
  },
126
138
  { deep: true }
127
139
  );
140
+ async function recheck(names) {
141
+ const epoch = validationEpoch;
142
+ await Promise.all(names.map((name) => validate(name)));
143
+ if (epoch !== validationEpoch) return;
144
+ if (fromForm.size || submitCount.value) await runForm();
145
+ }
128
146
  let snapshot = clone(plain());
129
147
  watch(
130
148
  plain,
131
149
  () => {
132
150
  const now = clone(plain());
151
+ const changed = [];
133
152
  for (const name of Object.keys(now)) {
134
153
  if (deepEqual(now[name], snapshot[name])) continue;
135
154
  if (external[name]) delete external[name];
136
- if (touched[name] || submitCount.value) void validate(name);
155
+ if (touched[name] || submitCount.value) changed.push(name);
137
156
  }
138
157
  snapshot = now;
158
+ if (changed.length) void recheck(changed);
139
159
  },
140
160
  { deep: true }
141
161
  );
@@ -168,8 +188,11 @@ function useForm(options) {
168
188
  try {
169
189
  submitCount.value++;
170
190
  for (const name of keys()) touched[name] = true;
171
- if (!await validate()) return;
172
- const submitted = clone(plain());
191
+ let submitted;
192
+ do {
193
+ submitted = clone(plain());
194
+ if (!await validate()) return;
195
+ } while (!deepEqual(plain(), submitted));
173
196
  await fn(submitted);
174
197
  if (deepEqual(plain(), submitted)) {
175
198
  baseline = submitted;
@@ -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;