@leavepulse/ui 0.77.3 → 0.78.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) 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-CLLhd3WB.js} +2 -2
  12. package/dist/chunks/FieldLeading-mr81aEAP.js +27 -0
  13. package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
  14. package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
  15. package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
  16. package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
  17. package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
  18. package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
  19. package/dist/chunks/{LpAddressInput-E8KtwU7-.js → LpAddressInput-BSS49jpm.js} +12 -11
  20. package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
  21. package/dist/chunks/LpAppShell-BKbYCHkx.js +601 -0
  22. package/dist/chunks/{LpAutocomplete-C-SpPfBG.js → LpAutocomplete-DkY6CSyD.js} +24 -42
  23. package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
  24. package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
  25. package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
  26. package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
  27. package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
  28. package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
  29. package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
  30. package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
  31. package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DBqy4RLd.js} +19 -41
  32. package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-D3BUAhV1.js} +5 -5
  33. package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
  34. package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-COHzV68R.js} +11 -12
  35. package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
  36. package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-CnrmzkuN.js} +3 -3
  37. package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-CwbObVGH.js} +1 -1
  38. package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu-Bx_IhQDS.js} +17 -19
  39. package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
  40. package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-sAMvWeLP.js} +3 -3
  41. package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
  42. package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-CaVfsozH.js} +13 -4
  43. package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
  44. package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
  45. package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
  46. package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-DXNQFpAA.js} +61 -61
  47. package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
  48. package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
  49. package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
  50. package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
  51. package/dist/chunks/LpFileTree-C-rJKzEQ.js +735 -0
  52. package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-BgYn4U1J.js} +116 -34
  53. package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
  54. package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
  55. package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
  56. package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
  57. package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
  58. package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-CHE9jAJG.js} +29 -11
  59. package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
  60. package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
  61. package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-Bb5nbuFY.js} +19 -2
  62. package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-D0O6dpuA.js} +32 -47
  63. package/dist/chunks/LpInspector-DO3fTCQ1.js +209 -0
  64. package/dist/chunks/{LpLaneNode-HtnQf2FF.js → LpLaneNode-Bqcdm8Rf.js} +19 -1
  65. package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-CtDTQV01.js} +57 -32
  66. package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
  67. package/dist/chunks/LpLogInspector-BdQlX6S-.js +119 -0
  68. package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-umCZBapN.js} +234 -53
  69. package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
  70. package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
  71. package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-BYEwySoF.js} +3 -3
  72. package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DDvrSAnf.js} +11 -13
  73. package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-gOi1Giz1.js} +11 -37
  74. package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-DUbVyK6R.js} +9 -9
  75. package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-Csg-1Zh_.js} +25 -20
  76. package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
  77. package/dist/chunks/LpPageScrollbar-D2O0xhJw.js +164 -0
  78. package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
  79. package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-BIXpZLGe.js} +4 -4
  80. package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-D4HPhqfV.js} +2 -2
  81. package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
  82. package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-oVNHjsKD.js} +22 -21
  83. package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-BSXT6oUJ.js} +16 -7
  84. package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
  85. package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
  86. package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
  87. package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
  88. package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
  89. package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
  90. package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-0zI-44ve.js} +1 -1
  91. package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
  92. package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
  93. package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
  94. package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-CqvwfZs2.js} +31 -22
  95. package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-B2roc4Iz.js} +10 -9
  96. package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
  97. package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
  98. package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
  99. package/dist/chunks/{LpServiceNode-D8uJ8sGk.js → LpServiceNode-Cln2ntdw.js} +17 -0
  100. package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
  101. package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
  102. package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-DDNJzb69.js} +74 -87
  103. package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-CE0jQS8i.js} +8 -6
  104. package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-DOTg1txp.js} +6 -5
  105. package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
  106. package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
  107. package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-DPjc6_fX.js} +19 -6
  108. package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
  109. package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
  110. package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
  111. package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
  112. package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
  113. package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
  114. package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-B_XMOeAh.js} +4 -4
  115. package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
  116. package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
  117. package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
  118. package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
  119. package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-ChU0_Ga8.js} +12 -195
  120. package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-DmCZ21P_.js} +8 -6
  121. package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
  122. package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-Ct_ZOhCh.js} +10 -8
  123. package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-Bz_rrq5S.js} +56 -24
  124. package/dist/chunks/LpTopologyCanvas-jqz1KCq2.js +678 -0
  125. package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
  126. package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-ellq9RYM.js} +6 -5
  127. package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
  128. package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BoxcCDVY.js} +3 -3
  129. package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
  130. package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
  131. package/dist/chunks/LpWorkspaceSwitcher-BeNHCLd5.js +139 -0
  132. package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
  133. package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
  134. package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
  135. package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-D_iyrB8d.js} +3 -3
  136. package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
  137. package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
  138. package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
  139. package/dist/component-names.d.ts +1 -1
  140. package/dist/components/AppShellContextNav.vue.d.ts +13 -0
  141. package/dist/components/AppShellContextNav.vue.js +4 -0
  142. package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
  143. package/dist/components/ChartRangeSelector.vue.js +4 -0
  144. package/dist/components/ContextMenuItems.vue.js +1 -1
  145. package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
  146. package/dist/components/DropzoneLinkField.vue.js +1 -1
  147. package/dist/components/FieldLeading.vue.d.ts +16 -0
  148. package/dist/components/FieldLeading.vue.js +4 -0
  149. package/dist/components/FieldWrapper.vue.js +1 -1
  150. package/dist/components/IconCloseButton.vue.d.ts +7 -0
  151. package/dist/components/IconCloseButton.vue.js +4 -0
  152. package/dist/components/LayoutCanvas.vue.js +1 -1
  153. package/dist/components/LayoutNode.vue.js +1 -1
  154. package/dist/components/LpActionBar.vue.js +1 -1
  155. package/dist/components/LpActivityLine.vue.js +1 -1
  156. package/dist/components/LpAddressInput.vue.js +1 -1
  157. package/dist/components/LpAlert.vue.js +1 -1
  158. package/dist/components/LpAppShell.vue.d.ts +125 -2
  159. package/dist/components/LpAppShell.vue.js +1 -1
  160. package/dist/components/LpAutocomplete.vue.js +1 -1
  161. package/dist/components/LpAvatar.vue.js +1 -1
  162. package/dist/components/LpBadge.vue.js +1 -1
  163. package/dist/components/LpBottomNav.vue.d.ts +5 -0
  164. package/dist/components/LpBottomNav.vue.js +1 -1
  165. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  166. package/dist/components/LpButton.vue.d.ts +14 -2
  167. package/dist/components/LpButton.vue.js +1 -1
  168. package/dist/components/LpCalendar.vue.js +1 -1
  169. package/dist/components/LpCard.vue.js +1 -1
  170. package/dist/components/LpChart.vue.d.ts +74 -2
  171. package/dist/components/LpChart.vue.js +326 -85
  172. package/dist/components/LpCheckbox.vue.d.ts +6 -2
  173. package/dist/components/LpCheckbox.vue.js +1 -1
  174. package/dist/components/LpCodeBlock.vue.js +1 -1
  175. package/dist/components/LpCodeDisplay.vue.js +1 -1
  176. package/dist/components/LpCollapse.vue.js +1 -1
  177. package/dist/components/LpColorPicker.vue.js +1 -1
  178. package/dist/components/LpCommandPalette.vue.d.ts +8 -0
  179. package/dist/components/LpCommandPalette.vue.js +107 -56
  180. package/dist/components/LpCommandScope.vue.js +1 -1
  181. package/dist/components/LpConfirmDialog.vue.js +1 -1
  182. package/dist/components/LpConfirmHost.vue.js +1 -1
  183. package/dist/components/LpContextMenu.vue.js +1 -1
  184. package/dist/components/LpContextSwitcher.vue.js +1 -1
  185. package/dist/components/LpCopyButton.vue.js +1 -1
  186. package/dist/components/LpCountdown.vue.js +1 -1
  187. package/dist/components/LpDataList.vue.d.ts +1 -1
  188. package/dist/components/LpDataList.vue.js +1 -1
  189. package/dist/components/LpDatePicker.vue.d.ts +3 -15
  190. package/dist/components/LpDatePicker.vue.js +1 -1
  191. package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
  192. package/dist/components/LpDateRangePicker.vue.js +1 -1
  193. package/dist/components/LpDisclosure.vue.js +1 -1
  194. package/dist/components/LpDock.vue.js +21 -18
  195. package/dist/components/LpDrawer.vue.d.ts +1 -1
  196. package/dist/components/LpDrawer.vue.js +1 -1
  197. package/dist/components/LpDropdownMenu.vue.js +1 -1
  198. package/dist/components/LpDropzone.vue.js +14 -11
  199. package/dist/components/LpEditable.vue.js +1 -1
  200. package/dist/components/LpEmptyState.vue.js +1 -1
  201. package/dist/components/LpFieldNotice.vue.js +1 -1
  202. package/dist/components/LpFileTree.vue.d.ts +96 -6
  203. package/dist/components/LpFileTree.vue.js +1 -1
  204. package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
  205. package/dist/components/LpFileTreeNode.vue.js +1 -1
  206. package/dist/components/LpFormField.vue.js +1 -1
  207. package/dist/components/LpFrame.vue.js +1 -1
  208. package/dist/components/LpGauge.vue.d.ts +1 -1
  209. package/dist/components/LpHintExample.vue.js +1 -1
  210. package/dist/components/LpHintLayer.vue.js +1 -1
  211. package/dist/components/LpHints.vue.js +1 -1
  212. package/dist/components/LpHoverCard.vue.js +1 -1
  213. package/dist/components/LpIcon.vue.d.ts +2 -0
  214. package/dist/components/LpIcon.vue.js +1 -1
  215. package/dist/components/LpIdenticon.vue.js +1 -1
  216. package/dist/components/LpImageEditor.vue.js +7 -6
  217. package/dist/components/LpInfraNode.vue.d.ts +11 -2
  218. package/dist/components/LpInfraNode.vue.js +1 -1
  219. package/dist/components/LpInput.vue.d.ts +1 -1
  220. package/dist/components/LpInput.vue.js +1 -1
  221. package/dist/components/LpInspector.vue.d.ts +87 -0
  222. package/dist/components/LpInspector.vue.js +4 -0
  223. package/dist/components/LpLaneNode.vue.d.ts +2 -3
  224. package/dist/components/LpLaneNode.vue.js +1 -1
  225. package/dist/components/LpLightbox.vue.d.ts +8 -0
  226. package/dist/components/LpLightbox.vue.js +1 -1
  227. package/dist/components/LpLoader.vue.d.ts +1 -1
  228. package/dist/components/LpLoader.vue.js +1 -1
  229. package/dist/components/LpLogInspector.vue.d.ts +18 -0
  230. package/dist/components/LpLogInspector.vue.js +4 -0
  231. package/dist/components/LpLogViewer.vue.d.ts +93 -0
  232. package/dist/components/LpLogViewer.vue.js +1 -1
  233. package/dist/components/LpMapPicker.vue.js +1 -1
  234. package/dist/components/LpMasonry.vue.js +1 -1
  235. package/dist/components/LpMediaGallery.vue.js +1 -1
  236. package/dist/components/LpModal.vue.d.ts +4 -2
  237. package/dist/components/LpModal.vue.js +1 -1
  238. package/dist/components/LpModalNav.vue.d.ts +5 -5
  239. package/dist/components/LpModalNav.vue.js +1 -1
  240. package/dist/components/LpNotificationBell.vue.d.ts +2 -2
  241. package/dist/components/LpNotificationBell.vue.js +1 -1
  242. package/dist/components/LpNumberField.vue.d.ts +13 -2
  243. package/dist/components/LpNumberField.vue.js +1 -1
  244. package/dist/components/LpOtpInput.vue.js +1 -1
  245. package/dist/components/LpPageScrollbar.vue.d.ts +10 -0
  246. package/dist/components/LpPageScrollbar.vue.js +4 -0
  247. package/dist/components/LpPagination.vue.js +1 -1
  248. package/dist/components/LpPaletteFacts.vue.js +1 -1
  249. package/dist/components/LpPaletteHeader.vue.js +2 -2
  250. package/dist/components/LpPaletteTheme.vue.js +1 -1
  251. package/dist/components/LpPasswordInput.vue.js +1 -1
  252. package/dist/components/LpPhoneInput.vue.js +1 -1
  253. package/dist/components/LpPie.vue.d.ts +2 -2
  254. package/dist/components/LpPie.vue.js +1 -1
  255. package/dist/components/LpPipeline.vue.d.ts +4 -0
  256. package/dist/components/LpPipeline.vue.js +1 -1
  257. package/dist/components/LpPopover.vue.d.ts +7 -3
  258. package/dist/components/LpPopover.vue.js +1 -1
  259. package/dist/components/LpProgress.vue.d.ts +1 -1
  260. package/dist/components/LpProgress.vue.js +1 -1
  261. package/dist/components/LpQuota.vue.js +1 -1
  262. package/dist/components/LpRadioGroup.vue.js +1 -1
  263. package/dist/components/LpRangeCalendar.vue.js +1 -1
  264. package/dist/components/LpRangeSlider.vue.js +1 -1
  265. package/dist/components/LpRelativeTime.vue.js +1 -1
  266. package/dist/components/LpRepeater.vue.js +1 -1
  267. package/dist/components/LpRevealOnScroll.vue.js +1 -1
  268. package/dist/components/LpScramble.vue.js +1 -1
  269. package/dist/components/LpScrollArea.vue.js +1 -1
  270. package/dist/components/LpSecretField.vue.js +1 -1
  271. package/dist/components/LpSection.vue.js +1 -1
  272. package/dist/components/LpSegmented.vue.js +1 -1
  273. package/dist/components/LpSelect.vue.js +1 -1
  274. package/dist/components/LpServiceNode.vue.d.ts +8 -2
  275. package/dist/components/LpServiceNode.vue.js +1 -1
  276. package/dist/components/LpShaderBackdrop.vue.js +1 -1
  277. package/dist/components/LpShift.vue.js +1 -1
  278. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  279. package/dist/components/LpSidebar.vue.d.ts +1 -1
  280. package/dist/components/LpSidebar.vue.js +1 -1
  281. package/dist/components/LpSidebarNav.vue.js +1 -1
  282. package/dist/components/LpSidebarRow.vue.js +1 -1
  283. package/dist/components/LpSlider.vue.js +1 -1
  284. package/dist/components/LpSparkline.vue.d.ts +1 -1
  285. package/dist/components/LpSpotlight.vue.js +1 -1
  286. package/dist/components/LpStat.vue.d.ts +16 -0
  287. package/dist/components/LpStat.vue.js +1 -1
  288. package/dist/components/LpStatus.vue.js +1 -1
  289. package/dist/components/LpStepMark.vue.js +1 -1
  290. package/dist/components/LpStepper.vue.js +1 -1
  291. package/dist/components/LpSwap.vue.js +1 -1
  292. package/dist/components/LpSwitch.vue.js +1 -1
  293. package/dist/components/LpTabFace.vue.js +1 -1
  294. package/dist/components/LpTable.vue.d.ts +132 -0
  295. package/dist/components/LpTable.vue.js +547 -135
  296. package/dist/components/LpTableFilter.vue.js +1 -1
  297. package/dist/components/LpTableOfContents.vue.js +1 -1
  298. package/dist/components/LpTabs.vue.js +6 -5
  299. package/dist/components/LpTagsInput.vue.js +1 -1
  300. package/dist/components/LpTextarea.vue.js +1 -1
  301. package/dist/components/LpThemeProvider.vue.d.ts +2 -0
  302. package/dist/components/LpThemeProvider.vue.js +1 -1
  303. package/dist/components/LpThemeStudio.vue.js +1 -1
  304. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  305. package/dist/components/LpTimeField.vue.js +1 -1
  306. package/dist/components/LpToaster.vue.js +1 -1
  307. package/dist/components/LpTooltip.vue.js +1 -1
  308. package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
  309. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  310. package/dist/components/LpTour.vue.js +1 -1
  311. package/dist/components/LpTruncate.vue.js +1 -1
  312. package/dist/components/LpTypewriter.vue.js +1 -1
  313. package/dist/components/LpUptimeBar.vue.js +1 -1
  314. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  315. package/dist/components/LpWindow.vue.d.ts +99 -0
  316. package/dist/components/LpWindow.vue.js +4 -0
  317. package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
  318. package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
  319. package/dist/components/MenuTitle.vue.js +1 -1
  320. package/dist/components/OptionContent.vue.js +1 -1
  321. package/dist/components/PickerField.vue.d.ts +2 -2
  322. package/dist/components/PickerField.vue.js +1 -1
  323. package/dist/components/RevealToggle.vue.js +1 -1
  324. package/dist/components/SliderRail.vue.d.ts +3 -0
  325. package/dist/components/SliderRail.vue.js +4 -0
  326. package/dist/components/TourCard.vue.js +1 -1
  327. package/dist/components/address.js +2 -1
  328. package/dist/components/appShell.d.ts +36 -0
  329. package/dist/components/appShell.js +30 -0
  330. package/dist/components/calendar.d.ts +12 -3
  331. package/dist/components/calendar.js +2 -5
  332. package/dist/components/chart.d.ts +21 -0
  333. package/dist/components/chart.js +4 -3
  334. package/dist/components/chartWindow.d.ts +57 -0
  335. package/dist/components/chartWindow.js +136 -0
  336. package/dist/components/color.js +1 -1
  337. package/dist/components/commandPalette.d.ts +16 -2
  338. package/dist/components/commandPalette.js +39 -4
  339. package/dist/components/controlSize.d.ts +5 -0
  340. package/dist/components/controlSize.js +8 -0
  341. package/dist/components/dropdown.d.ts +5 -0
  342. package/dist/components/dropdown.js +2 -0
  343. package/dist/components/exportData.d.ts +6 -1
  344. package/dist/components/exportData.js +25 -18
  345. package/dist/components/fileTree.d.ts +67 -0
  346. package/dist/components/fileTree.js +141 -1
  347. package/dist/components/identicon.js +3 -2
  348. package/dist/components/logTools.d.ts +93 -0
  349. package/dist/components/logTools.js +210 -0
  350. package/dist/components/menuWhen.js +1 -1
  351. package/dist/components/meter.js +2 -1
  352. package/dist/components/pipeline.d.ts +2 -0
  353. package/dist/components/pipeline.js +5 -0
  354. package/dist/components/relativeTime.js +2 -1
  355. package/dist/components/reveal.js +2 -1
  356. package/dist/components/scrollbar.d.ts +34 -0
  357. package/dist/components/scrollbar.js +47 -0
  358. package/dist/components/select.d.ts +5 -0
  359. package/dist/components/select.js +10 -0
  360. package/dist/components/sidebar.d.ts +1 -0
  361. package/dist/components/tableFeatures.d.ts +58 -0
  362. package/dist/components/tableFeatures.js +87 -0
  363. package/dist/components/topologyGraph.d.ts +164 -0
  364. package/dist/components/topologyGraph.js +416 -0
  365. package/dist/components/tour.js +5 -3
  366. package/dist/components/videoBackdrop.js +7 -6
  367. package/dist/composables/clamp.d.ts +2 -0
  368. package/dist/composables/clamp.js +4 -0
  369. package/dist/composables/devWarn.d.ts +3 -0
  370. package/dist/composables/devWarn.js +14 -0
  371. package/dist/composables/easing.d.ts +13 -4
  372. package/dist/composables/easing.js +16 -10
  373. package/dist/composables/overlayHistory.js +14 -1
  374. package/dist/composables/pointerDrag.d.ts +15 -0
  375. package/dist/composables/pointerDrag.js +40 -0
  376. package/dist/composables/propCheck.d.ts +10 -0
  377. package/dist/composables/propCheck.js +89 -0
  378. package/dist/composables/realm.d.ts +6 -0
  379. package/dist/composables/realm.js +23 -0
  380. package/dist/composables/scroll.js +4 -2
  381. package/dist/composables/scrollMemory.d.ts +12 -1
  382. package/dist/composables/scrollMemory.js +36 -12
  383. package/dist/composables/spatialNav.js +2 -1
  384. package/dist/composables/textEntry.d.ts +17 -0
  385. package/dist/composables/textEntry.js +19 -0
  386. package/dist/composables/useAsyncTask.d.ts +6 -0
  387. package/dist/composables/useChartSync.d.ts +5 -0
  388. package/dist/composables/useChartSync.js +33 -0
  389. package/dist/composables/useCloseGuard.d.ts +3 -1
  390. package/dist/composables/useCloseGuard.js +6 -3
  391. package/dist/composables/useCommands.d.ts +50 -0
  392. package/dist/composables/useCommands.js +66 -0
  393. package/dist/composables/useField.d.ts +37 -0
  394. package/dist/composables/useField.js +27 -2
  395. package/dist/composables/useFitScale.js +4 -1
  396. package/dist/composables/useFormDraft.d.ts +13 -2
  397. package/dist/composables/useFormDraft.js +17 -9
  398. package/dist/composables/useHintSystem.js +2 -2
  399. package/dist/composables/useHotkeys.js +11 -32
  400. package/dist/composables/useInView.js +2 -1
  401. package/dist/composables/useInputFilter.js +7 -5
  402. package/dist/composables/useInputMask.js +5 -3
  403. package/dist/composables/useLinkedView.d.ts +97 -0
  404. package/dist/composables/useLinkedView.js +139 -0
  405. package/dist/composables/useOptimisticToggle.d.ts +3 -1
  406. package/dist/composables/useOptimisticToggle.js +2 -1
  407. package/dist/composables/useOverlayHistory.d.ts +7 -0
  408. package/dist/composables/useOverlayHistory.js +16 -2
  409. package/dist/composables/usePaintSelect.js +18 -14
  410. package/dist/composables/usePaletteCommands.d.ts +7 -0
  411. package/dist/composables/usePaletteCommands.js +16 -3
  412. package/dist/composables/usePersisted.d.ts +10 -0
  413. package/dist/composables/usePersisted.js +1 -1
  414. package/dist/composables/usePillTransition.d.ts +2 -2
  415. package/dist/composables/usePillTransition.js +5 -5
  416. package/dist/composables/useResizeObserver.js +2 -1
  417. package/dist/composables/useReveal.js +2 -1
  418. package/dist/composables/useRovingFocus.d.ts +2 -2
  419. package/dist/composables/useRovingFocus.js +9 -11
  420. package/dist/composables/useScramble.js +7 -1
  421. package/dist/composables/useShift.js +8 -6
  422. package/dist/composables/useTilt.js +2 -1
  423. package/dist/composables/useTween.js +9 -5
  424. package/dist/composables/useView.d.ts +1 -0
  425. package/dist/composables/useView.js +14 -2
  426. package/dist/composables/useZoomPan.js +2 -4
  427. package/dist/composables/windowing.d.ts +40 -0
  428. package/dist/composables/windowing.js +118 -0
  429. package/dist/icons-all.js +1 -1
  430. package/dist/icons.d.ts +4 -0
  431. package/dist/index.d.ts +31 -5
  432. package/dist/index.js +312 -264
  433. package/dist/layout/tree.js +19 -15
  434. package/dist/layout/useLayout.d.ts +2 -0
  435. package/dist/layout/useLayout.js +5 -1
  436. package/dist/layout/useWorkspaces.d.ts +52 -0
  437. package/dist/layout/useWorkspaces.js +140 -0
  438. package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
  439. package/dist/theme/config.js +25 -0
  440. package/dist/theme/define.js +61 -0
  441. package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
  442. package/dist/theme/presets.js +239 -0
  443. package/dist/theme/studio.js +134 -0
  444. package/dist/theme/tokens.js +63 -0
  445. package/dist/theme/useTheme.d.ts +3 -2
  446. package/dist/theme/useTheme.js +325 -0
  447. package/package.json +8 -1
  448. package/src/component-names.ts +6 -1
  449. package/src/components/AppShellContextNav.vue +44 -0
  450. package/src/components/ChartRangeSelector.vue +120 -0
  451. package/src/components/FieldLeading.vue +17 -0
  452. package/src/components/IconCloseButton.vue +21 -0
  453. package/src/components/LayoutCanvas.vue +3 -0
  454. package/src/components/LayoutNode.vue +37 -38
  455. package/src/components/LpActivityLine.vue +4 -2
  456. package/src/components/LpAddressInput.vue +3 -3
  457. package/src/components/LpAppShell.vue +385 -24
  458. package/src/components/LpAutocomplete.vue +13 -30
  459. package/src/components/LpBottomNav.vue +9 -1
  460. package/src/components/LpBreadcrumbs.vue +2 -1
  461. package/src/components/LpButton.vue +11 -4
  462. package/src/components/LpChart.vue +336 -37
  463. package/src/components/LpCheckbox.vue +43 -9
  464. package/src/components/LpCodeBlock.vue +17 -23
  465. package/src/components/LpCollapse.vue +5 -4
  466. package/src/components/LpColorPicker.vue +8 -9
  467. package/src/components/LpCommandPalette.vue +133 -50
  468. package/src/components/LpContextMenu.vue +22 -13
  469. package/src/components/LpCountdown.vue +2 -1
  470. package/src/components/LpDataList.vue +13 -1
  471. package/src/components/LpDatePicker.vue +5 -17
  472. package/src/components/LpDateRangePicker.vue +5 -16
  473. package/src/components/LpDock.vue +25 -16
  474. package/src/components/LpDrawer.vue +70 -61
  475. package/src/components/LpDropdownMenu.vue +6 -10
  476. package/src/components/LpDropzone.vue +12 -7
  477. package/src/components/LpEditable.vue +6 -2
  478. package/src/components/LpFileTree.vue +507 -66
  479. package/src/components/LpFileTreeNode.vue +106 -5
  480. package/src/components/LpFormField.vue +1 -1
  481. package/src/components/LpFrame.vue +33 -13
  482. package/src/components/LpHoverCard.vue +37 -5
  483. package/src/components/LpIcon.vue +6 -2
  484. package/src/components/LpIdenticon.vue +2 -1
  485. package/src/components/LpImageEditor.vue +5 -2
  486. package/src/components/LpInfraNode.vue +4 -3
  487. package/src/components/LpInput.vue +19 -26
  488. package/src/components/LpInspector.vue +197 -0
  489. package/src/components/LpLaneNode.vue +5 -1
  490. package/src/components/LpLightbox.vue +74 -29
  491. package/src/components/LpLogInspector.vue +85 -0
  492. package/src/components/LpLogViewer.vue +239 -29
  493. package/src/components/LpMapPicker.vue +2 -1
  494. package/src/components/LpMasonry.vue +8 -5
  495. package/src/components/LpModal.vue +12 -12
  496. package/src/components/LpModalNav.vue +2 -21
  497. package/src/components/LpNumberField.vue +13 -16
  498. package/src/components/LpOtpInput.vue +2 -2
  499. package/src/components/LpPageScrollbar.vue +195 -0
  500. package/src/components/LpPagination.vue +5 -3
  501. package/src/components/LpPhoneInput.vue +8 -19
  502. package/src/components/LpPie.vue +25 -23
  503. package/src/components/LpPipeline.vue +14 -1
  504. package/src/components/LpPopover.vue +23 -2
  505. package/src/components/LpProgress.vue +2 -1
  506. package/src/components/LpRadioGroup.vue +2 -2
  507. package/src/components/LpRangeSlider.vue +5 -6
  508. package/src/components/LpRevealOnScroll.vue +1 -1
  509. package/src/components/LpScrollArea.vue +55 -34
  510. package/src/components/LpSecretField.vue +2 -1
  511. package/src/components/LpSegmented.vue +6 -8
  512. package/src/components/LpSelect.vue +54 -24
  513. package/src/components/LpServiceNode.vue +4 -2
  514. package/src/components/LpShaderBackdrop.vue +12 -9
  515. package/src/components/LpShift.vue +18 -15
  516. package/src/components/LpSidebar.vue +77 -74
  517. package/src/components/LpSidebarNav.vue +3 -2
  518. package/src/components/LpSidebarRow.vue +2 -1
  519. package/src/components/LpSlider.vue +5 -6
  520. package/src/components/LpSpotlight.vue +2 -1
  521. package/src/components/LpStat.vue +25 -5
  522. package/src/components/LpSwitch.vue +5 -3
  523. package/src/components/LpTable.vue +609 -93
  524. package/src/components/LpTableFilter.vue +1 -1
  525. package/src/components/LpTableOfContents.vue +16 -9
  526. package/src/components/LpTabs.vue +2 -1
  527. package/src/components/LpTagsInput.vue +12 -19
  528. package/src/components/LpTextarea.vue +5 -11
  529. package/src/components/LpThemeProvider.vue +29 -13
  530. package/src/components/LpTimeField.vue +4 -7
  531. package/src/components/LpToaster.vue +7 -6
  532. package/src/components/LpTooltip.vue +69 -18
  533. package/src/components/LpTopologyCanvas.vue +569 -42
  534. package/src/components/LpTour.vue +7 -5
  535. package/src/components/LpTruncate.vue +4 -3
  536. package/src/components/LpTypewriter.vue +2 -1
  537. package/src/components/LpVideoBackdrop.vue +11 -13
  538. package/src/components/LpWindow.vue +373 -0
  539. package/src/components/LpWorkspaceSwitcher.vue +116 -0
  540. package/src/components/PickerField.vue +2 -2
  541. package/src/components/SliderRail.vue +10 -0
  542. package/src/components/address.ts +3 -1
  543. package/src/components/appShell.ts +74 -0
  544. package/src/components/calendar.ts +12 -5
  545. package/src/components/chart.ts +27 -3
  546. package/src/components/chartWindow.ts +198 -0
  547. package/src/components/color.ts +2 -1
  548. package/src/components/commandPalette.ts +66 -5
  549. package/src/components/controlSize.ts +6 -0
  550. package/src/components/dropdown.ts +3 -0
  551. package/src/components/exportData.ts +33 -18
  552. package/src/components/fileTree.ts +215 -0
  553. package/src/components/identicon.ts +4 -2
  554. package/src/components/logTools.ts +298 -0
  555. package/src/components/meter.ts +2 -1
  556. package/src/components/pipeline.ts +6 -0
  557. package/src/components/relativeTime.ts +2 -1
  558. package/src/components/reveal.ts +3 -1
  559. package/src/components/scrollbar.ts +71 -0
  560. package/src/components/select.ts +14 -0
  561. package/src/components/sidebar.ts +1 -0
  562. package/src/components/tableFeatures.ts +149 -0
  563. package/src/components/topologyGraph.ts +655 -0
  564. package/src/components/tour.ts +5 -3
  565. package/src/components/videoBackdrop.ts +7 -6
  566. package/src/composables/clamp.ts +2 -0
  567. package/src/composables/devWarn.ts +19 -0
  568. package/src/composables/easing.ts +37 -12
  569. package/src/composables/overlayHistory.ts +24 -0
  570. package/src/composables/pointerDrag.ts +54 -0
  571. package/src/composables/propCheck.ts +105 -0
  572. package/src/composables/realm.ts +25 -0
  573. package/src/composables/scroll.ts +4 -2
  574. package/src/composables/scrollMemory.ts +56 -14
  575. package/src/composables/spatialNav.ts +2 -1
  576. package/src/composables/textEntry.ts +33 -0
  577. package/src/composables/useAsyncTask.ts +6 -0
  578. package/src/composables/useChartSync.ts +52 -0
  579. package/src/composables/useCloseGuard.ts +22 -10
  580. package/src/composables/useCommands.ts +123 -0
  581. package/src/composables/useField.ts +41 -2
  582. package/src/composables/useFitScale.ts +4 -1
  583. package/src/composables/useFormDraft.ts +38 -14
  584. package/src/composables/useHintSystem.ts +2 -2
  585. package/src/composables/useHotkeys.ts +19 -48
  586. package/src/composables/useInView.ts +2 -1
  587. package/src/composables/useInputFilter.ts +8 -5
  588. package/src/composables/useInputMask.ts +8 -3
  589. package/src/composables/useLinkedView.ts +222 -0
  590. package/src/composables/useOptimisticToggle.ts +7 -1
  591. package/src/composables/useOverlayHistory.ts +20 -0
  592. package/src/composables/usePaintSelect.ts +20 -14
  593. package/src/composables/usePaletteCommands.ts +18 -2
  594. package/src/composables/usePersisted.ts +10 -0
  595. package/src/composables/usePillTransition.ts +9 -6
  596. package/src/composables/useResizeObserver.ts +2 -1
  597. package/src/composables/useReveal.ts +2 -1
  598. package/src/composables/useRovingFocus.ts +11 -14
  599. package/src/composables/useScramble.ts +12 -1
  600. package/src/composables/useShift.ts +8 -6
  601. package/src/composables/useTilt.ts +2 -1
  602. package/src/composables/useTween.ts +10 -5
  603. package/src/composables/useView.ts +17 -3
  604. package/src/composables/useZoomPan.ts +2 -5
  605. package/src/composables/windowing.ts +190 -0
  606. package/src/icons.ts +27 -6
  607. package/src/index.ts +42 -4
  608. package/src/kit-icons.ts +1 -1
  609. package/src/layout/tree.ts +31 -16
  610. package/src/layout/useLayout.ts +6 -0
  611. package/src/layout/useWorkspaces.ts +234 -0
  612. package/src/nuxt.ts +9 -1
  613. package/src/runtime/propCheck.plugin.ts +10 -0
  614. package/src/theme/studio.ts +7 -5
  615. package/src/theme/useTheme.ts +89 -15
  616. package/src/tokens/tokens.css +8 -1
  617. package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
  618. package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
  619. package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
  620. package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
  621. package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
