@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,68 @@
1
+ /** Random number in [0, 1). Injected so frames are reproducible under test. */
2
+ export type Random = () => number;
3
+ /** Glyphs a position cycles through before it settles. Upper case and digits read as "code". */
4
+ export declare const SCRAMBLE_GLYPHS = "ABCDEFGHJKLMNPQRSTUVWXYZ0123456789#%&*+=?@$";
5
+ export interface ScrambleOptions {
6
+ /** Total travel time in ms, from the first glyph to the last position settling. */
7
+ duration: number;
8
+ /**
9
+ * `sequential` settles left to right, which reads as decoding; `together`
10
+ * holds every position until near the end and lands them in a short burst,
11
+ * which reads as a lock opening.
12
+ */
13
+ order?: "sequential" | "together";
14
+ /** Glyph pool. */
15
+ glyphs?: string;
16
+ /**
17
+ * Characters that never scramble: a space or a dash in a key keeps the
18
+ * grouping visible while the rest churns, so the reader sees the shape of
19
+ * what is coming.
20
+ */
21
+ keep?: (char: string) => boolean;
22
+ }
23
+ export interface ScrambleCell {
24
+ /** The character settled into, or "" for a position the new value no longer has. */
25
+ final: string;
26
+ /** The character shown before the run started (sizes a position the value is losing). */
27
+ initial: string;
28
+ /** Ms from the start of the run when this position shows `final`. */
29
+ settleAt: number;
30
+ /** Never churns (see `keep`). */
31
+ fixed: boolean;
32
+ }
33
+ export interface ScrambleFrameCell {
34
+ /** What to draw now. */
35
+ char: string;
36
+ /** The character that gives the position its width: the final one, or the old one while it is leaving. */
37
+ sizer: string;
38
+ settled: boolean;
39
+ }
40
+ /**
41
+ * Splits into user-perceived characters, so an emoji or an accented letter is
42
+ * one position rather than two halves that scramble separately.
43
+ */
44
+ export declare function graphemes(text: string): string[];
45
+ /**
46
+ * When each position stops churning (all of them start at once).
47
+ *
48
+ * `sequential`: positions start together and settle on a ramp across the last
49
+ * 70% of the run, so the left of the value is readable while the right still
50
+ * moves. `together`: every position settles within the last 15%, with a
51
+ * little random spread so they do not land as one flat click.
52
+ */
53
+ export declare function planScramble(from: string, to: string, options: ScrambleOptions, random?: Random): ScrambleCell[];
54
+ /** A glyph from the pool. */
55
+ export declare function randomGlyph(random: Random, glyphs?: string): string;
56
+ /**
57
+ * The text at `elapsed` ms into the run. A churning position draws a fresh
58
+ * random glyph each call; the caller decides how often to call (the glyph
59
+ * re-roll rate), not this.
60
+ */
61
+ export declare function scrambleFrame(cells: ScrambleCell[], elapsed: number, random?: Random, glyphs?: string): ScrambleFrameCell[];
62
+ /** The cells of a value at rest, for the first paint and for reduced motion. */
63
+ export declare function settledCells(text: string): ScrambleFrameCell[];
64
+ /**
65
+ * A small seeded generator (mulberry32), for tests and for a scramble that
66
+ * should look the same every time it plays (a demo, a screenshot).
67
+ */
68
+ export declare function seededRandom(seed: number): Random;
@@ -0,0 +1,58 @@
1
+ const SCRAMBLE_GLYPHS = "ABCDEFGHJKLMNPQRSTUVWXYZ0123456789#%&*+=?@$";
2
+ const defaultKeep = (char) => /\s/.test(char);
3
+ function graphemes(text) {
4
+ const Segmenter = Intl.Segmenter;
5
+ if (Segmenter) return Array.from(new Segmenter(void 0, { granularity: "grapheme" }).segment(text), (s) => s.segment);
6
+ return Array.from(text);
7
+ }
8
+ function planScramble(from, to, options, random = Math.random) {
9
+ const keep = options.keep ?? defaultKeep;
10
+ const a = graphemes(from);
11
+ const b = graphemes(to);
12
+ const length = Math.max(a.length, b.length);
13
+ const duration = Math.max(0, options.duration);
14
+ const cells = [];
15
+ for (let i = 0; i < length; i++) {
16
+ const final = b[i] ?? "";
17
+ const initial = a[i] ?? "";
18
+ let settleAt;
19
+ if (options.order === "together") settleAt = duration * (0.85 + 0.15 * random());
20
+ else settleAt = length === 1 ? duration : duration * (0.3 + 0.7 * i / (length - 1));
21
+ const fixed = final !== "" && keep(final) && (initial === final || initial === "");
22
+ cells.push({ final, initial, settleAt: fixed ? 0 : settleAt, fixed });
23
+ }
24
+ return cells;
25
+ }
26
+ function randomGlyph(random, glyphs = SCRAMBLE_GLYPHS) {
27
+ const pool = graphemes(glyphs);
28
+ return pool[Math.min(pool.length - 1, Math.floor(random() * pool.length))] ?? "";
29
+ }
30
+ function scrambleFrame(cells, elapsed, random = Math.random, glyphs = SCRAMBLE_GLYPHS) {
31
+ return cells.map((cell) => {
32
+ const sizer = cell.final || cell.initial;
33
+ if (cell.fixed || elapsed >= cell.settleAt) return { char: cell.final, sizer: cell.final, settled: true };
34
+ return { char: randomGlyph(random, glyphs), sizer, settled: false };
35
+ });
36
+ }
37
+ function settledCells(text) {
38
+ return graphemes(text).map((char) => ({ char, sizer: char, settled: true }));
39
+ }
40
+ function seededRandom(seed) {
41
+ let state = seed >>> 0;
42
+ return () => {
43
+ state = state + 1831565813 >>> 0;
44
+ let t = state;
45
+ t = Math.imul(t ^ t >>> 15, t | 1);
46
+ t ^= t + Math.imul(t ^ t >>> 7, t | 61);
47
+ return ((t ^ t >>> 14) >>> 0) / 4294967296;
48
+ };
49
+ }
50
+ export {
51
+ SCRAMBLE_GLYPHS,
52
+ graphemes,
53
+ planScramble,
54
+ randomGlyph,
55
+ scrambleFrame,
56
+ seededRandom,
57
+ settledCells
58
+ };
@@ -0,0 +1,20 @@
1
+ export type ShaderPreset = "aurora" | "silk" | "grain" | "dots";
2
+ export interface PresetDef {
3
+ /** Body of the fragment shader, after the shared header. */
4
+ fragment: string;
5
+ /** Rendering resolution relative to CSS pixels × pixel ratio. Soft looks lose nothing at half. */
6
+ scale: number;
7
+ /** CSS `background` of the still that stands in for the look. */
8
+ fallback: string;
9
+ }
10
+ export declare const VERTEX_SHADER = "\nattribute vec2 p;\nvoid main() { gl_Position = vec4(p, 0.0, 1.0); }\n";
11
+ export declare const FRAGMENT_HEADER = "\nprecision mediump float;\nuniform vec2 u_res;\nuniform float u_time;\nuniform float u_px;\nuniform float u_k;\nuniform vec3 u_bg;\nuniform vec3 u_brand;\nuniform vec3 u_accent;\nuniform vec3 u_action;\nuniform vec3 u_ink;\n";
12
+ export declare const PRESETS: Record<ShaderPreset, PresetDef>;
13
+ export declare const PRESET_NAMES: ShaderPreset[];
14
+ /** Whether enough time has passed for the next frame at `fps`. Frames land on the display's beat, so allow a little early. */
15
+ export declare function frameDue(now: number, last: number, fps: number): boolean;
16
+ export declare function tooSlow(intervals: readonly number[], fps: number): boolean;
17
+ /** A colour in 0–1 sRGB channels, as a shader takes it. */
18
+ export type Vec3 = [number, number, number];
19
+ /** Move `from` toward `to` by share `k` (0–1): theme changes blend over a few frames instead of snapping. */
20
+ export declare function approach(from: Vec3, to: Vec3, k: number): Vec3;
@@ -0,0 +1,156 @@
1
+ const VERTEX_SHADER = `
2
+ attribute vec2 p;
3
+ void main() { gl_Position = vec4(p, 0.0, 1.0); }
4
+ `;
5
+ const FRAGMENT_HEADER = `
6
+ precision mediump float;
7
+ uniform vec2 u_res;
8
+ uniform float u_time;
9
+ uniform float u_px;
10
+ uniform float u_k;
11
+ uniform vec3 u_bg;
12
+ uniform vec3 u_brand;
13
+ uniform vec3 u_accent;
14
+ uniform vec3 u_action;
15
+ uniform vec3 u_ink;
16
+ `;
17
+ const mix = (token, share) => `color-mix(in oklab, var(--color-${token}) ${share}%, transparent)`;
18
+ const NOISE = `url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix values='0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0 0.5 0 0 0 0.35 0'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E")`;
19
+ const PRESETS = {
20
+ /*
21
+ * Curtains of light across the upper part: each band has a sharp upper
22
+ * edge and a long fall-off below it, waves sideways, and is striated by
23
+ * fine vertical rays that drift.
24
+ */
25
+ aurora: {
26
+ scale: 0.5,
27
+ fragment: `
28
+ float band(vec2 uv, float x, float off, float sp) {
29
+ float y = 0.66 + off + 0.09 * sin(x * 1.9 + u_time * sp + off * 9.0) + 0.04 * sin(x * 4.7 - u_time * sp * 1.7 + off * 4.0);
30
+ float d = uv.y - y;
31
+ float body = exp(-d * d * (d > 0.0 ? 160.0 : 22.0));
32
+ float rays = 0.86 + 0.14 * sin(x * 70.0 + 6.0 * sin(x * 2.3 + u_time * 0.4));
33
+ return body * rays;
34
+ }
35
+ void main() {
36
+ vec2 uv = gl_FragCoord.xy / u_res;
37
+ float x = gl_FragCoord.x / u_res.y;
38
+ vec3 col = u_bg;
39
+ col = mix(col, u_brand, band(uv, x, 0.0, 0.35) * 0.7 * u_k);
40
+ col = mix(col, u_accent, band(uv, x, -0.18, 0.27) * 0.45 * u_k);
41
+ col = mix(col, u_action, band(uv, x, 0.12, 0.43) * 0.45 * u_k);
42
+ gl_FragColor = vec4(col, 1.0);
43
+ }`,
44
+ fallback: [
45
+ `radial-gradient(70% 38% at 30% 28%, ${mix("brand", 42)}, transparent 70%)`,
46
+ `radial-gradient(55% 30% at 72% 44%, ${mix("accent", 30)}, transparent 70%)`,
47
+ `radial-gradient(50% 26% at 55% 18%, ${mix("action", 26)}, transparent 70%)`
48
+ ].join(", ")
49
+ },
50
+ /*
51
+ * A sheet of fabric: diagonal folds that slowly ripple, the brand colour
52
+ * in the body and a narrow highlight running along each crest.
53
+ */
54
+ silk: {
55
+ scale: 0.5,
56
+ fragment: `
57
+ void main() {
58
+ vec2 uv = gl_FragCoord.xy / u_res;
59
+ vec2 p = (gl_FragCoord.xy - 0.5 * u_res) / u_res.y * 2.2;
60
+ float t = u_time * 0.6;
61
+ float f = p.x * 0.9 + p.y * 0.5 + 0.6 * sin(p.y * 1.7 + t) + 0.35 * sin(p.x * 2.3 - t * 0.8 + p.y);
62
+ float fold = sin(f * 3.4);
63
+ float sheen = pow(0.5 + 0.5 * fold, 6.0);
64
+ vec3 tint = mix(u_brand, u_accent, clamp(uv.x * 0.7 + 0.15 * sin(t * 0.5), 0.0, 1.0));
65
+ vec3 col = mix(u_bg, tint, (0.22 + 0.14 * fold) * u_k);
66
+ col += sheen * mix(u_brand, vec3(1.0), 0.4) * 0.28 * u_k;
67
+ gl_FragColor = vec4(col, 1.0);
68
+ }`,
69
+ fallback: [
70
+ `linear-gradient(115deg, transparent 12%, ${mix("brand", 30)} 30%, transparent 46%, ${mix("accent", 22)} 64%, transparent 80%)`,
71
+ `linear-gradient(160deg, ${mix("brand", 16)}, transparent 70%)`
72
+ ].join(", ")
73
+ },
74
+ /*
75
+ * Two soft colour pools drifting over the surface, under moving film
76
+ * grain. The grain is per device pixel and refreshes a dozen-odd times a
77
+ * second, like film, rather than every frame, which would read as static.
78
+ */
79
+ grain: {
80
+ scale: 1,
81
+ fragment: `
82
+ float hash(vec2 q) { return fract(sin(dot(q, vec2(12.9898, 78.233))) * 43758.5453); }
83
+ void main() {
84
+ vec2 uv = gl_FragCoord.xy / u_res;
85
+ float aspect = u_res.x / u_res.y;
86
+ vec2 p = vec2(uv.x * aspect, uv.y);
87
+ float t = u_time * 0.25;
88
+ vec2 a = vec2((0.3 + 0.2 * sin(t)) * aspect, 0.7 + 0.15 * cos(t * 1.3));
89
+ vec2 b = vec2((0.75 + 0.15 * cos(t * 0.8)) * aspect, 0.3 + 0.2 * sin(t * 1.1));
90
+ float da = exp(-dot(p - a, p - a) * 3.0);
91
+ float db = exp(-dot(p - b, p - b) * 4.0);
92
+ vec3 col = mix(u_bg, u_brand, da * 0.6 * u_k);
93
+ col = mix(col, u_accent, db * 0.5 * u_k);
94
+ col = mix(col, u_action, (1.0 - uv.y) * 0.12 * u_k);
95
+ vec2 cell = floor(gl_FragCoord.xy / max(1.0, u_px));
96
+ float g = hash(cell + vec2(floor(u_time * 14.0) * 17.31, 0.0)) - 0.5;
97
+ col += g * 0.09;
98
+ gl_FragColor = vec4(col, 1.0);
99
+ }`,
100
+ fallback: [
101
+ NOISE,
102
+ `radial-gradient(55% 55% at 28% 30%, ${mix("brand", 40)}, transparent 70%)`,
103
+ `radial-gradient(50% 50% at 76% 72%, ${mix("accent", 32)}, transparent 70%)`,
104
+ `linear-gradient(to top, ${mix("action", 10)}, transparent 60%)`
105
+ ].join(", ")
106
+ },
107
+ /*
108
+ * A dot grid with a slow ripple travelling out from the middle: dots on
109
+ * the crest swell and take the brand colour, the rest stay small and quiet.
110
+ */
111
+ dots: {
112
+ scale: 1,
113
+ fragment: `
114
+ void main() {
115
+ float cell = 22.0 * u_px;
116
+ vec2 g = gl_FragCoord.xy / cell;
117
+ vec2 id = floor(g);
118
+ vec2 f = fract(g) - 0.5;
119
+ float dist = length(id + 0.5 - 0.5 * u_res / cell);
120
+ float wave = pow(0.5 + 0.5 * sin(dist * 0.5 - u_time * 1.6), 3.0);
121
+ float r = 0.08 + 0.07 * wave * u_k;
122
+ float aa = 1.0 / cell;
123
+ float dotMask = 1.0 - smoothstep(r - aa, r + aa, length(f));
124
+ vec3 rest = mix(u_bg, u_ink, 0.2);
125
+ vec3 col = mix(u_bg, u_brand, wave * 0.03 * u_k);
126
+ col = mix(col, mix(rest, u_brand, wave * u_k), dotMask);
127
+ gl_FragColor = vec4(col, 1.0);
128
+ }`,
129
+ fallback: [
130
+ `radial-gradient(circle, ${mix("ink", 22)} 1.5px, transparent 2.2px) center / 22px 22px`,
131
+ `radial-gradient(45% 45% at 50% 50%, ${mix("brand", 16)}, transparent 75%)`
132
+ ].join(", ")
133
+ }
134
+ };
135
+ const PRESET_NAMES = Object.keys(PRESETS);
136
+ function frameDue(now, last, fps) {
137
+ return now - last >= 1e3 / Math.max(1, fps) - 2;
138
+ }
139
+ function tooSlow(intervals, fps) {
140
+ if (intervals.length < 20) return false;
141
+ const sorted = [...intervals].sort((a, b) => a - b);
142
+ const median = sorted[Math.floor(sorted.length / 2)];
143
+ return median > Math.max(2 * 1e3 / Math.max(1, fps), 80);
144
+ }
145
+ function approach(from, to, k) {
146
+ return [from[0] + (to[0] - from[0]) * k, from[1] + (to[1] - from[1]) * k, from[2] + (to[2] - from[2]) * k];
147
+ }
148
+ export {
149
+ FRAGMENT_HEADER,
150
+ PRESETS,
151
+ PRESET_NAMES,
152
+ VERTEX_SHADER,
153
+ approach,
154
+ frameDue,
155
+ tooSlow
156
+ };
@@ -0,0 +1,5 @@
1
+ export declare const SLIDER_GLIDE = "[&_[style*=left]]:transition-[left,right] [&_[style*=left]]:duration-(--duration-medium) [&_[style*=left]]:ease-(--ease-emphasized) data-[dragging]:[&_[style*=left]]:transition-none motion-reduce:[&_[style*=left]]:transition-none";
2
+ export declare function useSliderDrag(): {
3
+ dragging: import("vue").Ref<boolean, boolean>;
4
+ onPointerDown: (event: PointerEvent) => void;
5
+ };
@@ -0,0 +1,24 @@
1
+ import { ref, onBeforeUnmount } from "vue";
2
+ const SLIDER_GLIDE = "[&_[style*=left]]:transition-[left,right] [&_[style*=left]]:duration-(--duration-medium) [&_[style*=left]]:ease-(--ease-emphasized) data-[dragging]:[&_[style*=left]]:transition-none motion-reduce:[&_[style*=left]]:transition-none";
3
+ function useSliderDrag() {
4
+ const dragging = ref(false);
5
+ let view = null;
6
+ const end = () => {
7
+ dragging.value = false;
8
+ view?.removeEventListener("pointerup", end);
9
+ view?.removeEventListener("pointercancel", end);
10
+ view = null;
11
+ };
12
+ function onPointerDown(event) {
13
+ dragging.value = true;
14
+ view = event.currentTarget.ownerDocument.defaultView;
15
+ view?.addEventListener("pointerup", end);
16
+ view?.addEventListener("pointercancel", end);
17
+ }
18
+ onBeforeUnmount(end);
19
+ return { dragging, onPointerDown };
20
+ }
21
+ export {
22
+ SLIDER_GLIDE,
23
+ useSliderDrag
24
+ };
@@ -0,0 +1,2 @@
1
+ import { type Slot } from "vue";
2
+ export declare function slotText(slot: Slot | undefined): string | null;
@@ -0,0 +1,9 @@
1
+ import { Text } from "vue";
2
+ function slotText(slot) {
3
+ const nodes = slot?.() ?? [];
4
+ if (!nodes.length || !nodes.every((node) => node.type === Text)) return null;
5
+ return nodes.map((node) => String(node.children ?? "")).join("").trim() || null;
6
+ }
7
+ export {
8
+ slotText
9
+ };
@@ -0,0 +1,14 @@
1
+ import type { MeterTone } from "./meter";
2
+ export type StatusKind = "online" | "offline" | "degraded" | "down" | "maintenance" | "starting" | "unknown";
3
+ export interface StatusLook {
4
+ tone: MeterTone;
5
+ /**
6
+ * Whether the light breathes. Reserved for states that are LIVE (online:
7
+ * something is answering right now) or IN MOTION (starting: it will not stay
8
+ * like this) or demand attention (down). A pulse on every row would make the
9
+ * pulse mean nothing, so steady states stay still.
10
+ */
11
+ pulse: boolean;
12
+ }
13
+ export declare const STATUS_LOOK: Record<StatusKind, StatusLook>;
14
+ export declare const STATUS_LABELS: Record<StatusKind, string>;
@@ -0,0 +1,22 @@
1
+ const STATUS_LOOK = {
2
+ online: { tone: "ok", pulse: true },
3
+ offline: { tone: "neutral", pulse: false },
4
+ degraded: { tone: "warning", pulse: false },
5
+ down: { tone: "danger", pulse: true },
6
+ maintenance: { tone: "brand", pulse: false },
7
+ starting: { tone: "brand", pulse: true },
8
+ unknown: { tone: "neutral", pulse: false }
9
+ };
10
+ const STATUS_LABELS = {
11
+ online: "Online",
12
+ offline: "Offline",
13
+ degraded: "Degraded",
14
+ down: "Down",
15
+ maintenance: "Maintenance",
16
+ starting: "Starting",
17
+ unknown: "Unknown"
18
+ };
19
+ export {
20
+ STATUS_LABELS,
21
+ STATUS_LOOK
22
+ };
@@ -0,0 +1,8 @@
1
+ export declare function useTableFacets<T extends Record<string, unknown>>(options: {
2
+ rows: () => T[];
3
+ columns: () => string[];
4
+ hidden: () => Record<string, ReadonlySet<unknown>>;
5
+ }): {
6
+ distinct: (key: string) => unknown[];
7
+ counts: (key: string) => Map<unknown, number> | undefined;
8
+ };
@@ -0,0 +1,19 @@
1
+ import { computed } from "vue";
2
+ import { countValues } from "./tableFilter.js";
3
+ function useTableFacets(options) {
4
+ const columns = computed(() => new Map(options.columns().map((key) => [key, {
5
+ distinct: computed(() => [...new Set(options.rows().map((row) => row[key]))]),
6
+ counts: computed(() => {
7
+ const others = Object.entries(options.hidden()).filter(([column, values]) => column !== key && values.size);
8
+ const rows = others.length ? options.rows().filter((row) => others.every(([column, values]) => !values.has(row[column]))) : options.rows();
9
+ return countValues(rows, key);
10
+ })
11
+ }])));
12
+ return {
13
+ distinct: (key) => columns.value.get(key)?.distinct.value ?? [],
14
+ counts: (key) => columns.value.get(key)?.counts.value
15
+ };
16
+ }
17
+ export {
18
+ useTableFacets
19
+ };
@@ -0,0 +1,17 @@
1
+ export interface TextWord {
2
+ kind: "word";
3
+ /** Stable across edits for the same word in the same order. */
4
+ key: string;
5
+ text: string;
6
+ /** Letters (graphemes), or the whole word as one piece in word mode. */
7
+ parts: string[];
8
+ }
9
+ export interface TextSpace {
10
+ kind: "space";
11
+ key: string;
12
+ text: string;
13
+ }
14
+ export type TextPiece = TextWord | TextSpace;
15
+ export declare function splitText(text: string, by: "word" | "letter"): TextPiece[];
16
+ /** Keys of the words in `pieces`. */
17
+ export declare function wordKeys(pieces: TextPiece[]): Set<string>;
@@ -0,0 +1,24 @@
1
+ import { graphemes } from "./scramble.js";
2
+ function splitText(text, by) {
3
+ const pieces = [];
4
+ const seen = /* @__PURE__ */ new Map();
5
+ let spaces = 0;
6
+ for (const token of text.split(/(\s+)/)) {
7
+ if (!token) continue;
8
+ if (/^\s+$/.test(token)) {
9
+ pieces.push({ kind: "space", key: `s${spaces++}`, text: token });
10
+ continue;
11
+ }
12
+ const n = seen.get(token) ?? 0;
13
+ seen.set(token, n + 1);
14
+ pieces.push({ kind: "word", key: `${token}#${n}`, text: token, parts: by === "letter" ? graphemes(token) : [token] });
15
+ }
16
+ return pieces;
17
+ }
18
+ function wordKeys(pieces) {
19
+ return new Set(pieces.filter((p) => p.kind === "word").map((p) => p.key));
20
+ }
21
+ export {
22
+ splitText,
23
+ wordKeys
24
+ };
@@ -0,0 +1,78 @@
1
+ export interface TimeSplit {
2
+ days: number;
3
+ hours: number;
4
+ minutes: number;
5
+ seconds: number;
6
+ /** Whole milliseconds left over below a second. */
7
+ ms: number;
8
+ }
9
+ export type TimeUnit = "d" | "h" | "m" | "s";
10
+ /** Unit suffixes, so an app can write "2 д 3 ч" without reformatting. */
11
+ export type TimeUnitLabels = Record<TimeUnit, string>;
12
+ export declare const DEFAULT_UNIT_LABELS: TimeUnitLabels;
13
+ /**
14
+ * How a span is written.
15
+ *
16
+ * `clock` is for a short wait the eye follows second by second ("0:42",
17
+ * "1:05:09"); `units` is for a long one read at a glance ("2d 3h"); `auto` is
18
+ * clock below an hour and units above it, which is what both examples above
19
+ * want without the caller choosing.
20
+ */
21
+ export type TimeFormat = "auto" | "clock" | "units";
22
+ /** Splits a span into calendar-free parts. Negative spans count as zero. */
23
+ export declare function splitTime(ms: number): TimeSplit;
24
+ /** One printed piece of a span: a number and what follows it. */
25
+ export interface TimePart {
26
+ unit: TimeUnit;
27
+ value: number;
28
+ /** Digits to pad to: 2 for a clock's minutes and seconds after the first. */
29
+ pad: number;
30
+ /** Text printed after the number: a unit suffix, or ":" between clock fields. */
31
+ after: string;
32
+ }
33
+ /**
34
+ * A countdown rounds UP: with 41.2 s left it says 0:42, so the display only
35
+ * reaches 0:00 at the moment the wait is over. Rounding down would show 0:00
36
+ * for most of the last second while the thing is still not ready.
37
+ */
38
+ export declare function ceilToSecond(ms: number): number;
39
+ /** Which of `clock` and `units` an `auto` span resolves to. */
40
+ export declare function resolveFormat(ms: number, format: TimeFormat): "clock" | "units";
41
+ /**
42
+ * The parts of a span in the given format.
43
+ *
44
+ * Units keep the two largest non-zero places ("2d 3h", not "2d 3h 4m 5s"): a
45
+ * long wait is read for its size, and the extra places only flicker. A span
46
+ * under a minute keeps its seconds, and zero is "0s" rather than nothing.
47
+ * The clock always has minutes and seconds and grows hours when it needs
48
+ * them; days fold into hours, since a clock reading of days is not a clock.
49
+ */
50
+ export declare function timeParts(ms: number, format?: TimeFormat, labels?: TimeUnitLabels, places?: number): TimePart[];
51
+ /** Pads a part's number the way the clock prints it. */
52
+ export declare function padPart(part: Pick<TimePart, "value" | "pad">): string;
53
+ /** The span as one string — for titles, aria text and anything not animated. */
54
+ export declare function formatTime(ms: number, format?: TimeFormat, labels?: TimeUnitLabels, places?: number): string;
55
+ /**
56
+ * Time a job took, as a CI log writes it: "850ms" under a second (a step that
57
+ * fast is still worth telling apart from one that took nothing), then "42s",
58
+ * "1m 12s", "1h 3m".
59
+ */
60
+ export declare function formatElapsed(ms: number, labels?: TimeUnitLabels): string;
61
+ /**
62
+ * Milliseconds until the display next changes, so a ticking timer wakes on the
63
+ * second boundary instead of every 1000 ms from whenever it started. Started
64
+ * mid-second, a plain interval shows each value late by that fraction — and
65
+ * keeps drifting as timers fire late. Never zero: a tick that lands exactly on
66
+ * the boundary waits a whole second rather than spinning.
67
+ */
68
+ export declare function msToNextSecond(remaining: number): number;
69
+ /**
70
+ * Remaining time worth saying aloud. A timer re-read every second is noise to
71
+ * a screen reader; one that speaks when it crosses a round mark ("5 minutes
72
+ * left", "10 seconds left") is information. Returns the mark crossed going
73
+ * from `before` to `after`, or null.
74
+ */
75
+ export declare const DEFAULT_MILESTONES: number[];
76
+ export declare function crossedMilestone(before: number, after: number, milestones?: readonly number[]): number | null;
77
+ /** A date-ish input as epoch milliseconds, or NaN when it is not one. */
78
+ export declare function toEpoch(value: Date | string | number | null | undefined): number;
@@ -0,0 +1,85 @@
1
+ const DEFAULT_UNIT_LABELS = { d: "d", h: "h", m: "m", s: "s" };
2
+ const SECOND = 1e3;
3
+ const MINUTE = 60 * SECOND;
4
+ const HOUR = 60 * MINUTE;
5
+ const DAY = 24 * HOUR;
6
+ function splitTime(ms) {
7
+ const total = Number.isFinite(ms) ? Math.max(0, Math.floor(ms)) : 0;
8
+ return {
9
+ days: Math.floor(total / DAY),
10
+ hours: Math.floor(total % DAY / HOUR),
11
+ minutes: Math.floor(total % HOUR / MINUTE),
12
+ seconds: Math.floor(total % MINUTE / SECOND),
13
+ ms: total % SECOND
14
+ };
15
+ }
16
+ function ceilToSecond(ms) {
17
+ if (!Number.isFinite(ms) || ms <= 0) return 0;
18
+ return Math.ceil(ms / SECOND) * SECOND;
19
+ }
20
+ function resolveFormat(ms, format) {
21
+ if (format !== "auto") return format;
22
+ return ms >= HOUR ? "units" : "clock";
23
+ }
24
+ function timeParts(ms, format = "auto", labels = DEFAULT_UNIT_LABELS, places = 2) {
25
+ const t = splitTime(ms);
26
+ if (resolveFormat(ms, format) === "clock") {
27
+ const hours = t.days * 24 + t.hours;
28
+ const parts = [];
29
+ if (hours > 0) parts.push({ unit: "h", value: hours, pad: 1, after: ":" });
30
+ parts.push({ unit: "m", value: t.minutes, pad: hours > 0 ? 2 : 1, after: ":" });
31
+ parts.push({ unit: "s", value: t.seconds, pad: 2, after: "" });
32
+ return parts;
33
+ }
34
+ const all = [["d", t.days], ["h", t.hours], ["m", t.minutes], ["s", t.seconds]];
35
+ const first = all.findIndex(([, v]) => v > 0);
36
+ if (first === -1) return [{ unit: "s", value: 0, pad: 1, after: labels.s }];
37
+ return all.slice(first, first + Math.max(1, places)).filter(([, v], i) => i === 0 || v > 0).map(([unit, value]) => ({ unit, value, pad: 1, after: labels[unit] }));
38
+ }
39
+ function padPart(part) {
40
+ return String(part.value).padStart(part.pad, "0");
41
+ }
42
+ function formatTime(ms, format = "auto", labels = DEFAULT_UNIT_LABELS, places = 2) {
43
+ const parts = timeParts(ms, format, labels, places);
44
+ if (resolveFormat(ms, format) === "clock") return parts.map((p) => padPart(p) + p.after).join("");
45
+ return parts.map((p) => `${p.value}${p.after}`).join(" ");
46
+ }
47
+ function formatElapsed(ms, labels = DEFAULT_UNIT_LABELS) {
48
+ if (!Number.isFinite(ms) || ms < 0) return "";
49
+ if (ms < SECOND) return `${Math.round(ms)}ms`;
50
+ return formatTime(ms, "units", labels);
51
+ }
52
+ function msToNextSecond(remaining) {
53
+ if (!Number.isFinite(remaining) || remaining <= 0) return SECOND;
54
+ const rest = remaining % SECOND;
55
+ return rest === 0 ? SECOND : rest;
56
+ }
57
+ const DEFAULT_MILESTONES = [36e5, 18e5, 6e5, 3e5, 6e4, 3e4, 1e4];
58
+ function crossedMilestone(before, after, milestones = DEFAULT_MILESTONES) {
59
+ if (!(after < before)) return null;
60
+ let hit = null;
61
+ for (const mark of milestones) {
62
+ if (before > mark && after <= mark) hit = hit === null ? mark : Math.min(hit, mark);
63
+ }
64
+ return hit;
65
+ }
66
+ function toEpoch(value) {
67
+ if (value === null || value === void 0 || value === "") return Number.NaN;
68
+ if (value instanceof Date) return value.getTime();
69
+ if (typeof value === "number") return value;
70
+ return new Date(value).getTime();
71
+ }
72
+ export {
73
+ DEFAULT_MILESTONES,
74
+ DEFAULT_UNIT_LABELS,
75
+ ceilToSecond,
76
+ crossedMilestone,
77
+ formatElapsed,
78
+ formatTime,
79
+ msToNextSecond,
80
+ padPart,
81
+ resolveFormat,
82
+ splitTime,
83
+ timeParts,
84
+ toEpoch
85
+ };
@@ -0,0 +1,43 @@
1
+ /** The canonical tones. Everything else is an alias of one of these. */
2
+ export type Tone = "neutral" | "brand" | "success" | "warning" | "danger";
3
+ /**
4
+ * Every name a component's `tone` prop accepts. The aliases are the names the
5
+ * kit's components grew up with (a meter says `ok`, a button palette says
6
+ * `action`, a toast says `error`), kept so no caller has to rename anything.
7
+ */
8
+ export type ToneName = Tone | "info" | "ok" | "action" | "accent" | "error" | "muted";
9
+ /** Which canonical tone each name stands for. */
10
+ export declare const TONE_ALIASES: Readonly<Record<ToneName, Tone>>;
11
+ /** What a component needs to paint one tone. */
12
+ export interface ToneLook {
13
+ /** The solid colour, as a CSS value for a style or an SVG stroke. */
14
+ color: string;
15
+ /** The tinted background colour, as a CSS value. */
16
+ soft: string;
17
+ /** The solid colour as text: an icon, a label, a spinner. */
18
+ text: string;
19
+ /** The solid colour as a fill: a bar, a dot, a rail. */
20
+ bg: string;
21
+ /** The tinted background alone. */
22
+ softBg: string;
23
+ /**
24
+ * A chip: the tinted background with text that reads on it. Not always
25
+ * `softBg + text`: neutral text on its soft surface steps up to
26
+ * muted-strong, because plain muted on surface-soft is too faint to read.
27
+ */
28
+ chip: string;
29
+ /** The solid colour as a border. */
30
+ border: string;
31
+ /** A quiet panel in the tone: a faint tint with a faint edge (an alert, a callout). */
32
+ panel: string;
33
+ /** Selected text highlighted in the tone. */
34
+ selection: string;
35
+ }
36
+ export declare const TONES: Readonly<Record<Tone, ToneLook>>;
37
+ /**
38
+ * The canonical tone a name stands for. An unknown name (a typo, a tone from a
39
+ * newer kit read by an older one) falls back rather than painting nothing.
40
+ */
41
+ export declare function toneOf(name: string | null | undefined, fallback?: Tone): Tone;
42
+ /** How a tone is painted, by any of its names. */
43
+ export declare function toneLook(name: string | null | undefined, fallback?: Tone): ToneLook;