@leavepulse/ui 0.69.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 (634) 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.js +107 -138
  177. package/dist/components/LpCheckbox.vue.d.ts +2 -2
  178. package/dist/components/LpCheckbox.vue.js +1 -1
  179. package/dist/components/LpCodeBlock.vue.js +1 -1
  180. package/dist/components/LpCodeDisplay.vue.d.ts +89 -0
  181. package/dist/components/LpCodeDisplay.vue.js +4 -0
  182. package/dist/components/LpCollapse.vue.d.ts +58 -0
  183. package/dist/components/LpCollapse.vue.js +4 -0
  184. package/dist/components/LpColorPicker.vue.d.ts +2 -2
  185. package/dist/components/LpColorPicker.vue.js +1 -1
  186. package/dist/components/LpCommandPalette.vue.js +34 -23
  187. package/dist/components/LpConfirmDialog.vue.js +1 -1
  188. package/dist/components/LpConfirmHost.vue.js +1 -1
  189. package/dist/components/LpContextMenu.vue.js +1 -1
  190. package/dist/components/LpCopyButton.vue.d.ts +82 -0
  191. package/dist/components/LpCopyButton.vue.js +4 -0
  192. package/dist/components/LpCountdown.vue.d.ts +100 -0
  193. package/dist/components/LpCountdown.vue.js +4 -0
  194. package/dist/components/LpDataList.vue.d.ts +66 -0
  195. package/dist/components/LpDataList.vue.js +4 -0
  196. package/dist/components/LpDatePicker.vue.d.ts +1 -1
  197. package/dist/components/LpDatePicker.vue.js +1 -1
  198. package/dist/components/LpDateRangePicker.vue.d.ts +1 -1
  199. package/dist/components/LpDateRangePicker.vue.js +1 -1
  200. package/dist/components/LpDisclosure.vue.js +1 -1
  201. package/dist/components/LpDock.vue.d.ts +74 -0
  202. package/dist/components/LpDock.vue.js +204 -0
  203. package/dist/components/LpDrawer.vue.js +1 -1
  204. package/dist/components/LpDropdownMenu.vue.js +1 -1
  205. package/dist/components/LpDropzone.vue.d.ts +8 -1
  206. package/dist/components/LpDropzone.vue.js +36 -15
  207. package/dist/components/LpEditable.vue.d.ts +85 -0
  208. package/dist/components/LpEditable.vue.js +4 -0
  209. package/dist/components/LpEmptyState.vue.js +1 -1
  210. package/dist/components/LpFieldNotice.vue.js +1 -1
  211. package/dist/components/LpFileTree.vue.js +1 -1
  212. package/dist/components/LpFileTreeNode.vue.js +1 -1
  213. package/dist/components/LpFormField.vue.js +1 -1
  214. package/dist/components/LpFrame.vue.d.ts +22 -0
  215. package/dist/components/LpFrame.vue.js +4 -0
  216. package/dist/components/LpGauge.vue.d.ts +116 -0
  217. package/dist/components/LpGauge.vue.js +4 -0
  218. package/dist/components/LpGlowBorder.vue.d.ts +47 -0
  219. package/dist/components/LpGlowBorder.vue.js +4 -0
  220. package/dist/components/LpHintExample.vue.d.ts +2 -2
  221. package/dist/components/LpHintExample.vue.js +1 -1
  222. package/dist/components/LpHintLayer.vue.js +1 -1
  223. package/dist/components/LpHints.vue.js +1 -1
  224. package/dist/components/LpHoverCard.vue.d.ts +60 -0
  225. package/dist/components/LpHoverCard.vue.js +4 -0
  226. package/dist/components/LpIcon.vue.js +1 -1
  227. package/dist/components/LpIdenticon.vue.d.ts +37 -0
  228. package/dist/components/LpIdenticon.vue.js +4 -0
  229. package/dist/components/LpImageEditor.vue.js +13 -19
  230. package/dist/components/LpInfraNode.vue.js +1 -1
  231. package/dist/components/LpInput.vue.d.ts +10 -0
  232. package/dist/components/LpInput.vue.js +1 -1
  233. package/dist/components/LpLightbox.vue.js +1 -1
  234. package/dist/components/LpLoader.vue.d.ts +106 -0
  235. package/dist/components/LpLoader.vue.js +4 -0
  236. package/dist/components/LpLogViewer.vue.js +1 -1
  237. package/dist/components/LpMagnetic.vue.d.ts +28 -0
  238. package/dist/components/LpMagnetic.vue.js +4 -0
  239. package/dist/components/LpMapPicker.vue.js +1 -1
  240. package/dist/components/LpMasonry.vue.d.ts +42 -0
  241. package/dist/components/LpMasonry.vue.js +4 -0
  242. package/dist/components/LpMediaGallery.vue.js +1 -1
  243. package/dist/components/LpModal.vue.js +1 -1
  244. package/dist/components/LpModalNav.vue.js +1 -1
  245. package/dist/components/LpNotificationBell.vue.d.ts +15 -6
  246. package/dist/components/LpNotificationBell.vue.js +1 -1
  247. package/dist/components/LpNumberField.vue.d.ts +57 -0
  248. package/dist/components/LpNumberField.vue.js +1 -1
  249. package/dist/components/LpNumberFlow.vue.js +1 -1
  250. package/dist/components/LpOtpInput.vue.d.ts +12 -4
  251. package/dist/components/LpOtpInput.vue.js +1 -1
  252. package/dist/components/LpPagination.vue.js +1 -1
  253. package/dist/components/LpPaletteFacts.vue.js +1 -1
  254. package/dist/components/LpPaletteHeader.vue.js +2 -2
  255. package/dist/components/LpPalettePreview.vue.js +1 -1
  256. package/dist/components/LpPaletteStats.vue.js +1 -1
  257. package/dist/components/LpPasswordInput.vue.d.ts +12 -1
  258. package/dist/components/LpPasswordInput.vue.js +1 -1
  259. package/dist/components/LpPhoneInput.vue.js +1 -1
  260. package/dist/components/LpPie.vue.d.ts +3 -1
  261. package/dist/components/LpPie.vue.js +1 -1
  262. package/dist/components/LpPipeline.vue.d.ts +91 -0
  263. package/dist/components/LpPipeline.vue.js +4 -0
  264. package/dist/components/LpPopover.vue.d.ts +2 -2
  265. package/dist/components/LpPopover.vue.js +1 -1
  266. package/dist/components/LpProgress.vue.d.ts +11 -4
  267. package/dist/components/LpProgress.vue.js +1 -1
  268. package/dist/components/LpQuota.vue.d.ts +68 -0
  269. package/dist/components/LpQuota.vue.js +4 -0
  270. package/dist/components/LpRadioGroup.vue.js +1 -1
  271. package/dist/components/LpRangeCalendar.vue.js +1 -1
  272. package/dist/components/LpRangeSlider.vue.js +1 -1
  273. package/dist/components/LpRelativeTime.vue.d.ts +41 -0
  274. package/dist/components/LpRelativeTime.vue.js +4 -0
  275. package/dist/components/LpRepeater.vue.d.ts +48 -0
  276. package/dist/components/LpRepeater.vue.js +4 -0
  277. package/dist/components/LpRevealOnScroll.vue.d.ts +67 -0
  278. package/dist/components/LpRevealOnScroll.vue.js +4 -0
  279. package/dist/components/LpRollingText.vue.d.ts +1 -1
  280. package/dist/components/LpScramble.vue.d.ts +55 -0
  281. package/dist/components/LpScramble.vue.js +4 -0
  282. package/dist/components/LpScrollArea.vue.d.ts +1 -1
  283. package/dist/components/LpSecretField.vue.d.ts +108 -0
  284. package/dist/components/LpSecretField.vue.js +4 -0
  285. package/dist/components/LpSection.vue.js +1 -1
  286. package/dist/components/LpSegmented.vue.js +1 -1
  287. package/dist/components/LpSelect.vue.d.ts +2 -0
  288. package/dist/components/LpSelect.vue.js +1 -1
  289. package/dist/components/LpShaderBackdrop.vue.d.ts +39 -0
  290. package/dist/components/LpShaderBackdrop.vue.js +4 -0
  291. package/dist/components/LpShinyText.vue.d.ts +39 -0
  292. package/dist/components/LpShinyText.vue.js +4 -0
  293. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  294. package/dist/components/LpSidebar.vue.js +1 -1
  295. package/dist/components/LpSidebarNav.vue.js +1 -1
  296. package/dist/components/LpSlider.vue.js +1 -1
  297. package/dist/components/LpSparkline.vue.d.ts +4 -3
  298. package/dist/components/LpSparkline.vue.js +1 -1
  299. package/dist/components/LpSpotlight.vue.d.ts +37 -0
  300. package/dist/components/LpSpotlight.vue.js +4 -0
  301. package/dist/components/LpStat.vue.js +1 -1
  302. package/dist/components/LpStatus.vue.d.ts +65 -0
  303. package/dist/components/LpStatus.vue.js +4 -0
  304. package/dist/components/LpStepMark.vue.d.ts +31 -0
  305. package/dist/components/LpStepMark.vue.js +4 -0
  306. package/dist/components/LpStepper.vue.js +1 -1
  307. package/dist/components/LpSwap.vue.js +1 -1
  308. package/dist/components/LpSwitch.vue.d.ts +2 -2
  309. package/dist/components/LpSwitch.vue.js +1 -1
  310. package/dist/components/LpTable.vue.js +104 -120
  311. package/dist/components/LpTableFilter.vue.js +1 -1
  312. package/dist/components/LpTableOfContents.vue.d.ts +6 -1
  313. package/dist/components/LpTableOfContents.vue.js +1 -1
  314. package/dist/components/LpTabs.vue.d.ts +5 -5
  315. package/dist/components/LpTabs.vue.js +25 -33
  316. package/dist/components/LpTagsInput.vue.js +1 -1
  317. package/dist/components/LpTextReveal.vue.d.ts +58 -0
  318. package/dist/components/LpTextReveal.vue.js +4 -0
  319. package/dist/components/LpTextarea.vue.js +1 -1
  320. package/dist/components/LpThemeProvider.vue.js +1 -1
  321. package/dist/components/LpThemeStudio.vue.d.ts +54 -0
  322. package/dist/components/LpThemeStudio.vue.js +4 -0
  323. package/dist/components/LpThemeStudioSection.vue.d.ts +16 -0
  324. package/dist/components/LpThemeStudioSection.vue.js +4 -0
  325. package/dist/components/LpThemeSwitcher.vue.d.ts +32 -1
  326. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  327. package/dist/components/LpTimeField.vue.d.ts +2 -0
  328. package/dist/components/LpTimeField.vue.js +1 -1
  329. package/dist/components/LpToaster.vue.js +1 -1
  330. package/dist/components/LpTooltip.vue.d.ts +2 -2
  331. package/dist/components/LpTooltip.vue.js +1 -1
  332. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  333. package/dist/components/LpTour.vue.js +1 -1
  334. package/dist/components/LpTruncate.vue.d.ts +34 -0
  335. package/dist/components/LpTruncate.vue.js +4 -0
  336. package/dist/components/LpTypewriter.vue.d.ts +61 -0
  337. package/dist/components/LpTypewriter.vue.js +4 -0
  338. package/dist/components/LpUptimeBar.vue.js +1 -1
  339. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  340. package/dist/components/MenuTitle.vue.js +1 -1
  341. package/dist/components/OptionContent.vue.d.ts +7 -0
  342. package/dist/components/OptionContent.vue.js +4 -0
  343. package/dist/components/PickerField.vue.d.ts +43 -0
  344. package/dist/components/PickerField.vue.js +4 -0
  345. package/dist/components/RevealToggle.vue.d.ts +21 -0
  346. package/dist/components/RevealToggle.vue.js +4 -0
  347. package/dist/components/StepConnector.vue.d.ts +19 -0
  348. package/dist/components/StepConnector.vue.js +4 -0
  349. package/dist/components/TourCard.vue.js +1 -1
  350. package/dist/components/badge.d.ts +1 -0
  351. package/dist/components/badge.js +4 -0
  352. package/dist/components/chart.d.ts +5 -1
  353. package/dist/components/chart.js +2 -21
  354. package/dist/components/dateRange.d.ts +11 -0
  355. package/dist/components/dateRange.js +12 -0
  356. package/dist/components/dock.d.ts +19 -0
  357. package/dist/components/dock.js +16 -0
  358. package/dist/components/dropdown.d.ts +10 -1
  359. package/dist/components/dropdown.js +7 -2
  360. package/dist/components/fieldText.d.ts +38 -0
  361. package/dist/components/fieldText.js +53 -0
  362. package/dist/components/fileTree.d.ts +7 -3
  363. package/dist/components/fileTree.js +12 -18
  364. package/dist/components/format.d.ts +41 -0
  365. package/dist/components/format.js +67 -0
  366. package/dist/components/identicon.d.ts +38 -0
  367. package/dist/components/identicon.js +85 -0
  368. package/dist/components/masonry.d.ts +32 -0
  369. package/dist/components/masonry.js +40 -0
  370. package/dist/components/menuWhen.js +1 -1
  371. package/dist/components/meter.d.ts +64 -0
  372. package/dist/components/meter.js +53 -0
  373. package/dist/components/otp.d.ts +1 -1
  374. package/dist/components/otp.js +7 -2
  375. package/dist/components/pipeline.d.ts +55 -0
  376. package/dist/components/pipeline.js +51 -0
  377. package/dist/components/quota.d.ts +57 -0
  378. package/dist/components/quota.js +40 -0
  379. package/dist/components/relativeTime.d.ts +24 -0
  380. package/dist/components/relativeTime.js +56 -0
  381. package/dist/components/reveal.d.ts +18 -0
  382. package/dist/components/reveal.js +32 -0
  383. package/dist/components/scramble.d.ts +68 -0
  384. package/dist/components/scramble.js +58 -0
  385. package/dist/components/shaderBackdrop.d.ts +20 -0
  386. package/dist/components/shaderBackdrop.js +156 -0
  387. package/dist/components/slider.d.ts +5 -0
  388. package/dist/components/slider.js +24 -0
  389. package/dist/components/slotText.d.ts +2 -0
  390. package/dist/components/slotText.js +9 -0
  391. package/dist/components/status.d.ts +14 -0
  392. package/dist/components/status.js +22 -0
  393. package/dist/components/tableFacets.d.ts +8 -0
  394. package/dist/components/tableFacets.js +19 -0
  395. package/dist/components/textSplit.d.ts +17 -0
  396. package/dist/components/textSplit.js +24 -0
  397. package/dist/components/timeSpan.d.ts +78 -0
  398. package/dist/components/timeSpan.js +85 -0
  399. package/dist/components/tone.d.ts +43 -0
  400. package/dist/components/tone.js +82 -0
  401. package/dist/components/tour.js +3 -2
  402. package/dist/components/typewriter.d.ts +36 -0
  403. package/dist/components/typewriter.js +53 -0
  404. package/dist/components/videoBackdrop.js +5 -6
  405. package/dist/composables/easing.d.ts +22 -1
  406. package/dist/composables/easing.js +42 -1
  407. package/dist/composables/pseudoLocale.d.ts +15 -0
  408. package/dist/composables/pseudoLocale.js +96 -0
  409. package/dist/composables/scroll.js +5 -3
  410. package/dist/composables/useClipboard.d.ts +4 -1
  411. package/dist/composables/useClipboard.js +12 -2
  412. package/dist/composables/useField.d.ts +8 -0
  413. package/dist/composables/useField.js +5 -0
  414. package/dist/composables/useForm.js +19 -5
  415. package/dist/composables/useInView.d.ts +11 -0
  416. package/dist/composables/useInView.js +39 -0
  417. package/dist/composables/useLoadingGate.d.ts +8 -0
  418. package/dist/composables/useLoadingGate.js +38 -0
  419. package/dist/composables/useLpConfig.d.ts +10 -0
  420. package/dist/composables/useLpConfig.js +11 -1
  421. package/dist/composables/useMediaQuery.js +3 -1
  422. package/dist/composables/useNow.d.ts +16 -0
  423. package/dist/composables/useNow.js +39 -0
  424. package/dist/composables/usePersisted.js +14 -7
  425. package/dist/composables/usePillTransition.d.ts +5 -2
  426. package/dist/composables/usePillTransition.js +4 -3
  427. package/dist/composables/usePointerFrame.d.ts +18 -0
  428. package/dist/composables/usePointerFrame.js +31 -0
  429. package/dist/composables/useReducedMotion.d.ts +2 -0
  430. package/dist/composables/useReducedMotion.js +7 -0
  431. package/dist/composables/useRepeater.d.ts +17 -0
  432. package/dist/composables/useRepeater.js +31 -0
  433. package/dist/composables/useResizeObserver.d.ts +8 -0
  434. package/dist/composables/useResizeObserver.js +33 -0
  435. package/dist/composables/useRevealedValue.d.ts +31 -0
  436. package/dist/composables/useRevealedValue.js +26 -0
  437. package/dist/composables/useScramble.d.ts +42 -0
  438. package/dist/composables/useScramble.js +76 -0
  439. package/dist/composables/useShift.js +2 -10
  440. package/dist/composables/useSpotlight.d.ts +18 -0
  441. package/dist/composables/useSpotlight.js +53 -0
  442. package/dist/composables/useTilt.js +26 -18
  443. package/dist/composables/useTween.d.ts +43 -0
  444. package/dist/composables/useTween.js +69 -0
  445. package/dist/composables/useView.d.ts +18 -0
  446. package/dist/composables/useView.js +61 -0
  447. package/dist/icons-all.js +1 -1
  448. package/dist/index.d.ts +98 -1
  449. package/dist/index.js +262 -104
  450. package/dist/theme/define.d.ts +12 -0
  451. package/dist/theme/studio.d.ts +90 -0
  452. package/package.json +5 -2
  453. package/src/component-names.ts +33 -0
  454. package/src/components/AttentionDot.vue +27 -0
  455. package/src/components/FieldWrapper.vue +38 -0
  456. package/src/components/LayoutNode.vue +5 -9
  457. package/src/components/LegendSwatch.vue +15 -0
  458. package/src/components/LoaderMark.vue +90 -0
  459. package/src/components/LpActionBar.vue +12 -20
  460. package/src/components/LpActivityLine.vue +186 -0
  461. package/src/components/LpAlert.vue +54 -24
  462. package/src/components/LpAppShell.vue +7 -11
  463. package/src/components/LpAutocomplete.vue +16 -14
  464. package/src/components/LpAvatar.vue +17 -2
  465. package/src/components/LpBadge.vue +77 -13
  466. package/src/components/LpBreadcrumbs.vue +101 -35
  467. package/src/components/LpButton.vue +15 -3
  468. package/src/components/LpCard.vue +30 -7
  469. package/src/components/LpChart.vue +143 -154
  470. package/src/components/LpCheckbox.vue +10 -4
  471. package/src/components/LpCodeBlock.vue +11 -19
  472. package/src/components/LpCodeDisplay.vue +228 -0
  473. package/src/components/LpCollapse.vue +162 -0
  474. package/src/components/LpColorPicker.vue +10 -1
  475. package/src/components/LpCommandPalette.vue +38 -24
  476. package/src/components/LpContextMenu.vue +10 -1
  477. package/src/components/LpCopyButton.vue +185 -0
  478. package/src/components/LpCountdown.vue +308 -0
  479. package/src/components/LpDataList.vue +154 -0
  480. package/src/components/LpDatePicker.vue +53 -104
  481. package/src/components/LpDateRangePicker.vue +49 -95
  482. package/src/components/LpDisclosure.vue +58 -36
  483. package/src/components/LpDock.vue +274 -0
  484. package/src/components/LpDrawer.vue +10 -1
  485. package/src/components/LpDropdownMenu.vue +10 -1
  486. package/src/components/LpDropzone.vue +34 -13
  487. package/src/components/LpEditable.vue +293 -0
  488. package/src/components/LpFileTree.vue +5 -1
  489. package/src/components/LpFileTreeNode.vue +25 -50
  490. package/src/components/LpFormField.vue +22 -3
  491. package/src/components/LpFrame.vue +200 -0
  492. package/src/components/LpGauge.vue +287 -0
  493. package/src/components/LpGlowBorder.vue +60 -0
  494. package/src/components/LpHintExample.vue +9 -32
  495. package/src/components/LpHintLayer.vue +13 -3
  496. package/src/components/LpHoverCard.vue +175 -0
  497. package/src/components/LpIdenticon.vue +69 -0
  498. package/src/components/LpImageEditor.vue +15 -18
  499. package/src/components/LpInfraNode.vue +27 -16
  500. package/src/components/LpInput.vue +30 -16
  501. package/src/components/LpLightbox.vue +44 -23
  502. package/src/components/LpLoader.vue +145 -0
  503. package/src/components/LpLogViewer.vue +311 -82
  504. package/src/components/LpMagnetic.vue +97 -0
  505. package/src/components/LpMapPicker.vue +26 -28
  506. package/src/components/LpMasonry.vue +247 -0
  507. package/src/components/LpModal.vue +10 -1
  508. package/src/components/LpNotificationBell.vue +33 -49
  509. package/src/components/LpNumberField.vue +79 -14
  510. package/src/components/LpNumberFlow.vue +10 -35
  511. package/src/components/LpOtpInput.vue +7 -2
  512. package/src/components/LpPagination.vue +38 -4
  513. package/src/components/LpPalettePreview.vue +2 -7
  514. package/src/components/LpPasswordInput.vue +16 -14
  515. package/src/components/LpPhoneInput.vue +12 -3
  516. package/src/components/LpPie.vue +197 -36
  517. package/src/components/LpPipeline.vue +366 -0
  518. package/src/components/LpPopover.vue +10 -1
  519. package/src/components/LpProgress.vue +22 -84
  520. package/src/components/LpQuota.vue +197 -0
  521. package/src/components/LpRangeSlider.vue +5 -1
  522. package/src/components/LpRelativeTime.vue +90 -0
  523. package/src/components/LpRepeater.vue +80 -0
  524. package/src/components/LpRevealOnScroll.vue +125 -0
  525. package/src/components/LpScramble.vue +107 -0
  526. package/src/components/LpSecretField.vue +313 -0
  527. package/src/components/LpSegmented.vue +3 -10
  528. package/src/components/LpSelect.vue +78 -64
  529. package/src/components/LpShaderBackdrop.vue +434 -0
  530. package/src/components/LpShinyText.vue +139 -0
  531. package/src/components/LpSidebar.vue +2 -0
  532. package/src/components/LpSlider.vue +5 -1
  533. package/src/components/LpSparkline.vue +55 -37
  534. package/src/components/LpSpotlight.vue +51 -0
  535. package/src/components/LpStat.vue +6 -2
  536. package/src/components/LpStatus.vue +127 -0
  537. package/src/components/LpStepMark.vue +138 -0
  538. package/src/components/LpStepper.vue +37 -43
  539. package/src/components/LpSwap.vue +2 -2
  540. package/src/components/LpSwitch.vue +15 -22
  541. package/src/components/LpTable.vue +47 -63
  542. package/src/components/LpTableFilter.vue +1 -0
  543. package/src/components/LpTableOfContents.vue +53 -29
  544. package/src/components/LpTabs.vue +10 -21
  545. package/src/components/LpTagsInput.vue +53 -37
  546. package/src/components/LpTextReveal.vue +236 -0
  547. package/src/components/LpTextarea.vue +11 -11
  548. package/src/components/LpThemeStudio.vue +216 -0
  549. package/src/components/LpThemeStudioSection.vue +16 -0
  550. package/src/components/LpThemeSwitcher.vue +156 -47
  551. package/src/components/LpTimeField.vue +9 -1
  552. package/src/components/LpToaster.vue +63 -83
  553. package/src/components/LpTooltip.vue +10 -1
  554. package/src/components/LpTour.vue +24 -13
  555. package/src/components/LpTruncate.vue +135 -0
  556. package/src/components/LpTypewriter.vue +236 -0
  557. package/src/components/LpUptimeBar.vue +6 -5
  558. package/src/components/LpVideoBackdrop.vue +15 -13
  559. package/src/components/OptionContent.vue +17 -0
  560. package/src/components/PickerField.vue +58 -0
  561. package/src/components/RevealToggle.vue +51 -0
  562. package/src/components/StepConnector.vue +54 -0
  563. package/src/components/TourCard.vue +29 -16
  564. package/src/components/badge.ts +8 -0
  565. package/src/components/chart.ts +8 -23
  566. package/src/components/dateRange.ts +25 -0
  567. package/src/components/dock.ts +31 -0
  568. package/src/components/dropdown.ts +15 -3
  569. package/src/components/fieldText.ts +95 -0
  570. package/src/components/fileTree.ts +19 -21
  571. package/src/components/format.ts +136 -0
  572. package/src/components/identicon.ts +160 -0
  573. package/src/components/masonry.ts +73 -0
  574. package/src/components/meter.ts +122 -0
  575. package/src/components/otp.ts +14 -3
  576. package/src/components/pipeline.ts +101 -0
  577. package/src/components/quota.ts +111 -0
  578. package/src/components/relativeTime.ts +118 -0
  579. package/src/components/reveal.ts +56 -0
  580. package/src/components/scramble.ts +138 -0
  581. package/src/components/shaderBackdrop.ts +208 -0
  582. package/src/components/slider.ts +30 -0
  583. package/src/components/slotText.ts +13 -0
  584. package/src/components/status.ts +46 -0
  585. package/src/components/tableFacets.ts +25 -0
  586. package/src/components/textSplit.ts +55 -0
  587. package/src/components/timeSpan.ts +183 -0
  588. package/src/components/tone.ts +144 -0
  589. package/src/components/tour.ts +3 -2
  590. package/src/components/typewriter.ts +104 -0
  591. package/src/components/videoBackdrop.ts +7 -6
  592. package/src/composables/easing.ts +66 -1
  593. package/src/composables/pseudoLocale.ts +105 -0
  594. package/src/composables/scroll.ts +6 -3
  595. package/src/composables/useClipboard.ts +25 -3
  596. package/src/composables/useField.ts +12 -0
  597. package/src/composables/useForm.ts +27 -6
  598. package/src/composables/useInView.ts +61 -0
  599. package/src/composables/useLoadingGate.ts +63 -0
  600. package/src/composables/useLpConfig.ts +20 -1
  601. package/src/composables/useMediaQuery.ts +6 -2
  602. package/src/composables/useNow.ts +84 -0
  603. package/src/composables/usePersisted.ts +19 -8
  604. package/src/composables/usePillTransition.ts +21 -13
  605. package/src/composables/usePointerFrame.ts +72 -0
  606. package/src/composables/useReducedMotion.ts +22 -0
  607. package/src/composables/useRepeater.ts +44 -0
  608. package/src/composables/useResizeObserver.ts +59 -0
  609. package/src/composables/useRevealedValue.ts +84 -0
  610. package/src/composables/useScramble.ts +152 -0
  611. package/src/composables/useShift.ts +10 -16
  612. package/src/composables/useSpotlight.ts +82 -0
  613. package/src/composables/useTilt.ts +40 -23
  614. package/src/composables/useTween.ts +149 -0
  615. package/src/composables/useView.ts +93 -0
  616. package/src/index.css +1 -0
  617. package/src/index.ts +143 -1
  618. package/src/kit-icons.ts +1 -1
  619. package/src/theme/define.ts +65 -0
  620. package/src/theme/studio.ts +202 -0
  621. package/src/tokens/effects.css +151 -0
  622. package/src/tokens/tokens.css +131 -39
  623. package/src/tokens/utilities.css +81 -0
  624. package/dist/assets/LpTabs-Bk7v4bZz.css +0 -18
  625. package/dist/chunks/LpAlert-BdvxvcWE.js +0 -85
  626. package/dist/chunks/LpBadge-Fe0D1bYx.js +0 -62
  627. package/dist/chunks/LpBreadcrumbs-rzOKkLiI.js +0 -98
  628. package/dist/chunks/LpDatePicker-BMfM454Y.js +0 -243
  629. package/dist/chunks/LpDateRangePicker-CNb9X3eL.js +0 -195
  630. package/dist/chunks/LpNumberField-DO1ufKvE.js +0 -107
  631. package/dist/chunks/LpStepper-C2slwObu.js +0 -90
  632. package/dist/chunks/LpSwitch-CZy9_IoA.js +0 -132
  633. package/dist/chunks/LpThemeSwitcher-CDoziW0z.js +0 -166
  634. 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;
