@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,19 +1,20 @@
1
- import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createBlock, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, TransitionGroup, unref, withModifiers, nextTick } from "vue";
1
+ import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, createTextVNode, toDisplayString, createCommentVNode, Fragment, renderList, createBlock, createElementVNode, Transition, renderSlot, mergeProps, normalizeStyle, withModifiers, TransitionGroup, unref, nextTick } from "vue";
2
2
  import { usePaletteScope, suppressPaletteDiscovery, usePaletteCommands } from "../composables/usePaletteCommands.js";
3
3
  import { menuPaletteCommands } from "./commandPalette.js";
4
- import { _ as _sfc_main$1 } from "../chunks/LpDataList-Jxyl9H5w.js";
5
- import { _ as _sfc_main$9 } from "../chunks/LpCheckbox-Cs4SHaHX.js";
6
- import { _ as _sfc_main$8 } from "../chunks/LpContextMenu-rx2tCjwk.js";
7
- import { _ as _sfc_main$d } from "../chunks/LpEmptyState-EQHiRYhG.js";
8
- import { _ as _sfc_main$5 } from "../chunks/LpBadge-wUYLN4U9.js";
9
- import { _ as _sfc_main$3 } from "../chunks/LpIcon--5WSb3jJ.js";
4
+ import { _ as _sfc_main$1 } from "../chunks/LpDataList-CaVfsozH.js";
5
+ import { _ as _sfc_main$9 } from "../chunks/LpCheckbox-D6RuDW4X.js";
6
+ import { _ as _sfc_main$8 } from "../chunks/LpContextMenu-Bx_IhQDS.js";
7
+ import { _ as _sfc_main$e } from "../chunks/LpEditable-DVT0Rh8F.js";
8
+ import { _ as _sfc_main$d } from "../chunks/LpEmptyState-DurPF001.js";
9
+ import { _ as _sfc_main$5 } from "../chunks/LpBadge-D5QQdDQ_.js";
10
+ import { _ as _sfc_main$3 } from "../chunks/LpIcon-C6JpQ5td.js";
10
11
  import { _ as _sfc_main$c } from "../chunks/LpSkeleton-BB6XIV-w.js";
11
- import { _ as _sfc_main$e } from "../chunks/LpPagination-BIIiYHXR.js";
12
- import { _ as _sfc_main$a } from "../chunks/LpPopover-DmZ3wUtP.js";
13
- import { _ as _sfc_main$7 } from "../chunks/LpScrollArea-MyEnVB_5.js";
12
+ import { _ as _sfc_main$f } from "../chunks/LpPagination-snQ020xQ.js";
13
+ import { _ as _sfc_main$a } from "../chunks/LpPopover-BQSuxtai.js";
14
+ import { _ as _sfc_main$7 } from "../chunks/LpScrollArea-CqvwfZs2.js";
14
15
  import { _ as _sfc_main$6 } from "../chunks/LpRollingText-B54Pje7P.js";
15
- import { _ as _sfc_main$4 } from "../chunks/LpShift-CCq7dofl.js";
16
- import { _ as _sfc_main$b } from "../chunks/LpTableFilter-CiVBpaq0.js";
16
+ import { _ as _sfc_main$4 } from "../chunks/LpShift-DAgS_d2x.js";
17
+ import { _ as _sfc_main$b } from "../chunks/LpTableFilter-B_XMOeAh.js";
17
18
  import { useKitStorage } from "../composables/usePersisted.js";
18
19
  import { useAsyncTask } from "../composables/useAsyncTask.js";
19
20
  import { useTableFacets } from "./tableFacets.js";
@@ -22,13 +23,16 @@ import { usePaintSelect } from "../composables/usePaintSelect.js";
22
23
  import { useRovingFocus } from "../composables/useRovingFocus.js";
23
24
  import { useLabels } from "../composables/useLpConfig.js";
24
25
  import { useResizeObserver } from "../composables/useResizeObserver.js";
25
- import { compareValues } from "./tableSort.js";
26
- import { _ as _sfc_main$2 } from "../chunks/LpButton-CFb44IjC.js";
26
+ import { orderPinned, pinOffsets, groupRows, rowWindow, presetHidden, sortByKeys, nextSorts, clampColumnWidth } from "./tableFeatures.js";
27
+ import { devWarn } from "../composables/devWarn.js";
28
+ import { startPointerDrag } from "../composables/pointerDrag.js";
29
+ import { isHTMLElement, nodeWindow } from "../composables/realm.js";
30
+ import { _ as _sfc_main$2 } from "../chunks/LpButton-DSHioIfD.js";
27
31
  import { toCsv, downloadFile, fileStem } from "./exportData.js";
28
32
  import { toHiddenSets, sameHidden, summarizeShown, parseTableState, mergeRestored, serializeTableState, fromHiddenSets } from "./tableFilter.js";
29
33
  import { resolveRowMenu } from "./tableRowMenu.js";
