@leavepulse/ui 0.77.2 → 0.78.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (597) hide show
  1. package/README.md +68 -0
  2. package/dist/assets/{LpCommandPalette-DOIZHw-g.css → LpCommandPalette-DDJKICKh.css} +19 -19
  3. package/dist/assets/{LpDock-Cbh0wQUv.css → LpDock-Dw82tWVD.css} +3 -3
  4. package/dist/assets/{LpDropzone-B_qRq1-R.css → LpDropzone-DNbh_NFJ.css} +10 -10
  5. package/dist/assets/{LpImageEditor-XM5bAziW.css → LpImageEditor-Bgu20XLs.css} +6 -6
  6. package/dist/assets/{LpTable-Bv-EcQs7.css → LpTable-CCk0ZHo7.css} +19 -19
  7. package/dist/assets/LpTabs-Bh7a-Bdl.css +18 -0
  8. package/dist/chunks/AppShellContextNav-C6Ho2mof.js +49 -0
  9. package/dist/chunks/ChartRangeSelector-HO0sMMz6.js +129 -0
  10. package/dist/chunks/{ContextMenuItems-BXumicbh.js → ContextMenuItems-DmaKSJVv.js} +1 -1
  11. package/dist/chunks/{DropzoneLinkField-C-9BCGJn.js → DropzoneLinkField-DXIr0eFz.js} +2 -2
  12. package/dist/chunks/{FieldWrapper-CORPzo9s.js → FieldWrapper-DnuMTrqW.js} +1 -1
  13. package/dist/chunks/IconCloseButton-COZEsa9u.js +29 -0
  14. package/dist/chunks/{LayoutCanvas-CNOAUk7D.js → LayoutCanvas-CZKOltfA.js} +1 -1
  15. package/dist/chunks/{LayoutNode-DF5BMN0J.js → LayoutNode-D2f7v683.js} +45 -45
  16. package/dist/chunks/{LpActionBar-BP1ld7-S.js → LpActionBar-BGMk5KoG.js} +3 -3
  17. package/dist/chunks/{LpActivityLine-CJvzrNpj.js → LpActivityLine-Ea-t5Vza.js} +4 -2
  18. package/dist/chunks/{LpAddressInput-sYMvYzcY.js → LpAddressInput-ZqoZ-N2Y.js} +12 -11
  19. package/dist/chunks/{LpAlert-n5XPAZfv.js → LpAlert-CjvTZIKF.js} +3 -3
  20. package/dist/chunks/LpAppShell-BNAVTQsY.js +582 -0
  21. package/dist/chunks/{LpAutocomplete-DOu7FN5P.js → LpAutocomplete-DkY6CSyD.js} +26 -42
  22. package/dist/chunks/{LpAvatar-Cg6Az3wz.js → LpAvatar-cQVsNk6F.js} +2 -2
  23. package/dist/chunks/{LpBadge-wUYLN4U9.js → LpBadge-D5QQdDQ_.js} +2 -2
  24. package/dist/chunks/{LpBottomNav-CbNQQPuL.js → LpBottomNav-zxLGGbjm.js} +9 -2
  25. package/dist/chunks/{LpBreadcrumbs-DPdbth-c.js → LpBreadcrumbs-CIIBsygI.js} +4 -3
  26. package/dist/chunks/{LpButton-CFb44IjC.js → LpButton-DSHioIfD.js} +5 -4
  27. package/dist/chunks/{LpCalendar-CuoWks-0.js → LpCalendar-D4-LVjfF.js} +1 -1
  28. package/dist/chunks/{LpCard-r13WRqox.js → LpCard-BPtYXwnT.js} +1 -1
  29. package/dist/chunks/{LpCheckbox-Cs4SHaHX.js → LpCheckbox-D6RuDW4X.js} +38 -16
  30. package/dist/chunks/{LpCodeBlock-DRC8VbXW.js → LpCodeBlock-DuzmnIHl.js} +19 -41
  31. package/dist/chunks/{LpCodeDisplay-CE9TxCA4.js → LpCodeDisplay-CO8fngxa.js} +5 -5
  32. package/dist/chunks/{LpCollapse-CWS9M_lm.js → LpCollapse-DrAw5DBZ.js} +5 -4
  33. package/dist/chunks/{LpColorPicker-1y1QJHZR.js → LpColorPicker-BxAHEnR5.js} +11 -12
  34. package/dist/chunks/{LpCommandScope-CtUhJe8T.js → LpCommandScope-DRUvHiX7.js} +1 -1
  35. package/dist/chunks/{LpConfirmDialog-DlD45Bi_.js → LpConfirmDialog-6oCIJTDa.js} +3 -3
  36. package/dist/chunks/{LpConfirmHost-BIWjBLmI.js → LpConfirmHost-DgHvfT6s.js} +1 -1
  37. package/dist/chunks/{LpContextMenu-rx2tCjwk.js → LpContextMenu--eMGIql6.js} +13 -15
  38. package/dist/chunks/{LpContextSwitcher-Dwh6dyID.js → LpContextSwitcher-1C1tExdl.js} +2 -2
  39. package/dist/chunks/{LpCopyButton-xF7wFVoU.js → LpCopyButton-7EOSIuwa.js} +3 -3
  40. package/dist/chunks/{LpCountdown-DgeY3cLG.js → LpCountdown-DVl7vXI1.js} +4 -3
  41. package/dist/chunks/{LpDataList-Jxyl9H5w.js → LpDataList-DgBeM01y.js} +13 -4
  42. package/dist/chunks/{LpDatePicker-CA0QTfBC.js → LpDatePicker-DwSDY0mt.js} +12 -18
  43. package/dist/chunks/{LpDateRangePicker-u3J51xXk.js → LpDateRangePicker-CNQXdTVv.js} +10 -16
  44. package/dist/chunks/{LpDisclosure-Cpa7Hc5T.js → LpDisclosure-DG7JCo-d.js} +2 -2
  45. package/dist/chunks/{LpDrawer-CrG8t_KP.js → LpDrawer-Bt9UUqt_.js} +61 -61
  46. package/dist/chunks/{LpDropdownMenu-Dl7Z4ZhS.js → LpDropdownMenu-CLzxIOgM.js} +9 -17
  47. package/dist/chunks/{LpEditable-Cy6GLbFx.js → LpEditable-DVT0Rh8F.js} +9 -6
  48. package/dist/chunks/{LpEmptyState-EQHiRYhG.js → LpEmptyState-DurPF001.js} +1 -1
  49. package/dist/chunks/{LpFieldNotice-CzQ2_5rQ.js → LpFieldNotice-DJ10cYIo.js} +1 -1
  50. package/dist/chunks/LpFileTree-BSx1kBoV.js +735 -0
  51. package/dist/chunks/{LpFileTreeNode-cT6BIWvz.js → LpFileTreeNode-4dVmFHb3.js} +116 -34
  52. package/dist/chunks/{LpFormField-Ch69Jd-X.js → LpFormField-BKYn9dyP.js} +3 -3
  53. package/dist/chunks/{LpFrame-BVQCQLDI.js → LpFrame-Bv5Fphte.js} +25 -11
  54. package/dist/chunks/{LpHintExample-9Py0wc-L.js → LpHintExample-YzCXiSUp.js} +1 -1
  55. package/dist/chunks/{LpHintLayer-CgObdUsM.js → LpHintLayer-BeKRsRon.js} +2 -2
  56. package/dist/chunks/{LpHints-Bz-BlaSl.js → LpHints-qf3xYsza.js} +3 -3
  57. package/dist/chunks/{LpHoverCard-spGxyw7T.js → LpHoverCard-DanH3Nz1.js} +23 -5
  58. package/dist/chunks/{LpIcon--5WSb3jJ.js → LpIcon-C6JpQ5td.js} +6 -3
  59. package/dist/chunks/{LpIdenticon-BzdC_qz9.js → LpIdenticon-Dbbr4fvt.js} +2 -1
  60. package/dist/chunks/{LpInfraNode-46XOCkfq.js → LpInfraNode-BAU40Km2.js} +2 -2
  61. package/dist/chunks/{LpInput-Tw-yxT4I.js → LpInput-DL6HEJdi.js} +16 -28
  62. package/dist/chunks/LpInspector-CuoMAhiw.js +209 -0
  63. package/dist/chunks/{LpLightbox-B95yu22B.js → LpLightbox-xvpQ64MM.js} +57 -32
  64. package/dist/chunks/{LpLoader-DVwkOmt9.js → LpLoader-Bf1yZwaU.js} +1 -1
  65. package/dist/chunks/LpLogInspector-6cNnXqp4.js +119 -0
  66. package/dist/chunks/{LpLogViewer-ngqkns4m.js → LpLogViewer-Dvb1E9_G.js} +234 -53
  67. package/dist/chunks/{LpMapPicker-DRGgh89B.js → LpMapPicker-D5_YLLBC.js} +4 -3
  68. package/dist/chunks/{LpMasonry--k0571qG.js → LpMasonry-DPYekFxs.js} +8 -5
  69. package/dist/chunks/{LpMediaGallery-Bkram-MO.js → LpMediaGallery-Df-tiWeq.js} +3 -3
  70. package/dist/chunks/{LpModal-CoGhLTyH.js → LpModal-DrtQ_1A2.js} +11 -13
  71. package/dist/chunks/{LpModalNav-BGvs2y5Q.js → LpModalNav-DkmGCnZE.js} +11 -37
  72. package/dist/chunks/{LpNotificationBell-B0034Lk-.js → LpNotificationBell-D_wklO1m.js} +9 -9
  73. package/dist/chunks/{LpNumberField-e0IBkWU1.js → LpNumberField-CNHsmSDZ.js} +7 -16
  74. package/dist/chunks/{LpOtpInput-CeBPsM7D.js → LpOtpInput-BRpLBbOD.js} +2 -2
  75. package/dist/chunks/{LpPagination-BIIiYHXR.js → LpPagination-snQ020xQ.js} +6 -4
  76. package/dist/chunks/{LpPaletteTheme-DiLYKQiZ.js → LpPaletteTheme-dVtxHx-F.js} +4 -4
  77. package/dist/chunks/{LpPasswordInput-BkHKQDhM.js → LpPasswordInput-B-zD6tUS.js} +2 -2
  78. package/dist/chunks/{LpPhoneInput-CETEp5W7.js → LpPhoneInput-BSL7NX4z.js} +15 -26
  79. package/dist/chunks/{LpPie-DrZepi0p.js → LpPie-9t_guO49.js} +22 -21
  80. package/dist/chunks/{LpPipeline-B3aOVOkV.js → LpPipeline-rjXvEDRJ.js} +16 -7
  81. package/dist/chunks/{LpPopover-DmZ3wUtP.js → LpPopover-BQSuxtai.js} +10 -1
  82. package/dist/chunks/{LpProgress-Yr6ONG5t.js → LpProgress-D_MSjowb.js} +2 -1
  83. package/dist/chunks/{LpQuota-Dk2MyI2Z.js → LpQuota-CgWPgdVt.js} +1 -1
  84. package/dist/chunks/{LpRadioGroup-ggaPL92T.js → LpRadioGroup-BrazjLY_.js} +4 -4
  85. package/dist/chunks/{LpRangeCalendar-CYYUYqJ7.js → LpRangeCalendar-BrqlGZzE.js} +1 -1
  86. package/dist/chunks/{LpRangeSlider-CM-0ZITZ.js → LpRangeSlider-fz61tzc-.js} +5 -9
  87. package/dist/chunks/{LpRelativeTime-DwgCb5-8.js → LpRelativeTime-BovUk8MP.js} +1 -1
  88. package/dist/chunks/{LpRepeater-D7ZmnIYd.js → LpRepeater-BkJHSPI1.js} +3 -3
  89. package/dist/chunks/{LpRevealOnScroll-DcQjexLy.js → LpRevealOnScroll-CPwyiQAr.js} +1 -1
  90. package/dist/chunks/{LpScramble-Bn9OoOtC.js → LpScramble-DsE77iVp.js} +1 -1
  91. package/dist/chunks/{LpScrollArea-MyEnVB_5.js → LpScrollArea-ay4Xo_hg.js} +22 -10
  92. package/dist/chunks/{LpSecretField-BbmqM9ye.js → LpSecretField-DBvU6iAw.js} +10 -9
  93. package/dist/chunks/{LpSection-DFK_uoJE.js → LpSection-BfteipxU.js} +1 -1
  94. package/dist/chunks/{LpSegmented-CeACsMMA.js → LpSegmented-DbEJhbv-.js} +8 -10
  95. package/dist/chunks/{LpSelect-Cxq4yBGd.js → LpSelect-Y-iuSymW.js} +47 -30
  96. package/dist/chunks/{LpShaderBackdrop-Bote0iuy.js → LpShaderBackdrop-wQygYb5h.js} +13 -10
  97. package/dist/chunks/{LpShift-CCq7dofl.js → LpShift-DAgS_d2x.js} +18 -15
  98. package/dist/chunks/{LpSidebar-DzE1783C.js → LpSidebar-kSkpPh3-.js} +74 -87
  99. package/dist/chunks/{LpSidebarNav-DE3PhXVP.js → LpSidebarNav-C2mvqrY2.js} +8 -6
  100. package/dist/chunks/{LpSidebarRow-BRYhNDSo.js → LpSidebarRow-eRP4Q31q.js} +6 -5
  101. package/dist/chunks/{LpSlider-DxYoCJJO.js → LpSlider-A4ixovgS.js} +5 -9
  102. package/dist/chunks/{LpSpotlight-4F3NeUMY.js → LpSpotlight-DwxkhFgR.js} +2 -1
  103. package/dist/chunks/{LpStat-f2LfDCJ4.js → LpStat-pMNZgFcq.js} +2 -2
  104. package/dist/chunks/{LpStatus-DglxttQ7.js → LpStatus-DGJFwk5F.js} +2 -2
  105. package/dist/chunks/{LpStepMark-DpzKVyh8.js → LpStepMark-Dw2MRTrt.js} +2 -2
  106. package/dist/chunks/{LpStepper-DpsocBNJ.js → LpStepper-DNnh7lCu.js} +1 -1
  107. package/dist/chunks/{LpSwap-C96c0LWh.js → LpSwap-M7nFeW3C.js} +1 -1
  108. package/dist/chunks/{LpSwitch-BnXd1llc.js → LpSwitch-DnC2-0aV.js} +3 -3
  109. package/dist/chunks/{LpTabFace-DPCwKkH2.js → LpTabFace-DQoV8mQG.js} +2 -2
  110. package/dist/chunks/{LpTableFilter-CiVBpaq0.js → LpTableFilter-DgARTsA1.js} +4 -4
  111. package/dist/chunks/{LpTableOfContents-BN5zvpnx.js → LpTableOfContents-CKkWEK6R.js} +14 -9
  112. package/dist/chunks/{LpTagsInput-C-mDG648.js → LpTagsInput-Dt0mteSj.js} +19 -27
  113. package/dist/chunks/{LpTextarea-TE-yZv2U.js → LpTextarea-Co0b9PVx.js} +8 -16
  114. package/dist/chunks/LpThemeProvider-XK6ZeWAE.js +81 -0
  115. package/dist/chunks/{LpThemeStudio-BpORDvH6.js → LpThemeStudio-DzYfE-5k.js} +12 -195
  116. package/dist/chunks/{LpThemeSwitcher-BnEn_mvf.js → LpThemeSwitcher-CFLkdbBL.js} +8 -6
  117. package/dist/chunks/{LpTimeField-BawSVsmt.js → LpTimeField-DeOcKWJq.js} +6 -9
  118. package/dist/chunks/{LpToaster-IwTXjbbU.js → LpToaster-QFj0P-5m.js} +10 -8
  119. package/dist/chunks/{LpTooltip-BcBvIx4z.js → LpTooltip-BJf3lZMq.js} +51 -19
  120. package/dist/chunks/LpTopologyCanvas-BOHHHZ_6.js +673 -0
  121. package/dist/chunks/{LpTour-BZq-mUMv.js → LpTour-ClKYhx4h.js} +7 -5
  122. package/dist/chunks/{LpTruncate-CflAIwiJ.js → LpTruncate-C6u3gjc6.js} +6 -5
  123. package/dist/chunks/{LpTypewriter-BCL_a6wE.js → LpTypewriter-CZIzpdbe.js} +2 -1
  124. package/dist/chunks/{LpUptimeBar-DqNvvMBK.js → LpUptimeBar-BnYmR2rj.js} +3 -3
  125. package/dist/chunks/{LpVideoBackdrop-DS1wGv-X.js → LpVideoBackdrop-Ct4St4ZL.js} +10 -13
  126. package/dist/chunks/LpWindow-B8YSRVTH.js +297 -0
  127. package/dist/chunks/LpWorkspaceSwitcher-D0e9upAy.js +139 -0
  128. package/dist/chunks/{MenuTitle-BmCNNTKH.js → MenuTitle-Bh5dAdV1.js} +1 -1
  129. package/dist/chunks/{OptionContent-22UT8zLn.js → OptionContent-CGb8QlHA.js} +1 -1
  130. package/dist/chunks/{PickerField-Bfh8id3d.js → PickerField-BM1dyafh.js} +4 -4
  131. package/dist/chunks/{RevealToggle-BEit1n6Z.js → RevealToggle-CCPDE8Mv.js} +3 -3
  132. package/dist/chunks/SliderRail-DhPREa_R.js +18 -0
  133. package/dist/chunks/{TourCard-DNclH3u_.js → TourCard-DAzTYfav.js} +4 -4
  134. package/dist/chunks/{icons-DMITlfw5.js → icons-CYfcpSDS.js} +26 -10
  135. package/dist/component-names.d.ts +1 -1
  136. package/dist/components/AppShellContextNav.vue.d.ts +13 -0
  137. package/dist/components/AppShellContextNav.vue.js +4 -0
  138. package/dist/components/ChartRangeSelector.vue.d.ts +21 -0
  139. package/dist/components/ChartRangeSelector.vue.js +4 -0
  140. package/dist/components/ContextMenuItems.vue.js +1 -1
  141. package/dist/components/DropzoneLinkField.vue.d.ts +2 -2
  142. package/dist/components/DropzoneLinkField.vue.js +1 -1
  143. package/dist/components/FieldWrapper.vue.js +1 -1
  144. package/dist/components/IconCloseButton.vue.d.ts +7 -0
  145. package/dist/components/IconCloseButton.vue.js +4 -0
  146. package/dist/components/LayoutCanvas.vue.js +1 -1
  147. package/dist/components/LayoutNode.vue.js +1 -1
  148. package/dist/components/LpActionBar.vue.js +1 -1
  149. package/dist/components/LpActivityLine.vue.js +1 -1
  150. package/dist/components/LpAddressInput.vue.js +1 -1
  151. package/dist/components/LpAlert.vue.js +1 -1
  152. package/dist/components/LpAppShell.vue.d.ts +110 -2
  153. package/dist/components/LpAppShell.vue.js +1 -1
  154. package/dist/components/LpAutocomplete.vue.js +1 -1
  155. package/dist/components/LpAvatar.vue.js +1 -1
  156. package/dist/components/LpBadge.vue.js +1 -1
  157. package/dist/components/LpBottomNav.vue.d.ts +5 -0
  158. package/dist/components/LpBottomNav.vue.js +1 -1
  159. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  160. package/dist/components/LpButton.vue.d.ts +14 -2
  161. package/dist/components/LpButton.vue.js +1 -1
  162. package/dist/components/LpCalendar.vue.js +1 -1
  163. package/dist/components/LpCard.vue.js +1 -1
  164. package/dist/components/LpChart.vue.d.ts +74 -2
  165. package/dist/components/LpChart.vue.js +326 -85
  166. package/dist/components/LpCheckbox.vue.d.ts +6 -2
  167. package/dist/components/LpCheckbox.vue.js +1 -1
  168. package/dist/components/LpCodeBlock.vue.js +1 -1
  169. package/dist/components/LpCodeDisplay.vue.js +1 -1
  170. package/dist/components/LpCollapse.vue.js +1 -1
  171. package/dist/components/LpColorPicker.vue.js +1 -1
  172. package/dist/components/LpCommandPalette.vue.d.ts +8 -0
  173. package/dist/components/LpCommandPalette.vue.js +107 -56
  174. package/dist/components/LpCommandScope.vue.js +1 -1
  175. package/dist/components/LpConfirmDialog.vue.js +1 -1
  176. package/dist/components/LpConfirmHost.vue.js +1 -1
  177. package/dist/components/LpContextMenu.vue.js +1 -1
  178. package/dist/components/LpContextSwitcher.vue.js +1 -1
  179. package/dist/components/LpCopyButton.vue.js +1 -1
  180. package/dist/components/LpCountdown.vue.js +1 -1
  181. package/dist/components/LpDataList.vue.d.ts +1 -1
  182. package/dist/components/LpDataList.vue.js +1 -1
  183. package/dist/components/LpDatePicker.vue.d.ts +3 -15
  184. package/dist/components/LpDatePicker.vue.js +1 -1
  185. package/dist/components/LpDateRangePicker.vue.d.ts +3 -13
  186. package/dist/components/LpDateRangePicker.vue.js +1 -1
  187. package/dist/components/LpDisclosure.vue.js +1 -1
  188. package/dist/components/LpDock.vue.js +21 -18
  189. package/dist/components/LpDrawer.vue.d.ts +1 -1
  190. package/dist/components/LpDrawer.vue.js +1 -1
  191. package/dist/components/LpDropdownMenu.vue.js +1 -1
  192. package/dist/components/LpDropzone.vue.js +14 -11
  193. package/dist/components/LpEditable.vue.js +1 -1
  194. package/dist/components/LpEmptyState.vue.js +1 -1
  195. package/dist/components/LpFieldNotice.vue.js +1 -1
  196. package/dist/components/LpFileTree.vue.d.ts +96 -6
  197. package/dist/components/LpFileTree.vue.js +1 -1
  198. package/dist/components/LpFileTreeNode.vue.d.ts +48 -0
  199. package/dist/components/LpFileTreeNode.vue.js +1 -1
  200. package/dist/components/LpFormField.vue.js +1 -1
  201. package/dist/components/LpFrame.vue.js +1 -1
  202. package/dist/components/LpGauge.vue.d.ts +1 -1
  203. package/dist/components/LpHintExample.vue.js +1 -1
  204. package/dist/components/LpHintLayer.vue.js +1 -1
  205. package/dist/components/LpHints.vue.js +1 -1
  206. package/dist/components/LpHoverCard.vue.js +1 -1
  207. package/dist/components/LpIcon.vue.d.ts +2 -0
  208. package/dist/components/LpIcon.vue.js +1 -1
  209. package/dist/components/LpIdenticon.vue.js +1 -1
  210. package/dist/components/LpImageEditor.vue.js +7 -6
  211. package/dist/components/LpInfraNode.vue.js +1 -1
  212. package/dist/components/LpInput.vue.d.ts +1 -1
  213. package/dist/components/LpInput.vue.js +1 -1
  214. package/dist/components/LpInspector.vue.d.ts +87 -0
  215. package/dist/components/LpInspector.vue.js +4 -0
  216. package/dist/components/LpLightbox.vue.d.ts +8 -0
  217. package/dist/components/LpLightbox.vue.js +1 -1
  218. package/dist/components/LpLoader.vue.d.ts +1 -1
  219. package/dist/components/LpLoader.vue.js +1 -1
  220. package/dist/components/LpLogInspector.vue.d.ts +18 -0
  221. package/dist/components/LpLogInspector.vue.js +4 -0
  222. package/dist/components/LpLogViewer.vue.d.ts +93 -0
  223. package/dist/components/LpLogViewer.vue.js +1 -1
  224. package/dist/components/LpMapPicker.vue.js +1 -1
  225. package/dist/components/LpMasonry.vue.js +1 -1
  226. package/dist/components/LpMediaGallery.vue.js +1 -1
  227. package/dist/components/LpModal.vue.d.ts +4 -2
  228. package/dist/components/LpModal.vue.js +1 -1
  229. package/dist/components/LpModalNav.vue.d.ts +5 -5
  230. package/dist/components/LpModalNav.vue.js +1 -1
  231. package/dist/components/LpNotificationBell.vue.d.ts +2 -2
  232. package/dist/components/LpNotificationBell.vue.js +1 -1
  233. package/dist/components/LpNumberField.vue.js +1 -1
  234. package/dist/components/LpOtpInput.vue.js +1 -1
  235. package/dist/components/LpPagination.vue.js +1 -1
  236. package/dist/components/LpPaletteFacts.vue.js +1 -1
  237. package/dist/components/LpPaletteHeader.vue.js +2 -2
  238. package/dist/components/LpPaletteTheme.vue.js +1 -1
  239. package/dist/components/LpPasswordInput.vue.js +1 -1
  240. package/dist/components/LpPhoneInput.vue.js +1 -1
  241. package/dist/components/LpPie.vue.d.ts +2 -2
  242. package/dist/components/LpPie.vue.js +1 -1
  243. package/dist/components/LpPipeline.vue.d.ts +4 -0
  244. package/dist/components/LpPipeline.vue.js +1 -1
  245. package/dist/components/LpPopover.vue.d.ts +7 -3
  246. package/dist/components/LpPopover.vue.js +1 -1
  247. package/dist/components/LpProgress.vue.d.ts +1 -1
  248. package/dist/components/LpProgress.vue.js +1 -1
  249. package/dist/components/LpQuota.vue.js +1 -1
  250. package/dist/components/LpRadioGroup.vue.js +1 -1
  251. package/dist/components/LpRangeCalendar.vue.js +1 -1
  252. package/dist/components/LpRangeSlider.vue.js +1 -1
  253. package/dist/components/LpRelativeTime.vue.js +1 -1
  254. package/dist/components/LpRepeater.vue.js +1 -1
  255. package/dist/components/LpRevealOnScroll.vue.js +1 -1
  256. package/dist/components/LpScramble.vue.js +1 -1
  257. package/dist/components/LpScrollArea.vue.js +1 -1
  258. package/dist/components/LpSecretField.vue.js +1 -1
  259. package/dist/components/LpSection.vue.js +1 -1
  260. package/dist/components/LpSegmented.vue.js +1 -1
  261. package/dist/components/LpSelect.vue.js +1 -1
  262. package/dist/components/LpShaderBackdrop.vue.js +1 -1
  263. package/dist/components/LpShift.vue.js +1 -1
  264. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  265. package/dist/components/LpSidebar.vue.d.ts +1 -1
  266. package/dist/components/LpSidebar.vue.js +1 -1
  267. package/dist/components/LpSidebarNav.vue.js +1 -1
  268. package/dist/components/LpSidebarRow.vue.js +1 -1
  269. package/dist/components/LpSlider.vue.js +1 -1
  270. package/dist/components/LpSparkline.vue.d.ts +1 -1
  271. package/dist/components/LpSpotlight.vue.js +1 -1
  272. package/dist/components/LpStat.vue.js +1 -1
  273. package/dist/components/LpStatus.vue.js +1 -1
  274. package/dist/components/LpStepMark.vue.js +1 -1
  275. package/dist/components/LpStepper.vue.js +1 -1
  276. package/dist/components/LpSwap.vue.js +1 -1
  277. package/dist/components/LpSwitch.vue.js +1 -1
  278. package/dist/components/LpTabFace.vue.js +1 -1
  279. package/dist/components/LpTable.vue.d.ts +132 -0
  280. package/dist/components/LpTable.vue.js +547 -135
  281. package/dist/components/LpTableFilter.vue.js +1 -1
  282. package/dist/components/LpTableOfContents.vue.js +1 -1
  283. package/dist/components/LpTabs.vue.js +6 -5
  284. package/dist/components/LpTagsInput.vue.js +1 -1
  285. package/dist/components/LpTextarea.vue.js +1 -1
  286. package/dist/components/LpThemeProvider.vue.d.ts +2 -0
  287. package/dist/components/LpThemeProvider.vue.js +1 -1
  288. package/dist/components/LpThemeStudio.vue.js +1 -1
  289. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  290. package/dist/components/LpTimeField.vue.js +1 -1
  291. package/dist/components/LpToaster.vue.js +1 -1
  292. package/dist/components/LpTooltip.vue.js +1 -1
  293. package/dist/components/LpTopologyCanvas.vue.d.ts +131 -5
  294. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  295. package/dist/components/LpTour.vue.js +1 -1
  296. package/dist/components/LpTruncate.vue.js +1 -1
  297. package/dist/components/LpTypewriter.vue.js +1 -1
  298. package/dist/components/LpUptimeBar.vue.js +1 -1
  299. package/dist/components/LpVideoBackdrop.vue.js +1 -1
  300. package/dist/components/LpWindow.vue.d.ts +99 -0
  301. package/dist/components/LpWindow.vue.js +4 -0
  302. package/dist/components/LpWorkspaceSwitcher.vue.d.ts +18 -0
  303. package/dist/components/LpWorkspaceSwitcher.vue.js +4 -0
  304. package/dist/components/MenuTitle.vue.js +1 -1
  305. package/dist/components/OptionContent.vue.js +1 -1
  306. package/dist/components/PickerField.vue.d.ts +2 -2
  307. package/dist/components/PickerField.vue.js +1 -1
  308. package/dist/components/RevealToggle.vue.js +1 -1
  309. package/dist/components/SliderRail.vue.d.ts +3 -0
  310. package/dist/components/SliderRail.vue.js +4 -0
  311. package/dist/components/TourCard.vue.js +1 -1
  312. package/dist/components/address.js +2 -1
  313. package/dist/components/appShell.d.ts +36 -0
  314. package/dist/components/appShell.js +30 -0
  315. package/dist/components/calendar.d.ts +12 -3
  316. package/dist/components/calendar.js +2 -5
  317. package/dist/components/chart.d.ts +21 -0
  318. package/dist/components/chart.js +4 -3
  319. package/dist/components/chartWindow.d.ts +57 -0
  320. package/dist/components/chartWindow.js +136 -0
  321. package/dist/components/color.js +1 -1
  322. package/dist/components/commandPalette.d.ts +16 -2
  323. package/dist/components/commandPalette.js +39 -4
  324. package/dist/components/controlSize.d.ts +5 -0
  325. package/dist/components/controlSize.js +8 -0
  326. package/dist/components/dropdown.d.ts +5 -0
  327. package/dist/components/dropdown.js +2 -0
  328. package/dist/components/exportData.d.ts +6 -1
  329. package/dist/components/exportData.js +25 -18
  330. package/dist/components/fileTree.d.ts +67 -0
  331. package/dist/components/fileTree.js +141 -1
  332. package/dist/components/identicon.js +3 -2
  333. package/dist/components/logTools.d.ts +93 -0
  334. package/dist/components/logTools.js +210 -0
  335. package/dist/components/menuWhen.js +1 -1
  336. package/dist/components/meter.js +2 -1
  337. package/dist/components/pipeline.d.ts +2 -0
  338. package/dist/components/pipeline.js +5 -0
  339. package/dist/components/relativeTime.js +2 -1
  340. package/dist/components/reveal.js +2 -1
  341. package/dist/components/select.d.ts +5 -0
  342. package/dist/components/select.js +10 -0
  343. package/dist/components/sidebar.d.ts +1 -0
  344. package/dist/components/tableFeatures.d.ts +58 -0
  345. package/dist/components/tableFeatures.js +87 -0
  346. package/dist/components/topologyGraph.d.ts +164 -0
  347. package/dist/components/topologyGraph.js +416 -0
  348. package/dist/components/tour.js +5 -3
  349. package/dist/components/videoBackdrop.js +7 -6
  350. package/dist/composables/clamp.d.ts +2 -0
  351. package/dist/composables/clamp.js +4 -0
  352. package/dist/composables/devWarn.d.ts +3 -0
  353. package/dist/composables/devWarn.js +14 -0
  354. package/dist/composables/easing.d.ts +13 -4
  355. package/dist/composables/easing.js +16 -10
  356. package/dist/composables/overlayHistory.js +14 -1
  357. package/dist/composables/pointerDrag.d.ts +15 -0
  358. package/dist/composables/pointerDrag.js +40 -0
  359. package/dist/composables/propCheck.d.ts +10 -0
  360. package/dist/composables/propCheck.js +78 -0
  361. package/dist/composables/realm.d.ts +6 -0
  362. package/dist/composables/realm.js +23 -0
  363. package/dist/composables/scroll.js +4 -2
  364. package/dist/composables/scrollMemory.d.ts +12 -1
  365. package/dist/composables/scrollMemory.js +36 -12
  366. package/dist/composables/spatialNav.js +2 -1
  367. package/dist/composables/textEntry.d.ts +17 -0
  368. package/dist/composables/textEntry.js +19 -0
  369. package/dist/composables/useAsyncTask.d.ts +6 -0
  370. package/dist/composables/useChartSync.d.ts +5 -0
  371. package/dist/composables/useChartSync.js +33 -0
  372. package/dist/composables/useCloseGuard.d.ts +3 -1
  373. package/dist/composables/useCloseGuard.js +6 -3
  374. package/dist/composables/useCommands.d.ts +50 -0
  375. package/dist/composables/useCommands.js +66 -0
  376. package/dist/composables/useField.d.ts +37 -0
  377. package/dist/composables/useField.js +27 -2
  378. package/dist/composables/useFitScale.js +4 -1
  379. package/dist/composables/useFormDraft.d.ts +13 -2
  380. package/dist/composables/useFormDraft.js +17 -9
  381. package/dist/composables/useHintSystem.js +2 -2
  382. package/dist/composables/useHotkeys.js +11 -32
  383. package/dist/composables/useInView.js +2 -1
  384. package/dist/composables/useInputFilter.js +7 -5
  385. package/dist/composables/useInputMask.js +5 -3
  386. package/dist/composables/useLinkedView.d.ts +97 -0
  387. package/dist/composables/useLinkedView.js +139 -0
  388. package/dist/composables/useOptimisticToggle.d.ts +3 -1
  389. package/dist/composables/useOptimisticToggle.js +2 -1
  390. package/dist/composables/useOverlayHistory.d.ts +7 -0
  391. package/dist/composables/useOverlayHistory.js +16 -2
  392. package/dist/composables/usePaintSelect.js +18 -14
  393. package/dist/composables/usePaletteCommands.d.ts +7 -0
  394. package/dist/composables/usePaletteCommands.js +12 -1
  395. package/dist/composables/usePersisted.d.ts +10 -0
  396. package/dist/composables/usePersisted.js +1 -1
  397. package/dist/composables/usePillTransition.d.ts +2 -2
  398. package/dist/composables/usePillTransition.js +5 -5
  399. package/dist/composables/useResizeObserver.js +2 -1
  400. package/dist/composables/useReveal.js +2 -1
  401. package/dist/composables/useRovingFocus.d.ts +2 -2
  402. package/dist/composables/useRovingFocus.js +9 -11
  403. package/dist/composables/useScramble.js +7 -1
  404. package/dist/composables/useShift.js +8 -6
  405. package/dist/composables/useTilt.js +2 -1
  406. package/dist/composables/useTween.js +9 -5
  407. package/dist/composables/useView.d.ts +1 -0
  408. package/dist/composables/useView.js +14 -2
  409. package/dist/composables/useZoomPan.js +2 -4
  410. package/dist/composables/windowing.d.ts +40 -0
  411. package/dist/composables/windowing.js +118 -0
  412. package/dist/icons-all.js +1 -1
  413. package/dist/icons.d.ts +4 -0
  414. package/dist/index.d.ts +30 -5
  415. package/dist/index.js +310 -264
  416. package/dist/layout/tree.js +19 -15
  417. package/dist/layout/useLayout.d.ts +2 -0
  418. package/dist/layout/useLayout.js +5 -1
  419. package/dist/layout/useWorkspaces.d.ts +52 -0
  420. package/dist/layout/useWorkspaces.js +140 -0
  421. package/dist/{chunks/backdrop-Dkf2vM81.js → theme/backdrop.js} +5 -5
  422. package/dist/theme/config.js +25 -0
  423. package/dist/theme/define.js +61 -0
  424. package/dist/{chunks/palette-Co8tSASo.js → theme/palette.js} +2 -2
  425. package/dist/theme/presets.js +239 -0
  426. package/dist/theme/studio.js +134 -0
  427. package/dist/theme/tokens.js +63 -0
  428. package/dist/theme/useTheme.d.ts +3 -2
  429. package/dist/theme/useTheme.js +325 -0
  430. package/package.json +8 -1
  431. package/src/component-names.ts +5 -1
  432. package/src/components/AppShellContextNav.vue +44 -0
  433. package/src/components/ChartRangeSelector.vue +120 -0
  434. package/src/components/IconCloseButton.vue +21 -0
  435. package/src/components/LayoutCanvas.vue +3 -0
  436. package/src/components/LayoutNode.vue +37 -38
  437. package/src/components/LpActivityLine.vue +4 -2
  438. package/src/components/LpAddressInput.vue +3 -3
  439. package/src/components/LpAppShell.vue +362 -24
  440. package/src/components/LpAutocomplete.vue +18 -30
  441. package/src/components/LpBottomNav.vue +9 -1
  442. package/src/components/LpBreadcrumbs.vue +2 -1
  443. package/src/components/LpButton.vue +11 -4
  444. package/src/components/LpChart.vue +336 -37
  445. package/src/components/LpCheckbox.vue +43 -9
  446. package/src/components/LpCodeBlock.vue +17 -23
  447. package/src/components/LpCollapse.vue +5 -4
  448. package/src/components/LpColorPicker.vue +8 -9
  449. package/src/components/LpCommandPalette.vue +133 -50
  450. package/src/components/LpContextMenu.vue +15 -13
  451. package/src/components/LpCountdown.vue +2 -1
  452. package/src/components/LpDataList.vue +13 -1
  453. package/src/components/LpDatePicker.vue +5 -17
  454. package/src/components/LpDateRangePicker.vue +5 -16
  455. package/src/components/LpDock.vue +25 -16
  456. package/src/components/LpDrawer.vue +70 -61
  457. package/src/components/LpDropdownMenu.vue +6 -10
  458. package/src/components/LpDropzone.vue +12 -7
  459. package/src/components/LpEditable.vue +6 -2
  460. package/src/components/LpFileTree.vue +507 -66
  461. package/src/components/LpFileTreeNode.vue +106 -5
  462. package/src/components/LpFormField.vue +1 -1
  463. package/src/components/LpFrame.vue +33 -13
  464. package/src/components/LpHoverCard.vue +30 -5
  465. package/src/components/LpIcon.vue +6 -2
  466. package/src/components/LpIdenticon.vue +2 -1
  467. package/src/components/LpImageEditor.vue +5 -2
  468. package/src/components/LpInput.vue +15 -23
  469. package/src/components/LpInspector.vue +197 -0
  470. package/src/components/LpLightbox.vue +74 -29
  471. package/src/components/LpLogInspector.vue +85 -0
  472. package/src/components/LpLogViewer.vue +239 -29
  473. package/src/components/LpMapPicker.vue +2 -1
  474. package/src/components/LpMasonry.vue +8 -5
  475. package/src/components/LpModal.vue +12 -12
  476. package/src/components/LpModalNav.vue +2 -21
  477. package/src/components/LpNumberField.vue +6 -15
  478. package/src/components/LpOtpInput.vue +2 -2
  479. package/src/components/LpPagination.vue +5 -3
  480. package/src/components/LpPhoneInput.vue +8 -19
  481. package/src/components/LpPie.vue +25 -23
  482. package/src/components/LpPipeline.vue +14 -1
  483. package/src/components/LpPopover.vue +23 -2
  484. package/src/components/LpProgress.vue +2 -1
  485. package/src/components/LpRadioGroup.vue +2 -2
  486. package/src/components/LpRangeSlider.vue +5 -6
  487. package/src/components/LpRevealOnScroll.vue +1 -1
  488. package/src/components/LpScrollArea.vue +28 -11
  489. package/src/components/LpSecretField.vue +2 -1
  490. package/src/components/LpSegmented.vue +6 -8
  491. package/src/components/LpSelect.vue +54 -24
  492. package/src/components/LpShaderBackdrop.vue +12 -9
  493. package/src/components/LpShift.vue +18 -15
  494. package/src/components/LpSidebar.vue +77 -74
  495. package/src/components/LpSidebarNav.vue +3 -2
  496. package/src/components/LpSidebarRow.vue +2 -1
  497. package/src/components/LpSlider.vue +5 -6
  498. package/src/components/LpSpotlight.vue +2 -1
  499. package/src/components/LpSwitch.vue +5 -3
  500. package/src/components/LpTable.vue +609 -93
  501. package/src/components/LpTableFilter.vue +1 -1
  502. package/src/components/LpTableOfContents.vue +16 -9
  503. package/src/components/LpTabs.vue +2 -1
  504. package/src/components/LpTagsInput.vue +12 -19
  505. package/src/components/LpTextarea.vue +5 -11
  506. package/src/components/LpThemeProvider.vue +29 -13
  507. package/src/components/LpTimeField.vue +4 -7
  508. package/src/components/LpToaster.vue +7 -6
  509. package/src/components/LpTooltip.vue +62 -18
  510. package/src/components/LpTopologyCanvas.vue +567 -42
  511. package/src/components/LpTour.vue +7 -5
  512. package/src/components/LpTruncate.vue +4 -3
  513. package/src/components/LpTypewriter.vue +2 -1
  514. package/src/components/LpVideoBackdrop.vue +11 -13
  515. package/src/components/LpWindow.vue +373 -0
  516. package/src/components/LpWorkspaceSwitcher.vue +116 -0
  517. package/src/components/PickerField.vue +2 -2
  518. package/src/components/SliderRail.vue +10 -0
  519. package/src/components/address.ts +3 -1
  520. package/src/components/appShell.ts +74 -0
  521. package/src/components/calendar.ts +12 -5
  522. package/src/components/chart.ts +27 -3
  523. package/src/components/chartWindow.ts +198 -0
  524. package/src/components/color.ts +2 -1
  525. package/src/components/commandPalette.ts +66 -5
  526. package/src/components/controlSize.ts +6 -0
  527. package/src/components/dropdown.ts +3 -0
  528. package/src/components/exportData.ts +33 -18
  529. package/src/components/fileTree.ts +215 -0
  530. package/src/components/identicon.ts +4 -2
  531. package/src/components/logTools.ts +298 -0
  532. package/src/components/meter.ts +2 -1
  533. package/src/components/pipeline.ts +6 -0
  534. package/src/components/relativeTime.ts +2 -1
  535. package/src/components/reveal.ts +3 -1
  536. package/src/components/select.ts +14 -0
  537. package/src/components/sidebar.ts +1 -0
  538. package/src/components/tableFeatures.ts +149 -0
  539. package/src/components/topologyGraph.ts +655 -0
  540. package/src/components/tour.ts +5 -3
  541. package/src/components/videoBackdrop.ts +7 -6
  542. package/src/composables/clamp.ts +2 -0
  543. package/src/composables/devWarn.ts +19 -0
  544. package/src/composables/easing.ts +37 -12
  545. package/src/composables/overlayHistory.ts +24 -0
  546. package/src/composables/pointerDrag.ts +54 -0
  547. package/src/composables/propCheck.ts +90 -0
  548. package/src/composables/realm.ts +25 -0
  549. package/src/composables/scroll.ts +4 -2
  550. package/src/composables/scrollMemory.ts +56 -14
  551. package/src/composables/spatialNav.ts +2 -1
  552. package/src/composables/textEntry.ts +33 -0
  553. package/src/composables/useAsyncTask.ts +6 -0
  554. package/src/composables/useChartSync.ts +52 -0
  555. package/src/composables/useCloseGuard.ts +22 -10
  556. package/src/composables/useCommands.ts +123 -0
  557. package/src/composables/useField.ts +41 -2
  558. package/src/composables/useFitScale.ts +4 -1
  559. package/src/composables/useFormDraft.ts +38 -14
  560. package/src/composables/useHintSystem.ts +2 -2
  561. package/src/composables/useHotkeys.ts +19 -48
  562. package/src/composables/useInView.ts +2 -1
  563. package/src/composables/useInputFilter.ts +8 -5
  564. package/src/composables/useInputMask.ts +8 -3
  565. package/src/composables/useLinkedView.ts +222 -0
  566. package/src/composables/useOptimisticToggle.ts +7 -1
  567. package/src/composables/useOverlayHistory.ts +20 -0
  568. package/src/composables/usePaintSelect.ts +20 -14
  569. package/src/composables/usePaletteCommands.ts +13 -0
  570. package/src/composables/usePersisted.ts +10 -0
  571. package/src/composables/usePillTransition.ts +9 -6
  572. package/src/composables/useResizeObserver.ts +2 -1
  573. package/src/composables/useReveal.ts +2 -1
  574. package/src/composables/useRovingFocus.ts +11 -14
  575. package/src/composables/useScramble.ts +12 -1
  576. package/src/composables/useShift.ts +8 -6
  577. package/src/composables/useTilt.ts +2 -1
  578. package/src/composables/useTween.ts +10 -5
  579. package/src/composables/useView.ts +17 -3
  580. package/src/composables/useZoomPan.ts +2 -5
  581. package/src/composables/windowing.ts +190 -0
  582. package/src/icons.ts +27 -6
  583. package/src/index.ts +41 -4
  584. package/src/kit-icons.ts +1 -1
  585. package/src/layout/tree.ts +31 -16
  586. package/src/layout/useLayout.ts +6 -0
  587. package/src/layout/useWorkspaces.ts +234 -0
  588. package/src/nuxt.ts +9 -1
  589. package/src/runtime/propCheck.plugin.ts +10 -0
  590. package/src/theme/studio.ts +7 -5
  591. package/src/theme/useTheme.ts +89 -15
  592. package/src/tokens/tokens.css +8 -1
  593. package/dist/assets/LpTabs-CJ0rYQbx.css +0 -18
  594. package/dist/chunks/LpAppShell-Dgejipzz.js +0 -319
  595. package/dist/chunks/LpFileTree-CooHinsC.js +0 -425
  596. package/dist/chunks/LpThemeProvider-8MG6yqU9.js +0 -640
  597. package/dist/chunks/LpTopologyCanvas-B1gIbS0n.js +0 -298