@@ -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>;
@@ -0,0 +1,38 @@
1
+ import { ref, watch, toValue, onScopeDispose } from "vue";
2
+ function useLoadingGate(active, options = {}) {
3
+ const shown = ref(false);
4
+ let shownAt = 0;
5
+ let timer;
6
+ const clear = () => {
7
+ if (timer !== void 0) clearTimeout(timer);
8
+ timer = void 0;
9
+ };
10
+ const show = () => {
11
+ clear();
12
+ shown.value = true;
13
+ shownAt = Date.now();
14
+ };
15
+ const settle = (on) => {
16
+ clear();
17
+ if (on) {
18
+ if (shown.value) return;
19
+ const wait = Math.max(0, toValue(options.delay) ?? 0);
20
+ if (wait === 0) show();
21
+ else timer = setTimeout(show, wait);
22
+ return;
23
+ }
24
+ if (!shown.value) return;
25
+ const left = Math.max(0, toValue(options.minVisible) ?? 0) - (Date.now() - shownAt);
26
+ if (left <= 0) shown.value = false;
27
+ else timer = setTimeout(() => {
28
+ timer = void 0;
29
+ shown.value = false;
30
+ }, left);
31
+ };
32
+ watch(() => !!toValue(active), settle, { immediate: true });
33
+ onScopeDispose(clear);
34
+ return shown;
35
+ }
36
+ export {
37
+ useLoadingGate
38
+ };
@@ -1,4 +1,5 @@
1
1
  import { type App, type Component, type ComputedRef, type InjectionKey, type MaybeRefOrGetter } from "vue";