30
34
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
31
- import '../assets/LpTable-Bv-EcQs7.css';const _hoisted_1 = {
35
+ import '../assets/LpTable-CCk0ZHo7.css';const _hoisted_1 = {
32
36
  key: 0,
33
37
  class: "flex justify-end"
34
38
  };
@@ -52,22 +56,47 @@ const _hoisted_8 = {
52
56
  class: "flex items-center gap-2"
53
57
  };
54
58
  const _hoisted_9 = { class: "hidden sm:inline" };
55
- const _hoisted_10 = { class: "border-b border-line bg-surface-soft" };
56
- const _hoisted_11 = ["inert"];
57
- const _hoisted_12 = ["aria-sort"];
58
- const _hoisted_13 = ["onClick"];
59
- const _hoisted_14 = ["aria-label", "data-lp-filter"];
59
+ const _hoisted_10 = ["aria-rowcount"];
60
+ const _hoisted_11 = { class: "border-b border-line bg-surface-soft" };
61
+ const _hoisted_12 = ["inert"];
62
+ const _hoisted_13 = ["data-lp-col", "aria-sort"];
63
+ const _hoisted_14 = ["onClick"];
60
64
  const _hoisted_15 = {
65
+ key: 1,
66
+ class: "tabular-nums text-brand"
67
+ };
68
+ const _hoisted_16 = ["aria-label", "data-lp-filter"];
69
+ const _hoisted_17 = ["aria-label", "aria-valuenow", "data-lp-resize", "onPointerdown", "onDblclick", "onKeydown"];
70
+ const _hoisted_18 = {
61
71
  key: 0,
62
72
  class: "sr-only"
63
73
  };
64
- const _hoisted_16 = {
74
+ const _hoisted_19 = {
65
75
  key: "lp-table-empty",
66
76
  class: "lp-row-empty"
67
77
  };
68
- const _hoisted_17 = ["colspan"];
69
- const _hoisted_18 = ["onContextmenu", "data-paint-key", "data-lp-context-row", "onClick", "onPointerdown"];
70
- const _hoisted_19 = ["onPointerdown"];
78
+ const _hoisted_20 = ["colspan"];
79
+ const _hoisted_21 = {
80
+ key: "lp-virtual-before",
81
+ "aria-hidden": "true"
82
+ };
83
+ const _hoisted_22 = ["colspan"];
84
+ const _hoisted_23 = ["colspan"];
85
+ const _hoisted_24 = ["aria-expanded", "aria-label", "onClick"];
86
+ const _hoisted_25 = {
87
+ key: 1,
88
+ class: "border-b border-line/60 last:border-0",
89
+ "data-lp-row-detail": ""
90
+ };
91
+ const _hoisted_26 = ["colspan"];
92
+ const _hoisted_27 = ["onContextmenu", "aria-rowindex", "data-paint-key", "data-lp-context-row", "onClick", "onPointerdown"];
93
+ const _hoisted_28 = ["aria-expanded", "aria-label", "onClick"];
94
+ const _hoisted_29 = ["onPointerdown"];
95
+ const _hoisted_30 = {
96
+ key: "lp-virtual-after",
97
+ "aria-hidden": "true"
98
+ };
99
+ const _hoisted_31 = ["colspan"];
71
100
  const __default__ = { inheritAttrs: false };
72
101
  const _sfc_main = /* @__PURE__ */ defineComponent({
73
102
  ...__default__,
@@ -105,9 +134,23 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
105
134
  density: { default: "comfortable" },
106
135
  summary: { type: Boolean, default: false },
107
136
  persist: {},
108
- allMatching: { type: Boolean, default: false }
137
+ allMatching: { type: Boolean, default: false },
138
+ selectionToken: { type: Boolean },
139
+ multiSort: { type: Boolean },
140
+ sorts: { default: void 0 },
141
+ resizableColumns: { type: Boolean },
142
+ columnWidths: { default: void 0 },
143
+ columnPresets: {},
144
+ columnPreset: { default: void 0 },
145
+ groupBy: { type: [String, Function], default: void 0 },
146
+ groupLabel: {},
147
+ collapsedGroups: { default: void 0 },
148
+ expandable: { type: [Boolean, Function] },
149
+ expanded: { default: void 0 },
150
+ virtualRowHeight: { default: void 0 },
151
+ virtualOverscan: { default: 6 }
109
152
  },
110
- emits: ["update:selected", "update:sort", "update:filters", "resetFilters", "update:allMatching", "rowClick"],
153
+ emits: ["update:selected", "update:sort", "update:filters", "resetFilters", "update:allMatching", "update:selectionToken", "update:sorts", "update:columnWidths", "update:columnPreset", "update:collapsedGroups", "update:expanded", "cellEdit", "rowClick"],
111
154
  setup(__props, { expose: __expose, emit: __emit }) {
112
155
  const props = __props;
113
156
  const labelSet = useLabels(
@@ -145,7 +188,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
145
188
  clearSelection: "Clear selection",
146
189
  pageSelected: "All {count} on this page are selected.",
147
190
  selectAllMatching: "Select all {total}",
148
- allMatchingSelected: "All {total} are selected."
191
+ allMatchingSelected: "All {total} are selected.",
192
+ columnPresets: "Column presets",
193
+ resizeColumn: "Resize {column}",
194
+ expandRow: "Expand row",
195
+ collapseRow: "Collapse row",
196
+ groupCount: "{label} ({count})",
197
+ expandGroup: "Expand {label}",
198
+ collapseGroup: "Collapse {label}"
149
199
  },
150
200
  () => props.labels
151
201
  );
@@ -184,10 +234,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
184
234
  }
185
235
  function openRowMenu(event) {
186
236
  const button = event.currentTarget;
187
- if (!(button instanceof HTMLElement)) return;
237
+ if (!isHTMLElement(button)) return;
188
238
  const rect = button.getBoundingClientRect();
239
+ const win = nodeWindow(button);
189
240
  button.dispatchEvent(
190
- new MouseEvent("contextmenu", { bubbles: true, cancelable: true, clientX: rect.left, clientY: rect.bottom })
241
+ new win.MouseEvent("contextmenu", { bubbles: true, cancelable: true, clientX: rect.left, clientY: rect.bottom })
191
242
  );
192
243
  }
193
244
  const rowMenuFor = computed(
@@ -206,7 +257,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
206
257
  return [...row, { ...table[0], separatorBefore: true }, ...table.slice(1)];
207
258
  });
208
259
  const ownSort = ref(null);
209
- const activeSort = computed(() => props.sort !== void 0 ? props.sort : ownSort.value);
260
+ const ownSorts = ref([]);
261
+ const activeSort = computed(() => {
262
+ if (props.multiSort) return (props.sorts ?? ownSorts.value)[0] ?? null;
263
+ return props.sort !== void 0 ? props.sort : ownSort.value;
264
+ });
265
+ const sortList = computed(() => {
266
+ if (props.multiSort) return props.sorts ?? ownSorts.value;
267
+ return activeSort.value ? [activeSort.value] : [];
268
+ });
269
+ const sortOf = (col) => sortList.value.find((sort) => sort.key === col.key);
210
270
  const loaded = shallowRef([]);
211
271
  const total = ref(0);
212
272
  const facets = ref({});
@@ -216,6 +276,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
216
276
  const busy = computed(() => props.loading || task.pending.value);
217
277
  const sourceRows = computed(() => props.load ? loaded.value : props.rows);
218
278
  const sourceIndex = computed(() => new Map(sourceRows.value.map((row, i) => [row, i])));
279
+ let warnedRowKey = false;
280
+ watch(sourceRows, () => {
281
+ if (warnedRowKey || props.rowKey || !props.selected.length) return;
282
+ warnedRowKey = true;
283
+ devWarn("LpTable: rows were replaced while some are selected, and without `rowKey` the selection now points at positions, not rows. Set `rowKey`.");
284
+ });
219
285
  const frameEl = ref(null);
220
286
  const floor = ref(0);
221
287
  async function holdHeight() {
@@ -237,12 +303,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
237
303
  emit("update:filters", fromHiddenSets(next));
238
304
  }
239
305
  const animating = ref(false);
306
+ const MOTION_WINDOW_MS = 600;
240
307
  let motionTimer;
241
308
  function withMotion(change) {
242
309
  if (!props.load) {
243
310
  animating.value = true;
244
311
  if (motionTimer) clearTimeout(motionTimer);
245
- motionTimer = setTimeout(() => animating.value = false, 600);
312
+ motionTimer = setTimeout(() => animating.value = false, MOTION_WINDOW_MS);
246
313
  }
247
314
  change();
248
315
  }
@@ -259,6 +326,89 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
259
326
  (c) => !hiddenColumns.value.has(c.key) && !(c.hideBelow && tableWidth.value < c.hideBelow)
260
327
  )
261
328
  );