@@ -80,7 +80,7 @@ const paint = usePaintSelect<unknown>({
80
80
  function onListKeydown(event: KeyboardEvent) {
81
81
  if (event.key !== "ArrowDown" && event.key !== "ArrowUp") return
82
82
  const boxes = [...(list.value?.querySelectorAll<HTMLElement>("[role=checkbox]") ?? [])]
83
- const at = boxes.indexOf(document.activeElement as HTMLElement)
83
+ const at = boxes.indexOf(list.value?.ownerDocument.activeElement as HTMLElement)
84
84
  const next = boxes[at + (event.key === "ArrowDown" ? 1 : -1)]
85
85
  if (!next) return
86
86
  event.preventDefault()
@@ -12,6 +12,7 @@
12
12
  import { Motion } from "motion-v"
13
13
  import { computed, onBeforeUnmount, onMounted, ref, useId, watch } from "vue"
14
14
  import { useLabels } from "../composables/useLpConfig"
15
+ import { useView, viewDocument, viewWindow } from "../composables/useView"
15
16
  import { atScrollEnd, scrollMarginTop, scrollParent, scrollToElement } from "../composables/scroll"
16
17
  import { usePillTransition } from "../composables/usePillTransition"
17
18
 
@@ -92,12 +93,17 @@ let safetyTimer: ReturnType<typeof setTimeout> | null = null
92
93
  * final section could otherwise never reach. Works for the window and for a
93
94
  * scroll area the headings live in.
94
95
  */
96
+ // Headings sit in the document this list renders in, a frame's inside one.
97
+ const host = useView()
98
+
95
99
  function setup() {
96
100
  stopSpy?.()
97
101
  stopSpy = null
98
102
  const ids = flatIds(props.links)
99
103
  if (!ids.length) return
100
- const first = document.getElementById(ids[0]!)
104
+ const page = viewDocument(host.value)
105
+ const win = viewWindow(host.value)
106
+ const first = page.getElementById(ids[0]!)
101
107
  const scroller = first ? scrollParent(first) : null
102
108
  let frame = 0
103
109
 
@@ -105,13 +111,13 @@ function setup() {
105
111
  frame = 0
106
112
  if (spySuppressed) return
107
113
  const top = scroller ? scroller.getBoundingClientRect().top : 0
108
- const headings = ids.map((id) => document.getElementById(id)).filter((el): el is HTMLElement => !!el)
114
+ const headings = ids.map((id) => page.getElementById(id)).filter((el): el is HTMLElement => !!el)
109
115
  if (!headings.length) return
110
116
  let current = headings[0]!.id
111
- const view = scroller ? scroller.clientHeight : window.innerHeight
117
+ const view = scroller ? scroller.clientHeight : win.innerHeight
112
118
  const line = Math.max(props.offset, view / 4)
113
119
  for (const el of headings) if (el.getBoundingClientRect().top - top <= line + 1) current = el.id
114
- const scrolled = scroller ? scroller.scrollTop : window.scrollY
120
+ const scrolled = scroller ? scroller.scrollTop : win.scrollY
115
121
  const end = atScrollEnd(headings[0])
116
122
  if (scrolled > 0 && end) current = headings[headings.length - 1]!.id
117
123
  activeId.value = current
@@ -119,13 +125,13 @@ function setup() {
119
125
  const onScroll = () => {
120
126
  if (!frame) frame = requestAnimationFrame(measure)
121
127
  }
122
- const target: HTMLElement | Window = scroller ?? window
128
+ const target: HTMLElement | Window = scroller ?? win
123
129
  target.addEventListener("scroll", onScroll, { passive: true })
124
- window.addEventListener("resize", onScroll)
130
+ win.addEventListener("resize", onScroll)
125
131
  measure()
126
132
  stopSpy = () => {
127
133
  target.removeEventListener("scroll", onScroll)
128
- window.removeEventListener("resize", onScroll)
134
+ win.removeEventListener("resize", onScroll)
129
135
  if (frame) cancelAnimationFrame(frame)
130
136
  }
131
137
  }
@@ -147,7 +153,8 @@ function suppressSpyUntilScrollEnds(target: HTMLElement) {
147
153
  if (rafId != null) cancelAnimationFrame(rafId)
148
154
  if (safetyTimer != null) clearTimeout(safetyTimer)
149
155
  const scroller = scrollParent(target)
150
- const position = () => (scroller ? scroller.scrollTop : window.scrollY)
156
+ const win = viewWindow(host.value)
157
+ const position = () => (scroller ? scroller.scrollTop : win.scrollY)
151
158
  let last = position()
152
159
  const tick = () => {
153
160
  const y = position()
@@ -165,7 +172,7 @@ function suppressSpyUntilScrollEnds(target: HTMLElement) {
165
172
  }
166
173
 
167
174
  function onClick(id: string, ev: MouseEvent) {
168
- const el = document.getElementById(id)
175
+ const el = viewDocument(host.value).getElementById(id)
169
176
  if (!el) return
170
177
  ev.preventDefault()
171
178
  activeId.value = id // mark immediately so the bar jumps to the clicked item
@@ -1,4 +1,5 @@
1
1
  <script setup lang="ts">
2
+ import { isHTMLElement } from "../composables/useView"
2
3
  import { usePaletteCommands, usePaletteScope } from "../composables/usePaletteCommands"
3
4
  import { Motion } from "motion-v"
4
5
  import { TabsContent, TabsList, TabsRoot, TabsTrigger } from "reka-ui"
@@ -179,7 +180,7 @@ function pillUnder(value: string, active?: string): boolean {
179
180
  */
180
181
  function releaseFocusAfterPointer(event: PointerEvent) {
181
182
  const target = event.currentTarget
182
- if (target instanceof HTMLElement) target.blur()
183
+ if (isHTMLElement(target)) target.blur()
183
184
  }
184
185
 
185
186
  const paletteScope = usePaletteScope()
@@ -13,6 +13,7 @@ export type TagsInputLabels = {
13
13
  </script>
14
14
 
15
15
  <script setup lang="ts">
16
+ import { isNode, isInputElement } from "../composables/realm"
16
17
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
17
18
  /*
18
19
  * Free-form list of short values: emails, labels, hostnames. Typing a
@@ -38,7 +39,7 @@ import {
38
39
  TagsInputRoot,
39
40
  } from "reka-ui"
40
41
  import { computed, ref, useAttrs, useId, watch } from "vue"
41
- import { fieldMessageId, useField, useFieldControl } from "../composables/useField"
42
+ import { fieldWrapperBinds, fieldMessageId, useField, useFieldControl, mergeDescribedBy } from "../composables/useField"
42
43
  import { prefersReducedMotion } from "../composables/easing"
43
44
  import { useFieldNotice, type FieldNoticeOptions } from "../composables/useFieldNotice"
44
45
  import { useShift } from "../composables/useShift"
@@ -177,13 +178,12 @@ const field = useFieldControl(() => ({
177
178
 
178
179
  const describedBy = computed(
179
180
  () =>
180
- [
181
+ mergeDescribedBy(
182
+ attrs["aria-describedby"],
181
183
  field.value.describedBy,
182
184
  hasField.value && field.value.id ? `${field.value.id}-notice` : undefined,
183
185
  standalone.value && notice.message.value ? noticeId : undefined,
184
- ]
185
- .filter(Boolean)
186
- .join(" ") || undefined,
186
+ ),
187
187
  )
188
188
 
189
189
  const rootAttrs = computed(() => {
@@ -336,7 +336,7 @@ function choose(opt: LpOptionBase<string>): void {
336
336
  function keepOpenInside(event: Event): void {
337
337
  guardOutside(event)
338
338
  const target = event.target
339
- if (target instanceof Node && boxEl.value?.contains(target)) event.preventDefault()
339
+ if (isNode(target) && boxEl.value?.contains(target)) event.preventDefault()
340
340
  }
341
341
 
342
342
  function isDelimiter(data: string): boolean {
@@ -346,7 +346,7 @@ function isDelimiter(data: string): boolean {
346
346
  }
347
347
 
348
348
  function onKeydown(event: KeyboardEvent): void {
349
- if (event.isComposing || !(event.target instanceof HTMLInputElement)) return
349
+ if (event.isComposing || !isInputElement(event.target)) return
350
350
  const count = suggestions.value.length
351
351
  if (listOpen.value && count) {
352
352
  if (event.key === "ArrowDown" || event.key === "ArrowUp") {
@@ -369,7 +369,7 @@ function onKeydown(event: KeyboardEvent): void {
369
369
  }
370
370
 
371
371
  function onBeforeInput(event: InputEvent): void {
372
- if (event.isComposing || !(event.target instanceof HTMLInputElement)) return
372
+ if (event.isComposing || !isInputElement(event.target)) return
373
373
  if (event.inputType === "insertText" && event.data && isDelimiter(event.data)) {
374
374
  event.preventDefault()
375
375
  commit(event.target)
@@ -377,7 +377,7 @@ function onBeforeInput(event: InputEvent): void {
377
377
  }
378
378
 
379
379
  function onInput(event: Event): void {
380
- if (event.target instanceof HTMLInputElement) sync(event.target)
380
+ if (isInputElement(event.target)) sync(event.target)
381
381
  if (!stuck.value) return
382
382
  stuck.value = false
383
383
  unsay()
@@ -385,7 +385,7 @@ function onInput(event: Event): void {
385
385
 
386
386
  function onPaste(event: ClipboardEvent): void {
387
387
  const pasted = event.clipboardData?.getData("text") ?? ""
388
- if (!(event.target instanceof HTMLInputElement) || !pasted) return
388
+ if (!isInputElement(event.target) || !pasted) return
389
389
  if (splitTags(pasted, props.delimiter).length < 2) return
390
390
  event.preventDefault()
391
391
  const el = event.target
@@ -397,7 +397,7 @@ function onPaste(event: ClipboardEvent): void {
397
397
  function onBlur(event: FocusEvent): void {
398
398
  focused.value = false
399
399
  emit("blur", event)
400
- if (props.addOnBlur && event.target instanceof HTMLInputElement && event.target.value.trim()) commit(event.target)
400
+ if (props.addOnBlur && isInputElement(event.target) && event.target.value.trim()) commit(event.target)
401
401
  }
402
402
 
403
403
  function onFocus(): void {
@@ -433,15 +433,8 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
433
433
 
434
434
  <template>
435
435
  <FieldWrapper
436
- :wrapped="hasField"
436
+ v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
437
437
  :ref="bindField"
438
- :id="field.id"
439
- :label="label"
440
- :hint="hint"
441
- :error="error"
442
- :required="required"
443
- :class="attrs.class"
444
- :style="attrs.style"
445
438
  >
446
439
  <div class="relative">
447
440
  <TagsInputRoot
@@ -3,9 +3,10 @@ export default { inheritAttrs: false }
3
3
  </script>
4
4
 
5
5
  <script setup lang="ts">
6
+ import { nodeWindow } from "../composables/realm"
6
7
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
7
8
  import { computed, nextTick, onMounted, ref, useAttrs, watch } from "vue"
8
- import { useFieldControl } from "../composables/useField"
9
+ import { fieldWrapperBinds, useFieldControl, mergeDescribedBy } from "../composables/useField"
9
10
  import { mergeClass } from "../composables/useMergedClass"
10
11
  import FieldWrapper from "./FieldWrapper.vue"
11
12
 
@@ -63,7 +64,7 @@ const box = ref<HTMLTextAreaElement | null>(null)
63
64
  function fit() {
64
65
  const el = box.value
65
66
  if (!props.autosize || !el) return
66
- const style = getComputedStyle(el)
67
+ const style = nodeWindow(el).getComputedStyle(el)
67
68
  const line = parseFloat(style.lineHeight) || parseFloat(style.fontSize) * 1.4
68
69
  const borders = parseFloat(style.borderTopWidth) + parseFloat(style.borderBottomWidth)
69
70
  const padding = parseFloat(style.paddingTop) + parseFloat(style.paddingBottom)
@@ -91,14 +92,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
91
92
 
92
93
  <template>
93
94
  <FieldWrapper
94
- :wrapped="hasField"
95
- :id="field.id"
96
- :label="label"
97
- :hint="hint"
98
- :error="error"
99
- :required="required"
100
- :class="attrs.class"
101
- :style="attrs.style"
95
+ v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
102
96
  >
103
97
  <textarea
104
98
  ref="box"
@@ -110,7 +104,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
110
104
  :disabled="field.disabled"
111
105
  :required="field.required || undefined"
112
106
  :aria-invalid="field.invalid || undefined"
113
- :aria-describedby="field.describedBy"
107
+ :aria-describedby="mergeDescribedBy(attrs['aria-describedby'], field.describedBy)"
114
108
  :class="textareaClass"
115
109
  :style="hasField ? undefined : (attrs.style as never)"
116
110
  @input="$emit('update:modelValue', ($event.target as HTMLTextAreaElement).value); fit()"
@@ -1,12 +1,16 @@
1
1
  <script lang="ts">
2
- // The last press anywhere on the page: a theme change triggered by a toggle
3
- // reveals from the toggle the user just pressed.
2
+ // The last press in each window: a theme change triggered by a toggle reveals
3
+ // from the toggle the user just pressed. Per window because an LpFrame has its
4
+ // own, whose presses and viewport coordinates the page never sees.
4
5
  const PRESS_FRESH_MS = 1500
5
- let lastPress: { x: number; y: number; at: number } | null = null
6
- if (typeof window !== "undefined") {
7
- window.addEventListener(
6
+ const presses = new WeakMap<Window, { x: number; y: number; at: number } | null>()
7
+
8
+ function trackPresses(win: Window) {
9
+ if (presses.has(win)) return
10
+ presses.set(win, null)
11
+ win.addEventListener(
8
12
  "pointerdown",
9
- (event) => (lastPress = { x: event.clientX, y: event.clientY, at: performance.now() }),
13
+ (event) => presses.set(win, { x: event.clientX, y: event.clientY, at: performance.now() }),
10
14
  { capture: true, passive: true },
11
15
  )
12
16
  }
@@ -26,13 +30,15 @@ export default { inheritAttrs: false }
26
30
  * circular reveal the global theme switch uses, growing from where the user
27
31
  * last pressed, or from the subtree's centre.
28
32
  */
29
- import { computed, nextTick, ref, shallowRef, watch, type Component, type ComponentPublicInstance } from "vue"
33
+ import { computed, nextTick, onMounted, ref, shallowRef, watch, type Component, type ComponentPublicInstance } from "vue"
30
34
  import type { TokenSet } from "../theme/tokens"
31
35
  import { revealTransition, themeEntries, type RevealOrigin } from "../theme/useTheme"
32
36
  import { useMergedAttrs } from "../composables/useMergedClass"
37
+ import { isElement, nodeWindow, useView, viewWindow } from "../composables/useView"
33
38
 
34
39
  const props = withDefaults(
35
40
  defineProps<{
41
+ /** Replace the object to change the theme: a mutation inside it is not seen. */
36
42
  theme: TokenSet
37
43
  /** Root element. A wrapper that should not affect layout can use `class="contents"`. */
38
44
  as?: string | Component
@@ -54,11 +60,19 @@ const style = computed(() => ({
54
60
  colorScheme: shown.value.mode,
55
61
  }))
56
62
 
57
- function originOf(): RevealOrigin | undefined {
58
- if (lastPress && performance.now() - lastPress.at < PRESS_FRESH_MS) return lastPress
63
+ const view = useView()
64
+ onMounted(() => trackPresses(viewWindow(view.value)))
65
+
66
+ function rootElement(): Element | undefined {
59
67
  const value = root.value
60
- const el = value instanceof HTMLElement ? value : (value?.$el as Element | undefined)
61
- const box = el?.getBoundingClientRect?.()
68
+ const el = isElement(value) ? value : value?.$el
69
+ return isElement(el) ? el : undefined
70
+ }
71
+
72
+ function originOf(el: Element | undefined): RevealOrigin | undefined {
73
+ const press = presses.get(el ? nodeWindow(el) : viewWindow(view.value))
74
+ if (press && performance.now() - press.at < PRESS_FRESH_MS) return press
75
+ const box = el?.getBoundingClientRect()
62
76
  return box ? { x: box.left + box.width / 2, y: box.top + box.height / 2 } : undefined
63
77
  }
64
78
 
@@ -69,10 +83,12 @@ watch(
69
83
  shown.value = next
70
84
  return
71
85
  }
72
- revealTransition(async () => {
86
+ const el = rootElement()
87
+ const update = async () => {
73
88
  shown.value = next
74
89
  await nextTick()
75
- }, originOf())
90
+ }
91
+ revealTransition(update, originOf(el), undefined, el?.ownerDocument)
76
92
  },
77
93
  )
78
94
  </script>
@@ -6,6 +6,7 @@ export default { inheritAttrs: false }
6
6
  </script>
7
7
 
8
8
  <script setup lang="ts">
9
+ import { CONTROL_SIZE } from "./controlSize"
9
10
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
10
11
  /*
11
12
  * Time-of-day field: hour and minute segments, typed or stepped with the arrow
@@ -21,7 +22,7 @@ import { usePaletteControl, type PaletteControlOptions } from "../composables/us
21
22
  import { Time } from "@internationalized/date"
22
23
  import { TimeFieldInput, TimeFieldRoot } from "reka-ui"
23
24
  import { computed } from "vue"
24
- import { focusLeft, useFieldControl } from "../composables/useField"
25
+ import { focusLeft, useFieldControl, mergeDescribedBy } from "../composables/useField"
25
26
  import { useMergedAttrs } from "../composables/useMergedClass"
26
27
  import LpIcon from "./LpIcon.vue"
27
28
 
@@ -73,11 +74,7 @@ const field = useFieldControl(() => ({
73
74
  disabled: props.disabled,
74
75
  }))
75
76
 
76
- const shellSize = {
77
- sm: "h-(--size-control-sm) text-xs",
78
- md: "h-(--size-control-md) text-sm",
79
- lg: "h-(--size-control-lg) text-sm",
80
- }
77
+ const shellSize = CONTROL_SIZE
81
78
 
82
79
  // `w-full` is the default, not a rule: a time column of `w-28` must win over it.
83
80
  const { class: rootClass, attrs: rest } = useMergedAttrs(() =>
@@ -101,10 +98,10 @@ usePaletteControl({ disabled: () => field.value.disabled, invalid: () => field.v
101
98
  :disabled="field.disabled"
102
99
  :required="field.required"
103
100
  :aria-invalid="field.invalid || undefined"
104
- :aria-describedby="field.describedBy"
105
101
  :aria-labelledby="field.labelId"
106
102
  :class="rootClass"
107
103
  v-bind="rest"
104
+ :aria-describedby="mergeDescribedBy(rest['aria-describedby'], field.describedBy)"
108
105
  @update:model-value="onUpdate"
109
106
  @focusout="onFocusOut"
110
107
  >
@@ -19,7 +19,7 @@ import { CLOSE_ICON } from "./dropdown"
19
19
  import LpCopyButton from "./LpCopyButton.vue"
20
20
  import LpIcon from "./LpIcon.vue"
21
21
  import { toneLook } from "./tone"
22
- import { usePortalTarget } from "../composables/useView"
22
+ import { nodeWindow, usePortalTarget, useView, viewDocument, viewWindow } from "../composables/useView"
23
23
 
24
24
  const props = defineProps<{ labels?: Partial<{ dismiss: string; copy: string; copied: string }> }>()
25
25
  const text = useLabels("toast", { dismiss: "Dismiss", copy: "Copy message", copied: "Copied" }, () => props.labels)
@@ -44,7 +44,7 @@ function toastsIn(root: Element): HTMLElement[] {
44
44
  }
45
45
 
46
46
  function slide(root: Element) {
47
- const reduce = prefersReducedMotion()
47
+ const reduce = prefersReducedMotion(nodeWindow(root))
48
48
  const height = (root as HTMLElement).offsetHeight
49
49
  for (const el of toastsIn(root)) {
50
50
  const before = tops.get(el)
@@ -61,12 +61,13 @@ function slide(root: Element) {
61
61
  // The viewport's component root is a wrapper fragment, not the list, so the
62
62
  // list is found by a mark of its own once it is teleported into place.
63
63
  const viewportId = useId()
64
+ const view = useView()
64
65
  onMounted(() =>
65
66
  nextTick(() => {
66
- const root = document.querySelector(`[data-lp-toasts="${viewportId}"]`)
67
- if (!root || typeof MutationObserver === "undefined") return
67
+ const root = viewDocument(view.value).querySelector(`[data-lp-toasts="${viewportId}"]`)
68
+ if (!root) return
68
69
  for (const el of toastsIn(root)) tops.set(el, el.offsetTop - (root as HTMLElement).offsetHeight)
69
- observer = new MutationObserver(() => slide(root))
70
+ observer = new (nodeWindow(root).MutationObserver)(() => slide(root))
70
71
  observer.observe(root, { childList: true, subtree: true })
71
72
  }),
72
73
  )
@@ -207,7 +208,7 @@ const copyable = (t: ToastItem) => t.variant === "error" || t.variant === "warni
207
208
  const toastText = (t: ToastItem) => () => [t.title, t.message, t.details, t.context].filter(Boolean).join("\n")
208
209
 
209
210
  function selecting(): boolean {
210
- return Boolean(window.getSelection()?.toString())
211
+ return Boolean(viewWindow(view.value).getSelection()?.toString())
211
212
  }
212
213
 
213
214
  function runClick(t: ToastItem) {
@@ -27,6 +27,7 @@
27
27
  * those bind their handlers to the slot's direct child, so a wrapper swallows
28
28
  * them and the control stops opening. Put `aria-label` on the trigger instead.
29
29
  */
30
+ import { clamp } from "../composables/clamp"
30
31
  import {
31
32
  injectTooltipProviderContext,
32
33
  TooltipContent,
@@ -43,7 +44,7 @@ import {
43
44
  } from "../composables/usePillTransition"
44
45
  import { PANEL_SURFACE, TOOLTIP_ANIM } from "./dropdown"
45
46
  import { prefersReducedMotion } from "../composables/easing"
46
- import { useOutsideGuard, usePortalTarget } from "../composables/useView"
47
+ import { useOutsideGuard, usePortalTarget, useView, viewWindow } from "../composables/useView"
47
48
 
48
49
  const props = withDefaults(
49
50
  defineProps<{
@@ -131,15 +132,21 @@ const EDGE = 8
131
132
  * uptime slice with its breakdown) slid half off screen. The offset is held to
132
133
  * the room the window has on each side of where reka put the tip.
133
134
  */
134
- function inView(x: number): number {
135
+ function inView(x: number, y: number): { x: number; y: number } {
135
136
  const panel = tipBody.value?.parentElement
136
- if (!panel) return x
137
+ if (!panel) return { x, y }
137
138
  const rect = panel.getBoundingClientRect()
138
- const placed = rect.left - offset.value.x
139
- const width = panel.ownerDocument.defaultView?.innerWidth ?? window.innerWidth
139
+ const win = panel.ownerDocument.defaultView ?? window
140
+ return {
141
+ x: withinRoom(x, rect.left - offset.value.x, rect.width, win.innerWidth),
142
+ y: withinRoom(y, rect.top - offset.value.y, rect.height, win.innerHeight),
143
+ }
144
+ }
145
+
146
+ function withinRoom(value: number, placed: number, size: number, room: number): number {
140
147
  const min = EDGE - placed
141
- const max = width - EDGE - rect.width - placed
142
- return max < min ? x : Math.min(max, Math.max(min, x))
148
+ const max = room - EDGE - size - placed
149
+ return max < min ? value : clamp(value, min, max)
143
150
  }
144
151
 
145
152
  /*
@@ -152,6 +159,22 @@ let sx: SpringState = { value: 0, velocity: 0 }
152
159
  let sy: SpringState = { value: 0, velocity: 0 }
153
160
  let frame = 0
154
161
  let lastFrame = 0
162
+ /* The last reading, so the tip can be placed again when the window changes under it. */
163
+ let pointer: { el: HTMLElement; x: number; y: number } | null = null
164
+
165
+ function stopSpring() {
166
+ if (frame) cancelAnimationFrame(frame)
167
+ frame = 0
168
+ lastFrame = 0
169
+ }
170
+
171
+ /* Straight to the target, with no spring left over to pull it back. */
172
+ function jumpToTarget() {
173
+ stopSpring()
174
+ offset.value = { x: target.x, y: target.y }
175
+ sx = { value: target.x, velocity: 0 }
176
+ sy = { value: target.y, velocity: 0 }
177
+ }
155
178
 
156
179
  const settle = (now: number) => {
157
180
  const dt = lastFrame ? (now - lastFrame) / 1000 : 1 / 60
@@ -179,10 +202,17 @@ const onPointerMove = (e: PointerEvent) => {
179
202
  if (!props.followCursor) return
180
203
  const el = e.currentTarget as HTMLElement | null
181
204
  if (!el) return
205
+ pointer = { el, x: e.clientX, y: e.clientY }
206
+ follow()
207
+ }
208
+
209
+ function follow() {
210
+ if (!pointer) return
211
+ const { el, x: clientX, y: clientY } = pointer
182
212
  const rect = el.getBoundingClientRect()
183
213
  const halfX = props.side === "left" || props.side === "right" ? rect.width / 2 : 0
184
214
  const dirX = props.side === "right" ? -1 : 1
185
- target.x = e.clientX - (rect.left + rect.width / 2) + halfX * dirX
215
+ target.x = clientX - (rect.left + rect.width / 2) + halfX * dirX
186
216
  /*
187
217
  * reka clears the tip past the whole box's EDGE, not past the pointer, so on
188
218
  * a tall trigger it ends up half the box above the cursor — measured at 96px
@@ -192,11 +222,11 @@ const onPointerMove = (e: PointerEvent) => {
192
222
  */
193
223
  const half = props.side === "top" || props.side === "bottom" ? rect.height / 2 : 0
194
224
  const dir = props.side === "bottom" ? -1 : 1
195
- target.y = e.clientY - (rect.top + rect.height / 2) + half * dir
196
- target.x = inView(target.x)
225
+ target.y = clientY - (rect.top + rect.height / 2) + half * dir
226
+ Object.assign(target, inView(target.x, target.y))
197
227
  // Without motion the tip goes straight to the reading instead of trailing.
198
228
  if (prefersReducedMotion()) {
199
- offset.value = { x: target.x, y: target.y }
229
+ jumpToTarget()
200
230
  return
201
231
  }
202
232
  if (!frame) frame = requestAnimationFrame(settle)
@@ -218,10 +248,7 @@ const onOpenChange = (next: boolean) => {
218
248
  if (!open.value || !props.followCursor) return
219
249
  // A fresh open starts at the cursor instead of flying in from wherever the
220
250
  // last one came to rest.
221
- offset.value = { x: target.x, y: target.y }
222
- sx = { value: target.x, velocity: 0 }
223
- sy = { value: target.y, velocity: 0 }
224
- lastFrame = 0
251
+ jumpToTarget()
225
252
  }
226
253
 
227
254
  /*
@@ -243,15 +270,38 @@ watch(
243
270
  },
244
271
  )
245
272
 
246
- onBeforeUnmount(() => {
247
- if (frame) cancelAnimationFrame(frame)
248
- })
273
+ /*
274
+ * A followed tip moves only with the pointer, so a window that changes under a
275
+ * still pointer (a resize, a phone's address bar, a rotation) would leave it
276
+ * off screen. And a tip that is gone has nothing left to animate.
277
+ */
278
+ const view = useView()
279
+ watch(
280
+ () => open.value && props.followCursor,
281
+ (following, _, onCleanup) => {
282
+ if (!following) {
283
+ stopSpring()
284
+ return
285
+ }
286
+ const win = viewWindow(view.value)
287
+ win.addEventListener("resize", follow)
288
+ onCleanup(() => win.removeEventListener("resize", follow))
289
+ },
290
+ )
291
+
292
+ onBeforeUnmount(stopSpring)
249
293
 
250
294
  // Overlays open in the window this component renders in (an LpFrame's, inside one).
251
295
  const portalTo = usePortalTarget()
252
296
  // What happens in another document (the page around a frame, or a frame in
253
297
  // the page) is not "outside" for this layer.
254
298
  const guardOutside = useOutsideGuard()
299
+
300
+ // Several roots (trigger and portal), so Vue cannot hand attributes on by
301
+ // itself and dropped them: a trigger wrapped around this one from outside (an
302
+ // LpPopover's, as-child) lost its id, ARIA state and click, and its popover
303
+ // never opened. They go to the trigger, which merges them onto the slot's element.
304
+ defineOptions({ inheritAttrs: false })
255
305
  </script>
256
306
 
257
307
  <template>
@@ -274,6 +324,7 @@ const guardOutside = useOutsideGuard()
274
324
  lands on the real button rather than on a wrapper. -->
275
325
  <TooltipTrigger
276
326
  as-child
327
+ v-bind="$attrs"
277
328
  :aria-label="label ? content : undefined"
278
329
  @pointermove="onPointerMove"
279
330
  >