2
+ import { type PseudoOptions } from "./pseudoLocale";
2
3
  export type LabelScope = Record<string, string>;
3
4
  export interface LpConfig {
4
5
  /** Component rendered for internal links (RouterLink, NuxtLink). Plain `<a>` when unset. */
@@ -11,6 +12,15 @@ export interface LpConfig {
11
12
  * desktop shell can hand in its own store. See `usePersisted`.
12
13
  */
13
14
  storage?: KitStorage;
15
+ /**
16
+ * Show every kit label pseudo-localised ("Next" → "[Ñééẋţ]"): accented,
17
+ * about a third longer, and bracketed. A development switch for checking a
18
+ * screen before any translation exists: plain English left on it is text
19
+ * that never went through the labels, and anything clipped or overflowing
20
+ * will be in a real language too. `true` uses the defaults; an object tunes
21
+ * them (see `pseudoLocalize`).
22
+ */
23
+ pseudoLocale?: boolean | PseudoOptions;
14
24
  }
15
25
  /**
16
26
  * Synchronous key/value store, the shape of `localStorage`. Synchronous on
@@ -1,4 +1,5 @@
1
1
  import { computed, inject, toValue, provide } from "vue";
2
+ import { pseudoLocalize } from "./pseudoLocale.js";
2
3
  const LP_CONFIG = /* @__PURE__ */ Symbol.for("lp-config");
3
4
  function provideLpConfig(config) {
4
5
  provide(LP_CONFIG, layered(inject(LP_CONFIG, {}), config));
@@ -24,6 +25,7 @@ function mergeConfig(outer, inner) {
24
25
  ...inner,
25
26
  linkComponent: inner.linkComponent ?? outer.linkComponent,
26
27
  storage: inner.storage ?? outer.storage,
28
+ pseudoLocale: inner.pseudoLocale ?? outer.pseudoLocale,
27
29
  labels
28
30
  };
29
31
  }
@@ -33,7 +35,15 @@ function useLpConfig() {
33
35
  }
34
36
  function useLabels(scope, defaults, own) {
35
37
  const config = useLpConfig();
36
- return computed(() => ({ ...defaults, ...config.value.labels?.[scope], ...own?.() }));
38
+ return computed(() => {
39
+ const labels = { ...defaults, ...config.value.labels?.[scope], ...own?.() };
40
+ const pseudo = config.value.pseudoLocale;
41
+ if (!pseudo) return labels;
42
+ const options = pseudo === true ? void 0 : pseudo;
43
+ return Object.fromEntries(
44
+ Object.entries(labels).map(([key, text]) => [key, typeof text === "string" ? pseudoLocalize(text, options) : text])
45
+ );
46
+ });
37
47
  }
38
48
  function useLinkComponent() {
39
49
  const config = useLpConfig();
@@ -1,12 +1,14 @@
1
1
  import { ref, onMounted, onBeforeUnmount } from "vue";
2
+ import { useView, viewWindow } from "./useView.js";
2
3
  function useMediaQuery(query) {
4
+ const view = useView();
3
5
  const matches = ref(false);
4
6
  let list;
5
7
  const update = () => {
6
8
  matches.value = !!list?.matches;
7
9
  };
8
10
  onMounted(() => {
9
- list = window.matchMedia?.(query);
11
+ list = viewWindow(view.value).matchMedia?.(query);
10
12
  update();
11
13
  list?.addEventListener("change", update);
12
14
  });