329
+ const shownColumns = computed(() => orderPinned(visibleColumns.value));
330
+ const RESIZE_STEP_PX = 16;
331
+ const UNSET_COLUMN_PX = 120;
332
+ const TICK_COLUMN_WIDTH = "3.25rem";
333
+ const EXPAND_COLUMN_WIDTH = "2.5rem";
334
+ const ownWidths = ref({});
335
+ const widths = computed(() => props.columnWidths ?? ownWidths.value);
336
+ const fixedLayout = computed(() => !!props.resizableColumns && Object.keys(widths.value).length > 0);
337
+ const tableStyle = computed(() => {
338
+ if (!fixedLayout.value) return void 0;
339
+ const sum = shownColumns.value.reduce((room, col) => room + (widths.value[col.key] ?? UNSET_COLUMN_PX), 0);
340
+ return { minWidth: `${sum}px` };
341
+ });
342
+ function writeWidths(next) {
343
+ ownWidths.value = next;
344
+ emit("update:columnWidths", next);
345
+ }
346
+ const canResize = (col) => !!props.resizableColumns && col.resizable !== false && !!col.label;
347
+ const measuredCol = (col) => props.resizableColumns || col.pin ? col.key : void 0;
348
+ function headerWidths() {
349
+ const measured = {};
350
+ for (const cell of frameEl.value?.querySelectorAll("th[data-lp-col]") ?? []) {
351
+ measured[cell.dataset.lpCol] = cell.offsetWidth;
352
+ }
353
+ return measured;
354
+ }
355
+ function setWidth(col, width) {
356
+ writeWidths({ ...widths.value, [col.key]: clampColumnWidth(width, col.minWidth, col.maxWidth) });
357
+ }
358
+ function clearWidth(col) {
359
+ const { [col.key]: _gone, ...rest } = widths.value;
360
+ writeWidths(rest);
361
+ }
362
+ function startResize(event, col) {
363
+ const handle = event.currentTarget;
364
+ if (!isHTMLElement(handle) || event.button !== 0) return;
365
+ event.stopPropagation();
366
+ const measured = headerWidths();
367
+ if (!fixedLayout.value) writeWidths(measured);
368
+ const from = measured[col.key] ?? handle.parentElement?.offsetWidth ?? 0;
369
+ const startX = event.clientX;
370
+ startPointerDrag(event, { move: (e) => setWidth(col, from + e.clientX - startX), end: () => {
371
+ } });
372
+ }
373
+ function onResizeKey(event, col) {
374
+ const step = event.key === "ArrowRight" ? RESIZE_STEP_PX : event.key === "ArrowLeft" ? -RESIZE_STEP_PX : 0;
375
+ if (!step) return;
376
+ event.preventDefault();
377
+ event.stopPropagation();
378
+ const measured = headerWidths();
379
+ if (!fixedLayout.value) writeWidths(measured);
380
+ setWidth(col, (widths.value[col.key] ?? measured[col.key] ?? UNSET_COLUMN_PX) + step);
381
+ }
382
+ const pinWidths = ref({});
383
+ const pinOffset = computed(() => pinOffsets(shownColumns.value, pinWidths.value));
384
+ function measurePins() {
385
+ if (shownColumns.value.some((col) => col.pin)) pinWidths.value = headerWidths();
386
+ }
387
+ watch([shownColumns, widths, tableWidth], measurePins, { flush: "post" });
388
+ onMounted(measurePins);
389
+ const PIN_HEAD = "sticky z-[11] bg-surface-soft";
390
+ const PIN_CELL = "sticky z-[1] bg-surface";
391
+ const pinStyle = (col) => col.pin ? { [col.pin]: `${pinOffset.value[col.key] ?? 0}px` } : void 0;
392
+ function headStyle(col) {
393
+ const width = props.resizableColumns ? widths.value[col.key] : void 0;
394
+ const size = width != null ? `${width}px` : col.width;
395
+ if (!size && !col.pin) return void 0;
396
+ return { ...size ? { width: size } : {}, ...pinStyle(col) };
397
+ }
398
+ const ownPreset = ref(null);
399
+ const activePreset = computed(() => props.columnPreset !== void 0 ? props.columnPreset : ownPreset.value);
400
+ function showPreset(id) {
401
+ const preset = props.columnPresets?.find((p) => p.id === id);
402
+ if (!preset) return;
403
+ hiddenColumns.value = presetHidden(preset, props.columns);
404
+ if (preset.widths && props.resizableColumns) writeWidths({ ...widths.value, ...preset.widths });
405
+ }
406
+ function choosePreset(id) {
407
+ ownPreset.value = id;
408
+ emit("update:columnPreset", id);
409
+ showPreset(id);
410
+ }
411
+ watch(() => props.columnPreset, showPreset, { immediate: true });
262
412
  const facetColumns = computed(() => props.columns.filter((col) => col.filterable).map((col) => col.key));
263
413
  const localFacets = useTableFacets({
264
414
  rows: () => props.load ? [] : props.rows,
@@ -322,6 +472,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
322
472
  if (next.has(key)) next.delete(key);
323
473
  else next.add(key);
324
474
  hiddenColumns.value = next;
475
+ if (activePreset.value != null) {
476
+ ownPreset.value = null;
477
+ emit("update:columnPreset", null);
478
+ }
325
479
  }
326
480
  const filteredRows = computed(() => {
327
481
  if (props.load) return sourceRows.value;
@@ -332,48 +486,47 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
332
486
  );
333
487
  });
334
488
  function sortRows(rows) {
335
- const s = activeSort.value;
336
- if (!s || props.load) return rows;
337
- const col = props.columns.find((c) => c.key === s.key);
338
- if (!col?.sortable) return rows;
339
- const factor = s.dir === "asc" ? 1 : -1;
340
- const own = col.compare;
341
- const value = col.sortValue ?? ((row) => row[s.key]);
342
- return [...rows].sort((a, b) => (own ? own(a, b) : compareValues(value(a), value(b))) * factor);
489
+ if (!sortList.value.length || props.load) return rows;
490
+ return sortByKeys(rows, sortList.value, props.columns);
343
491
  }
344
492
  const displayRows = computed(() => sortRows(filteredRows.value));