@@ -16,11 +16,12 @@ export default { inheritAttrs: false }
16
16
  * (the one matching `focusedId`), which is what a11y expects of role="tree" —
17
17
  * Tab enters the tree once, arrows move within it. The parent owns that state.
18
18
  */
19
- import { computed } from "vue"
19
+ import { computed, nextTick, ref, watch } from "vue"
20
20
  import {
21
21
  fileIcon,
22
22
  formatModified,
23
23
  formatSize,
24
+ renameSelectionEnd,
24
25
  sortNodes,
25
26
  type FileNode,
26
27
  type NodeStats,
@@ -53,6 +54,21 @@ const props = defineProps<{
53
54
  stats: Map<string, NodeStats>
54
55
  showSize: boolean
55
56
  showModified: boolean
57
+ /** Rows picked with Ctrl and Shift, in `multiple` mode. */
58
+ selectedIds?: ReadonlySet<string>
59
+ multiple?: boolean
60
+ /** The root flattens the tree to window it: this row renders alone, with its place stated. */
61
+ flat?: boolean
62
+ setSize?: number
63
+ posInSet?: number
64
+ /** Rows can be dragged; the root decides where they land. */
65
+ movable?: boolean
66
+ dropTargetId?: string
67
+ /** The row being renamed, the text in its field and whether that text can stand. */
68
+ renamingId?: string
69
+ renameValue?: string
70
+ renameInvalid?: boolean
71
+ renameLabel?: string
56
72
  }>()
57
73
 
58
74
  const emit = defineEmits<{
@@ -60,6 +76,15 @@ const emit = defineEmits<{
60
76
  (e: "toggle", node: FileNode): void
61
77
  (e: "focus", node: FileNode): void
62
78
  (e: "check", node: FileNode, value: boolean): void
79
+ (e: "pick", node: FileNode, mode: "toggle" | "range"): void
80
+ (e: "move-start", node: FileNode, event: DragEvent): void
81
+ (e: "move-over", node: FileNode, event: DragEvent): void
82
+ (e: "move-leave", node: FileNode): void
83
+ (e: "move-drop", node: FileNode): void
84
+ (e: "move-end"): void
85
+ (e: "rename-input", value: string): void
86
+ (e: "rename-commit", blurred?: boolean): void
87
+ (e: "rename-cancel"): void
63
88
  }>()
64
89
 
65
90
  // Declared explicitly: the component renders itself, so an inferred slot type
@@ -71,7 +96,8 @@ defineSlots<{
71
96
  const isDir = computed(() => props.node.kind === "dir")
72
97
  const isOpen = computed(() => isDir.value && props.expanded.has(props.node.id))
73
98
  const isLoading = computed(() => props.loading.has(props.node.id))
74
- const isSelected = computed(() => props.selectedId === props.node.id)
99
+ const isSelected = computed(() => props.selectedId === props.node.id || !!props.selectedIds?.has(props.node.id))
100
+ const isRenaming = computed(() => props.renamingId === props.node.id)
75
101
  const isFocused = computed(() => props.focusedId === props.node.id)
76
102
 
77
103
  // A directory with no `children` array hasn't been loaded yet — we can't know if
@@ -127,15 +153,50 @@ function rowDelay(index: number): string {
127
153
  return `${staggerDelay(index, 0, 18, 10)}ms`
128
154
  }
129
155
 
130
- function onActivate() {
156
+ function onActivate(event: MouseEvent) {
131
157
  if (props.node.disabled) return
132
158
  emit("focus", props.node)
159
+ if (props.multiple && (event.shiftKey || event.ctrlKey || event.metaKey)) {
160
+ emit("pick", props.node, event.shiftKey ? "range" : "toggle")
161
+ return
162
+ }
133
163
  // A directory row toggles; a file row selects. Directories still emit select
134
164
  // so callers can drive a details panel off the highlighted entry.
135
165
  emit("select", props.node)
136
166
  if (isDir.value) emit("toggle", props.node)
137
167
  }
138
168
 
169
+ const renameField = ref<HTMLInputElement | null>(null)
170
+
171
+ // Opens on the name without its extension, so typing replaces only that.
172
+ watch(
173
+ isRenaming,
174
+ async (renaming) => {
175
+ if (!renaming) return
176
+ await nextTick()
177
+ renameField.value?.focus()
178
+ renameField.value?.setSelectionRange(0, renameSelectionEnd(props.node))
179
+ },
180
+ { immediate: true },
181
+ )
182
+
183
+ // The field keeps every key to itself: the tree would take the arrows and Home,
184
+ // and a dialog around it would close on the Escape that cancels the rename.
185
+ function onRenameKey(event: KeyboardEvent) {
186
+ event.stopPropagation()
187
+ if (event.key === "Enter") emit("rename-commit", false)
188
+ else if (event.key === "Escape") emit("rename-cancel")
189
+ }
190
+
191
+ function onMoveStart(event: DragEvent) {
192
+ if (event.dataTransfer) {
193
+ event.dataTransfer.effectAllowed = "move"
194
+ // Firefox starts no drag without data.
195
+ event.dataTransfer.setData("text/plain", props.node.name)
196
+ }
197
+ emit("move-start", props.node, event)
198
+ }
199
+
139
200
  // A node is a list row whose min-width the consumer may need to release when the tree scrolls horizontally.
140
201
  const { class: rootClass, attrs: rest } = useMergedAttrs(
141
202
  "min-w-0",
@@ -151,6 +212,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
151
212
  :aria-selected="isSelected"
152
213
  :aria-expanded="canExpand ? isOpen : undefined"
153
214
  :aria-disabled="node.disabled || undefined"
215
+ :aria-setsize="flat ? setSize : undefined"
216
+ :aria-posinset="flat ? posInSet : undefined"
154
217
  >
155
218
  <!-- Passthrough when the node has no menu, so the row keeps the native one.
156
219
  Headed by the entry's own name and icon: in a column of look-alike
@@ -166,6 +229,8 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
166
229
  <div
167
230
  :data-node-id="node.id"
168
231
  :tabindex="isFocused ? 0 : -1"
232
+ :draggable="movable && !node.disabled && !isRenaming ? 'true' : undefined"
233
+ :data-drop-target="dropTargetId === node.id ? '' : undefined"
169
234
  class="group/row relative flex min-w-0 cursor-pointer select-none items-center gap-1.5 rounded-control py-1 pr-2 text-sm outline-none transition-colors duration-[var(--duration-fast)] focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring"
170
235
  :class="[
171
236
  node.disabled
@@ -173,9 +238,15 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
173
238
  : isSelected
174
239
  ? 'bg-brand-soft text-ink'
175
240
  : 'text-muted hover:bg-surface-soft hover:text-ink',
241
+ dropTargetId === node.id ? 'ring-2 ring-inset ring-brand' : '',
176
242
  ]"
177
243
  :style="{ paddingLeft: `${depth * 14 + 6}px` }"
178
244
  @click.stop="onActivate"
245
+ @dragstart="onMoveStart"
246
+ @dragover="emit('move-over', node, $event)"
247
+ @dragleave="emit('move-leave', node)"
248
+ @drop.prevent="emit('move-drop', node)"
249
+ @dragend="emit('move-end')"
179
250
  >
180
251
  <!-- Chevron sits in a fixed-width slot so names line up whether or not
181
252
  the row can expand. Leaves get the same gutter, left empty.
@@ -228,7 +299,20 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
228
299
  />
229
300
 
230
301
  <span class="min-w-0 flex-1 shrink-[2] truncate">
231
- <slot name="row" :node="node" :depth="depth" :expanded="isOpen" :selected="isSelected">
302
+ <input
303
+ v-if="isRenaming"
304
+ ref="renameField"
305
+ class="w-full min-w-0 rounded-sm border bg-surface-soft px-1 text-sm text-ink outline-none"
306
+ :class="renameInvalid ? 'border-danger' : 'border-line-strong'"
307
+ :value="renameValue"
308
+ :aria-label="renameLabel"
309
+ :aria-invalid="renameInvalid || undefined"
310
+ @click.stop
311
+ @keydown="onRenameKey"
312
+ @input="emit('rename-input', ($event.target as HTMLInputElement).value)"
313
+ @blur="emit('rename-commit', true)"
314
+ >
315
+ <slot v-else name="row" :node="node" :depth="depth" :expanded="isOpen" :selected="isSelected">
232
316
  {{ node.name }}
233
317
  </slot>
234
318
  </span>
@@ -260,7 +344,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
260
344
 
261
345
  <!-- The branch folds open and shut (LpCollapse); a toggle mid-way reverses
262
346
  from where it is. Rows inside stagger themselves in. -->
263
- <LpCollapse :open="isOpen && hasChildren">
347
+ <LpCollapse v-if="!flat" :open="isOpen && hasChildren">
264
348
  <ul role="group" class="flex min-w-0 flex-col overflow-hidden">
265
349
  <LpFileTreeNode
266
350
  v-for="(child, i) in children"
@@ -280,10 +364,27 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
280
364
  :stats="stats"
281
365
  :show-size="showSize"
282
366
  :show-modified="showModified"
367
+ :selected-ids="selectedIds"
368
+ :multiple="multiple"
369
+ :movable="movable"
370
+ :drop-target-id="dropTargetId"
371
+ :renaming-id="renamingId"
372
+ :rename-value="renameValue"
373
+ :rename-invalid="renameInvalid"
374
+ :rename-label="renameLabel"
283
375
  @select="emit('select', $event)"
284
376
  @toggle="emit('toggle', $event)"
285
377
  @focus="emit('focus', $event)"
286
378
  @check="(n, v) => emit('check', n, v)"
379
+ @pick="(n, mode) => emit('pick', n, mode)"
380
+ @move-start="(n, e) => emit('move-start', n, e)"
381
+ @move-over="(n, e) => emit('move-over', n, e)"
382
+ @move-leave="emit('move-leave', $event)"
383
+ @move-drop="emit('move-drop', $event)"
384
+ @move-end="emit('move-end')"
385
+ @rename-input="emit('rename-input', $event)"
386
+ @rename-commit="emit('rename-commit', $event)"
387
+ @rename-cancel="emit('rename-cancel')"
287
388
  >
288
389
  <template #row="slotProps">
289
390
  <slot name="row" v-bind="slotProps" />
@@ -81,7 +81,7 @@ const { class: rootClass, attrs: rest } = useMergedAttrs(
81
81
  const control = ref<HTMLElement | null>(null)
82
82
  const LABELABLE = "input, button, select, textarea, meter, output, progress"
83
83
  function focusControl() {
84
- const target = document.getElementById(id.value)
84
+ const target = control.value?.ownerDocument.getElementById(id.value)
85
85
  if (target?.matches(LABELABLE)) return
86
86
  const first = control.value?.querySelector<HTMLElement>(
87
87
  'input:not([type="hidden"]):not([disabled]), button:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"]), [contenteditable="true"]',
@@ -59,24 +59,41 @@ const { class: frameClass, attrs: rest } = useMergedAttrs(
59
59
  )
60
60
 
61
61
  const cleanups: (() => void)[] = []
62
+ const LAYERS = "[data-dismissable-layer], [role=dialog], [role=menu], [role=listbox]"
63
+
64
+ /* What can change on a stylesheet that is already in the page: a theme swapped by `href`, one turned off. */
65
+ const SHEET_ATTRIBUTES = ["href", "rel", "media", "disabled", "crossorigin", "integrity", "title", "type"]
62
66
 
63
67
  function mirrorHead(doc: Document) {
64
- const copies = new Map<Node, Node>()
68
+ const copies = new Map<Node, Element>()
69
+ const isSheet = (node: Node) => node instanceof HTMLStyleElement || (node instanceof HTMLLinkElement && node.rel === "stylesheet")
65
70
  const copy = (node: Node) => {
66
- if (!(node instanceof HTMLStyleElement || (node instanceof HTMLLinkElement && node.rel === "stylesheet"))) return
67
- const clone = doc.importNode(node, true)
71
+ if (!isSheet(node) || copies.has(node)) return
72
+ const clone = doc.importNode(node as Element, true)
68
73
  copies.set(node, clone)
69
74
  doc.head.appendChild(clone)
70
75
  }
76
+ const drop = (node: Node) => {
77
+ copies.get(node)?.remove()
78
+ copies.delete(node)
79
+ }
80
+ const syncAttribute = (node: Element, name: string) => {
81
+ if (!isSheet(node)) return drop(node)
82
+ if (!copies.has(node)) return copy(node)
83
+ const value = node.getAttribute(name)
84
+ if (value === null) copies.get(node)!.removeAttribute(name)
85
+ else copies.get(node)!.setAttribute(name, value)
86
+ }
71
87
  for (const node of document.head.childNodes) copy(node)
72
88
  const observer = new MutationObserver((records) => {
73
89
  for (const record of records) {
74
90
  if (record.type === "childList") {
75
91
  for (const node of record.addedNodes) copy(node)
76
- for (const node of record.removedNodes) {
77
- copies.get(node)?.parentNode?.removeChild(copies.get(node)!)
78
- copies.delete(node)
79
- }
92
+ for (const node of record.removedNodes) drop(node)
93
+ continue
94
+ }
95
+ if (record.type === "attributes") {
96
+ syncAttribute(record.target as Element, record.attributeName!)
80
97
  continue
81
98
  }
82
99
  // A style rewritten in place (a hot reload) is copied again.
@@ -84,7 +101,7 @@ function mirrorHead(doc: Document) {
84
101
  if (style instanceof HTMLStyleElement && copies.has(style)) copies.get(style)!.textContent = style.textContent
85
102
  }
86
103
  })
87
- observer.observe(document.head, { childList: true, subtree: true, characterData: true })
104
+ observer.observe(document.head, { childList: true, subtree: true, characterData: true, attributes: true, attributeFilter: SHEET_ATTRIBUTES })
88
105
  cleanups.push(() => observer.disconnect())
89
106
  }
90
107
 
@@ -118,7 +135,9 @@ function liftForeignLocks(doc: Document) {
118
135
  }
119
136
  }
120
137
  const observer = new MutationObserver(lift)
121
- observer.observe(document.body, { attributes: true, attributeFilter: ["style"] })
138
+ // The child list too: when the page's own layer goes while the frame's stays,
139
+ // reka keeps the lock and the style never changes to say so.
140
+ observer.observe(document.body, { attributes: true, attributeFilter: ["style"], childList: true, subtree: true })
122
141
  cleanups.push(() => observer.disconnect())
123
142
  }
124
143
 
@@ -143,12 +162,13 @@ function setup() {
143
162
  let pending = 0
144
163
  const measure = () => {
145
164
  pending = 0
146
- let bottom = content.offsetHeight
165
+ // scrollHeight as well: what is positioned inside overflows the box without growing it.
166
+ let bottom = Math.max(content.offsetHeight, content.scrollHeight)
147
167
  for (const child of doc.body.children) {
148
168
  if (child === content) continue
149
- for (const layer of child.querySelectorAll("[data-dismissable-layer], [role=dialog], [role=menu], [role=listbox]")) {
150
- bottom = Math.max(bottom, Math.ceil(layer.getBoundingClientRect().bottom + 8))
151
- }
169
+ // The portal's root can be the layer itself, which querySelectorAll skips.
170
+ const layers = [...(child.matches(LAYERS) ? [child] : []), ...child.querySelectorAll(LAYERS)]
171
+ for (const layer of layers) bottom = Math.max(bottom, Math.ceil(layer.getBoundingClientRect().bottom + 8))
152
172
  }
153
173
  contentHeight.value = bottom
154
174
  }
@@ -94,7 +94,11 @@ const guardOutside = useOutsideGuard()
94
94
  * the link under it.
95
95
  */
96
96
  const SLOP = 8
97
+ /* A long press may produce no click at all; past this the next click is the user's own. */
98
+ const CLICK_AFTER_RELEASE_MS = 350
97
99
  let holdTimer = 0
100
+ /* The finger the hold belongs to: a second one must not move or end it. */
101
+ let holdPointer: number | null = null
98
102
  let start = { x: 0, y: 0 }
99
103
  let held = false
100
104
 
@@ -103,9 +107,28 @@ function cancelHold() {
103
107
  holdTimer = 0
104
108
  }
105
109
 
110
+ function onPointerUp(event: PointerEvent) {
111
+ if (holdPointer !== null && event.pointerId !== holdPointer) return
112
+ holdPointer = null
113
+ cancelHold()
114
+ if (held) window.setTimeout(() => (held = false), CLICK_AFTER_RELEASE_MS)
115
+ }
116
+
117
+ // A cancelled press produces no click, so there is nothing left to swallow.
118
+ function onPointerCancel(event?: PointerEvent) {
119
+ if (event && holdPointer !== null && event.pointerId !== holdPointer) return
120
+ holdPointer = null
121
+ cancelHold()
122
+ held = false
123
+ }
124
+
106
125
  function onPointerDown(event: PointerEvent) {
107
- if (event.pointerType !== "touch" || props.touch !== "hold" || props.disabled) return
126
+ // Any new press starts over: on a hybrid laptop the mouse click after a hold
127
+ // must not be taken for that hold's own click.
128
+ if (holdTimer && event.pointerId !== holdPointer) return
108
129
  held = false
130
+ if (event.pointerType !== "touch" || props.touch !== "hold" || props.disabled) return
131
+ holdPointer = event.pointerId
109
132
  start = { x: event.clientX, y: event.clientY }
110
133
  cancelHold()
111
134
  holdTimer = window.setTimeout(() => {
@@ -116,7 +139,7 @@ function onPointerDown(event: PointerEvent) {
116
139
  }
117
140
 
118
141
  function onPointerMove(event: PointerEvent) {
119
- if (!holdTimer) return
142
+ if (!holdTimer || event.pointerId !== holdPointer) return
120
143
  if (Math.hypot(event.clientX - start.x, event.clientY - start.y) > SLOP) cancelHold()
121
144
  }
122
145
 
@@ -135,7 +158,9 @@ function onContextMenu(event: Event) {
135
158
  watch(
136
159
  () => props.disabled,
137
160
  (off) => {
138
- if (off) open.value = false
161
+ if (!off) return
162
+ onPointerCancel()
163
+ open.value = false
139
164
  },
140
165
  )
141
166
 
@@ -150,8 +175,8 @@ onBeforeUnmount(cancelHold)
150
175
  :class="touch === 'hold' ? '[-webkit-touch-callout:none]' : undefined"
151
176
  @pointerdown="onPointerDown"
152
177
  @pointermove="onPointerMove"
153
- @pointerup="cancelHold"
154
- @pointercancel="cancelHold"
178
+ @pointerup="onPointerUp"
179
+ @pointercancel="onPointerCancel"
155
180
  @click.capture="onClickCapture"
156
181
  @contextmenu="onContextMenu"
157
182
  >
@@ -14,12 +14,14 @@
14
14
  */
15
15
  import { computed, watchEffect } from "vue"
16
16
  import { Icon, getIcon } from "@iconify/vue"
17
- import { iconsVersion, requestIcon } from "../icons"
17
+ import { failedIcons, iconsVersion, requestIcon } from "../icons"
18
18
 
19
19
  const props = defineProps<{
20
20
  /** iconify name, e.g. "lucide:check". Bare names assume the lucide set. */
21
21
  name: string
22
22
  size?: number | string
23
+ /** An icon to show if `name` is unknown or its chunk fails to load; it must already be registered. */
24
+ fallback?: string
23
25
  }>()
24
26
 
25
27
  function resolve(name: string): string {
@@ -29,7 +31,9 @@ function resolve(name: string): string {
29
31
  const fullName = computed(() => resolve(props.name))
30
32
  const data = computed(() => {
31
33
  void iconsVersion.value
32
- return getIcon(fullName.value)
34
+ const icon = getIcon(fullName.value)
35
+ if (icon || !props.fallback || !failedIcons.has(fullName.value)) return icon
36
+ return getIcon(resolve(props.fallback))
33
37
  })
34
38
  const lucide = computed(() => fullName.value.startsWith("lucide:"))
35
39
 
@@ -17,6 +17,7 @@ export default { inheritAttrs: false }
17
17
  * `identicon()` in identicon.ts, which a canvas, a favicon or a notification
18
18
  * icon can call directly.
19
19
  */
20
+ import { clamp } from "../composables/clamp"
20
21
  import { computed } from "vue"
21
22
  import { identicon, identiconRects } from "./identicon"
22
23
  import { useMergedAttrs } from "../composables/useMergedClass"
@@ -43,7 +44,7 @@ const props = withDefaults(
43
44
 
44
45
  const icon = computed(() => identicon(props.seed, { grid: props.grid }))
45
46
  const rects = computed(() => identiconRects(icon.value.cells))
46
- const pad = computed(() => props.grid * Math.max(0, Math.min(0.4, props.padding)))
47
+ const pad = computed(() => props.grid * clamp(props.padding, 0, 0.4))
47
48
  const view = computed(() => props.grid + pad.value * 2)
48
49
  const wash = computed(() => `color-mix(in oklab, ${icon.value.color} 16%, var(--color-surface-soft))`)
49
50
 
@@ -175,6 +175,8 @@ watch(
175
175
  () => props.file,
176
176
  async (file) => {
177
177
  revoke()
178
+ // Decoding needs the browser; on the server the editor renders empty.
179
+ if (typeof document === "undefined") return
178
180
  rotation.value = 0
179
181
  zoom.reset()
180
182
  failed.value = false
@@ -278,7 +280,7 @@ async function decode(
278
280
  const sourceSize = computed(() => {
279
281
  const s = source.value
280
282
  if (!s) return null
281
- return s instanceof HTMLImageElement
283
+ return "naturalWidth" in s
282
284
  ? { width: s.naturalWidth, height: s.naturalHeight }
283
285
  : { width: s.width, height: s.height }
284
286
  })
@@ -287,7 +289,8 @@ function revoke() {
287
289
  if (ownedUrl) URL.revokeObjectURL(ownedUrl)
288
290
  ownedUrl = ""
289
291
  objectUrl.value = ""
290
- if (source.value instanceof ImageBitmap) source.value.close()
292
+ // By what it can do: the class is absent on the server and differs per window.
293
+ if (source.value && "close" in source.value) source.value.close()
291
294
  source.value = null
292
295
  }
293
296
 
@@ -3,10 +3,11 @@ export default { inheritAttrs: false }
3
3
  </script>
4
4
 
5
5
  <script setup lang="ts">
6
+ import { CONTROL_SIZE } from "./controlSize"
6
7
  import { usePaletteControl, type PaletteControlOptions } from "../composables/usePaletteCommands"
7
8
  import { tv, type VariantProps } from "tailwind-variants"
8
9
  import { computed, ref, useAttrs, useSlots } from "vue"
9
- import { useFieldControl } from "../composables/useField"
10
+ import { fieldWrapperBinds, isAttrOn, mergeDescribedBy, useFieldControl } from "../composables/useField"
10
11
  import { useLabels } from "../composables/useLpConfig"
11
12
  import { useInputFilter } from "../composables/useInputFilter"
12
13
  import { DEFAULT_MASK_TOKENS, useInputMask, type MaskSpec, type MaskTokens } from "../composables/useInputMask"
@@ -29,11 +30,7 @@ const shell = tv({
29
30
  "has-[:disabled]:cursor-not-allowed has-[:disabled]:opacity-55",
30
31
  ],
31
32
  variants: {
32
- size: {
33
- sm: "h-(--size-control-sm) text-xs",
34
- md: "h-(--size-control-md) text-sm",
35
- lg: "h-(--size-control-lg) text-sm",
36
- },
33
+ size: CONTROL_SIZE,
37
34
  invalid: {
38
35
  true: "border-danger focus-within:border-danger focus-within:ring-danger-soft",
39
36
  },
@@ -113,22 +110,24 @@ const shown = computed(() => (masking.active.value ? masking.format(props.modelV
113
110
  function onBefore(event: InputEvent): void {
114
111
  onBeforeInput(event)
115
112
  if (!event.defaultPrevented) masking.onBeforeInput(event)
116
- if (event.defaultPrevented && masking.active.value && event.target instanceof HTMLInputElement) {
117
- emit("update:modelValue", event.target.value)
113
+ if (event.defaultPrevented && masking.active.value) {
114
+ emit("update:modelValue", (event.target as HTMLInputElement).value)
118
115
  }
119
116
  }
120
117
 
121
118
  function onInputEvent(event: Event): void {
119
+ // `restrict` first: it sees what was typed, and the mask then lays out what
120
+ // is left, putting back any literal the clean-up took along.
121
+ filterInput(event)
122
122
  if (masking.active.value) masking.onInput(event)
123
- else filterInput(event)
124
123
  emit("update:modelValue", (event.target as HTMLInputElement).value)
125
124
  }
126
125
 
127
126
  function onComposed(event: CompositionEvent): void {
128
- if (masking.active.value) {
129
- masking.onCompositionEnd(event)
130
- emit("update:modelValue", (event.target as HTMLInputElement).value)
131
- } else onCompositionEnd(event)
127
+ onCompositionEnd(event)
128
+ if (!masking.active.value) return
129
+ masking.onCompositionEnd(event)
130
+ emit("update:modelValue", (event.target as HTMLInputElement).value)
132
131
  }
133
132
 
134
133
  // Pattern failure folds into the same invalid state as the explicit prop/error.
@@ -150,7 +149,7 @@ const field = useFieldControl(() => ({
150
149
  disabled: props.disabled,
151
150
  }))
152
151
  const text = useLabels("input", { clear: "Clear" }, () => props.labels)
153
- const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && (attrs.readonly === undefined || attrs.readonly === false))
152
+ const showClear = computed(() => props.clearable && !!props.modelValue && !field.value.disabled && !isAttrOn(attrs.readonly) && !isAttrOn(attrs.readOnly))
154
153
  const isInvalidState = computed(() => field.value.invalid)
155
154
  const shellClass = computed(() =>
156
155
  shell({ size: props.size, invalid: isInvalidState.value }),
@@ -183,14 +182,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
183
182
 
184
183
  <template>
185
184
  <FieldWrapper
186
- :wrapped="hasField"
187
- :id="field.id"
188
- :label="label"
189
- :hint="hint"
190
- :error="error"
191
- :required="required"
192
- :class="attrs.class"
193
- :style="attrs.style"
185
+ v-bind="fieldWrapperBinds(hasField, field, $props, attrs)"
194
186
  >
195
187
  <div
196
188
  data-lp-ring-owner
@@ -210,7 +202,7 @@ usePaletteControl({ label: () => props.label, disabled: () => field.value.disabl
210
202
  :disabled="field.disabled"
211
203
  :required="field.required || undefined"
212
204
  :aria-invalid="isInvalidState || undefined"
213
- :aria-describedby="field.describedBy"
205
+ :aria-describedby="mergeDescribedBy(attrs['aria-describedby'], field.describedBy)"
214
206
  :class="[
215
207
  'lp-autofill min-w-0 flex-1 self-stretch bg-transparent outline-none placeholder:text-muted',
216
208
  clearable && '[&::-webkit-search-cancel-button]:hidden',