@leavepulse/ui 0.77.3 → 0.78.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 (597) hide show
  1. package/README.md +68 -0
  2. package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
  3. package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
  4. package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
  5. package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
  6. package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
  7. package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
  8. package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
  9. package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
  10. package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
  11. package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
  12. package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
  13. package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
  14. package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
  15. package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
  16. package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
  17. package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
  18. package/dist/chunks/{LpAddressInput-E8KtwU7-.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
  19. package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
  20. package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
  21. package/dist/chunks/{LpAutocomplete-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -42
  22. package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
  23. package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
  24. package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
  25. package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
  26. package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
  27. package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
  28. package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
  29. package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
  30. package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
  31. package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
  32. package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
  33. package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
  34. package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
  35. package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
  36. package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
  37. package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
  38. package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
  39. package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
  40. package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
  41. package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
  42. package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
  43. package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
  44. package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
  45. package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
  46. package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
  47. package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
  48. package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
  49. package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
  50. package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
  51. package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
  52. package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
  53. package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
  54. package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
  55. package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
  56. package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
  57. package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
  58. package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
  59. package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
  60. package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
  61. package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
  62. package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
  63. package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
  64. package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
  65. package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
  66. package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
  67. package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
  68. package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
  69. package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
  70. package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
  71. package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
  72. package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
  73. package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
  74. package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
  75. package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
  76. package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
  77. package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
  78. package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
  79. package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
  80. package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
  81. package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
  82. package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
  83. package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
  84. package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
  85. package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
  86. package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
  87. package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
  88. package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
  89. package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
  90. package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
  91. package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
  92. package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
  93. package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
  94. package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
  95. package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
  96. package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
  97. package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
  98. package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
  99. package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
  100. package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
  101. package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
  102. package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
  103. package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
  104. package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
  105. package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
  106. package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
  107. package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
  108. package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
  109. package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
  110. package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
  111. package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
  112. package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
  113. package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
  114. package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
  115. package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
  116. package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
  117. package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
  118. package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
  119. package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
  120. package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
  121. package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
  122. package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
  123. package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
  124. package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
  125. package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
  126. package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
  127. package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
  128. package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
  129. package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
  130. package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
  131. package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
  132. package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
  133. package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
  134. package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
  135. package/dist/component-names.d.ts +1 -1
  136. package/dist/components/AppShellContextNav.vue.d.ts +13 -0
  137. package/dist/components/AppShellContextNav.vue.js +4 -0
  138. package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
  139. package/dist/components/ChartRangeSelector.vue.js +4 -0
  140. package/dist/components/ContextMenuItems.vue.js +1 -1
  141. package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
  142. package/dist/components/DropzoneLinkField.vue.js +1 -1
  143. package/dist/components/FieldWrapper.vue.js +1 -1
  144. package/dist/components/IconCloseButton.vue.d.ts +7 -0
  145. package/dist/components/IconCloseButton.vue.js +4 -0
  146. package/dist/components/LayoutCanvas.vue.js +1 -1
  147. package/dist/components/LayoutNode.vue.js +1 -1
  148. package/dist/components/LpActionBar.vue.js +1 -1
  149. package/dist/components/LpActivityLine.vue.js +1 -1
  150. package/dist/components/LpAddressInput.vue.js +1 -1
  151. package/dist/components/LpAlert.vue.js +1 -1
  152. package/dist/components/LpAppShell.vue.d.ts +110 -2
  153. package/dist/components/LpAppShell.vue.js +1 -1
  154. package/dist/components/LpAutocomplete.vue.js +1 -1
  155. package/dist/components/LpAvatar.vue.js +1 -1
  156. package/dist/components/LpBadge.vue.js +1 -1
  157. package/dist/components/LpBottomNav.vue.d.ts +5 -0
  158. package/dist/components/LpBottomNav.vue.js +1 -1
  159. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  160. package/dist/components/LpButton.vue.d.ts +14 -2
  161. package/dist/components/LpButton.vue.js +1 -1
  162. package/dist/components/LpCalendar.vue.js +1 -1
  163. package/dist/components/LpCard.vue.js +1 -1
  164. package/dist/components/LpChart.vue.d.ts +74 -2
  165. package/dist/components/LpChart.vue.js +326 -85
  166. package/dist/components/LpCheckbox.vue.d.ts +6 -2
  167. package/dist/components/LpCheckbox.vue.js +1 -1
  168. package/dist/components/LpCodeBlock.vue.js +1 -1
  169. package/dist/components/LpCodeDisplay.vue.js +1 -1
  170. package/dist/components/LpCollapse.vue.js +1 -1
  171. package/dist/components/LpColorPicker.vue.js +1 -1
  172. package/dist/components/LpCommandPalette.vue.d.ts +8 -0
  173. package/dist/components/LpCommandPalette.vue.js +107 -56
  174. package/dist/components/LpCommandScope.vue.js +1 -1
  175. package/dist/components/LpConfirmDialog.vue.js +1 -1
  176. package/dist/components/LpConfirmHost.vue.js +1 -1
  177. package/dist/components/LpContextMenu.vue.js +1 -1
  178. package/dist/components/LpContextSwitcher.vue.js +1 -1
  179. package/dist/components/LpCopyButton.vue.js +1 -1
  180. package/dist/components/LpCountdown.vue.js +1 -1
  181. package/dist/components/LpDataList.vue.d.ts +1 -1
  182. package/dist/components/LpDataList.vue.js +1 -1
  183. package/dist/components/LpDatePicker.vue.d.ts +3 -15
  184. package/dist/components/LpDatePicker.vue.js +1 -1
  185. package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
  186. package/dist/components/LpDateRangePicker.vue.js +1 -1
  187. package/dist/components/LpDisclosure.vue.js +1 -1
  188. package/dist/components/LpDock.vue.js +21 -18
  189. package/dist/components/LpDrawer.vue.d.ts +1 -1
  190. package/dist/components/LpDrawer.vue.js +1 -1
  191. package/dist/components/LpDropdownMenu.vue.js +1 -1
  192. package/dist/components/LpDropzone.vue.js +14 -11
  193. package/dist/components/LpEditable.vue.js +1 -1
  194. package/dist/components/LpEmptyState.vue.js +1 -1
  195. package/dist/components/LpFieldNotice.vue.js +1 -1
  196. package/dist/components/LpFileTree.vue.d.ts +96 -6
  197. package/dist/components/LpFileTree.vue.js +1 -1
  198. package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
  199. package/dist/components/LpFileTreeNode.vue.js +1 -1
  200. package/dist/components/LpFormField.vue.js +1 -1
  201. package/dist/components/LpFrame.vue.js +1 -1
  202. package/dist/components/LpGauge.vue.d.ts +1 -1
  203. package/dist/components/LpHintExample.vue.js +1 -1
  204. package/dist/components/LpHintLayer.vue.js +1 -1
  205. package/dist/components/LpHints.vue.js +1 -1
  206. package/dist/components/LpHoverCard.vue.js +1 -1
  207. package/dist/components/LpIcon.vue.d.ts +2 -0
  208. package/dist/components/LpIcon.vue.js +1 -1
  209. package/dist/components/LpIdenticon.vue.js +1 -1
  210. package/dist/components/LpImageEditor.vue.js +7 -6
  211. package/dist/components/LpInfraNode.vue.js +1 -1
  212. package/dist/components/LpInput.vue.d.ts +1 -1
  213. package/dist/components/LpInput.vue.js +1 -1
  214. package/dist/components/LpInspector.vue.d.ts +87 -0
  215. package/dist/components/LpInspector.vue.js +4 -0
  216. package/dist/components/LpLightbox.vue.d.ts +8 -0
  217. package/dist/components/LpLightbox.vue.js +1 -1
  218. package/dist/components/LpLoader.vue.d.ts +1 -1
  219. package/dist/components/LpLoader.vue.js +1 -1
  220. package/dist/components/LpLogInspector.vue.d.ts +18 -0
  221. package/dist/components/LpLogInspector.vue.js +4 -0
  222. package/dist/components/LpLogViewer.vue.d.ts +93 -0
  223. package/dist/components/LpLogViewer.vue.js +1 -1
  224. package/dist/components/LpMapPicker.vue.js +1 -1
  225. package/dist/components/LpMasonry.vue.js +1 -1
  226. package/dist/components/LpMediaGallery.vue.js +1 -1
  227. package/dist/components/LpModal.vue.d.ts +4 -2
  228. package/dist/components/LpModal.vue.js +1 -1
  229. package/dist/components/LpModalNav.vue.d.ts +5 -5
  230. package/dist/components/LpModalNav.vue.js +1 -1
  231. package/dist/components/LpNotificationBell.vue.d.ts +2 -2
  232. package/dist/components/LpNotificationBell.vue.js +1 -1
  233. package/dist/components/LpNumberField.vue.js +1 -1
  234. package/dist/components/LpOtpInput.vue.js +1 -1
  235. package/dist/components/LpPagination.vue.js +1 -1
  236. package/dist/components/LpPaletteFacts.vue.js +1 -1
  237. package/dist/components/LpPaletteHeader.vue.js +2 -2
  238. package/dist/components/LpPaletteTheme.vue.js +1 -1
  239. package/dist/components/LpPasswordInput.vue.js +1 -1
  240. package/dist/components/LpPhoneInput.vue.js +1 -1
  241. package/dist/components/LpPie.vue.d.ts +2 -2
  242. package/dist/components/LpPie.vue.js +1 -1
  243. package/dist/components/LpPipeline.vue.d.ts +4 -0
  244. package/dist/components/LpPipeline.vue.js +1 -1
  245. package/dist/components/LpPopover.vue.d.ts +7 -3
  246. package/dist/components/LpPopover.vue.js +1 -1
  247. package/dist/components/LpProgress.vue.d.ts +1 -1
  248. package/dist/components/LpProgress.vue.js +1 -1
  249. package/dist/components/LpQuota.vue.js +1 -1
  250. package/dist/components/LpRadioGroup.vue.js +1 -1
  251. package/dist/components/LpRangeCalendar.vue.js +1 -1
  252. package/dist/components/LpRangeSlider.vue.js +1 -1
  253. package/dist/components/LpRelativeTime.vue.js +1 -1
  254. package/dist/components/LpRepeater.vue.js +1 -1
  255. package/dist/components/LpRevealOnScroll.vue.js +1 -1
  256. package/dist/components/LpScramble.vue.js +1 -1
  257. package/dist/components/LpScrollArea.vue.js +1 -1
  258. package/dist/components/LpSecretField.vue.js +1 -1
  259. package/dist/components/LpSection.vue.js +1 -1
  260. package/dist/components/LpSegmented.vue.js +1 -1
  261. package/dist/components/LpSelect.vue.js +1 -1
  262. package/dist/components/LpShaderBackdrop.vue.js +1 -1
  263. package/dist/components/LpShift.vue.js +1 -1
  264. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  265. package/dist/components/LpSidebar.vue.d.ts +1 -1
  266. package/dist/components/LpSidebar.vue.js +1 -1
  267. package/dist/components/LpSidebarNav.vue.js +1 -1
  268. package/dist/components/LpSidebarRow.vue.js +1 -1
  269. package/dist/components/LpSlider.vue.js +1 -1
  270. package/dist/components/LpSparkline.vue.d.ts +1 -1
  271. package/dist/components/LpSpotlight.vue.js +1 -1
  272. package/dist/components/LpStat.vue.js +1 -1
  273. package/dist/components/LpStatus.vue.js +1 -1
  274. package/dist/components/LpStepMark.vue.js +1 -1
  275. package/dist/components/LpStepper.vue.js +1 -1
  276. package/dist/components/LpSwap.vue.js +1 -1
  277. package/dist/components/LpSwitch.vue.js +1 -1
  278. package/dist/components/LpTabFace.vue.js +1 -1
  279. package/dist/components/LpTable.vue.d.ts +132 -0
  280. package/dist/components/LpTable.vue.js +547 -135
  281. package/dist/components/LpTableFilter.vue.js +1 -1
  282. package/dist/components/LpTableOfContents.vue.js +1 -1
  283. package/dist/components/LpTabs.vue.js +6 -5
  284. package/dist/components/LpTagsInput.vue.js +1 -1
  285. package/dist/components/LpTextarea.vue.js +1 -1
  286. package/dist/components/LpThemeProvider.vue.d.ts +2 -0
  287. package/dist/components/LpThemeProvider.vue.js +1 -1
  288. package/dist/components/LpThemeStudio.vue.js +1 -1
  289. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  290. package/dist/components/LpTimeField.vue.js +1 -1
  291. package/dist/components/LpToaster.vue.js +1 -1
  292. package/dist/components/LpTooltip.vue.js +1 -1
  293. package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
  294. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  295. package/dist/components/LpTour.vue.js +1 -1
  296. package/dist/components/LpTruncate.vue.js +1 -1
  297. package/dist/components/LpTypewriter.vue.js +1 -1
  298. package/dist/components/LpUptimeBar.vue.js +1 -1
  299. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  300. package/dist/components/LpWindow.vue.d.ts +99 -0
  301. package/dist/components/LpWindow.vue.js +4 -0
  302. package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
  303. package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
  304. package/dist/components/MenuTitle.vue.js +1 -1
  305. package/dist/components/OptionContent.vue.js +1 -1
  306. package/dist/components/PickerField.vue.d.ts +2 -2
  307. package/dist/components/PickerField.vue.js +1 -1
  308. package/dist/components/RevealToggle.vue.js +1 -1
  309. package/dist/components/SliderRail.vue.d.ts +3 -0
  310. package/dist/components/SliderRail.vue.js +4 -0
  311. package/dist/components/TourCard.vue.js +1 -1
  312. package/dist/components/address.js +2 -1
  313. package/dist/components/appShell.d.ts +36 -0
  314. package/dist/components/appShell.js +30 -0
  315. package/dist/components/calendar.d.ts +12 -3
  316. package/dist/components/calendar.js +2 -5
  317. package/dist/components/chart.d.ts +21 -0
  318. package/dist/components/chart.js +4 -3
  319. package/dist/components/chartWindow.d.ts +57 -0
  320. package/dist/components/chartWindow.js +136 -0
  321. package/dist/components/color.js +1 -1
  322. package/dist/components/commandPalette.d.ts +16 -2
  323. package/dist/components/commandPalette.js +39 -4
  324. package/dist/components/controlSize.d.ts +5 -0
  325. package/dist/components/controlSize.js +8 -0
  326. package/dist/components/dropdown.d.ts +5 -0
  327. package/dist/components/dropdown.js +2 -0
  328. package/dist/components/exportData.d.ts +6 -1
  329. package/dist/components/exportData.js +25 -18
  330. package/dist/components/fileTree.d.ts +67 -0
  331. package/dist/components/fileTree.js +141 -1
  332. package/dist/components/identicon.js +3 -2
  333. package/dist/components/logTools.d.ts +93 -0
  334. package/dist/components/logTools.js +210 -0
  335. package/dist/components/menuWhen.js +1 -1
  336. package/dist/components/meter.js +2 -1
  337. package/dist/components/pipeline.d.ts +2 -0
  338. package/dist/components/pipeline.js +5 -0
  339. package/dist/components/relativeTime.js +2 -1
  340. package/dist/components/reveal.js +2 -1
  341. package/dist/components/select.d.ts +5 -0
  342. package/dist/components/select.js +10 -0
  343. package/dist/components/sidebar.d.ts +1 -0
  344. package/dist/components/tableFeatures.d.ts +58 -0
  345. package/dist/components/tableFeatures.js +87 -0
  346. package/dist/components/topologyGraph.d.ts +164 -0
  347. package/dist/components/topologyGraph.js +416 -0
  348. package/dist/components/tour.js +5 -3
  349. package/dist/components/videoBackdrop.js +7 -6
  350. package/dist/composables/clamp.d.ts +2 -0
  351. package/dist/composables/clamp.js +4 -0
  352. package/dist/composables/devWarn.d.ts +3 -0
  353. package/dist/composables/devWarn.js +14 -0
  354. package/dist/composables/easing.d.ts +13 -4
  355. package/dist/composables/easing.js +16 -10
  356. package/dist/composables/overlayHistory.js +14 -1
  357. package/dist/composables/pointerDrag.d.ts +15 -0
  358. package/dist/composables/pointerDrag.js +40 -0
  359. package/dist/composables/propCheck.d.ts +10 -0
  360. package/dist/composables/propCheck.js +78 -0
  361. package/dist/composables/realm.d.ts +6 -0
  362. package/dist/composables/realm.js +23 -0
  363. package/dist/composables/scroll.js +4 -2
  364. package/dist/composables/scrollMemory.d.ts +12 -1
  365. package/dist/composables/scrollMemory.js +36 -12
  366. package/dist/composables/spatialNav.js +2 -1
  367. package/dist/composables/textEntry.d.ts +17 -0
  368. package/dist/composables/textEntry.js +19 -0
  369. package/dist/composables/useAsyncTask.d.ts +6 -0
  370. package/dist/composables/useChartSync.d.ts +5 -0
  371. package/dist/composables/useChartSync.js +33 -0
  372. package/dist/composables/useCloseGuard.d.ts +3 -1
  373. package/dist/composables/useCloseGuard.js +6 -3
  374. package/dist/composables/useCommands.d.ts +50 -0
  375. package/dist/composables/useCommands.js +66 -0
  376. package/dist/composables/useField.d.ts +37 -0
  377. package/dist/composables/useField.js +27 -2
  378. package/dist/composables/useFitScale.js +4 -1
  379. package/dist/composables/useFormDraft.d.ts +13 -2
  380. package/dist/composables/useFormDraft.js +17 -9
  381. package/dist/composables/useHintSystem.js +2 -2
  382. package/dist/composables/useHotkeys.js +11 -32
  383. package/dist/composables/useInView.js +2 -1
  384. package/dist/composables/useInputFilter.js +7 -5
  385. package/dist/composables/useInputMask.js +5 -3
  386. package/dist/composables/useLinkedView.d.ts +97 -0
  387. package/dist/composables/useLinkedView.js +139 -0
  388. package/dist/composables/useOptimisticToggle.d.ts +3 -1
  389. package/dist/composables/useOptimisticToggle.js +2 -1
  390. package/dist/composables/useOverlayHistory.d.ts +7 -0
  391. package/dist/composables/useOverlayHistory.js +16 -2
  392. package/dist/composables/usePaintSelect.js +18 -14
  393. package/dist/composables/usePaletteCommands.d.ts +7 -0
  394. package/dist/composables/usePaletteCommands.js +12 -1
  395. package/dist/composables/usePersisted.d.ts +10 -0
  396. package/dist/composables/usePersisted.js +1 -1
  397. package/dist/composables/usePillTransition.d.ts +2 -2
  398. package/dist/composables/usePillTransition.js +5 -5
  399. package/dist/composables/useResizeObserver.js +2 -1
  400. package/dist/composables/useReveal.js +2 -1
  401. package/dist/composables/useRovingFocus.d.ts +2 -2
  402. package/dist/composables/useRovingFocus.js +9 -11
  403. package/dist/composables/useScramble.js +7 -1
  404. package/dist/composables/useShift.js +8 -6
  405. package/dist/composables/useTilt.js +2 -1
  406. package/dist/composables/useTween.js +9 -5
  407. package/dist/composables/useView.d.ts +1 -0
  408. package/dist/composables/useView.js +14 -2
  409. package/dist/composables/useZoomPan.js +2 -4
  410. package/dist/composables/windowing.d.ts +40 -0
  411. package/dist/composables/windowing.js +118 -0
  412. package/dist/icons-all.js +1 -1
  413. package/dist/icons.d.ts +4 -0
  414. package/dist/index.d.ts +30 -5
  415. package/dist/index.js +310 -264
  416. package/dist/layout/tree.js +19 -15
  417. package/dist/layout/useLayout.d.ts +2 -0
  418. package/dist/layout/useLayout.js +5 -1
  419. package/dist/layout/useWorkspaces.d.ts +52 -0
  420. package/dist/layout/useWorkspaces.js +140 -0
  421. package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
  422. package/dist/theme/config.js +25 -0
  423. package/dist/theme/define.js +61 -0
  424. package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
  425. package/dist/theme/presets.js +239 -0
  426. package/dist/theme/studio.js +134 -0
  427. package/dist/theme/tokens.js +63 -0
  428. package/dist/theme/useTheme.d.ts +3 -2
  429. package/dist/theme/useTheme.js +325 -0
  430. package/package.json +8 -1
  431. package/src/component-names.ts +5 -1
  432. package/src/components/AppShellContextNav.vue +44 -0
  433. package/src/components/ChartRangeSelector.vue +120 -0
  434. package/src/components/IconCloseButton.vue +21 -0
  435. package/src/components/LayoutCanvas.vue +3 -0
  436. package/src/components/LayoutNode.vue +37 -38
  437. package/src/components/LpActivityLine.vue +4 -2
  438. package/src/components/LpAddressInput.vue +3 -3
  439. package/src/components/LpAppShell.vue +362 -24
  440. package/src/components/LpAutocomplete.vue +13 -30
  441. package/src/components/LpBottomNav.vue +9 -1
  442. package/src/components/LpBreadcrumbs.vue +2 -1
  443. package/src/components/LpButton.vue +11 -4
  444. package/src/components/LpChart.vue +336 -37
  445. package/src/components/LpCheckbox.vue +43 -9
  446. package/src/components/LpCodeBlock.vue +17 -23
  447. package/src/components/LpCollapse.vue +5 -4
  448. package/src/components/LpColorPicker.vue +8 -9
  449. package/src/components/LpCommandPalette.vue +133 -50
  450. package/src/components/LpContextMenu.vue +15 -13
  451. package/src/components/LpCountdown.vue +2 -1
  452. package/src/components/LpDataList.vue +13 -1
  453. package/src/components/LpDatePicker.vue +5 -17
  454. package/src/components/LpDateRangePicker.vue +5 -16
  455. package/src/components/LpDock.vue +25 -16
  456. package/src/components/LpDrawer.vue +70 -61
  457. package/src/components/LpDropdownMenu.vue +6 -10
  458. package/src/components/LpDropzone.vue +12 -7
  459. package/src/components/LpEditable.vue +6 -2
  460. package/src/components/LpFileTree.vue +507 -66
  461. package/src/components/LpFileTreeNode.vue +106 -5
  462. package/src/components/LpFormField.vue +1 -1
  463. package/src/components/LpFrame.vue +33 -13
  464. package/src/components/LpHoverCard.vue +30 -5
  465. package/src/components/LpIcon.vue +6 -2
  466. package/src/components/LpIdenticon.vue +2 -1
  467. package/src/components/LpImageEditor.vue +5 -2
  468. package/src/components/LpInput.vue +15 -23
  469. package/src/components/LpInspector.vue +197 -0
  470. package/src/components/LpLightbox.vue +74 -29
  471. package/src/components/LpLogInspector.vue +85 -0
  472. package/src/components/LpLogViewer.vue +239 -29
  473. package/src/components/LpMapPicker.vue +2 -1
  474. package/src/components/LpMasonry.vue +8 -5
  475. package/src/components/LpModal.vue +12 -12
  476. package/src/components/LpModalNav.vue +2 -21
  477. package/src/components/LpNumberField.vue +6 -15
  478. package/src/components/LpOtpInput.vue +2 -2
  479. package/src/components/LpPagination.vue +5 -3
  480. package/src/components/LpPhoneInput.vue +8 -19
  481. package/src/components/LpPie.vue +25 -23
  482. package/src/components/LpPipeline.vue +14 -1
  483. package/src/components/LpPopover.vue +23 -2
  484. package/src/components/LpProgress.vue +2 -1
  485. package/src/components/LpRadioGroup.vue +2 -2
  486. package/src/components/LpRangeSlider.vue +5 -6
  487. package/src/components/LpRevealOnScroll.vue +1 -1
  488. package/src/components/LpScrollArea.vue +28 -11
  489. package/src/components/LpSecretField.vue +2 -1
  490. package/src/components/LpSegmented.vue +6 -8
  491. package/src/components/LpSelect.vue +54 -24
  492. package/src/components/LpShaderBackdrop.vue +12 -9
  493. package/src/components/LpShift.vue +18 -15
  494. package/src/components/LpSidebar.vue +77 -74
  495. package/src/components/LpSidebarNav.vue +3 -2
  496. package/src/components/LpSidebarRow.vue +2 -1
  497. package/src/components/LpSlider.vue +5 -6
  498. package/src/components/LpSpotlight.vue +2 -1
  499. package/src/components/LpSwitch.vue +5 -3
  500. package/src/components/LpTable.vue +609 -93
  501. package/src/components/LpTableFilter.vue +1 -1
  502. package/src/components/LpTableOfContents.vue +16 -9
  503. package/src/components/LpTabs.vue +2 -1
  504. package/src/components/LpTagsInput.vue +12 -19
  505. package/src/components/LpTextarea.vue +5 -11
  506. package/src/components/LpThemeProvider.vue +29 -13
  507. package/src/components/LpTimeField.vue +4 -7
  508. package/src/components/LpToaster.vue +7 -6
  509. package/src/components/LpTooltip.vue +62 -18
  510. package/src/components/LpTopologyCanvas.vue +567 -42
  511. package/src/components/LpTour.vue +7 -5
  512. package/src/components/LpTruncate.vue +4 -3
  513. package/src/components/LpTypewriter.vue +2 -1
  514. package/src/components/LpVideoBackdrop.vue +11 -13
  515. package/src/components/LpWindow.vue +373 -0
  516. package/src/components/LpWorkspaceSwitcher.vue +116 -0
  517. package/src/components/PickerField.vue +2 -2
  518. package/src/components/SliderRail.vue +10 -0
  519. package/src/components/address.ts +3 -1
  520. package/src/components/appShell.ts +74 -0
  521. package/src/components/calendar.ts +12 -5
  522. package/src/components/chart.ts +27 -3
  523. package/src/components/chartWindow.ts +198 -0
  524. package/src/components/color.ts +2 -1
  525. package/src/components/commandPalette.ts +66 -5
  526. package/src/components/controlSize.ts +6 -0
  527. package/src/components/dropdown.ts +3 -0
  528. package/src/components/exportData.ts +33 -18
  529. package/src/components/fileTree.ts +215 -0
  530. package/src/components/identicon.ts +4 -2
  531. package/src/components/logTools.ts +298 -0
  532. package/src/components/meter.ts +2 -1
  533. package/src/components/pipeline.ts +6 -0
  534. package/src/components/relativeTime.ts +2 -1
  535. package/src/components/reveal.ts +3 -1
  536. package/src/components/select.ts +14 -0
  537. package/src/components/sidebar.ts +1 -0
  538. package/src/components/tableFeatures.ts +149 -0
  539. package/src/components/topologyGraph.ts +655 -0
  540. package/src/components/tour.ts +5 -3
  541. package/src/components/videoBackdrop.ts +7 -6
  542. package/src/composables/clamp.ts +2 -0
  543. package/src/composables/devWarn.ts +19 -0
  544. package/src/composables/easing.ts +37 -12
  545. package/src/composables/overlayHistory.ts +24 -0
  546. package/src/composables/pointerDrag.ts +54 -0
  547. package/src/composables/propCheck.ts +90 -0
  548. package/src/composables/realm.ts +25 -0
  549. package/src/composables/scroll.ts +4 -2
  550. package/src/composables/scrollMemory.ts +56 -14
  551. package/src/composables/spatialNav.ts +2 -1
  552. package/src/composables/textEntry.ts +33 -0
  553. package/src/composables/useAsyncTask.ts +6 -0
  554. package/src/composables/useChartSync.ts +52 -0
  555. package/src/composables/useCloseGuard.ts +22 -10
  556. package/src/composables/useCommands.ts +123 -0
  557. package/src/composables/useField.ts +41 -2
  558. package/src/composables/useFitScale.ts +4 -1
  559. package/src/composables/useFormDraft.ts +38 -14
  560. package/src/composables/useHintSystem.ts +2 -2
  561. package/src/composables/useHotkeys.ts +19 -48
  562. package/src/composables/useInView.ts +2 -1
  563. package/src/composables/useInputFilter.ts +8 -5
  564. package/src/composables/useInputMask.ts +8 -3
  565. package/src/composables/useLinkedView.ts +222 -0
  566. package/src/composables/useOptimisticToggle.ts +7 -1
  567. package/src/composables/useOverlayHistory.ts +20 -0
  568. package/src/composables/usePaintSelect.ts +20 -14
  569. package/src/composables/usePaletteCommands.ts +13 -0
  570. package/src/composables/usePersisted.ts +10 -0
  571. package/src/composables/usePillTransition.ts +9 -6
  572. package/src/composables/useResizeObserver.ts +2 -1
  573. package/src/composables/useReveal.ts +2 -1
  574. package/src/composables/useRovingFocus.ts +11 -14
  575. package/src/composables/useScramble.ts +12 -1
  576. package/src/composables/useShift.ts +8 -6
  577. package/src/composables/useTilt.ts +2 -1
  578. package/src/composables/useTween.ts +10 -5
  579. package/src/composables/useView.ts +17 -3
  580. package/src/composables/useZoomPan.ts +2 -5
  581. package/src/composables/windowing.ts +190 -0
  582. package/src/icons.ts +27 -6
  583. package/src/index.ts +41 -4
  584. package/src/kit-icons.ts +1 -1
  585. package/src/layout/tree.ts +31 -16
  586. package/src/layout/useLayout.ts +6 -0
  587. package/src/layout/useWorkspaces.ts +234 -0
  588. package/src/nuxt.ts +9 -1
  589. package/src/runtime/propCheck.plugin.ts +10 -0
  590. package/src/theme/studio.ts +7 -5
  591. package/src/theme/useTheme.ts +89 -15
  592. package/src/tokens/tokens.css +8 -1
  593. package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
  594. package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
  595. package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
  596. package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
  597. package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
@@ -0,0 +1,416 @@
1
+ function neighborhood(edges, id) {
2
+ const nodes = /* @__PURE__ */ new Set([id]);
3
+ const touching = [];
4
+ for (const edge of edges) {
5
+ if (edge.source !== id && edge.target !== id) continue;
6
+ nodes.add(edge.source);
7
+ nodes.add(edge.target);
8
+ touching.push(edge.id);
9
+ }
10
+ return { nodes: [...nodes], edges: touching };
11
+ }
12
+ function findPath(edges, from, to, options = {}) {
13
+ const links = /* @__PURE__ */ new Map();
14
+ const link = (a, b, edge) => {
15
+ const list = links.get(a);
16
+ if (list) list.push({ next: b, edge });
17
+ else links.set(a, [{ next: b, edge }]);
18
+ };
19
+ for (const edge of edges) {
20
+ if (options.allow && !options.allow(edge)) continue;
21
+ link(edge.source, edge.target, edge.id);
22
+ if (!options.directed) link(edge.target, edge.source, edge.id);
23
+ }
24
+ const cameBy = /* @__PURE__ */ new Map([[from, null]]);
25
+ const queue = [from];
26
+ for (let head = 0; head < queue.length; head++) {
27
+ const at = queue[head];
28
+ if (at === to) break;
29
+ for (const { next, edge } of links.get(at) ?? []) {
30
+ if (cameBy.has(next)) continue;
31
+ cameBy.set(next, { from: at, edge });
32
+ queue.push(next);
33
+ }
34
+ }
35
+ if (!cameBy.has(to)) return null;
36
+ const path = { nodes: [to], edges: [] };
37
+ for (let step = cameBy.get(to); step; step = cameBy.get(step.from)) {
38
+ path.nodes.unshift(step.from);
39
+ path.edges.unshift(step.edge);
40
+ }
41
+ return path;
42
+ }
43
+ function fingerprint(item) {
44
+ const { position: _position, dimmed: _dimmed, data, ...rest } = item;
45
+ const { dimmed: _dataDimmed, ...own } = data ?? {};
46
+ return JSON.stringify(
47
+ [rest, own],
48
+ (_key, value) => value && typeof value === "object" && !Array.isArray(value) ? Object.fromEntries(Object.entries(value).sort(([a], [b]) => a < b ? -1 : 1)) : value
49
+ );
50
+ }
51
+ function compare(before, after) {
52
+ const old = new Map(before.map((item) => [item.id, item]));
53
+ const fresh = new Set(after.map((item) => item.id));
54
+ return {
55
+ added: after.filter((item) => !old.has(item.id)).map((item) => item.id),
56
+ removed: before.filter((item) => !fresh.has(item.id)).map((item) => item.id),
57
+ changed: after.filter((item) => old.has(item.id) && fingerprint(old.get(item.id)) !== fingerprint(item)).map((item) => item.id)
58
+ };
59
+ }
60
+ function diffTopology(before, after) {
61
+ const nodes = compare(before.nodes, after.nodes);
62
+ const edges = compare(before.edges, after.edges);
63
+ return {
64
+ addedNodes: nodes.added,
65
+ removedNodes: nodes.removed,
66
+ changedNodes: nodes.changed,
67
+ addedEdges: edges.added,
68
+ removedEdges: edges.removed,
69
+ changedEdges: edges.changed
70
+ };
71
+ }
72
+ const DEFAULT_NODE_WIDTH = 220;
73
+ const DEFAULT_NODE_HEIGHT = 96;
74
+ const DEFAULT_LAYER_GAP = 96;
75
+ const DEFAULT_NODE_GAP = 32;
76
+ const DEFAULT_GROUP_GAP = 72;
77
+ const ORDER_SWEEPS = 4;
78
+ function topLevelOf(nodes) {
79
+ const parents = new Map(nodes.map((node) => [node.id, node.parent]));
80
+ const top = /* @__PURE__ */ new Map();
81
+ for (const node of nodes) {
82
+ let at = node.id;
83
+ const seen = /* @__PURE__ */ new Set([at]);
84
+ for (let up = parents.get(at); up && parents.has(up) && !seen.has(up); up = parents.get(at)) {
85
+ at = up;
86
+ seen.add(at);
87
+ }
88
+ top.set(node.id, at);
89
+ }
90
+ return top;
91
+ }
92
+ function acyclicLinks(ids, links) {
93
+ const out = new Map(ids.map((id) => [id, []]));
94
+ for (const [a, b] of links) {
95
+ const list = out.get(a);
96
+ if (list && out.has(b) && a !== b && !list.includes(b)) list.push(b);
97
+ }
98
+ const state = /* @__PURE__ */ new Map();
99
+ const kept = [];
100
+ for (const root of ids) {
101
+ if (state.has(root)) continue;
102
+ state.set(root, "open");
103
+ const stack = [{ id: root, next: 0 }];
104
+ while (stack.length) {
105
+ const top = stack[stack.length - 1];
106
+ const target = out.get(top.id)[top.next++];
107
+ if (target === void 0) {
108
+ state.set(top.id, "done");
109
+ stack.pop();
110
+ } else if (state.get(target) !== "open") {
111
+ kept.push([top.id, target]);
112
+ if (!state.has(target)) {
113
+ state.set(target, "open");
114
+ stack.push({ id: target, next: 0 });
115
+ }
116
+ }
117
+ }
118
+ }
119
+ return kept;
120
+ }
121
+ function rankOf(ids, links) {
122
+ const rank = new Map(ids.map((id) => [id, 0]));
123
+ const waiting = new Map(ids.map((id) => [id, 0]));
124
+ const out = new Map(ids.map((id) => [id, []]));
125
+ for (const [a, b] of links) {
126
+ out.get(a).push(b);
127
+ waiting.set(b, waiting.get(b) + 1);
128
+ }
129
+ const queue = ids.filter((id) => waiting.get(id) === 0);
130
+ for (let head = 0; head < queue.length; head++) {
131
+ const at = queue[head];
132
+ for (const next of out.get(at)) {
133
+ rank.set(next, Math.max(rank.get(next), rank.get(at) + 1));
134
+ waiting.set(next, waiting.get(next) - 1);
135
+ if (waiting.get(next) === 0) queue.push(next);
136
+ }
137
+ }
138
+ return rank;
139
+ }
140
+ function orderLayers(layers, links) {
141
+ const around = /* @__PURE__ */ new Map();
142
+ const add = (a, b) => around.set(a, [...around.get(a) ?? [], b]);
143
+ for (const [a, b] of links) {
144
+ add(a, b);
145
+ add(b, a);
146
+ }
147
+ for (let sweep = 0; sweep < ORDER_SWEEPS; sweep++) {
148
+ const down = sweep % 2 === 0;
149
+ const place = new Map(layers.flatMap((layer) => layer.map((id, i) => [id, i])));
150
+ for (let i = 0; i < layers.length; i++) {
151
+ const at = down ? i : layers.length - 1 - i;
152
+ const weight = (id, fallback) => {
153
+ const known = (around.get(id) ?? []).map((other) => place.get(other)).filter((n) => n !== void 0);
154
+ return known.length ? known.reduce((sum, n) => sum + n, 0) / known.length : fallback;
155
+ };
156
+ const ranked = layers[at].map((id, index) => ({ id, index, weight: weight(id, index) }));
157
+ ranked.sort((a, b) => a.weight - b.weight || a.index - b.index);
158
+ layers[at] = ranked.map((entry) => entry.id);
159
+ layers[at].forEach((id, index) => place.set(id, index));
160
+ }
161
+ }
162
+ }
163
+ function layeredLayout(nodes, edges, options = {}) {
164
+ const vertical = options.direction === "TB";
165
+ const layerGap = options.layerGap ?? DEFAULT_LAYER_GAP;
166
+ const nodeGap = options.nodeGap ?? DEFAULT_NODE_GAP;
167
+ const groupGap = options.groupGap ?? DEFAULT_GROUP_GAP;
168
+ const width = (node) => node.width ?? options.nodeWidth ?? DEFAULT_NODE_WIDTH;
169
+ const height = (node) => node.height ?? options.nodeHeight ?? DEFAULT_NODE_HEIGHT;
170
+ const along = (node) => vertical ? height(node) : width(node);
171
+ const across = (node) => vertical ? width(node) : height(node);
172
+ const top = topLevelOf(nodes);
173
+ const byId = new Map(nodes.map((node) => [node.id, node]));
174
+ const roots = nodes.filter((node) => top.get(node.id) === node.id);
175
+ const links = edges.flatMap((edge) => {
176
+ const a = top.get(edge.source);
177
+ const b = top.get(edge.target);
178
+ return a && b ? [[a, b]] : [];
179
+ });
180
+ const bands = /* @__PURE__ */ new Map();
181
+ for (const node of roots) {
182
+ const key = options.groupOf?.(node) ?? "";
183
+ const band = bands.get(key);
184
+ if (band) band.push(node);
185
+ else bands.set(key, [node]);
186
+ }
187
+ const positions = /* @__PURE__ */ new Map();
188
+ let bandStart = 0;
189
+ for (const band of bands.values()) {
190
+ const ids = band.map((node) => node.id);
191
+ const acyclic = acyclicLinks(ids, links);
192
+ const rank = rankOf(ids, acyclic);
193
+ const layers = [];
194
+ for (const id of ids) (layers[rank.get(id)] ??= []).push(id);
195
+ orderLayers(layers, acyclic);
196
+ const extent = (layer) => layer.reduce((sum, id) => sum + across(byId.get(id)) + nodeGap, -nodeGap);
197
+ const bandSize = Math.max(...layers.map(extent));
198
+ let main = 0;
199
+ for (const layer of layers) {
200
+ let cross = bandStart + (bandSize - extent(layer)) / 2;
201
+ for (const id of layer) {
202
+ positions.set(id, vertical ? { x: cross, y: main } : { x: main, y: cross });
203
+ cross += across(byId.get(id)) + nodeGap;
204
+ }
205
+ main += Math.max(...layer.map((id) => along(byId.get(id)))) + layerGap;
206
+ }
207
+ bandStart += bandSize + groupGap;
208
+ }
209
+ return positions;
210
+ }
211
+ const LANE_PADDING = 24;
212
+ const LANE_HEADER = 28;
213
+ function groupBoxes(nodes, keyOf, options = {}) {
214
+ const padding = options.padding ?? LANE_PADDING;
215
+ const header = options.header ?? LANE_HEADER;
216
+ const edges = /* @__PURE__ */ new Map();
217
+ for (const node of nodes) {
218
+ const key = node.parent ? void 0 : keyOf(node);
219
+ if (key === void 0) continue;
220
+ const { x, y } = node.position;
221
+ const right = x + (node.width ?? options.nodeWidth ?? DEFAULT_NODE_WIDTH);
222
+ const bottom = y + (node.height ?? options.nodeHeight ?? DEFAULT_NODE_HEIGHT);
223
+ const seen = edges.get(key);
224
+ edges.set(key, seen ? { left: Math.min(seen.left, x), top: Math.min(seen.top, y), right: Math.max(seen.right, right), bottom: Math.max(seen.bottom, bottom) } : { left: x, top: y, right, bottom });
225
+ }
226
+ return [...edges].map(([key, e]) => ({
227
+ key,
228
+ box: {
229
+ x: e.left - padding,
230
+ y: e.top - padding - header,
231
+ width: e.right - e.left + padding * 2,
232
+ height: e.bottom - e.top + padding * 2 + header
233
+ }
234
+ }));
235
+ }
236
+ const CHILD_WIDTH = 170;
237
+ const CHILD_HEIGHT = 56;
238
+ const FRAME_PADDING = 16;
239
+ function frameSize(children, options = {}) {
240
+ const padding = options.padding ?? FRAME_PADDING;
241
+ let width = options.minWidth ?? 0;
242
+ let height = options.minHeight ?? 0;
243
+ for (const child of children) {
244
+ width = Math.max(width, child.position.x + (child.width ?? options.childWidth ?? CHILD_WIDTH) + padding);
245
+ height = Math.max(height, child.position.y + (child.height ?? options.childHeight ?? CHILD_HEIGHT) + padding);
246
+ }
247
+ return { width, height };
248
+ }
249
+ function mergeEdges(edges, mapId) {
250
+ const merged = /* @__PURE__ */ new Map();
251
+ for (const edge of edges) {
252
+ const source = mapId(edge.source);
253
+ const target = mapId(edge.target);
254
+ if (source === void 0 || target === void 0 || source === target) continue;
255
+ const id = `${source}\0${target}`;
256
+ const seen = merged.get(id);
257
+ if (seen) seen.members.push(edge.id);
258
+ else merged.set(id, { id, source, target, members: [edge.id] });
259
+ }
260
+ return [...merged.values()];
261
+ }
262
+ const CLUSTER_PREFIX = "lp-cluster:";
263
+ function clusterGraph(nodes, edges, keyOf) {
264
+ const top = topLevelOf(nodes);
265
+ const byId = new Map(nodes.map((node) => [node.id, node]));
266
+ const groups = /* @__PURE__ */ new Map();
267
+ const standsFor = /* @__PURE__ */ new Map();
268
+ for (const node of nodes) {
269
+ const root = byId.get(top.get(node.id));
270
+ const key = keyOf(root);
271
+ if (key === void 0) {
272
+ standsFor.set(node.id, node.id);
273
+ continue;
274
+ }
275
+ standsFor.set(node.id, CLUSTER_PREFIX + key);
276
+ if (node !== root) continue;
277
+ const group = groups.get(key);
278
+ if (group) group.push(node);
279
+ else groups.set(key, [node]);
280
+ }
281
+ const clusters = [...groups].map(([key, members]) => ({
282
+ id: CLUSTER_PREFIX + key,
283
+ key,
284
+ position: {
285
+ x: members.reduce((sum, node) => sum + node.position.x, 0) / members.length,
286
+ y: members.reduce((sum, node) => sum + node.position.y, 0) / members.length
287
+ },
288
+ members: nodes.filter((node) => standsFor.get(node.id) === CLUSTER_PREFIX + key).map((node) => node.id)
289
+ }));
290
+ return {
291
+ nodes: nodes.filter((node) => standsFor.get(node.id) === node.id),
292
+ clusters,
293
+ edges: mergeEdges(edges, (id) => standsFor.get(id))
294
+ };
295
+ }
296
+ function collapseChildren(nodes, edges) {
297
+ const top = topLevelOf(nodes);
298
+ return { nodes: nodes.filter((node) => top.get(node.id) === node.id), edges: mergeEdges(edges, (id) => top.get(id)) };
299
+ }
300
+ const SIMPLE_BELOW_ZOOM = 0.7;
301
+ const OVERVIEW_BELOW_ZOOM = 0.45;
302
+ function detailAtZoom(zoom, grouped) {
303
+ if (zoom < OVERVIEW_BELOW_ZOOM && grouped) return "overview";
304
+ return zoom < SIMPLE_BELOW_ZOOM ? "simple" : "full";
305
+ }
306
+ function absolutePositions(nodes) {
307
+ const byId = new Map(nodes.map((node) => [node.id, node]));
308
+ const resolved = /* @__PURE__ */ new Map();
309
+ const resolve = (node, seen) => {
310
+ const known = resolved.get(node.id);
311
+ if (known) return known;
312
+ const parent = node.parent ? byId.get(node.parent) : void 0;
313
+ const base = parent && !seen.has(parent.id) ? resolve(parent, seen.add(node.id)) : { x: 0, y: 0 };
314
+ const point = { x: base.x + node.position.x, y: base.y + node.position.y };
315
+ resolved.set(node.id, point);
316
+ return point;
317
+ };
318
+ for (const node of nodes) resolve(node, /* @__PURE__ */ new Set());
319
+ return resolved;
320
+ }
321
+ function nodeName(node) {
322
+ const name = node.data?.name;
323
+ return node.label ?? (typeof name === "string" ? name : node.id);
324
+ }
325
+ function findNodes(nodes, query) {
326
+ const needle = query.trim().toLowerCase();
327
+ if (!needle) return [];
328
+ const score = (node) => {
329
+ const at = nodeName(node).toLowerCase().indexOf(needle);
330
+ if (at === 0) return 0;
331
+ if (at > 0) return 1;
332
+ return node.id.toLowerCase().includes(needle) ? 2 : -1;
333
+ };
334
+ return nodes.map((node) => ({ node, rank: score(node) })).filter((entry) => entry.rank >= 0).sort((a, b) => a.rank - b.rank).map((entry) => entry.node);
335
+ }
336
+ const OFF_AXIS_PENALTY = 2;
337
+ function nearestInDirection(positions, from, direction) {
338
+ const origin = positions.get(from);
339
+ if (!origin) return null;
340
+ let best = null;
341
+ let bestCost = Infinity;
342
+ for (const [id, point] of positions) {
343
+ if (id === from) continue;
344
+ const dx = point.x - origin.x;
345
+ const dy = point.y - origin.y;
346
+ const main = { up: -dy, down: dy, left: -dx, right: dx }[direction];
347
+ if (main <= 0) continue;
348
+ const side = direction === "up" || direction === "down" ? dx : dy;
349
+ const cost = main + Math.abs(side) * OFF_AXIS_PENALTY;
350
+ if (cost < bestCost) {
351
+ bestCost = cost;
352
+ best = id;
353
+ }
354
+ }
355
+ return best;
356
+ }
357
+ function edgeLabelText(edge) {
358
+ const parts = [
359
+ edge.kind,
360
+ edge.rtt === void 0 ? void 0 : `${Math.round(edge.rtt)} ms`,
361
+ edge.loss === void 0 ? void 0 : `${edge.loss}% loss`
362
+ ].filter((part) => part !== void 0);
363
+ return parts.length ? parts.join(" · ") : void 0;
364
+ }
365
+ const SVG_MARGIN = 24;
366
+ const SVG_RADIUS = 10;
367
+ const SVG_FONT_SIZE = 12;
368
+ const SVG_FRAME_LABEL_Y = 18;
369
+ const escapeXml = (text) => text.replace(/[&<>"']/g, (char) => `&#${char.charCodeAt(0)};`);
370
+ function topologyToSvg(nodes, edges, theme) {
371
+ const left = Math.min(0, ...nodes.map((n) => n.x)) - SVG_MARGIN;
372
+ const top = Math.min(0, ...nodes.map((n) => n.y)) - SVG_MARGIN;
373
+ const width = Math.max(0, ...nodes.map((n) => n.x + n.width)) + SVG_MARGIN - left;
374
+ const height = Math.max(0, ...nodes.map((n) => n.y + n.height)) + SVG_MARGIN - top;
375
+ const byId = new Map(nodes.map((node) => [node.id, node]));
376
+ const middle = (n) => ({ x: n.x + n.width / 2, y: n.y + n.height / 2 });
377
+ const wires = edges.flatMap((edge) => {
378
+ const from = byId.get(edge.source);
379
+ const to = byId.get(edge.target);
380
+ if (!from || !to) return [];
381
+ const a = middle(from);
382
+ const b = middle(to);
383
+ const dash = edge.dash && edge.dash !== "0" ? ` stroke-dasharray="${escapeXml(edge.dash)}"` : "";
384
+ const line = `<line x1="${a.x}" y1="${a.y}" x2="${b.x}" y2="${b.y}" stroke="${escapeXml(edge.color ?? theme.edge)}" stroke-width="2"${dash}/>`;
385
+ const label = edge.label ? `<text x="${(a.x + b.x) / 2}" y="${(a.y + b.y) / 2}" text-anchor="middle" fill="${escapeXml(theme.text)}">${escapeXml(edge.label)}</text>` : "";
386
+ return [line + label];
387
+ });
388
+ const box = (n) => {
389
+ const textX = n.x + n.width / 2;
390
+ const textY = n.frame ? n.y + SVG_FRAME_LABEL_Y : n.y + n.height / 2;
391
+ return `<rect x="${n.x}" y="${n.y}" width="${n.width}" height="${n.height}" rx="${SVG_RADIUS}" fill="${escapeXml(theme.surface)}" stroke="${escapeXml(theme.line)}"/><text x="${textX}" y="${textY}" text-anchor="middle" dominant-baseline="middle" fill="${escapeXml(theme.text)}">${escapeXml(n.label)}</text>`;
392
+ };
393
+ const frames = nodes.filter((n) => n.frame).map(box);
394
+ const cards = nodes.filter((n) => !n.frame).map(box);
395
+ return `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${height}" viewBox="${left} ${top} ${width} ${height}" font-family="sans-serif" font-size="${SVG_FONT_SIZE}"><rect x="${left}" y="${top}" width="${width}" height="${height}" fill="${escapeXml(theme.background)}"/>` + frames.join("") + wires.join("") + cards.join("") + "</svg>";
396
+ }
397
+ export {
398
+ OVERVIEW_BELOW_ZOOM,
399
+ SIMPLE_BELOW_ZOOM,
400
+ absolutePositions,
401
+ clusterGraph,
402
+ collapseChildren,
403
+ detailAtZoom,
404
+ diffTopology,
405
+ edgeLabelText,
406
+ findNodes,
407
+ findPath,
408
+ frameSize,
409
+ groupBoxes,
410
+ layeredLayout,
411
+ mergeEdges,
412
+ nearestInDirection,
413
+ neighborhood,
414
+ nodeName,
415
+ topologyToSvg
416
+ };
@@ -1,3 +1,4 @@
1
+ import { nodeWindow } from "../composables/realm.js";
1
2
  function holeOf(target, padding, viewport) {
2
3
  const x = Math.max(0, target.x - padding);
3
4
  const y = Math.max(0, target.y - padding);
@@ -37,8 +38,9 @@ function holeClip(hole, viewport, radius) {
37
38
  }
38
39
  function openContextMenu(el) {
39
40
  const box = el.getBoundingClientRect();
41
+ const win = nodeWindow(el);
40
42
  el.dispatchEvent(
41
- new MouseEvent("contextmenu", {
43
+ new win.MouseEvent("contextmenu", {
42
44
  bubbles: true,
43
45
  cancelable: true,
44
46
  button: 2,
@@ -49,8 +51,8 @@ function openContextMenu(el) {
49
51
  return () => {
50
52
  const outside = { bubbles: true, cancelable: true, clientX: 0, clientY: 0 };
51
53
  const body = el.ownerDocument.body;
52
- body.dispatchEvent(new PointerEvent("pointerdown", outside));
53
- body.dispatchEvent(new PointerEvent("pointerup", outside));
54
+ body.dispatchEvent(new win.PointerEvent("pointerdown", outside));
55
+ body.dispatchEvent(new win.PointerEvent("pointerup", outside));
54
56
  };
55
57
  }
56
58
  export {
@@ -1,16 +1,17 @@
1
+ import { clamp } from "../composables/clamp.js";
1
2
  import { splitTime } from "./timeSpan.js";
2
3
  function planLoop(duration, options = {}) {
3
4
  if (!Number.isFinite(duration) || duration <= 0) return { from: 0, to: 0, fade: 0 };
4
- const clamp = (value) => Math.min(duration, Math.max(0, value));
5
- let from = clamp(options.start ?? 0);
6
- let to = clamp(options.end ?? duration);
5
+ const within = (value) => clamp(value, 0, duration);
6
+ let from = within(options.start ?? 0);
7
+ let to = within(options.end ?? duration);
7
8
  if (to < from) [from, to] = [to, from];
8
- const minLength = Math.min(duration, Math.max(0, options.minLength ?? 0.5));
9
+ const minLength = clamp(options.minLength ?? 0.5, 0, duration);
9
10
  if (to - from < minLength) {
10
11
  to = Math.min(duration, from + minLength);
11
12
  from = Math.max(0, to - minLength);
12
13
  }
13
- const fade = Math.min(Math.max(0, options.crossfade ?? 0), (to - from) / 2);
14
+ const fade = clamp(options.crossfade ?? 0, 0, (to - from) / 2);
14
15
  return { from, to, fade };
15
16
  }
16
17
  function seamReached(plan, time) {
@@ -18,7 +19,7 @@ function seamReached(plan, time) {
18
19
  }
19
20
  function seamProgress(plan, incomingTime) {
20
21
  if (plan.fade <= 0) return 1;
21
- return Math.min(1, Math.max(0, (incomingTime - plan.from) / plan.fade));
22
+ return clamp((incomingTime - plan.from) / plan.fade, 0, 1);
22
23
  }
23
24
  function isNativeLoop(plan, duration) {
24
25
  return plan.fade === 0 && plan.from === 0 && plan.to >= duration;
@@ -0,0 +1,2 @@
1
+ /** `value` held between `min` and `max`. When they cross, `max` wins. */
2
+ export declare const clamp: (value: number, min: number, max: number) => number;
@@ -0,0 +1,4 @@
1
+ const clamp = (value, min, max) => Math.min(max, Math.max(min, value));
2
+ export {
3
+ clamp
4
+ };
@@ -0,0 +1,3 @@
1
+ export declare function isDev(): boolean;
2
+ /** A warning for the developer only. */
3
+ export declare function devWarn(message: string): void;
@@ -0,0 +1,14 @@
1
+ function isDev() {
2
+ try {
3
+ return process.env.NODE_ENV !== "production";
4
+ } catch {
5
+ return false;
6
+ }
7
+ }
8
+ function devWarn(message) {
9
+ if (isDev()) console.warn(`[@leavepulse/ui] ${message}`);
10
+ }
11
+ export {
12
+ devWarn,
13
+ isDev
14
+ };
@@ -8,8 +8,16 @@
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
10
  * setting changes mid-session should use `usePrefersReducedMotion`.
11
+ *
12
+ * Which one to use: a one-off animation reads this as it starts; anything that
13
+ * keeps running (a loop, a spring, a video) follows the reactive one or the
14
+ * media query's own change event, so it stops without a new action; a CSS
15
+ * transition uses `prefers-reduced-motion` in CSS.
16
+ *
17
+ * `win` is the window to ask, for a caller inside an LpFrame.
11
18
  */
12
- export declare const prefersReducedMotion: () => boolean;
19
+ export declare const prefersReducedMotion: (win?: Window) => boolean;
20
+ type TokenScope = Element | Document;
13
21
  /**
14
22
  * A motion token's value, for an API that cannot take a `var()`.
15
23
  *
@@ -21,13 +29,13 @@ export declare const prefersReducedMotion: () => boolean;
21
29
  * Reading the custom property keeps them themeable. The fallback covers SSR and
22
30
  * the frame before tokens are applied.
23
31
  */
24
- export declare const easingToken: (name: "ease-emphasized" | "ease-travel" | "ease-settle", fallback?: string) => string;
32
+ export declare const easingToken: (name: "ease-emphasized" | "ease-travel" | "ease-settle", fallback?: string, scope?: TokenScope) => string;
25
33
  /**
26
34
  * A duration token in milliseconds, for an animation or a timer driven in
27
35
  * script. Same reasoning as `easingToken`: a typed-out 220 would not follow a
28
36
  * theme that retunes the token.
29
37
  */
30
- export declare const durationToken: (name: "duration-fast" | "duration-medium", fallback?: number) => number;
38
+ export declare const durationToken: (name: "duration-fast" | "duration-medium", fallback?: number, scope?: TokenScope) => number;
31
39
  /**
32
40
  * Comes to rest — `--ease-settle`'s shape without the overshoot.
33
41
  *
@@ -70,4 +78,5 @@ export declare const cubicBezier: (x1: number, y1: number, x2: number, y2: numbe
70
78
  * `linear()` list) falls back to `easeOut`, which has the same "arrives and
71
79
  * settles" intent as every curve the kit defines.
72
80
  */
73
- export declare const tokenEase: (name: "ease-emphasized" | "ease-travel" | "ease-settle") => ((t: number) => number);
81
+ export declare const tokenEase: (name: "ease-emphasized" | "ease-travel" | "ease-settle", scope?: TokenScope) => ((t: number) => number);
82
+ export {};
@@ -1,12 +1,18 @@
1
- const prefersReducedMotion = () => typeof window !== "undefined" && (window.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false);
2
- const easingToken = (name, fallback = "cubic-bezier(0.2, 0, 0, 1)") => {
3
- if (typeof window === "undefined" || !window.getComputedStyle) return fallback;
4
- const value = getComputedStyle(document.documentElement).getPropertyValue(`--${name}`).trim();
5
- return value || fallback;
1
+ const prefersReducedMotion = (win) => {
2
+ const target = win ?? (typeof window === "undefined" ? void 0 : window);
3
+ return target?.matchMedia?.("(prefers-reduced-motion: reduce)").matches ?? false;
6
4
  };
7
- const durationToken = (name, fallback = 220) => {
8
- if (typeof window === "undefined" || !window.getComputedStyle) return fallback;
9
- const raw = getComputedStyle(document.documentElement).getPropertyValue(`--${name}`).trim();
5
+ function readToken(name, scope) {
6
+ if (typeof window === "undefined") return null;
7
+ const el = scope ? "documentElement" in scope ? scope.documentElement : scope : document.documentElement;
8
+ const view = el.ownerDocument?.defaultView ?? window;
9
+ if (!view.getComputedStyle) return null;
10
+ return view.getComputedStyle(el).getPropertyValue(`--${name}`).trim();
11
+ }
12
+ const easingToken = (name, fallback = "cubic-bezier(0.2, 0, 0, 1)", scope) => readToken(name, scope) || fallback;
13
+ const durationToken = (name, fallback = 220, scope) => {
14
+ const raw = readToken(name, scope);
15
+ if (raw === null) return fallback;
10
16
  const ms = Number.parseFloat(raw);
11
17
  return Number.isFinite(ms) ? raw.endsWith("ms") || !raw.endsWith("s") ? ms : ms * 1e3 : fallback;
12
18
  };
@@ -55,8 +61,8 @@ const cubicBezier = (x1, y1, x2, y2) => {
55
61
  return y(s);
56
62
  };
57
63
  };
58
- const tokenEase = (name) => {
59
- const match = /cubic-bezier\(([^)]+)\)/.exec(easingToken(name));
64
+ const tokenEase = (name, scope) => {
65
+ const match = /cubic-bezier\(([^)]+)\)/.exec(easingToken(name, void 0, scope));
60
66
  const n = match?.[1].split(",").map((p) => Number.parseFloat(p));
61
67
  return n && n.length === 4 && n.every(Number.isFinite) ? cubicBezier(n[0], n[1], n[2], n[3]) : easeOut;
62
68
  };
@@ -1,5 +1,6 @@
1
1
  const KEY = "__lpOverlay";
2
2
  const SETTLE_MS = 300;
3
+ const STEP_TIMEOUT_MS = 1500;
3
4
  const STATE_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:overlay-history");
4
5
  const g = globalThis;
5
6
  const fresh = {
@@ -16,7 +17,8 @@ const fresh = {
16
17
  href: "",
17
18
  serial: 0,
18
19
  internal: false,
19
- settle: 0
20
+ settle: 0,
21
+ stalled: 0
20
22
  };
21
23
  const s = g[STATE_KEY] ??= fresh;
22
24
  function markOf(state) {
@@ -44,9 +46,18 @@ function own(run) {
44
46
  function silentGo(delta) {
45
47
  if (delta === 0) return;
46
48
  s.silent++;
49
+ window.clearTimeout(s.stalled);
50
+ s.stalled = window.setTimeout(abandonSteps, STEP_TIMEOUT_MS);
47
51
  mute();
48
52
  own(() => history.go(delta));
49
53
  }
54
+ function abandonSteps() {
55
+ s.silent = 0;
56
+ s.keep = null;
57
+ s.href = location.href;
58
+ flushWaiting();
59
+ mute();
60
+ }
50
61
  function whenSettled(run) {
51
62
  if (s.silent > 0) s.waiting.push(run);
52
63
  else run();
@@ -76,6 +87,7 @@ function handlePop(event) {
76
87
  s.href = location.href;
77
88
  if (s.silent > 0) {
78
89
  s.silent--;
90
+ if (s.silent === 0) window.clearTimeout(s.stalled);
79
91
  const keep = s.silent === 0 ? s.keep : null;
80
92
  if (s.silent === 0) s.keep = null;
81
93
  if (keep && keep.href !== location.href) restore(keep, event);
@@ -179,6 +191,7 @@ function setHistoryRouter(router) {
179
191
  if (s.router && s.router !== router) s.router.listening = true;
180
192
  s.router = router;
181
193
  if (typeof window === "undefined") return;
194
+ install();
182
195
  window.removeEventListener("popstate", afterPop);
183
196
  window.addEventListener("popstate", afterPop);
184
197
  mute();
@@ -0,0 +1,15 @@
1
+ export interface PointerDragHandlers {
2
+ move: (event: PointerEvent) => void;
3
+ /** `completed` is false for a cancelled or lost pointer: nothing should be committed. */
4
+ end: (completed: boolean) => void;
5
+ /** Hold this cursor over the whole page for the drag, the way a resize grip wants. */
6
+ cursor?: string;
7
+ }
8
+ /**
9
+ * Follow a pointer from the handle it pressed until it lets go, however that
10
+ * ends: release, a cancelled touch, a lost capture or the returned stop. The
11
+ * end runs once. Everything happens on the handle, which holds the capture, so
12
+ * it works inside an LpFrame, and the body's text selection is off meanwhile,
13
+ * in the handle's own window, and put back as it was.
14
+ */
15
+ export declare function startPointerDrag(event: PointerEvent, handlers: PointerDragHandlers): () => void;