345
- function toggleSort(col) {
346
- if (!col.sortable) return;
347
- const s = activeSort.value;
348
- let next;
349
- if (!s || s.key !== col.key) next = { key: col.key, dir: "asc" };
350
- else if (s.dir === "asc") next = { key: col.key, dir: "desc" };
351
- else next = null;
493
+ function writeSorts(next) {
352
494
  withMotion(() => {
353
- ownSort.value = next;
354
- emit("update:sort", next);
495
+ ownSorts.value = next;
496
+ ownSort.value = next[0] ?? null;
497
+ if (props.multiSort) emit("update:sorts", next);
498
+ emit("update:sort", next[0] ?? null);
355
499
  });
356
500
  }
501
+ function toggleSort(col, event) {
502
+ if (!col.sortable) return;
503
+ writeSorts(nextSorts(sortList.value, col.key, !!(props.multiSort && event?.shiftKey)));
504
+ }
357
505
  function sortIcon(col) {
358
- const s = activeSort.value;
359
- if (s?.key !== col.key) return "lucide:chevrons-up-down";
506
+ const s = sortOf(col);
507
+ if (!s) return "lucide:chevrons-up-down";
360
508
  return s.dir === "asc" ? "lucide:arrow-up" : "lucide:arrow-down";
361
509
  }
510
+ function sortPosition(col) {
511
+ if (sortList.value.length < 2) return void 0;
512
+ const at = sortList.value.findIndex((sort) => sort.key === col.key);
513
+ return at < 0 ? void 0 : at + 1;
514
+ }
515
+ const MENU_CLOSE_LIMIT_MS = 600;
516
+ const FOCUS_RETURN_MS = 30;
362
517
  function openFilter(key) {
363
518
  const open = () => frameEl.value?.querySelector(`[data-lp-filter="${CSS.escape(key)}"]`)?.click();
364
519
  const started = performance.now();
520
+ const closing = [...(frameEl.value?.ownerDocument ?? document).querySelectorAll("[data-reka-menu-content]")];
365
521
  const wait = () => {
366
- if (!document.querySelector("[data-reka-menu-content]") || performance.now() - started > 600) setTimeout(open, 30);
522
+ if (!closing.some((menu) => menu.isConnected) || performance.now() - started > MENU_CLOSE_LIMIT_MS) setTimeout(open, FOCUS_RETURN_MS);
367
523
  else requestAnimationFrame(wait);
368
524
  };
369
525
  requestAnimationFrame(wait);
370
526
  }
371
527
  function headerMenu(col) {
372
528
  const s = activeSort.value;
373
- const set = (next) => () => withMotion(() => {
374
- ownSort.value = next;
375
- emit("update:sort", next);
376
- });
529
+ const set = (next) => () => writeSorts(next ? [next] : []);
377
530
  const items = [];
378
531
  if (col.sortable) {
379
532
  items.push(
@@ -420,8 +573,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
420
573
  const offered = props.columns.filter((c) => !c.alwaysVisible && c.label);
421
574
  const exportItem = props.exportable ? [{ label: text.value.exportCsv, icon: "lucide:download", onSelect: () => exportCsv() }] : [];
422
575
  if (!offered.length) return exportItem;
576
+ const presets = props.columnPresets?.length ? [{
577
+ label: text.value.columnPresets,
578
+ icon: "lucide:layout-template",
579
+ children: props.columnPresets.map((preset) => ({
580
+ label: preset.label,
581
+ checked: activePreset.value === preset.id,
582
+ onSelect: () => choosePreset(preset.id)
583
+ }))
584
+ }] : [];
423
585
  return [
424
586
  ...exportItem,
587
+ ...presets,
425
588
  {
426
589
  label: text.value.columns,
427
590
  icon: "lucide:columns-3",
@@ -443,6 +606,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
443
606
  Object.entries(hiddenValues.value).filter(([, set]) => set.size).map(([key, set]) => [key, [...set]])
444
607
  );
445
608
  const query = { page: page.value, pageSize: props.pageSize, sort: activeSort.value, hidden };
609
+ if (props.multiSort) query.sorts = sortList.value;
446
610
  task.run((signal) => load(query, signal), {
447
611
  delay,
448
612
  apply: (result) => {
@@ -462,7 +626,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
462
626
  }
463
627
  });
464
628
  }
465
- watch([activeSort, hiddenValues, () => props.pageSize], () => {
629
+ watch([sortList, hiddenValues, () => props.pageSize], () => {
466
630
  if (!props.load) return;
467
631
  if (page.value !== 1) page.value = 1;
468
632
  else fetchPage(props.debounce);
@@ -477,6 +641,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
477
641
  if (state) {
478
642
  if (state.sort !== void 0) {
479
643
  ownSort.value = state.sort;
644
+ ownSorts.value = state.sort ? [state.sort] : [];
480
645
  emit("update:sort", state.sort);
481
646
  }
482
647
  if (state.hidden) writeHidden(mergeRestored(hiddenValues.value, state.hidden));
@@ -510,20 +675,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
510
675
  }));
511
676
  const csv = toCsv(rows, columns, options);
512
677
  if (options.download !== false) {
513
- downloadFile(`${fileStem(options.filename ?? props.exportFilename, "table")}.csv`, csv, "text/csv;charset=utf-8");
678
+ downloadFile(`${fileStem(options.filename ?? props.exportFilename, "table")}.csv`, csv, "text/csv;charset=utf-8", tableEl.value?.ownerDocument);
514
679
  }
515
680
  return csv;
516
681
  }
517
682
  __expose({ reload: () => fetchPage(), exportCsv });
518
683
  const selectedSet = computed(() => new Set(props.selected));
684
+ const excluded = ref(/* @__PURE__ */ new Set());
685
+ const tokenActive = computed(() => !!props.selectionToken && !!props.load && props.allMatching);
686
+ const isSelected = (key) => tokenActive.value ? !excluded.value.has(key) : selectedSet.value.has(key);
519
687
  const allKeys = computed(() => filteredRows.value.map((r, i) => keyFor(r, i)));
520
688
  const allChecked = computed(
521
- () => allKeys.value.length > 0 && allKeys.value.every((k) => selectedSet.value.has(k))
689
+ () => allKeys.value.length > 0 && allKeys.value.every(isSelected)
522
690
  );
523
691
  const someChecked = computed(
524
- () => !allChecked.value && allKeys.value.some((k) => selectedSet.value.has(k))
692
+ () => !allChecked.value && allKeys.value.some(isSelected)
525
693
  );
526
694
  function toggleAll(checked) {
695
+ if (tokenActive.value) {
696
+ if (checked) excluded.value = /* @__PURE__ */ new Set();
697
+ else clearSelection();
698
+ return;
699
+ }
527
700
  const next = new Set(selectedSet.value);
528
701
  for (const key of allKeys.value) {
529
702
  if (checked) next.add(key);
@@ -532,6 +705,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
532
705
  emit("update:selected", [...next]);
533
706
  }
534
707
  function toggleRow(key, checked) {
708
+ if (tokenActive.value) {
709
+ const out = new Set(excluded.value);
710
+ if (checked) out.delete(key);
711
+ else out.add(key);
712
+ if (out.size >= total.value) clearSelection();
713
+ else excluded.value = out;
714
+ return;
715
+ }
535
716
  const next = new Set(selectedSet.value);
536
717
  if (checked) next.add(key);
537
718
  else next.delete(key);
@@ -542,7 +723,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
542
723
  );
543
724
  const paint = usePaintSelect({
544
725
  root: frameEl,
545
- enabled: () => !!props.selectable,
726
+ enabled: () => !!props.selectable && !tokenActive.value,
546
727
  selection: () => props.selected,
547
728
  set: (keys) => emit("update:selected", keys),
548
729
  resolve: (raw) => keyByText.value.get(raw),
@@ -556,7 +737,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
556
737
  function clearSelection() {
557
738
  emit("update:selected", []);
558
739
  if (props.allMatching) emit("update:allMatching", false);
740
+ excluded.value = /* @__PURE__ */ new Set();
559
741
  }
742
+ watch([tokenActive, sortList, excluded, total], () => {
743
+ if (!tokenActive.value) {
744
+ if (excluded.value.size) excluded.value = /* @__PURE__ */ new Set();
745
+ emit("update:selectionToken", null);
746
+ return;
747
+ }
748
+ emit("update:selectionToken", {
749
+ sorts: sortList.value,
750
+ hidden: Object.fromEntries(
751
+ Object.entries(hiddenValues.value).filter(([, set]) => set.size).map(([key, set]) => [key, [...set]])
752
+ ),
753
+ excluded: [...excluded.value],
754
+ total: total.value
755
+ });
756
+ });
757
+ watch(hiddenValues, () => {
758
+ if (tokenActive.value) clearSelection();
759
+ });
560
760
  const OWN_CLICKS = "a,button,input,select,textarea,label,[role=button],[role=checkbox],[contenteditable=true]";
561
761
  function onRowPointerDown(event, key) {
562
762
  if (!holdMode.value) return;
@@ -564,7 +764,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
564
764
  paint.onPointerDown(event, key, { hold: 420 });
565
765
  }
566
766
  function onRowClick(row, key) {
567
- if (holdMode.value && props.selected.length) toggleRow(key, !selectedSet.value.has(key));
767
+ if (holdMode.value && props.selected.length) toggleRow(key, !isSelected(key));
568
768
  else emit("rowClick", row);
569
769
  }
570
770
  useHotkeys(
@@ -582,10 +782,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
582
782
  () => pageKeys.value.length > 0 && pageKeys.value.every((k) => selectedSet.value.has(k))
583
783
  );
584
784
  watch(pageAllSelected, (all) => {
585
- if (!all && props.allMatching) emit("update:allMatching", false);
785
+ if (!all && props.allMatching && !props.selectionToken) emit("update:allMatching", false);
586
786
  });
587
787
  const statusText = computed(() => {
588
788
  if (!(props.selectable && props.selected.length)) return countText.value;
789
+ if (tokenActive.value && excluded.value.size) {
790
+ return text.value.selectedCount.replace("{count}", String(total.value - excluded.value.size));
791
+ }
589
792
  return props.allMatching ? text.value.allMatchingSelected.replace("{total}", String(total.value)) : text.value.selectedCount.replace("{count}", String(props.selected.length));
590
793
  });
591
794
  const countText = computed(() => {
@@ -610,12 +813,87 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
610
813
  function skeletonWidth(row, col) {
611
814
  return `${SKELETON_WIDTHS[(row * 3 + col * 2) % SKELETON_WIDTHS.length]}%`;
612
815
  }
613
- const colSpan = computed(() => visibleColumns.value.length + (props.selectable ? 1 : 0));
816
+ const VIEWPORT = "[data-reka-scroll-area-viewport]";
817
+ const expansionOn = computed(() => !!props.expandable && !props.virtualRowHeight);
818
+ const ownExpanded = ref([]);
819
+ const expandedKeys = computed(() => new Set(props.expanded ?? ownExpanded.value));
820
+ const canExpand = (row) => typeof props.expandable === "function" ? props.expandable(row) : !!props.expandable;
821
+ function toggleExpanded(key) {
822
+ const next = new Set(expandedKeys.value);
823
+ if (!next.delete(key)) next.add(key);
824
+ ownExpanded.value = [...next];
825
+ emit("update:expanded", ownExpanded.value);
826
+ }
827
+ const ownCollapsed = ref([]);
828
+ const collapsedSet = computed(() => new Set(props.collapsedGroups ?? ownCollapsed.value));
829
+ function toggleGroup(id) {
830
+ const next = new Set(collapsedSet.value);
831
+ if (!next.delete(id)) next.add(id);
832
+ ownCollapsed.value = [...next];
833
+ emit("update:collapsedGroups", ownCollapsed.value);
834
+ }
835
+ function groupValue(row) {
836
+ return typeof props.groupBy === "function" ? props.groupBy(row) : row[props.groupBy];
837
+ }
838
+ const allEntries = computed(() => {
839
+ const rows = displayRows.value;
840
+ const indexes = props.groupBy !== void 0 ? new Map(rows.map((row, i) => [row, i])) : null;
841
+ const entries = [];
842
+ const pushRow = (row, index) => {
843
+ const key = keyFor(row, index);
844
+ entries.push({ kind: "row", id: String(key), row, index });
845
+ if (expansionOn.value && expandedKeys.value.has(key) && canExpand(row)) {
846
+ entries.push({ kind: "detail", id: `lp-detail:${key}`, row, index });
847
+ }
848
+ };
849
+ if (!indexes) {
850
+ rows.forEach((row, index) => pushRow(row, index));
851
+ return entries;
852
+ }
853
+ for (const group of groupRows(rows, groupValue)) {
854
+ const collapsed = collapsedSet.value.has(group.id);
855
+ const name = props.groupLabel?.(group.value, group.rows) ?? group.id;
856
+ const label = text.value.groupCount.replace("{label}", name).replace("{count}", String(group.rows.length));
857
+ entries.push({ kind: "group", id: `lp-group:${group.id}`, group: group.id, value: group.value, rows: group.rows, label, collapsed });
858
+ if (!collapsed) for (const row of group.rows) pushRow(row, indexes.get(row) ?? 0);
859
+ }
860
+ return entries;
861
+ });
862
+ const viewportEl = shallowRef(null);
863
+ const scrollTop = ref(0);
864
+ const viewportHeight = ref(0);
865
+ const onViewportScroll = () => scrollTop.value = viewportEl.value?.scrollTop ?? 0;
866
+ onMounted(() => {
867
+ if (props.virtualRowHeight) viewportEl.value = frameEl.value?.querySelector(VIEWPORT) ?? null;
868
+ });
869
+ watch(viewportEl, (el, _, onCleanup) => {
870
+ if (!el) return;
871
+ el.addEventListener("scroll", onViewportScroll, { passive: true });
872
+ onCleanup(() => el.removeEventListener("scroll", onViewportScroll));
873
+ });
874
+ useResizeObserver(viewportEl, (_, el) => viewportHeight.value = el.clientHeight, { immediate: true });
875
+ const rowWindowed = computed(
876
+ () => props.virtualRowHeight ? rowWindow(scrollTop.value, viewportHeight.value, props.virtualRowHeight, allEntries.value.length, props.virtualOverscan) : null
877
+ );
878
+ const viewEntries = computed(
879
+ () => rowWindowed.value ? allEntries.value.slice(rowWindowed.value.start, rowWindowed.value.end) : allEntries.value
880
+ );
881
+ const rowOffset = (entry) => (rowWindowed.value?.start ?? 0) + viewEntries.value.indexOf(entry) + 2;
882
+ const rowStyle = computed(() => props.virtualRowHeight ? { height: `${props.virtualRowHeight}px` } : void 0);
883
+ function isEditable(col, row) {
884
+ return typeof col.editable === "function" ? col.editable(row) : !!col.editable;
885
+ }
886
+ function saveCell(col, row, value) {
887
+ const parsed = col.parseEdit ? col.parseEdit(value, row) : value;
888
+ emit("cellEdit", { row, key: col.key, value: parsed, previous: row[col.key] });
889
+ }
890
+ const colSpan = computed(
891
+ () => visibleColumns.value.length + (props.selectable ? 1 : 0) + (expansionOn.value ? 1 : 0)
892
+ );
614
893
  const rovingItems = computed(
615
- () => displayRows.value.map((row, index) => ({
616
- id: String(keyFor(row, index)),
617
- label: String(row[props.columns[0]?.key ?? ""] ?? "")
618
- }))
894
+ () => viewEntries.value.flatMap(
895
+ (entry) => entry.kind === "row" ? [{ id: entry.id, label: String(entry.row[props.columns[0]?.key ?? ""] ?? "") }] : []
896
+ )
619
897
  );
620
898
  const rowByKey = computed(() => {
621
899
  const map = /* @__PURE__ */ new Map();
@@ -636,7 +914,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
636
914
  const row = rowByKey.value.get(key);
637
915
  if (row) {
638
916
  const rowKey = keyFor(row, displayRows.value.indexOf(row));
639
- toggleRow(rowKey, !selectedSet.value.has(rowKey));
917
+ toggleRow(rowKey, !isSelected(rowKey));
640
918
  }
641
919
  return;
642
920
  }
@@ -827,17 +1105,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
827
1105
  createElementVNode("table", {
828
1106
  ref_key: "tableEl",
829
1107
  ref: tableEl,
830
- class: "w-full border-collapse text-sm"
1108
+ class: normalizeClass(["w-full border-collapse text-sm", fixedLayout.value ? "table-fixed" : ""]),
1109
+ style: normalizeStyle(tableStyle.value),
1110
+ "aria-rowcount": __props.virtualRowHeight ? allEntries.value.length + 1 : void 0
831
1111
  }, [
832
1112
  createElementVNode("thead", {
833
1113
  ref_key: "headEl",
834
1114
  ref: headEl,
835
1115
  class: normalizeClass(__props.stickyHeader ? "sticky top-0 z-10 bg-surface-soft" : "")
836
1116
  }, [
837
- createElementVNode("tr", _hoisted_10, [
838
- __props.selectable ? (openBlock(), createElementBlock("th", {
1117
+ createElementVNode("tr", _hoisted_11, [
1118
+ expansionOn.value ? (openBlock(), createElementBlock("th", {
839
1119
  key: 0,
840
- class: normalizeClass(["w-px p-0", cellY.value])
1120
+ class: normalizeClass(["w-px p-0", cellY.value]),
1121
+ style: normalizeStyle(fixedLayout.value ? { width: EXPAND_COLUMN_WIDTH } : void 0)
1122
+ }, null, 6)) : createCommentVNode("", true),
1123
+ __props.selectable ? (openBlock(), createElementBlock("th", {
1124
+ key: 1,
1125
+ class: normalizeClass(["w-px p-0", cellY.value]),
1126
+ style: normalizeStyle(fixedLayout.value ? { width: ticksShown.value ? TICK_COLUMN_WIDTH : "0" } : void 0)
841
1127
  }, [
842
1128
  createElementVNode("div", {
843
1129
  class: normalizeClass(["lp-tick lp-tick-open", ticksShown.value ? "" : "lp-tick-hidden"]),
@@ -848,14 +1134,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
848
1134
  indeterminate: someChecked.value,
849
1135
  "onUpdate:modelValue": toggleAll
850
1136
  }, null, 8, ["model-value", "indeterminate"])
851
- ], 10, _hoisted_11)
852
- ], 2)) : createCommentVNode("", true),
853
- (openBlock(true), createElementBlock(Fragment, null, renderList(visibleColumns.value, (col) => {
1137
+ ], 10, _hoisted_12)
1138
+ ], 6)) : createCommentVNode("", true),
1139
+ (openBlock(true), createElementBlock(Fragment, null, renderList(shownColumns.value, (col) => {
854
1140
  return openBlock(), createElementBlock("th", {
855
1141
  key: col.key,
856
- style: normalizeStyle(col.width ? { width: col.width } : void 0),
857
- class: normalizeClass(["px-4 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted", [alignClass(col.align), cellY.value]]),
858
- "aria-sort": activeSort.value?.key === col.key ? activeSort.value.dir === "asc" ? "ascending" : "descending" : void 0
1142
+ style: normalizeStyle(headStyle(col)),
1143
+ class: normalizeClass(["px-4 text-[11px] font-semibold uppercase tracking-[0.08em] text-muted", [alignClass(col.align), cellY.value, col.pin ? PIN_HEAD : "", canResize(col) && !col.pin ? "relative" : ""]]),
1144
+ "data-lp-col": measuredCol(col),
1145
+ "aria-sort": sortOf(col) ? sortOf(col).dir === "asc" ? "ascending" : "descending" : void 0
859
1146
  }, [
860
1147
  col.sortable || col.filterable ? (openBlock(), createBlock(_sfc_main$8, {
861
1148
  key: 0,
@@ -866,9 +1153,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
866
1153
  type: "button",
867
1154
  class: normalizeClass(["group/sort -mx-1 inline-flex items-center gap-1 rounded-small px-1 outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring", [
868
1155
  col.align === "right" ? "flex-row-reverse" : "",
869
- activeSort.value?.key === col.key ? "text-ink" : ""
1156
+ sortOf(col) ? "text-ink" : ""
870
1157
  ]]),
871
- onClick: ($event) => toggleSort(col)
1158
+ onClick: ($event) => toggleSort(col, $event)
872
1159
  }, [
873
1160
  createTextVNode(toDisplayString(col.label) + " ", 1),
874
1161
  col.sortable ? (openBlock(), createBlock(_sfc_main$3, {
@@ -877,10 +1164,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
877
1164
  size: 13,
878
1165
  class: normalizeClass([
879
1166
  "shrink-0 transition-[transform,opacity] duration-[var(--duration-fast)] ease-[var(--ease-emphasized)]",
880
- activeSort.value?.key === col.key ? "opacity-100" : "opacity-40 group-hover/sort:opacity-70"
1167
+ sortOf(col) ? "opacity-100" : "opacity-40 group-hover/sort:opacity-70"
881
1168
  ])
882
- }, null, 8, ["name", "class"])) : createCommentVNode("", true)
883
- ], 10, _hoisted_13)
1169
+ }, null, 8, ["name", "class"])) : createCommentVNode("", true),
1170
+ sortPosition(col) ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(sortPosition(col)), 1)) : createCommentVNode("", true)
1171
+ ], 10, _hoisted_14)
884
1172
  ]),
885
1173
  _: 2
886
1174
  }, 1032, ["items"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
@@ -903,7 +1191,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
903
1191
  name: hiddenValues.value[col.key]?.size ? "lucide:filter-x" : "lucide:filter",
904
1192
  size: 12
905
1193
  }, null, 8, ["name"])
906
- ], 10, _hoisted_14)
1194
+ ], 10, _hoisted_16)
907
1195
  ]),
908
1196
  default: withCtx(() => [
909
1197
  createVNode(_sfc_main$b, {
@@ -914,15 +1202,30 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
914
1202
  }, null, 8, ["options", "hidden", "labels", "onUpdate:hidden"])
915
1203
  ]),
916
1204
  _: 2
917
- }, 1032, ["aria-label"])) : createCommentVNode("", true)
918
- ], 14, _hoisted_12);
1205
+ }, 1032, ["aria-label"])) : createCommentVNode("", true),
1206
+ canResize(col) ? (openBlock(), createElementBlock("span", {
1207
+ key: 3,
1208
+ role: "separator",
1209
+ "aria-orientation": "vertical",
1210
+ tabindex: "0",
1211
+ "aria-label": text.value.resizeColumn.replace("{column}", col.label),
1212
+ "aria-valuenow": widths.value[col.key],
1213
+ class: "absolute inset-y-0 right-0 w-1.5 cursor-col-resize touch-none outline-none transition-colors duration-fast hover:bg-brand focus-visible:bg-brand",
1214
+ "data-lp-resize": col.key,
1215
+ onPointerdown: ($event) => startResize($event, col),
1216
+ onClick: _cache[2] || (_cache[2] = withModifiers(() => {
1217
+ }, ["stop"])),
1218
+ onDblclick: withModifiers(($event) => clearWidth(col), ["stop"]),
1219
+ onKeydown: ($event) => onResizeKey($event, col)
1220
+ }, null, 40, _hoisted_17)) : createCommentVNode("", true)
1221
+ ], 14, _hoisted_13);
919
1222
  }), 128))
