@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
@@ -1,6 +1,7 @@
1
1
  import { ref, toValue, onMounted, onBeforeUnmount, readonly } from "vue";
2
2
  import { useHotkeys } from "./useHotkeys.js";
3
3
  import { scrollParent } from "./scroll.js";
4
+ import { nodeWindow } from "./realm.js";
4
5
  const HOLD_MS = 320;
5
6
  const SLOP_PX = 8;
6
7
  const EDGE_PX = 40;
@@ -23,8 +24,9 @@ function usePaintSelect(options) {
23
24
  }
24
25
  return out;
25
26
  }
27
+ const hostWindow = () => options.root.value ? nodeWindow(options.root.value) : window;
26
28
  function keyAt(x, y) {
27
- const item = document.elementFromPoint(x, y)?.closest("[data-paint-key]");
29
+ const item = options.root.value?.ownerDocument.elementFromPoint(x, y)?.closest("[data-paint-key]");
28
30
  if (!item || !options.root.value?.contains(item)) return void 0;
29
31
  return resolve(item.dataset.paintKey ?? "");
30
32
  }
@@ -45,11 +47,11 @@ function usePaintSelect(options) {
45
47
  function tick() {
46
48
  frame = 0;
47
49
  if (!stroke) return;
48
- const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom: window.innerHeight };
50
+ const box = stroke.scroller?.getBoundingClientRect() ?? { top: 0, bottom: hostWindow().innerHeight };
49
51
  const delta = stroke.y > box.bottom - EDGE_PX ? SCROLL_STEP : stroke.y < box.top + EDGE_PX ? -SCROLL_STEP : 0;
50
52
  if (delta) {
51
53
  if (stroke.scroller) stroke.scroller.scrollTop += delta;
52
- else window.scrollBy(0, delta);
54
+ else hostWindow().scrollBy(0, delta);
53
55
  extend();
54
56
  }
55
57
  frame = requestAnimationFrame(tick);
@@ -61,7 +63,7 @@ function usePaintSelect(options) {
61
63
  const before = new Set(options.selection());
62
64
  stroke = { keys, anchor, paint: !before.has(key), before, x, y, scroller: scrollParent(options.root.value) };
63
65
  painting.value = true;
64
- window.getSelection()?.removeAllRanges();
66
+ hostWindow().getSelection()?.removeAllRanges();
65
67
  if (options.root.value) options.root.value.style.userSelect = "none";
66
68
  extend();
67
69
  if (!frame) frame = requestAnimationFrame(tick);
@@ -138,22 +140,24 @@ function usePaintSelect(options) {
138
140
  ] : [],
139
141
  { scope: options.root }
140
142
  );
143
+ let listening = null;
141
144
  onMounted(() => {
142
- window.addEventListener("pointermove", onMove);
143
- window.addEventListener("pointerup", onUp);
144
- window.addEventListener("pointercancel", onUp);
145
- window.addEventListener("click", onClickCapture, true);
146
- window.addEventListener("contextmenu", onContextMenu, true);
145
+ listening = hostWindow();
146
+ listening.addEventListener("pointermove", onMove);
147
+ listening.addEventListener("pointerup", onUp);
148
+ listening.addEventListener("pointercancel", onUp);
149
+ listening.addEventListener("click", onClickCapture, true);
150
+ listening.addEventListener("contextmenu", onContextMenu, true);
147
151
  options.root.value?.addEventListener("touchmove", onTouchMove, { passive: false });
148
152
  });
149
153
  onBeforeUnmount(() => {
150
154
  onUp();
151
155
  swallowClick = false;
152
- window.removeEventListener("pointermove", onMove);
153
- window.removeEventListener("pointerup", onUp);
154
- window.removeEventListener("pointercancel", onUp);
155
- window.removeEventListener("click", onClickCapture, true);
156
- window.removeEventListener("contextmenu", onContextMenu, true);
156
+ listening?.removeEventListener("pointermove", onMove);
157
+ listening?.removeEventListener("pointerup", onUp);
158
+ listening?.removeEventListener("pointercancel", onUp);
159
+ listening?.removeEventListener("click", onClickCapture, true);
160
+ listening?.removeEventListener("contextmenu", onContextMenu, true);
157
161
  options.root.value?.removeEventListener("touchmove", onTouchMove);
158
162
  });
159
163
  return { onPointerDown, painting: readonly(painting) };
@@ -1,5 +1,6 @@
1
1
  import { type Directive, type MaybeRefOrGetter } from "vue";
2
2
  import type { Command } from "../components/LpCommandPalette.vue";
3
+ import type { ContextMenuItemDef } from "../components/LpContextMenu.vue";
3
4
  export interface PaletteRegistration {
4
5
  commands: () => readonly Command[];
5
6
  priority: number;
@@ -30,6 +31,12 @@ export declare function usePaletteCommands(commands: MaybeRefOrGetter<readonly C
30
31
  scope?: PaletteScope;
31
32
  }): void;
32
33
  /** Manual definitions override a discovered command without changing its place. */
34
+ /** A titled menu as one command of the palette, with its items inside. */
35
+ export declare function useMenuPalette(menu: {
36
+ palette?: PaletteControlOptions;
37
+ title?: string;
38
+ items: ContextMenuItemDef[];
39
+ }): void;
33
40
  export declare function mergePaletteCommands(discovered: readonly Command[], manual: readonly Command[]): Command[];
34
41
  export type PaletteControlOptions = false | {
35
42
  id?: string;
@@ -1,4 +1,5 @@
1
- import { inject, toValue, onScopeDispose, getCurrentInstance, ref, onMounted, onUpdated, provide, shallowReactive, computed, shallowRef, useId, h } from "vue";
1
+ import { useId, inject, toValue, onScopeDispose, provide, getCurrentInstance, ref, onMounted, onUpdated, computed, h, shallowReactive, shallowRef } from "vue";
2
+ import { menuPaletteCommands } from "../components/commandPalette.js";
2
3
  import { useField, provideField } from "./useField.js";
3
4
  import { useLabels } from "./useLpConfig.js";
4
5
  function uniqueCommands(commands) {
@@ -73,6 +74,15 @@ function usePaletteCommands(commands, options = {}) {
73
74
  });
74
75
  onScopeDispose(unregister);
75
76
  }
77
+ function useMenuPalette(menu) {
78
+ const scope = usePaletteScope();
79
+ const generated = useId();
80
+ usePaletteCommands(() => {
81
+ if (menu.palette === false || !menu.title || !menu.items.length) return [];
82
+ const id = `${scope?.id}/${menu.palette?.id ?? generated}`;
83
+ return [{ id, label: menu.palette?.label ?? menu.title, children: menuPaletteCommands(menu.items, id) }];
84
+ }, { automatic: true });
85
+ }
76
86
  function mergePaletteCommands(discovered, manual) {
77
87
  const overrides = new Map(manual.map((command) => [command.id, command]));
78
88
  return uniqueCommands([...discovered.map((command) => overrides.get(command.id) ?? command), ...manual]);
@@ -219,6 +229,7 @@ export {
219
229
  mergePaletteCommands,
220
230
  providePaletteScope,
221
231
  suppressPaletteDiscovery,
232
+ useMenuPalette,
222
233
  usePaletteAction,
223
234
  usePaletteCommands,
224
235
  usePaletteControl,
@@ -24,5 +24,15 @@ export interface PersistedOptions<T> {
24
24
  *
25
25
  * A changed key reads the new key's value, so one component instance can
26
26
  * follow the thing it shows (a drawer per record).
27
+ *
28
+ * Made for small preferences, and this is the contract:
29
+ * - JSON values only, `initial` included. A Map, Set or Date does not survive
30
+ * the round trip, a key holding `undefined` is dropped, and a BigInt or a
31
+ * cycle throws here, however `T` reads.
32
+ * - Every change walks the value and rewrites it whole, synchronously. A large
33
+ * document wants its own saving: debounced, with dirty state and versions.
34
+ * - One owner per key. Two refs on one key do not see each other's writes
35
+ * (the `storage` event only reaches other tabs) and the last write wins, so
36
+ * share the ref instead.
27
37
  */
28
38
  export declare function usePersisted<T>(key: MaybeRefOrGetter<string | false | null | undefined>, initial: T, options?: PersistedOptions<T>): Ref<T>;
@@ -1,4 +1,4 @@
1
- import { ref, watch, toValue, getCurrentInstance, inject } from "vue";
1
+ import { getCurrentInstance, toValue, inject, ref, watch } from "vue";
2
2
  import { LP_CONFIG } from "./useLpConfig.js";
3
3
  const browserStorage = {
4
4
  get(key) {
@@ -1,12 +1,12 @@
1
1
  import { type ComputedRef } from "vue";
2
2
  export type PillTransition = {
3
3
  duration: number;
4
- } | {
4
+ } | Readonly<{
5
5
  type: "spring";
6
6
  stiffness: number;
7
7
  damping: number;
8
8
  mass?: number;
9
- };
9
+ }>;
10
10
  export type PillFeel = "pill" | "float" | "layout";
11
11
  export declare function usePillTransition(feel?: PillFeel): ComputedRef<PillTransition>;
12
12
  /** The feels a pointer follower uses; "layout" is a motion-v layout move only. */
@@ -1,10 +1,10 @@
1
1
  import { computed } from "vue";
2
2
  import { usePrefersReducedMotion } from "./useReducedMotion.js";
3
- const SPRING = {
4
- pill: { type: "spring", stiffness: 520, damping: 40 },
5
- float: { type: "spring", stiffness: 210, damping: 26 },
6
- layout: { type: "spring", stiffness: 520, damping: 42, mass: 0.9 }
7
- };
3
+ const SPRING = Object.freeze({
4
+ pill: Object.freeze({ type: "spring", stiffness: 520, damping: 40 }),
5
+ float: Object.freeze({ type: "spring", stiffness: 210, damping: 26 }),
6
+ layout: Object.freeze({ type: "spring", stiffness: 520, damping: 42, mass: 0.9 })
7
+ });
8
8
  function usePillTransition(feel = "pill") {
9
9
  const reduceMotion = usePrefersReducedMotion();
10
10
  return computed(
@@ -1,3 +1,4 @@
1
+ import { nodeWindow } from "./realm.js";
1
2
  import { watch, toValue, onScopeDispose } from "vue";
2
3
  function useResizeObserver(target, callback, options = {}) {
3
4
  const { immediate = false, ...observe } = options;
@@ -13,7 +14,7 @@ function useResizeObserver(target, callback, options = {}) {
13
14
  if (!el) return;
14
15
  if (immediate) callback(void 0, el);
15
16
  if (typeof ResizeObserver === "undefined") return;
16
- observer = new ResizeObserver((entries) => {
17
+ observer = new (nodeWindow(el)).ResizeObserver((entries) => {
17
18
  const entry = entries[entries.length - 1];
18
19
  if (entry) callback(entry, el);
19
20
  });
@@ -1,3 +1,4 @@
1
+ import { nodeWindow } from "./realm.js";
1
2
  import { ref, watch, toValue, onBeforeUnmount } from "vue";
2
3
  import { prefersReducedMotion } from "./easing.js";
3
4
  function useReveal(options = {}) {
@@ -27,7 +28,7 @@ function useReveal(options = {}) {
27
28
  reveal();
28
29
  return;
29
30
  }
30
- observer = new IntersectionObserver(
31
+ observer = new (nodeWindow(node)).IntersectionObserver(
31
32
  (entries) => {
32
33
  if (entries.some((entry) => entry.isIntersecting)) reveal();
33
34
  },
@@ -13,9 +13,9 @@ export interface UseRovingFocusOptions {
13
13
  /**
14
14
  * Which axis the arrows follow. `vertical` (default) uses ↑↓, `horizontal`
15
15
  * uses ←→, `both` accepts either — for a grid whose wrapping the caller
16
- * cannot describe here.
16
+ * cannot describe here. A ref or getter follows a list that changes axis.
17
17
  */
18
- orientation?: "vertical" | "horizontal" | "both";
18
+ orientation?: MaybeRefOrGetter<"vertical" | "horizontal" | "both">;
19
19
  /** Wrap around at the ends instead of stopping. Default true. */
20
20
  loop?: boolean;
21
21
  /** Jump to an item by typing its first letters. Default true. */
@@ -1,5 +1,8 @@
1
1
  import { ref, computed, toValue, watch } from "vue";
2
+ import { isTextEntry } from "./textEntry.js";
3
+ import { isHTMLElement } from "./realm.js";
2
4
  const NON_TEXT_INPUTS = /* @__PURE__ */ new Set(["checkbox", "radio", "button", "submit", "reset", "range", "color", "file", "image"]);
5
+ const ROW_FIELD = { select: true, inputType: (type) => !NON_TEXT_INPUTS.has(type) };
3
6
  const TYPEAHEAD_RESET_MS = 700;
4
7
  function useRovingFocus(items, options = {}) {
5
8
  const {
@@ -70,15 +73,11 @@ function useRovingFocus(items, options = {}) {
70
73
  }
71
74
  }
72
75
  }
73
- function isTextEntry(target) {
74
- if (!(target instanceof HTMLElement)) return false;
75
- if (target.isContentEditable || target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement) return true;
76
- return target instanceof HTMLInputElement && !NON_TEXT_INPUTS.has(target.type);
77
- }
78
76
  function onKeydown(event) {
79
- if (event.isComposing || isTextEntry(event.target)) return;
80
- const vertical = orientation === "vertical" || orientation === "both";
81
- const horizontal = orientation === "horizontal" || orientation === "both";
77
+ if (event.isComposing || isTextEntry(event.target, ROW_FIELD)) return;
78
+ const axis = toValue(orientation);
79
+ const vertical = axis === "vertical" || axis === "both";
80
+ const horizontal = axis === "horizontal" || axis === "both";
82
81
  switch (event.key) {
83
82
  case "ArrowDown":
84
83
  if (!vertical) return;
@@ -126,9 +125,8 @@ function useRovingFocus(items, options = {}) {
126
125
  }
127
126
  }
128
127
  watch(activeId, (id) => {
129
- if (!id || typeof document === "undefined") return;
130
128
  const container = containerEl.value;
131
- if (!container || !container.contains(document.activeElement)) return;
129
+ if (!id || !container || !container.contains(container.ownerDocument.activeElement)) return;
132
130
  const target = container.querySelector(
133
131
  `[data-roving-id="${CSS.escape(id)}"]`
134
132
  );
@@ -138,7 +136,7 @@ function useRovingFocus(items, options = {}) {
138
136
  containerEl.value = el;
139
137
  }
140
138
  const containerProps = computed(() => ({
141
- ref: (el) => setContainer(el instanceof HTMLElement ? el : null),
139
+ ref: (el) => setContainer(isHTMLElement(el) ? el : null),
142
140
  onKeydown
143
141
  }));
144
142
  function itemProps(id) {
@@ -1,13 +1,19 @@
1
1
  import { toValue, shallowRef, computed, watch, onScopeDispose } from "vue";
2
2
  import { scrambleFrame, planScramble, settledCells, SCRAMBLE_GLYPHS } from "../components/scramble.js";
3
3
  import { prefersReducedMotion } from "./easing.js";
4
+ const SEED_MULTIPLIER = 16807;
5
+ const SEED_MODULUS = 2147483647;
6
+ function seededRandom(seed = 1) {
7
+ return () => (seed = seed * SEED_MULTIPLIER % SEED_MODULUS) / SEED_MODULUS;
8
+ }
4
9
  function useScramble(source, options = {}) {
5
10
  const random = options.random ?? Math.random;
11
+ const firstRoll = options.random ?? seededRandom();
6
12
  const tick = options.tick ?? 50;
7
13
  const glyphs = () => toValue(options.glyphs) || SCRAMBLE_GLYPHS;
8
14
  const initial = toValue(source);
9
15
  const cells = shallowRef(
10
- options.start === "masked" ? scrambleFrame(planScramble(initial, initial, { duration: 1, keep: options.keep }, random), 0, random, glyphs()) : settledCells(initial)
16
+ options.start === "masked" ? scrambleFrame(planScramble(initial, initial, { duration: 1, keep: options.keep }, firstRoll), 0, firstRoll, glyphs()) : settledCells(initial)
11
17
  );
12
18
  const running = shallowRef(false);
13
19
  const text = computed(() => cells.value.map((cell) => cell.char).join(""));
@@ -1,4 +1,5 @@
1
1
  import { ref, watch, toValue, onBeforeUnmount, nextTick } from "vue";
2
+ import { nodeWindow, isElement } from "./realm.js";
2
3
  import { prefersReducedMotion } from "./easing.js";
3
4
  const TWEEN_MS = 160;
4
5
  const RETARGET_AFTER_MS = 40;
@@ -18,7 +19,7 @@ function useShift(options = {}) {
18
19
  const scrolled = /* @__PURE__ */ new Set();
19
20
  const rememberScroll = (event) => {
20
21
  const target = event.target;
21
- if (target instanceof Element) scrolled.add(target);
22
+ if (isElement(target)) scrolled.add(target);
22
23
  };
23
24
  function readScroll() {
24
25
  const tops = /* @__PURE__ */ new Map();
@@ -72,7 +73,7 @@ function useShift(options = {}) {
72
73
  tweenStart = performance.now();
73
74
  resizing.value = true;
74
75
  clearTimeout(settleTimer);
75
- const wait = prefersReducedMotion() ? 0 : toValue(options.duration) ?? TWEEN_MS;
76
+ const wait = prefersReducedMotion(nodeWindow(node)) ? 0 : toValue(options.duration) ?? TWEEN_MS;
76
77
  settleTimer = setTimeout(() => {
77
78
  inFlight = false;
78
79
  resizing.value = false;
@@ -125,12 +126,13 @@ function useShift(options = {}) {
125
126
  ro.disconnect();
126
127
  for (const child of Array.from(node.children)) ro.observe(child);
127
128
  };
128
- if (typeof ResizeObserver !== "undefined") {
129
- ro = new ResizeObserver(() => retune());
129
+ const win = nodeWindow(node);
130
+ if (typeof win.ResizeObserver !== "undefined") {
131
+ ro = new win.ResizeObserver(() => retune());
130
132
  watchChildren();
131
133
  }
132
- if (typeof MutationObserver !== "undefined") {
133
- mo = new MutationObserver(() => {
134
+ if (typeof win.MutationObserver !== "undefined") {
135
+ mo = new win.MutationObserver(() => {
134
136
  watchChildren();
135
137
  retune();
136
138
  });
@@ -1,4 +1,5 @@
1
1
  import { computed, toValue, ref } from "vue";
2
+ import { isHTMLElement } from "./realm.js";
2
3
  import { usePointerFrame } from "./usePointerFrame.js";
3
4
  import { usePrefersReducedMotion } from "./useReducedMotion.js";
4
5
  import { spotlightPoint } from "./useSpotlight.js";
@@ -21,7 +22,7 @@ function useTilt(source = {}) {
21
22
  }
22
23
  });
23
24
  function onPointerMove(e) {
24
- if (e.currentTarget instanceof HTMLElement) target = e.currentTarget;
25
+ if (isHTMLElement(e.currentTarget)) target = e.currentTarget;
25
26
  pointer.move(e);
26
27
  }
27
28
  function onPointerEnter() {
@@ -1,6 +1,9 @@
1
- import { shallowRef, watch, toValue, onScopeDispose } from "vue";
1
+ import { clamp } from "./clamp.js";
2
+ import { useView } from "./useView.js";
3
+ import { hasInjectionContext, shallowRef, watch, toValue, onScopeDispose } from "vue";
2
4
  import { durationToken, prefersReducedMotion, tokenEase } from "./easing.js";
3
5
  function useTween(source, mix, options = {}) {
6
+ const view = hasInjectionContext() ? useView() : null;
4
7
  const shown = shallowRef(source());
5
8
  let target = shown.value;
6
9
  let frame = 0;
@@ -11,18 +14,19 @@ function useTween(source, mix, options = {}) {
11
14
  watch(source, (to) => {
12
15
  if (options.equal?.(target, to)) return;
13
16
  target = to;
14
- const ms = toValue(options.duration) ?? durationToken("duration-medium");
15
- if (toValue(options.enabled) === false || ms <= 0 || prefersReducedMotion() || typeof requestAnimationFrame === "undefined") {
17
+ const scope = view?.value?.document;
18
+ const ms = toValue(options.duration) ?? durationToken("duration-medium", void 0, scope);
19
+ if (toValue(options.enabled) === false || ms <= 0 || prefersReducedMotion(view?.value?.window) || typeof requestAnimationFrame === "undefined") {
16
20
  stop();
17
21
  shown.value = to;
18
22
  return;
19
23
  }
20
24
  const from = shown.value;
21
- const ease = options.ease ?? tokenEase("ease-emphasized");
25
+ const ease = options.ease ?? tokenEase("ease-emphasized", scope);
22
26
  const started = performance.now();
23
27
  stop();
24
28
  const step = (now) => {
25
- const t = Math.min(1, Math.max(0, (now - started) / ms));
29
+ const t = clamp((now - started) / ms, 0, 1);
26
30
  shown.value = t < 1 ? mix(from, to, ease(t)) : to;
27
31
  frame = t < 1 ? requestAnimationFrame(step) : 0;
28
32
  };
@@ -1,4 +1,5 @@
1
1
  import { type ComputedRef } from "vue";
2
+ export { isElement, isHTMLElement, isInputElement, isNode, nodeWindow } from "./realm";
2
3
  export interface LpView {
3
4
  window: Window;
4
5
  document: Document;
@@ -1,4 +1,7 @@
1
1
  import { inject, computed, provide } from "vue";
2
+ import { isNode } from "./realm.js";
3
+ import { isElement, isHTMLElement, isInputElement, nodeWindow } from "./realm.js";
4
+ import { isTextEntry } from "./textEntry.js";
2
5
  const LP_VIEW = /* @__PURE__ */ Symbol.for("lp-view");
3
6
  function provideView(view) {
4
7
  provide(LP_VIEW, view);
@@ -21,11 +24,15 @@ function usePortalTarget() {
21
24
  }
22
25
  const ORIGIN = "lpViewDocument";
23
26
  const FORWARDED = ["pointerdown", "pointerup", "click", "focusin", "keydown"];
27
+ function typedHere(event) {
28
+ const printable = event.key.length === 1 && !event.ctrlKey && !event.metaKey;
29
+ return printable && isTextEntry(event.target, { select: true });
30
+ }
24
31
  function forwardViewEvents(from, to) {
25
32
  const forward = (event) => {
26
33
  if (event.type === "keydown") {
27
34
  const key = event;
28
- if (key.defaultPrevented || key.key !== "Escape" && !key.ctrlKey && !key.metaKey) return;
35
+ if (key.defaultPrevented || typedHere(key)) return;
29
36
  }
30
37
  const Copy = event.constructor;
31
38
  const copy = new Copy(event.type, event);
@@ -47,7 +54,7 @@ function originOf(event) {
47
54
  const marked = inner[ORIGIN];
48
55
  if (marked) return marked;
49
56
  const target = inner.target;
50
- if (!target || typeof target.nodeType !== "number") return null;
57
+ if (!isNode(target)) return null;
51
58
  return target.nodeType === 9 ? target : target.ownerDocument;
52
59
  }
53
60
  function useOutsideGuard() {
@@ -59,6 +66,11 @@ function useOutsideGuard() {
59
66
  }
60
67
  export {
61
68
  forwardViewEvents,
69
+ isElement,
70
+ isHTMLElement,
71
+ isInputElement,
72
+ isNode,
73
+ nodeWindow,
62
74
  provideView,
63
75
  useOutsideGuard,
64
76
  usePortalTarget,
@@ -1,3 +1,4 @@
1
+ import { clamp } from "./clamp.js";
1
2
  import { ref, computed, toValue } from "vue";
2
3
  function useZoomPan(options = {}) {
3
4
  const min = options.min ?? 1;
@@ -17,9 +18,6 @@ function useZoomPan(options = {}) {
17
18
  function setViewport(el) {
18
19
  viewport = el;
19
20
  }
20
- function clamp(value, lo, hi) {
21
- return Math.min(hi, Math.max(lo, value));
22
- }
23
21
  function clampPan() {
24
22
  if (!viewport) return;
25
23
  const rect = viewport.getBoundingClientRect();
@@ -116,7 +114,7 @@ function useZoomPan(options = {}) {
116
114
  const offset = computed(() => ({ x: x.value, y: y.value }));
117
115
  function setView(view) {
118
116
  if (view.scale !== void 0) {
119
- scale.value = Math.min(maxOf(), Math.max(min, view.scale));
117
+ scale.value = clamp(view.scale, min, maxOf());
120
118
  }
121
119
  x.value = view.x;
122
120
  y.value = view.y;
@@ -0,0 +1,40 @@
1
+ import { type ComputedRef } from "vue";
2
+ export interface WindowRect {
3
+ x: number;
4
+ y: number;
5
+ width: number;
6
+ height: number;
7
+ }
8
+ export interface WindowViewport {
9
+ width: number;
10
+ height: number;
11
+ }
12
+ export interface WindowBounds {
13
+ minWidth: number;
14
+ minHeight: number;
15
+ }
16
+ export type WindowDock = "left" | "right" | "top" | "bottom" | "full";
17
+ export type WindowEdge = "n" | "s" | "e" | "w" | "ne" | "nw" | "se" | "sw";
18
+ export declare const WINDOW_DOCKS: readonly WindowDock[];
19
+ /** True for a stored rectangle that can still be used. */
20
+ export declare function isWindowRect(value: unknown): value is WindowRect;
21
+ /** Fit a rectangle on screen: no smaller than its bounds where there is room, never larger than the view. */
22
+ export declare function clampRect(rect: WindowRect, viewport: WindowViewport, bounds: WindowBounds): WindowRect;
23
+ /** Pull a moved rectangle onto the view's edges and the edges of other windows, when within `threshold`. */
24
+ export declare function snapRect(rect: WindowRect, viewport: WindowViewport, others: readonly WindowRect[], threshold: number): WindowRect;
25
+ /** Which dock a pointer at this point asks for: the top edge fills the view. */
26
+ export declare function dockAt(x: number, y: number, viewport: WindowViewport, edge: number): WindowDock | null;
27
+ /** The rectangle of a dock. `fraction` is the share of the view a side takes. */
28
+ export declare function dockedRect(dock: WindowDock, viewport: WindowViewport, fraction: number): WindowRect;
29
+ /** Drag one edge or corner; the opposite side stays put, also against the bounds and the view. */
30
+ export declare function resizeRect(start: WindowRect, edge: WindowEdge, dx: number, dy: number, viewport: WindowViewport, bounds: WindowBounds): WindowRect;
31
+ export interface WindowLayer {
32
+ /** Join the order, or come to its top. Ignored on the server, where nothing would release it. */
33
+ raise: () => void;
34
+ release: () => void;
35
+ /** Where the other open windows are, for snapping to. */
36
+ others: () => WindowRect[];
37
+ z: ComputedRef<string>;
38
+ top: ComputedRef<boolean>;
39
+ }
40
+ export declare function useWindowLayer(rect: () => WindowRect | null): WindowLayer;
@@ -0,0 +1,118 @@
1
+ import { clamp } from "./clamp.js";
2
+ import { ref, computed } from "vue";
3
+ const WINDOW_DOCKS = ["left", "right", "top", "bottom", "full"];
4
+ function isWindowRect(value) {
5
+ const rect = value;
6
+ return !!rect && [rect.x, rect.y, rect.width, rect.height].every((n) => typeof n === "number" && Number.isFinite(n)) && rect.width > 0 && rect.height > 0;
7
+ }
8
+ const between = (value, min, max) => Math.min(Math.max(value, min), Math.max(min, max));
9
+ function clampRect(rect, viewport, bounds) {
10
+ const width = clamp(rect.width, bounds.minWidth, viewport.width);
11
+ const height = clamp(rect.height, bounds.minHeight, viewport.height);
12
+ return {
13
+ x: between(rect.x, 0, viewport.width - width),
14
+ y: between(rect.y, 0, viewport.height - height),
15
+ width,
16
+ height
17
+ };
18
+ }
19
+ function nearest(value, candidates, threshold) {
20
+ let best = value;
21
+ let distance = threshold;
22
+ for (const candidate of candidates) {
23
+ const gap = Math.abs(candidate - value);
24
+ if (gap <= distance) {
25
+ best = candidate;
26
+ distance = gap;
27
+ }
28
+ }
29
+ return best;
30
+ }
31
+ function snapRect(rect, viewport, others, threshold) {
32
+ const xs = [0, viewport.width - rect.width];
33
+ const ys = [0, viewport.height - rect.height];
34
+ for (const other of others) {
35
+ xs.push(other.x, other.x + other.width, other.x - rect.width, other.x + other.width - rect.width);
36
+ ys.push(other.y, other.y + other.height, other.y - rect.height, other.y + other.height - rect.height);
37
+ }
38
+ return { ...rect, x: nearest(rect.x, xs, threshold), y: nearest(rect.y, ys, threshold) };
39
+ }
40
+ function dockAt(x, y, viewport, edge) {
41
+ if (y <= edge) return "full";
42
+ if (x <= edge) return "left";
43
+ if (x >= viewport.width - edge) return "right";
44
+ if (y >= viewport.height - edge) return "bottom";
45
+ return null;
46
+ }
47
+ function dockedRect(dock, viewport, fraction) {
48
+ const { width, height } = viewport;
49
+ const across = Math.round(width * fraction);
50
+ const down = Math.round(height * fraction);
51
+ switch (dock) {
52
+ case "left":
53
+ return { x: 0, y: 0, width: across, height };
54
+ case "right":
55
+ return { x: width - across, y: 0, width: across, height };
56
+ case "top":
57
+ return { x: 0, y: 0, width, height: down };
58
+ case "bottom":
59
+ return { x: 0, y: height - down, width, height: down };
60
+ case "full":
61
+ return { x: 0, y: 0, width, height };
62
+ }
63
+ }
64
+ function resizeRect(start, edge, dx, dy, viewport, bounds) {
65
+ let { x, y, width, height } = start;
66
+ const right = start.x + start.width;
67
+ const bottom = start.y + start.height;
68
+ if (edge.includes("e")) width = between(start.width + dx, bounds.minWidth, viewport.width - start.x);
69
+ if (edge.includes("s")) height = between(start.height + dy, bounds.minHeight, viewport.height - start.y);
70
+ if (edge.includes("w")) {
71
+ x = between(start.x + dx, 0, right - bounds.minWidth);
72
+ width = right - x;
73
+ }
74
+ if (edge.includes("n")) {
75
+ y = between(start.y + dy, 0, bottom - bounds.minHeight);
76
+ height = bottom - y;
77
+ }
78
+ return { x, y, width, height };
79
+ }
80
+ const WINDOW_Z_ROOM = 20;
81
+ const STATE_KEY = /* @__PURE__ */ Symbol.for("@leavepulse/ui:window-stack");
82
+ const g = globalThis;
83
+ const state = g[STATE_KEY] ??= { order: ref([]), nextId: 0, rects: /* @__PURE__ */ new Map() };
84
+ function useWindowLayer(rect) {
85
+ const id = state.nextId++;
86
+ const order = state.order;
87
+ return {
88
+ raise: () => {
89
+ if (typeof window === "undefined") return;
90
+ state.rects.set(id, rect);
91
+ if (order.value[order.value.length - 1] === id) return;
92
+ order.value = [...order.value.filter((x) => x !== id), id];
93
+ },
94
+ release: () => {
95
+ state.rects.delete(id);
96
+ order.value = order.value.filter((x) => x !== id);
97
+ },
98
+ others: () => [...state.rects.entries()].flatMap(([other, read]) => {
99
+ const found = other === id ? null : read();
100
+ return found ? [found] : [];
101
+ }),
102
+ z: computed(() => {
103
+ const at = clamp(order.value.indexOf(id), 0, WINDOW_Z_ROOM - 1);
104
+ return `calc(var(--z-dropdown) - ${WINDOW_Z_ROOM - at})`;
105
+ }),
106
+ top: computed(() => order.value[order.value.length - 1] === id)
107
+ };
108
+ }
109
+ export {
110
+ WINDOW_DOCKS,
111
+ clampRect,
112
+ dockAt,
113
+ dockedRect,
114
+ isWindowRect,
115
+ resizeRect,
116
+ snapRect,
117
+ useWindowLayer
118
+ };
package/dist/icons-all.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import lucide from "@iconify-json/lucide/icons.json";
2
- import { a as registerIconCollection } from "./chunks/icons-DMITlfw5.js";
2
+ import { a as registerIconCollection } from "./chunks/icons-CYfcpSDS.js";
3
3
  registerIconCollection(lucide);
package/dist/icons.d.ts CHANGED
@@ -1,6 +1,10 @@
1
1
  import { type IconifyJSON } from "@iconify/vue";
2
2
  /** Bumped whenever icons are registered, so rendered icons re-resolve. */
3
3
  export declare const iconsVersion: import("vue").Ref<number, number>;
4
+ /** Names that could not be loaded, so an LpIcon can show its `fallback`. */
5
+ export declare const failedIcons: import("vue").Reactive<Set<string>>;
6
+ /** Load once, but forget a failure: a lost chunk must not fail every later icon too. */
7
+ export declare function loadOnce<T>(load: () => Promise<T>): () => Promise<T>;
4
8
  /** Register a whole iconify collection (any prefix) for offline use. */
5
9
  export declare function registerIconCollection(collection: IconifyJSON): void;
6
10
  /**