@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
@@ -1,4 +1,5 @@
1
- import { useId, computed, provide, onScopeDispose, inject } from "vue";
1
+ import { useId, computed, provide, inject, useAttrs, onScopeDispose } from "vue";
2
+ import { isElement } from "./realm.js";
2
3
  const LP_FIELD = /* @__PURE__ */ Symbol.for("lp-field");
3
4
  function provideField(context) {
4
5
  provide(LP_FIELD, context);
@@ -9,6 +10,13 @@ function useField() {
9
10
  function fieldMessageId(id) {
10
11
  return `${id}-message`;
11
12
  }
13
+ function mergeDescribedBy(...ids) {
14
+ const all = ids.flatMap((id) => typeof id === "string" ? id.split(/\s+/) : []).filter(Boolean);
15
+ return [...new Set(all)].join(" ") || void 0;
16
+ }
17
+ function isAttrOn(value) {
18
+ return !!value || value === "";
19
+ }
12
20
  function useFieldControl(own) {
13
21
  const outer = useField();
14
22
  const generated = useId();
@@ -41,7 +49,7 @@ function useFieldControl(own) {
41
49
  }
42
50
  function focusLeft(event) {
43
51
  const next = event.relatedTarget;
44
- return !(next instanceof Node && event.currentTarget?.contains(next));
52
+ return !(isElement(next) && event.currentTarget?.contains(next));
45
53
  }
46
54
  function useFieldBlur(blur) {
47
55
  const partId = `lp-field-${useId()}`;
@@ -62,11 +70,28 @@ function useFieldBlur(blur) {
62
70
  onScopeDispose(() => cancelPending?.());
63
71
  return { partId, onFocusOut };
64
72
  }
73
+ function fieldWrapperBinds(wrapped, field, props, attrs) {
74
+ const { label, hint, error, required } = props;
75
+ return { wrapped, id: field.id, label, hint, error, required, class: attrs.class, style: attrs.style };
76
+ }
77
+ function useAttrsField(state) {
78
+ const attrs = useAttrs();
79
+ const field = useFieldControl(() => ({
80
+ wrapped: false,
81
+ id: typeof attrs.id === "string" ? attrs.id : void 0,
82
+ ...state()
83
+ }));
84
+ return { attrs, field };
85
+ }
65
86
  export {
66
87
  LP_FIELD,
67
88
  fieldMessageId,
89
+ fieldWrapperBinds,
68
90
  focusLeft,
91
+ isAttrOn,
92
+ mergeDescribedBy,
69
93
  provideField,
94
+ useAttrsField,
70
95
  useField,
71
96
  useFieldBlur,
72
97
  useFieldControl
@@ -1,3 +1,4 @@
1
+ import { nodeWindow } from "./realm.js";
1
2
  import { ref, onMounted, watch, onBeforeUnmount } from "vue";
2
3
  function useFitScale(box, content, min = 0.6) {
3
4
  const scale = ref(1);
@@ -15,7 +16,9 @@ function useFitScale(box, content, min = 0.6) {
15
16
  function observe() {
16
17
  observer?.disconnect();
17
18
  if (typeof ResizeObserver === "undefined") return;
18
- observer = new ResizeObserver(measure);
19
+ const el = box.value ?? content.value;
20
+ if (!el) return measure();
21
+ observer = new (nodeWindow(el)).ResizeObserver(measure);
19
22
  if (box.value) observer.observe(box.value);
20
23
  if (content.value) observer.observe(content.value);
21
24
  measure();
@@ -22,6 +22,12 @@ export interface UseFormDraftOptions<T> {
22
22
  maxAgeMs?: number;
23
23
  /** Skip the write without tearing the composable out of the component. */
24
24
  disabled?: MaybeRefOrGetter<boolean>;
25
+ /**
26
+ * Accept a stored value or reject it. The envelope's version follows the
27
+ * kit, not this form: a draft written before the form changed shape needs
28
+ * this to be turned away. A rejected draft reads as no draft.
29
+ */
30
+ validate?: (value: unknown) => value is T;
25
31
  }
26
32
  export interface UseFormDraft<T> {
27
33
  /**
@@ -40,8 +46,13 @@ export interface UseFormDraft<T> {
40
46
  * what to do with each field, because only it knows the form's shape.
41
47
  */
42
48
  read: () => T | null;
43
- /** Forget the draft. Call after applying it, and after a successful save. */
44
- discard: () => void;
49
+ /**
50
+ * Forget the draft. Call after applying it, and after a successful save.
51
+ * With no argument it acts on the key as it is now; a callback that may
52
+ * outlive the subject (an awaited save) passes the key it started under, so
53
+ * it cannot delete the draft of whatever the form moved on to.
54
+ */
55
+ discard: (key?: string) => void;
45
56
  /** Write now, ignoring `dirty` and a pending draft. For "save and come back to this later". */
46
57
  save: () => void;
47
58
  }
@@ -7,13 +7,18 @@ function useFormDraft(options) {
7
7
  const hasDraft = ref(false);
8
8
  const savedAt = ref(null);
9
9
  const maxAge = options.maxAgeMs ?? WEEK_MS;
10
+ function normalizeKey(key) {
11
+ return String(key || "").trim();
12
+ }
10
13
  function currentKey() {
11
- return String(toValue(options.key) || "").trim();
14
+ return normalizeKey(toValue(options.key));
12
15
  }
13
16
  function fresh(parsed) {
14
- if (!parsed || parsed.version !== ENVELOPE_VERSION) return false;
15
- if (maxAge <= 0) return true;
16
- return !(Date.now() - Date.parse(parsed.savedAt) > maxAge);
17
+ if (!parsed || parsed.version !== ENVELOPE_VERSION || !("value" in Object(parsed))) return false;
18
+ const stamp = typeof parsed.savedAt === "string" ? Date.parse(parsed.savedAt) : Number.NaN;
19
+ if (Number.isNaN(stamp)) return false;
20
+ if (options.validate && !options.validate(parsed.value)) return false;
21
+ return maxAge <= 0 || Math.abs(Date.now() - stamp) <= maxAge;
17
22
  }
18
23
  function read() {
19
24
  const key = currentKey();
@@ -44,11 +49,14 @@ function useFormDraft(options) {
44
49
  })
45
50
  );
46
51
  }
47
- function discard() {
48
- const key = currentKey();
49
- hasDraft.value = false;
50
- savedAt.value = null;
51
- if (key) store.remove(key);
52
+ function discard(key) {
53
+ const current = currentKey();
54
+ const target = typeof key === "string" ? normalizeKey(key) : current;
55
+ if (target === current) {
56
+ hasDraft.value = false;
57
+ savedAt.value = null;
58
+ }
59
+ if (target) store.remove(target);
52
60
  }
53
61
  function save() {
54
62
  write(toValue(options.value));
@@ -1,5 +1,6 @@
1
1
  import { shallowRef, provide, onBeforeUnmount, reactive, computed, inject, watch } from "vue";
2
2
  import { anyModalOpen } from "../components/modalDepth.js";
3
+ import { isTextEntry } from "./textEntry.js";
3
4
  import { hints } from "./useHints.js";
4
5
  const HINT_SIGNALS = {
5
6
  /** A context menu was opened (right click or long press). */
@@ -154,8 +155,7 @@ function hintSummary(records, features, page) {
154
155
  };
155
156
  }
156
157
  function typing() {
157
- const el = document.activeElement;
158
- return el instanceof HTMLInputElement || el instanceof HTMLTextAreaElement || el instanceof HTMLElement && el.isContentEditable;
158
+ return isTextEntry(document.activeElement, { inputType: () => true });
159
159
  }
160
160
  function createHintSystem(options) {
161
161
  const timing = { ...DEFAULT_TIMING, ...options.timing };
@@ -1,5 +1,8 @@
1
1
  import { shallowReactive, ref, computed, toValue, onMounted, getCurrentInstance, onBeforeUnmount } from "vue";
2
2
  import { topModalElement } from "../components/modalDepth.js";
3
+ import { isDev } from "./devWarn.js";
4
+ import { isNode } from "./realm.js";
5
+ import { isTextEntry } from "./textEntry.js";
3
6
  const isAppleKeyboard = typeof navigator !== "undefined" && /Mac|iPhone|iPad|iPod/.test(navigator.platform || "");
4
7
  function useAppleKeyboard() {
5
8
  const apple = ref(false);
@@ -12,24 +15,6 @@ function appleModifierLabel(key, apple = isAppleKeyboard) {
12
15
  if (key === "Alt") return "⌥";
13
16
  return key;
14
17
  }
15
- const TEXT_INPUT_TYPES = /* @__PURE__ */ new Set([
16
- "text",
17
- "search",
18
- "email",
19
- "number",
20
- "password",
21
- "tel",
22
- "url"
23
- ]);
24
- function isTextEntry(target) {
25
- if (!(target instanceof HTMLElement)) return false;
26
- if (target.isContentEditable) return true;
27
- if (target instanceof HTMLTextAreaElement) return true;
28
- if (target instanceof HTMLInputElement) {
29
- return TEXT_INPUT_TYPES.has(target.type);
30
- }
31
- return false;
32
- }
33
18
  const MODIFIER_KEYS = /* @__PURE__ */ new Set(["control", "meta", "shift", "alt"]);
34
19
  function matchesHotkey(event, binding) {
35
20
  if (binding.key === void 0) return false;
@@ -102,11 +87,11 @@ const mounted = state.mounted;
102
87
  function inScope(target, scope) {
103
88
  const el = toValue(scope);
104
89
  if (!el) return true;
105
- const node = target instanceof Node ? target : null;
106
- return !!node && (el === node || el.contains(node));
90
+ return isNode(target) && (el === target || el.contains(target));
107
91
  }
108
- function topLayer() {
109
- const layers = document.querySelectorAll("[data-dismissable-layer]");
92
+ function topLayer(origin) {
93
+ const doc = isNode(origin) ? origin.ownerDocument ?? document : document;
94
+ const layers = doc.querySelectorAll("[data-dismissable-layer]");
110
95
  return layers[layers.length - 1] ?? null;
111
96
  }
112
97
  function insideOf(entry, layer) {
@@ -126,7 +111,7 @@ function snapshot(event) {
126
111
  }
127
112
  function eligible(event) {
128
113
  const inTextEntry = isTextEntry(event.target);
129
- const blocker = event.key === "Escape" ? topLayer() : topModalElement();
114
+ const blocker = event.key === "Escape" ? topLayer(event.target) : topModalElement();
130
115
  const entries = [...mounted].sort(
131
116
  (a, b) => Number(toValue(b.priority) || 0) - Number(toValue(a.priority) || 0) || b.order - a.order
132
117
  );
@@ -165,6 +150,7 @@ function flushHeld() {
165
150
  function onKeydown(event) {
166
151
  if (event.isComposing || event.defaultPrevented) return;
167
152
  if (pressed.length && MODIFIER_KEYS.has(event.key.toLowerCase())) return;
153
+ if (pressed.length && event.repeat) return;
168
154
  if (pressed.length && event.key === "Escape") {
169
155
  resetSequence();
170
156
  }
@@ -216,7 +202,7 @@ function useHotkeys(bindings, options = {}) {
216
202
  order: ++state.order,
217
203
  host: () => {
218
204
  const el = instance?.vnode.el;
219
- return el instanceof Node ? el : null;
205
+ return isNode(el) ? el : null;
220
206
  }
221
207
  };
222
208
  onMounted(() => {
@@ -230,11 +216,11 @@ function useHotkeys(bindings, options = {}) {
230
216
  });
231
217
  onBeforeUnmount(() => {
232
218
  mounted.delete(entry);
219
+ resetSequence();
233
220
  if (!mounted.size && state.listening) {
234
221
  window.removeEventListener("keydown", onKeydown);
235
222
  window.removeEventListener("blur", resetSequence);
236
223
  state.listening = false;
237
- resetSequence();
238
224
  }
239
225
  });
240
226
  }
@@ -297,13 +283,6 @@ const hotkeyConflicts = computed(
297
283
  )
298
284
  );
299
285
  const warned = /* @__PURE__ */ new Set();
300
- function isDev() {
301
- try {
302
- return process.env.NODE_ENV !== "production";
303
- } catch {
304
- return false;
305
- }
306
- }
307
286
  function warnConflicts() {
308
287
  if (!isDev()) return;
309
288
  for (const conflict of hotkeyConflicts.value) {
@@ -1,3 +1,4 @@
1
+ import { nodeWindow } from "./realm.js";
1
2
  import { ref, watch, onBeforeUnmount } from "vue";
2
3
  function useInView(options = {}) {
3
4
  const el = ref(null);
@@ -17,7 +18,7 @@ function useInView(options = {}) {
17
18
  observer?.disconnect();
18
19
  observer = null;
19
20
  if (!node || typeof IntersectionObserver === "undefined") return sync();
20
- observer = new IntersectionObserver(
21
+ observer = new (nodeWindow(node)).IntersectionObserver(
21
22
  (entries) => {
22
23
  intersecting.value = entries.some((entry) => entry.isIntersecting);
23
24
  sync();
@@ -1,4 +1,5 @@
1
1
  import { computed, toValue } from "vue";
2
+ import { isElement } from "./realm.js";
2
3
  function anchorPattern(p) {
3
4
  if (p instanceof RegExp) return new RegExp(`^(?:${p.source})$`, p.flags.replace(/[gy]/g, ""));
4
5
  return new RegExp(`^(?:${p})$`);
@@ -49,12 +50,13 @@ function useInputFilter(options = {}) {
49
50
  function sanitize(target) {
50
51
  const re = restrict.value;
51
52
  if (!re) return false;
52
- if (!(target instanceof HTMLInputElement || target instanceof HTMLTextAreaElement)) return false;
53
- const { text, caret } = stripDisallowed(target.value, re, target.selectionStart ?? target.value.length);
54
- if (text === target.value) return false;
55
- target.value = text;
53
+ if (!isElement(target) || !["INPUT", "TEXTAREA"].includes(target.tagName)) return false;
54
+ const field = target;
55
+ const { text, caret } = stripDisallowed(field.value, re, field.selectionStart ?? field.value.length);
56
+ if (text === field.value) return false;
57
+ field.value = text;
56
58
  try {
57
- target.setSelectionRange(caret, caret);
59
+ field.setSelectionRange(caret, caret);
58
60
  } catch {
59
61
  }
60
62
  return true;
@@ -1,4 +1,5 @@
1
1
  import { computed, toValue } from "vue";
2
+ import { isElement } from "./realm.js";
2
3
  const DEFAULT_MASK_TOKENS = {
3
4
  "0": /\d/,
4
5
  a: new RegExp("\\p{L}", "u"),
@@ -115,6 +116,7 @@ function maskDelete(value, caret, direction, options) {
115
116
  chars.splice(index, 1);
116
117
  return applyMask(chars.join(""), { ...options, caret: index, fromRaw: true });
117
118
  }
119
+ const isInput = (target) => isElement(target) && target.tagName === "INPUT";
118
120
  function useInputMask(options) {
119
121
  const spec = computed(() => {
120
122
  const mask = toValue(options.mask);
@@ -138,7 +140,7 @@ function useInputMask(options) {
138
140
  function onBeforeInput(event) {
139
141
  const s = spec.value;
140
142
  const el = event.target;
141
- if (!s || event.isComposing || !(el instanceof HTMLInputElement)) return;
143
+ if (!s || event.isComposing || !isInput(el)) return;
142
144
  const backward = event.inputType === "deleteContentBackward";
143
145
  if (!backward && event.inputType !== "deleteContentForward") return;
144
146
  const start = el.selectionStart;
@@ -153,11 +155,11 @@ function useInputMask(options) {
153
155
  commit(el, applyMask(el.value, { ...s, caret: el.selectionStart ?? el.value.length }));
154
156
  }
155
157
  function onInput(event) {
156
- if (event.isComposing || !(event.target instanceof HTMLInputElement)) return;
158
+ if (event.isComposing || !isInput(event.target)) return;
157
159
  reformat(event.target);
158
160
  }
159
161
  function onCompositionEnd(event) {
160
- if (event.target instanceof HTMLInputElement) reformat(event.target);
162
+ if (isInput(event.target)) reformat(event.target);
161
163
  }
162
164
  return { active: computed(() => !!spec.value), format, onBeforeInput, onInput, onCompositionEnd };
163
165
  }
@@ -0,0 +1,97 @@
1
+ import { type MaybeRefOrGetter, type Ref, type ShallowRef } from "vue";
2
+ import type { ChartAnnotation } from "../components/chart";
3
+ import type { ChartRange } from "../components/chartWindow";
4
+ import { type LogId, type LogTimeRange } from "../components/logTools";
5
+ import { type PipelineStep } from "../components/pipeline";
6
+ export type LinkedId = string | number;
7
+ export interface LinkedEntity {
8
+ id: LinkedId;
9
+ kind?: string;
10
+ }
11
+ /** A point of interest on the shared timeline, such as a log line. */
12
+ export interface LinkedMoment {
13
+ time: number | string;
14
+ label: string;
15
+ }
16
+ export interface LinkedView {
17
+ entity: ShallowRef<LinkedEntity | null>;
18
+ timeRange: ShallowRef<LogTimeRange | null>;
19
+ moment: ShallowRef<LinkedMoment | null>;
20
+ traceId: Ref<string | null>;
21
+ select(entity: LinkedEntity | null): void;
22
+ clear(): void;
23
+ }
24
+ export declare function createLinkedView(): LinkedView;
25
+ /** Shares a view with everything below the calling component. */
26
+ export declare function provideLinkedView(view?: LinkedView): LinkedView;
27
+ /** The view provided above; a private one with none, so a panel works alone. */
28
+ export declare function useLinkedView(): LinkedView;
29
+ interface LinkOptions {
30
+ /** The sort of entity this component shows. Unset answers to any. */
31
+ kind?: string;
32
+ }
33
+ /** v-bind for LpTable: single selection, whatever the table's `selected` held before. */
34
+ export declare function linkTable(view: LinkedView, options?: LinkOptions): import("vue").ComputedRef<{
35
+ selected: LinkedId[];
36
+ "onUpdate:selected": (keys: LinkedId[]) => void;
37
+ }>;
38
+ /** What linkTopology drives: LpTopologyCanvas's exposed `focusNode`. */
39
+ export interface LinkedCanvas {
40
+ focusNode(id: string, options?: {
41
+ keepFocus?: boolean;
42
+ }): Promise<boolean>;
43
+ }
44
+ /** v-bind for LpTopologyCanvas; `canvas` is its template ref, focused on a selection from elsewhere. */
45
+ export declare function linkTopology(view: LinkedView, canvas: Ref<LinkedCanvas | null>, options?: LinkOptions): import("vue").ComputedRef<{
46
+ onNodeSelect: (id: string) => void;
47
+ }>;
48
+ export interface LinkLogOptions extends LinkOptions {
49
+ /** The log sources of an entity. Defaults to its id. */
50
+ sourcesOf?: (entity: LinkedEntity) => string[];
51
+ }
52
+ /**
53
+ * v-bind for LpLogViewer. The filters the selection and the trace set stay
54
+ * local, so the viewer's own chips and search box go on working; typing over a
55
+ * followed trace stops following it. Picking a line marks it on the timeline.
56
+ */
57
+ export declare function linkLog(view: LinkedView, options?: LinkLogOptions): import("vue").ComputedRef<{
58
+ sources: string[];
59
+ search: string;
60
+ highlight: string;
61
+ filterMatches: boolean;
62
+ timeRange: LogTimeRange | undefined;
63
+ "onUpdate:sources": (next: string[]) => string[];
64
+ "onUpdate:search": (next: string) => void;
65
+ onSelect: ({ line }: {
66
+ line: {
67
+ time?: number | string;
68
+ message: string;
69
+ };
70
+ }) => void;
71
+ onIdClick: ({ value }: {
72
+ kind: LogId["kind"];
73
+ value: string;
74
+ }) => string;
75
+ }>;
76
+ export interface LinkChartOptions {
77
+ /** The time of each point, oldest first, in step with the chart's `labels`. */
78
+ times: MaybeRefOrGetter<readonly (number | string)[]>;
79
+ /** The chart's own annotations, kept beside the linked one. */
80
+ annotations?: MaybeRefOrGetter<readonly ChartAnnotation[] | undefined>;
81
+ }
82
+ /** v-bind for LpChart: the shared time range is its window, the marked moment an annotation. */
83
+ export declare function linkChart(view: LinkedView, options: LinkChartOptions): import("vue").ComputedRef<{
84
+ range: ChartRange | null;
85
+ annotations: ChartAnnotation[];
86
+ "onUpdate:range": (next: ChartRange | null) => void;
87
+ }>;
88
+ export interface LinkPipelineOptions extends LinkOptions {
89
+ /** The steps on show; a getter, as they usually follow the selection. */
90
+ steps: MaybeRefOrGetter<readonly PipelineStep[]>;
91
+ }
92
+ /** v-bind for LpPipeline: selecting opens what failed, and the rows stay the reader's to toggle. */
93
+ export declare function linkPipeline(view: LinkedView, options: LinkPipelineOptions): import("vue").ComputedRef<{
94
+ expanded: string[];
95
+ "onUpdate:expanded": (next: string[]) => string[];
96
+ }>;
97
+ export {};
@@ -0,0 +1,139 @@
1
+ import { shallowRef, ref, computed, toValue, watch, provide, inject } from "vue";
2
+ import { inTimeRange, nearestByTime } from "../components/logTools.js";
3
+ import { stepKey } from "../components/pipeline.js";
4
+ function createLinkedView() {
5
+ const entity = shallowRef(null);
6
+ const timeRange = shallowRef(null);
7
+ const moment = shallowRef(null);
8
+ const traceId = ref(null);
9
+ return {
10
+ entity,
11
+ timeRange,
12
+ moment,
13
+ traceId,
14
+ // The same thing again is no change, so a binder echoing a selection back
15
+ // (a focused node reports itself selected) cannot start a loop.
16
+ select(next) {
17
+ const now = entity.value;
18
+ if (next?.id !== now?.id || next?.kind !== now?.kind) entity.value = next;
19
+ },
20
+ clear() {
21
+ entity.value = null;
22
+ timeRange.value = null;
23
+ moment.value = null;
24
+ traceId.value = null;
25
+ }
26
+ };
27
+ }
28
+ const LP_LINKED_VIEW = /* @__PURE__ */ Symbol.for("lp-linked-view");
29
+ function provideLinkedView(view = createLinkedView()) {
30
+ provide(LP_LINKED_VIEW, view);
31
+ return view;
32
+ }
33
+ function useLinkedView() {
34
+ return inject(LP_LINKED_VIEW, null) ?? createLinkedView();
35
+ }
36
+ const answersTo = (entity, kind) => !!entity && (kind === void 0 || entity.kind === kind);
37
+ function linkTable(view, options = {}) {
38
+ return computed(() => {
39
+ const entity = view.entity.value;
40
+ const current = answersTo(entity, options.kind) ? entity.id : null;
41
+ return {
42
+ selected: current === null ? [] : [current],
43
+ "onUpdate:selected": (keys) => {
44
+ const picked = keys.find((key) => key !== current) ?? keys[0];
45
+ view.select(picked === void 0 ? null : { id: picked, kind: options.kind });
46
+ }
47
+ };
48
+ });
49
+ }
50
+ function linkTopology(view, canvas, options = {}) {
51
+ watch(
52
+ view.entity,
53
+ (entity) => {
54
+ if (answersTo(entity, options.kind)) void canvas.value?.focusNode(String(entity.id), { keepFocus: true });
55
+ },
56
+ { flush: "post" }
57
+ );
58
+ return computed(() => ({
59
+ onNodeSelect: (id) => view.select({ id, kind: options.kind })
60
+ }));
61
+ }
62
+ function linkLog(view, options = {}) {
63
+ const sourcesOf = options.sourcesOf ?? ((entity) => [String(entity.id)]);
64
+ const sources = shallowRef([]);
65
+ const search = ref("");
66
+ watch(view.entity, (entity) => sources.value = answersTo(entity, options.kind) ? sourcesOf(entity) : []);
67
+ watch(view.traceId, (id, old) => {
68
+ if (id !== null) search.value = id;
69
+ else if (search.value === old) search.value = "";
70
+ });
71
+ return computed(() => ({
72
+ sources: sources.value,
73
+ search: search.value,
74
+ // A viewer with no toolbar reads its term from here instead.
75
+ highlight: search.value,
76
+ // A search only marks its hits; a followed trace is meant to leave just its lines.
77
+ filterMatches: view.traceId.value !== null,
78
+ timeRange: view.timeRange.value ?? void 0,
79
+ "onUpdate:sources": (next) => sources.value = next,
80
+ "onUpdate:search": (next) => {
81
+ search.value = next;
82
+ if (next !== view.traceId.value) view.traceId.value = null;
83
+ },
84
+ onSelect: ({ line }) => {
85
+ view.moment.value = line.time === void 0 ? null : { time: line.time, label: line.message };
86
+ },
87
+ onIdClick: ({ value }) => view.traceId.value = value
88
+ }));
89
+ }
90
+ function linkChart(view, options) {
91
+ const rows = computed(() => toValue(options.times).map((time) => ({ time })));
92
+ return computed(() => {
93
+ const times = toValue(options.times);
94
+ const last = times.length - 1;
95
+ const shared = view.timeRange.value;
96
+ const moment = view.moment.value;
97
+ const onChart = !!moment && last >= 0 && inTimeRange(moment.time, { from: times[0], to: times[last] });
98
+ const range = shared && last >= 0 ? {
99
+ start: shared.from === void 0 ? 0 : Math.max(0, nearestByTime(rows.value, shared.from)),
100
+ end: shared.to === void 0 ? last : Math.max(0, nearestByTime(rows.value, shared.to))
101
+ } : null;
102
+ return {
103
+ range,
104
+ annotations: [
105
+ ...toValue(options.annotations) ?? [],
106
+ ...onChart ? [{ at: nearestByTime(rows.value, moment.time), label: moment.label }] : []
107
+ ],
108
+ "onUpdate:range": (next) => {
109
+ view.timeRange.value = next && { from: times[next.start], to: times[next.end] };
110
+ }
111
+ };
112
+ });
113
+ }
114
+ function linkPipeline(view, options) {
115
+ const expanded = shallowRef([]);
116
+ const failedKeys = () => toValue(options.steps).flatMap((step, index) => step.status === "failed" ? [stepKey(step, index)] : []);
117
+ watch(
118
+ [view.entity, () => failedKeys().join("\0")],
119
+ ([entity]) => {
120
+ if (!answersTo(entity, options.kind)) return;
121
+ expanded.value = [.../* @__PURE__ */ new Set([...expanded.value, ...failedKeys()])];
122
+ },
123
+ { flush: "post" }
124
+ );
125
+ return computed(() => ({
126
+ expanded: expanded.value,
127
+ "onUpdate:expanded": (next) => expanded.value = next
128
+ }));
129
+ }
130
+ export {
131
+ createLinkedView,
132
+ linkChart,
133
+ linkLog,
134
+ linkPipeline,
135
+ linkTable,
136
+ linkTopology,
137
+ provideLinkedView,
138
+ useLinkedView
139
+ };
@@ -13,7 +13,9 @@ type ToggleEmit = {
13
13
  * Shared by LpSwitch and LpCheckbox so a setting saved from either behaves
14
14
  * the same.
15
15
  */
16
- export declare function useOptimisticToggle(action: () => ((value: boolean) => unknown) | undefined, emit: ToggleEmit): {
16
+ export declare function useOptimisticToggle(action: () => ((value: boolean) => unknown) | undefined, emit: ToggleEmit,
17
+ /** Puts back what a boolean cannot say: a checkbox's mixed state. */
18
+ rolledBack?: () => void): {
17
19
  pending: import("vue").Ref<boolean, boolean>;
18
20
  set: (value: boolean) => Promise<void>;
19
21
  };
@@ -1,6 +1,6 @@
1
1
  import { getCurrentInstance, ref } from "vue";
2
2
  import { useToast } from "./useToast.js";
3
- function useOptimisticToggle(action, emit) {
3
+ function useOptimisticToggle(action, emit, rolledBack) {
4
4
  const toast = useToast();
5
5
  const instance = getCurrentInstance();
6
6
  const pending = ref(false);
@@ -15,6 +15,7 @@ function useOptimisticToggle(action, emit) {
15
15
  emit("done", value);
16
16
  } catch (error) {
17
17
  emit("update:modelValue", !value);
18
+ rolledBack?.();
18
19
  if (instance?.vnode.props?.onError) emit("error", error);
19
20
  else toast.error(error instanceof Error ? error : String(error));
20
21
  } finally {
@@ -26,6 +26,13 @@ export interface OverlayHistoryOptions {
26
26
  navigated: () => void;
27
27
  }
28
28
  /** Wire an overlay's `open` to a history entry. */
29
+ /** The wiring of an overlay driven by a v-model: closing asks its guard first. */
30
+ export declare function useModelOverlayHistory(options: {
31
+ mode: OverlayHistoryOptions["mode"];
32
+ open: () => boolean;
33
+ setOpen: (open: boolean) => void;
34
+ allowClose: () => Promise<boolean>;
35
+ }): void;
29
36
  export declare function useOverlayHistory(options: OverlayHistoryOptions): void;
30
37
  export interface StepHistoryOptions {
31
38
  /** The component's own `history` prop; `undefined` follows the overlay it sits in. */
@@ -1,11 +1,24 @@
1
- import { inject, computed, toValue, watch, onBeforeUnmount, provide, nextTick } from "vue";
2
- import { isLive, pushEntry, dropEntry, setHistoryRouter } from "./overlayHistory.js";
1
+ import { inject, onBeforeUnmount, provide, computed, toValue, watch, nextTick } from "vue";
2
+ import { isLive, dropEntry, setHistoryRouter, pushEntry } from "./overlayHistory.js";
3
3
  const MODE = /* @__PURE__ */ Symbol("lp-overlay-history");
4
4
  const SCOPE = /* @__PURE__ */ Symbol("lp-overlay-history-scope");
5
5
  function provideOverlayHistory(mode = true, options = {}) {
6
6
  provide(MODE, mode);
7
7
  if (options.router) setHistoryRouter(options.router);
8
8
  }
9
+ function useModelOverlayHistory(options) {
10
+ useOverlayHistory({
11
+ mode: options.mode,
12
+ open: options.open,
13
+ close: async () => {
14
+ if (!await options.allowClose()) return false;
15
+ options.setOpen(false);
16
+ return true;
17
+ },
18
+ reopen: () => options.setOpen(true),
19
+ navigated: () => options.setOpen(false)
20
+ });
21
+ }
9
22
  function useOverlayHistory(options) {
10
23
  const inherited = inject(MODE, false);
11
24
  const mode = computed(() => options.mode() ?? toValue(inherited));
@@ -79,6 +92,7 @@ function useStepHistory(options) {
79
92
  }
80
93
  export {
81
94
  provideOverlayHistory,
95
+ useModelOverlayHistory,
82
96
  useOverlayHistory,
83
97
  useStepHistory
84
98
  };