920
1223
  ])
921
1224
  ], 2),
922
1225
  createVNode(TransitionGroup, {
923
1226
  tag: "tbody",
924
1227
  name: "lp-row",
925
- css: animating.value,
1228
+ css: animating.value && !__props.virtualRowHeight,
926
1229
  class: normalizeClass(busy.value && displayRows.value.length ? "opacity-60 transition-opacity" : "transition-opacity"),
927
1230
  "aria-busy": busy.value || void 0,
928
1231
  ref: (el) => unref(roving).setContainer(el?.$el ?? null)
@@ -933,11 +1236,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
933
1236
  key: `lp-table-skeleton-${n}`,
934
1237
  class: "lp-row-empty border-b border-line/60 last:border-0"
935
1238
  }, [
936
- __props.selectable ? (openBlock(), createElementBlock("td", {
1239
+ expansionOn.value ? (openBlock(), createElementBlock("td", {
937
1240
  key: 0,
938
1241
  class: normalizeClass(["w-px p-0", cellY.value])
939
1242
  }, null, 2)) : createCommentVNode("", true),
940
- (openBlock(true), createElementBlock(Fragment, null, renderList(visibleColumns.value, (col, ci) => {
1243
+ __props.selectable ? (openBlock(), createElementBlock("td", {
1244
+ key: 1,
1245
+ class: normalizeClass(["w-px p-0", cellY.value])
1246
+ }, null, 2)) : createCommentVNode("", true),
1247
+ (openBlock(true), createElementBlock(Fragment, null, renderList(shownColumns.value, (col, ci) => {
941
1248
  return openBlock(), createElementBlock("td", {
942
1249
  key: col.key,
943
1250
  class: normalizeClass(["px-4", [alignClass(col.align), cellY.value]])
@@ -946,11 +1253,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
946
1253
  class: "inline-block h-3 align-middle",
947
1254
  style: normalizeStyle({ width: skeletonWidth(n, ci) })
948
1255
  }, null, 8, ["style"]),
949
- n === 1 && ci === 0 ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(text.value.loading), 1)) : createCommentVNode("", true)
1256
+ n === 1 && ci === 0 ? (openBlock(), createElementBlock("span", _hoisted_18, toDisplayString(text.value.loading), 1)) : createCommentVNode("", true)
950
1257
  ], 2);
951
1258
  }), 128))
952
1259
  ]);
953
- }), 128)) : displayRows.value.length === 0 ? (openBlock(), createElementBlock("tr", _hoisted_16, [
1260
+ }), 128)) : displayRows.value.length === 0 ? (openBlock(), createElementBlock("tr", _hoisted_19, [
954
1261
  createElementVNode("td", {
955
1262
  colspan: colSpan.value,
956
1263
  class: "p-0"
@@ -975,66 +1282,171 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
975
1282
  ]),
976
1283
  _: 1
977
1284
  }, 8, ["icon", "title"])
978
- ], 8, _hoisted_17)
1285
+ ], 8, _hoisted_20)
979
1286
  ])) : createCommentVNode("", true),
980
- (openBlock(true), createElementBlock(Fragment, null, renderList(displayRows.value, (row, index) => {
981
- return openBlock(), createElementBlock("tr", mergeProps({
982
- key: keyFor(row, index),
983
- onContextmenu: ($event) => onRowContextMenu(row),
984
- class: ["group border-b border-line/60 outline-none transition-colors last:border-0 hover:bg-surface-soft/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring data-[active]:bg-surface-soft/40", selectedSet.value.has(keyFor(row, index)) ? "bg-brand-soft/40" : ""]
985
- }, { ref_for: true }, unref(roving).itemProps(String(keyFor(row, index))), {
986
- "data-paint-key": __props.selectable ? String(keyFor(row, index)) : void 0,
987
- "data-lp-context-row": __props.rowMenu ? "" : void 0,
988
- onClick: ($event) => onRowClick(row, keyFor(row, index)),
989
- onPointerdown: ($event) => onRowPointerDown($event, keyFor(row, index)),
990
- onKeydown: onRowKeydown
991
- }), [
992
- __props.selectable ? (openBlock(), createElementBlock("td", {
1287
+ rowWindowed.value?.before ? (openBlock(), createElementBlock("tr", _hoisted_21, [
1288
+ createElementVNode("td", {
1289
+ colspan: colSpan.value,
1290
+ class: "p-0",
1291
+ style: normalizeStyle({ height: `${rowWindowed.value.before}px` })
1292
+ }, null, 12, _hoisted_22)
1293
+ ])) : createCommentVNode("", true),
1294
+ (openBlock(true), createElementBlock(Fragment, null, renderList(viewEntries.value, (entry) => {
1295
+ return openBlock(), createElementBlock(Fragment, {
1296
+ key: entry.id
1297
+ }, [
1298
+ entry.kind === "group" ? (openBlock(), createElementBlock("tr", {
993
1299
  key: 0,
994
- class: normalizeClass(["w-px cursor-pointer p-0 select-none", cellY.value]),
995
- onClick: _cache[2] || (_cache[2] = withModifiers(() => {
996
- }, ["stop"])),
997
- onPointerdown: withModifiers(($event) => unref(paint).onPointerDown($event, keyFor(row, index)), ["stop"])
1300
+ class: "border-b border-line/60 bg-surface-soft/60",
1301
+ style: normalizeStyle(rowStyle.value)
998
1302
  }, [
999
- createElementVNode("div", {
1000
- class: normalizeClass(["lp-tick lp-tick-open", ticksShown.value ? "" : "lp-tick-cue"])
1001
- }, [
1002
- createVNode(_sfc_main$9, {
1003
- "model-value": selectedSet.value.has(keyFor(row, index)),
1004
- "onUpdate:modelValue": (v) => toggleRow(keyFor(row, index), v)
1005
- }, null, 8, ["model-value", "onUpdate:modelValue"])
1006
- ], 2)
1007
- ], 42, _hoisted_19)) : createCommentVNode("", true),
1008
- (openBlock(true), createElementBlock(Fragment, null, renderList(visibleColumns.value, (col, ci) => {
1009
- return openBlock(), createElementBlock("td", {
1010
- key: col.key,
1011
- class: normalizeClass(["px-4 text-ink", [alignClass(col.align), cellY.value, col.nowrap ? "whitespace-nowrap" : ""]])
1303
+ createElementVNode("td", {
1304
+ colspan: colSpan.value,
1305
+ class: normalizeClass(["px-4 text-xs font-medium text-muted", cellY.value])
1012
1306
  }, [
1013
- renderSlot(_ctx.$slots, `cell-${col.key}`, {
1014
- row,
1015
- value: row[col.key],
1016
- openMenu: openRowMenu
1307
+ renderSlot(_ctx.$slots, "group", {
1308
+ value: entry.value,
1309
+ rows: entry.rows,
1310
+ label: entry.label,
1311
+ collapsed: entry.collapsed,
1312
+ toggle: () => toggleGroup(entry.group)
1017
1313
  }, () => [
1018
- createTextVNode(toDisplayString(row[col.key]), 1)
1314
+ createElementVNode("button", {
1315
+ type: "button",
1316
+ class: "inline-flex items-center gap-1 rounded-small outline-none transition-colors duration-fast hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
1317
+ "aria-expanded": !entry.collapsed,
1318
+ "aria-label": (entry.collapsed ? text.value.expandGroup : text.value.collapseGroup).replace("{label}", entry.label),
1319
+ onClick: ($event) => toggleGroup(entry.group)
1320
+ }, [
1321
+ createVNode(_sfc_main$3, {
1322
+ name: "lucide:chevron-right",
1323
+ size: 14,
1324
+ class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", entry.collapsed ? "" : "rotate-90"])
1325
+ }, null, 8, ["class"]),
1326
+ createTextVNode(" " + toDisplayString(entry.label), 1)
1327
+ ], 8, _hoisted_24)
1019
1328
  ], true)
1020
- ], 2);
1021
- }), 128))
1022
- ], 16, _hoisted_18);
1023
- }), 128))
1329
+ ], 10, _hoisted_23)
1330
+ ], 4)) : entry.kind === "detail" ? (openBlock(), createElementBlock("tr", _hoisted_25, [
1331
+ createElementVNode("td", {
1332
+ colspan: colSpan.value,
1333
+ class: "px-4 py-3"
1334
+ }, [
1335
+ renderSlot(_ctx.$slots, "expanded", {
1336
+ row: entry.row,
1337
+ close: () => toggleExpanded(keyFor(entry.row, entry.index))
1338
+ }, void 0, true)
1339
+ ], 8, _hoisted_26)
1340
+ ])) : (openBlock(), createElementBlock("tr", mergeProps({
1341
+ key: 2,
1342
+ onContextmenu: ($event) => onRowContextMenu(entry.row),
1343
+ class: ["group border-b border-line/60 outline-none transition-colors last:border-0 hover:bg-surface-soft/60 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring data-[active]:bg-surface-soft/40", isSelected(keyFor(entry.row, entry.index)) ? "bg-brand-soft/40" : ""],
1344
+ style: rowStyle.value,
1345
+ "aria-rowindex": __props.virtualRowHeight ? rowOffset(entry) : void 0
1346
+ }, { ref_for: true }, unref(roving).itemProps(String(keyFor(entry.row, entry.index))), {
1347
+ "data-paint-key": __props.selectable ? String(keyFor(entry.row, entry.index)) : void 0,
1348
+ "data-lp-context-row": __props.rowMenu ? "" : void 0,
1349
+ onClick: ($event) => onRowClick(entry.row, keyFor(entry.row, entry.index)),
1350
+ onPointerdown: ($event) => onRowPointerDown($event, keyFor(entry.row, entry.index)),
1351
+ onKeydown: onRowKeydown
1352
+ }), [
1353
+ expansionOn.value ? (openBlock(), createElementBlock("td", {
1354
+ key: 0,
1355
+ class: normalizeClass(["w-px p-0 text-center", cellY.value]),
1356
+ onClick: _cache[3] || (_cache[3] = withModifiers(() => {
1357
+ }, ["stop"])),
1358
+ onKeydown: _cache[4] || (_cache[4] = withModifiers(() => {
1359
+ }, ["stop"]))
1360
+ }, [
1361
+ canExpand(entry.row) ? (openBlock(), createElementBlock("button", {
1362
+ key: 0,
1363
+ type: "button",
1364
+ class: "inline-grid size-6 place-items-center rounded-small text-muted outline-none transition-colors duration-fast hover:text-ink focus-visible:ring-2 focus-visible:ring-ring",
1365
+ "aria-expanded": expandedKeys.value.has(keyFor(entry.row, entry.index)),
1366
+ "aria-label": expandedKeys.value.has(keyFor(entry.row, entry.index)) ? text.value.collapseRow : text.value.expandRow,
1367
+ onClick: ($event) => toggleExpanded(keyFor(entry.row, entry.index))
1368
+ }, [
1369
+ createVNode(_sfc_main$3, {
1370
+ name: "lucide:chevron-right",
1371
+ size: 14,
1372
+ class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", expandedKeys.value.has(keyFor(entry.row, entry.index)) ? "rotate-90" : ""])
1373
+ }, null, 8, ["class"])
1374
+ ], 8, _hoisted_28)) : createCommentVNode("", true)
1375
+ ], 34)) : createCommentVNode("", true),
1376
+ __props.selectable ? (openBlock(), createElementBlock("td", {
1377
+ key: 1,
1378
+ class: normalizeClass(["w-px cursor-pointer p-0 select-none", cellY.value]),
1379
+ onClick: _cache[5] || (_cache[5] = withModifiers(() => {
1380
+ }, ["stop"])),
1381
+ onPointerdown: withModifiers(($event) => unref(paint).onPointerDown($event, keyFor(entry.row, entry.index)), ["stop"])
1382
+ }, [
1383
+ createElementVNode("div", {
1384
+ class: normalizeClass(["lp-tick lp-tick-open", ticksShown.value ? "" : "lp-tick-cue"])
1385
+ }, [
1386
+ createVNode(_sfc_main$9, {
1387
+ "model-value": isSelected(keyFor(entry.row, entry.index)),
1388
+ "onUpdate:modelValue": (v) => toggleRow(keyFor(entry.row, entry.index), v)
1389
+ }, null, 8, ["model-value", "onUpdate:modelValue"])
1390
+ ], 2)
1391
+ ], 42, _hoisted_29)) : createCommentVNode("", true),
1392
+ (openBlock(true), createElementBlock(Fragment, null, renderList(shownColumns.value, (col) => {
1393
+ return openBlock(), createElementBlock("td", {
1394
+ key: col.key,
1395
+ class: normalizeClass(["px-4 text-ink", [alignClass(col.align), cellY.value, col.nowrap ? "whitespace-nowrap" : "", col.pin ? PIN_CELL : ""]]),
1396
+ style: normalizeStyle(pinStyle(col))
1397
+ }, [
1398
+ renderSlot(_ctx.$slots, `cell-${col.key}`, {
1399
+ row: entry.row,
1400
+ value: entry.row[col.key],
1401
+ openMenu: openRowMenu
1402
+ }, () => [
1403
+ isEditable(col, entry.row) ? (openBlock(), createElementBlock("span", {
1404
+ key: 0,
1405
+ class: "inline-block",
1406
+ onClick: _cache[6] || (_cache[6] = withModifiers(() => {
1407
+ }, ["stop"])),
1408
+ onPointerdown: _cache[7] || (_cache[7] = withModifiers(() => {
1409
+ }, ["stop"])),
1410
+ onKeydown: _cache[8] || (_cache[8] = withModifiers(() => {
1411
+ }, ["stop"]))
1412
+ }, [
1413
+ createVNode(_sfc_main$e, {
1414
+ "model-value": String(entry.row[col.key] ?? ""),
1415
+ label: col.label,
1416
+ size: "sm",
1417
+ validate: (value) => col.validateEdit?.(value, entry.row),
1418
+ save: (value) => saveCell(col, entry.row, value)
1419
+ }, null, 8, ["model-value", "label", "validate", "save"])
1420
+ ], 32)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1421
+ createTextVNode(toDisplayString(entry.row[col.key]), 1)
1422
+ ], 64))
1423
+ ], true)
1424
+ ], 6);
1425
+ }), 128))
1426
+ ], 16, _hoisted_27))
1427
+ ], 64);
1428
+ }), 128)),
1429
+ rowWindowed.value?.after ? (openBlock(), createElementBlock("tr", _hoisted_30, [
1430
+ createElementVNode("td", {
1431
+ colspan: colSpan.value,
1432
+ class: "p-0",
1433
+ style: normalizeStyle({ height: `${rowWindowed.value.after}px` })
1434
+ }, null, 12, _hoisted_31)
1435
+ ])) : createCommentVNode("", true)
1024
1436
  ]),
1025
1437
  _: 3
1026
1438
  }, 8, ["css", "class", "aria-busy"])
1027
- ], 512)
1439
+ ], 14, _hoisted_10)
1028
1440
  ]),
1029
1441
  _: 3
1030
1442
  }, 8, ["items", "no-hint", "title", "subtitle", "title-icon", "title-image"])
1031
1443
  ]),
1032
1444
  _: 3
1033
1445
  }, 16, ["style", "bar-inset-top"]),
1034
- __props.load && total.value > __props.pageSize ? (openBlock(), createBlock(_sfc_main$e, {
1446
+ __props.load && total.value > __props.pageSize ? (openBlock(), createBlock(_sfc_main$f, {
1035
1447
  key: 1,
1036
1448
  page: page.value,
1037
- "onUpdate:page": _cache[3] || (_cache[3] = ($event) => page.value = $event),
1449
+ "onUpdate:page": _cache[9] || (_cache[9] = ($event) => page.value = $event),
1038
1450
  total: total.value,
1039
1451
  "page-size": __props.pageSize,
1040
1452
  disabled: busy.value
@@ -1043,7 +1455,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1043
1455
  };
1044
1456
  }
1045
1457
  });
1046
- const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d2bafc29"]]);
1458
+ const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-48ad51fc"]]);
1047
1459
  export {
1048
1460
  LpTable as default
1049
1461
  };