@leavepulse/ui 0.86.2 → 0.87.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 (231) hide show
  1. package/dist/assets/{LpTable-CEFsRz5J.css → LpTable-BqZNpWgC.css} +51 -19
  2. package/dist/chunks/{ContextMenuItems-D15cGEw9.js → ContextMenuItems-D0jObgzN.js} +27 -3
  3. package/dist/chunks/{DropzoneLinkField-Dz7fIaLh.js → DropzoneLinkField-DhwYRnvd.js} +1 -1
  4. package/dist/chunks/{FieldLeading-DZZLK02U.js → FieldLeading-k9EJOKOI.js} +1 -1
  5. package/dist/chunks/{FieldWrapper-BDDw1F9H.js → FieldWrapper-CVTPnpoG.js} +1 -1
  6. package/dist/chunks/{IconCloseButton-Cn_w4aN3.js → IconCloseButton-CmWOJAXG.js} +1 -1
  7. package/dist/chunks/{LayoutCanvas-Dr5eSfAu.js → LayoutCanvas-j4TZqx1A.js} +1 -1
  8. package/dist/chunks/{LayoutNode-CViJnx6q.js → LayoutNode-4Eaf8ZWj.js} +1 -1
  9. package/dist/chunks/{LpActionBar-C0LK-Aqs.js → LpActionBar-Cx_MSZl9.js} +1 -1
  10. package/dist/chunks/{LpAddressInput-B9sSvodU.js → LpAddressInput-CfqQR5jE.js} +7 -7
  11. package/dist/chunks/{LpAlert-Bpd7122M.js → LpAlert-CYtbpRYW.js} +1 -1
  12. package/dist/chunks/{LpAppShell-DpsQtXvG.js → LpAppShell-BQG98odS.js} +4 -4
  13. package/dist/chunks/{LpAutocomplete-CQID7Zc-.js → LpAutocomplete-VNID5zdy.js} +4 -4
  14. package/dist/chunks/{LpAvatar-DLkiMGKx.js → LpAvatar-CfLBqlY1.js} +1 -1
  15. package/dist/chunks/{LpBadge-RFp8uHFt.js → LpBadge-Bh5roBr_.js} +1 -1
  16. package/dist/chunks/{LpBottomNav-BcJVkAhh.js → LpBottomNav-9AqvZlRW.js} +1 -1
  17. package/dist/chunks/{LpBreadcrumbs-DJ_DB45r.js → LpBreadcrumbs-Zv1fn9e_.js} +1 -1
  18. package/dist/chunks/{LpCalendar-D6tfCr2G.js → LpCalendar-aACjUhpM.js} +1 -1
  19. package/dist/chunks/{LpCheckbox-DcXC2qd5.js → LpCheckbox-P7tEw8GO.js} +2 -2
  20. package/dist/chunks/{LpCodeBlock-kGT15Zou.js → LpCodeBlock-BNThgUdQ.js} +2 -2
  21. package/dist/chunks/{LpCodeDisplay-DlwzZo9o.js → LpCodeDisplay-DsiE-Qy9.js} +4 -4
  22. package/dist/chunks/{LpColorPicker-Cjna_Bio.js → LpColorPicker-EXpwcX-t.js} +3 -3
  23. package/dist/chunks/{LpConfirmDialog-bfcX5F9d.js → LpConfirmDialog-DPiPVRn_.js} +2 -2
  24. package/dist/chunks/{LpConfirmHost-DIgloymi.js → LpConfirmHost-Ddiljlog.js} +1 -1
  25. package/dist/chunks/{LpContextMenu-CUFZIQX2.js → LpContextMenu-DYpDm6iI.js} +2 -2
  26. package/dist/chunks/{LpContextSwitcher-CMweLbv2.js → LpContextSwitcher-BPDSkKyA.js} +2 -2
  27. package/dist/chunks/{LpCopyButton-TGoE43mE.js → LpCopyButton-CxX682t4.js} +1 -1
  28. package/dist/chunks/{LpDataList-Due909Cy.js → LpDataList-DCtF7krm.js} +2 -2
  29. package/dist/chunks/{LpDatePicker-B5gzwI3T.js → LpDatePicker-BElEHVm6.js} +5 -5
  30. package/dist/chunks/{LpDateRangePicker-CwNnpyoL.js → LpDateRangePicker-vLt-drEu.js} +3 -3
  31. package/dist/chunks/{LpDisclosure-CsJ7nnFz.js → LpDisclosure-D4JZ-o8K.js} +1 -1
  32. package/dist/chunks/{LpDrawer-C1q2bl1r.js → LpDrawer-C97k-3L2.js} +1 -1
  33. package/dist/chunks/{LpDropdownMenu-DRABI-Bl.js → LpDropdownMenu-BPEsqZCN.js} +2 -2
  34. package/dist/chunks/{LpEditable-DCPdDDBb.js → LpEditable-CeRAzYMv.js} +2 -2
  35. package/dist/chunks/{LpEmptyState-DT8U4R8L.js → LpEmptyState-DrHBR3yh.js} +1 -1
  36. package/dist/chunks/{LpFieldNotice-mcmO-O-J.js → LpFieldNotice-DUPo1Yii.js} +1 -1
  37. package/dist/chunks/{LpFileTree-B365yOLv.js → LpFileTree-BcQgsw4e.js} +4 -4
  38. package/dist/chunks/{LpFileTreeNode-DfvIGmSz.js → LpFileTreeNode-Dk2WqkPF.js} +4 -4
  39. package/dist/chunks/{LpFormField-C5GOuOY-.js → LpFormField-jbM7K1Hg.js} +1 -1
  40. package/dist/chunks/{LpHintLayer-B0choo1r.js → LpHintLayer-CUSRLtLu.js} +1 -1
  41. package/dist/chunks/{LpHints-BEetUVTl.js → LpHints-BF40CP4_.js} +3 -3
  42. package/dist/chunks/{LpIcon-DCGhNsCU.js → LpIcon-CxHFPwKt.js} +1 -1
  43. package/dist/chunks/{LpInfraNode-BsExhdPE.js → LpInfraNode-BYiMFDnA.js} +2 -2
  44. package/dist/chunks/{LpInput-CKMblRtp.js → LpInput-BU5IsOlE.js} +3 -3
  45. package/dist/chunks/{LpInspector-BNxjuWMP.js → LpInspector-CEko6-pS.js} +4 -4
  46. package/dist/chunks/{LpLightbox-DVyiB4dw.js → LpLightbox-REei-y5e.js} +4 -4
  47. package/dist/chunks/{LpLogInspector-Yj310k4n.js → LpLogInspector-Bwz351LY.js} +2 -2
  48. package/dist/chunks/{LpLogViewer-Bki-IdNC.js → LpLogViewer-BCkqdH66.js} +6 -6
  49. package/dist/chunks/{LpMapPicker-CnpJhiY0.js → LpMapPicker-DVfiy3rR.js} +1 -1
  50. package/dist/chunks/{LpMediaGallery-OJemmbV7.js → LpMediaGallery-BF1Bch3v.js} +4 -4
  51. package/dist/chunks/{LpModal-B5y9_LgA.js → LpModal-BK2T5uIG.js} +1 -1
  52. package/dist/chunks/{LpModalNav-Er99S_AP.js → LpModalNav-Dk4eHpg6.js} +3 -3
  53. package/dist/chunks/{LpNotificationBell-DmR1xDd-.js → LpNotificationBell-CMwUXhFg.js} +4 -4
  54. package/dist/chunks/{LpNotificationFeed-DK7D1f-v.js → LpNotificationFeed-BXsRp9jm.js} +4 -4
  55. package/dist/chunks/{LpNumberField-BeYT7zzt.js → LpNumberField-QUMXvpqx.js} +3 -3
  56. package/dist/chunks/{LpOtpInput-DqwY-U5R.js → LpOtpInput-C14XagVB.js} +1 -1
  57. package/dist/chunks/{LpPagination-V1wEhu1K.js → LpPagination-DGLntZJN.js} +1 -1
  58. package/dist/chunks/{LpPaletteTheme-CWFz4H2D.js → LpPaletteTheme-wiJtP5hV.js} +2 -2
  59. package/dist/chunks/{LpPasswordInput-LaOXNYuV.js → LpPasswordInput-W9AZfzaL.js} +2 -2
  60. package/dist/chunks/{LpPhoneInput-D7Tq2iaz.js → LpPhoneInput-DsRv-Qla.js} +3 -3
  61. package/dist/chunks/{LpPie-CAsGO9jE.js → LpPie-pbrNFbRP.js} +2 -2
  62. package/dist/chunks/{LpPipeline-D-uPcbMN.js → LpPipeline-BHWmvOiv.js} +2 -2
  63. package/dist/chunks/{LpQuota-BR8ck2a9.js → LpQuota-BaCq5YOQ.js} +1 -1
  64. package/dist/chunks/{LpRadioGroup-DSOCL9MD.js → LpRadioGroup-D94KMStE.js} +2 -2
  65. package/dist/chunks/{LpRangeCalendar-QepHrmba.js → LpRangeCalendar-C9gkNMYw.js} +1 -1
  66. package/dist/chunks/{LpRangeSlider-BaAM7XIs.js → LpRangeSlider-CkP9hYUC.js} +1 -1
  67. package/dist/chunks/{LpRepeater-BKq5XPh4.js → LpRepeater-DLLcbQ6J.js} +2 -2
  68. package/dist/chunks/{LpSecretField-Dp-c7wWc.js → LpSecretField-Au7ZQTtm.js} +5 -5
  69. package/dist/chunks/{LpSection-BGzlKIWO.js → LpSection-RKCwB0xN.js} +1 -1
  70. package/dist/chunks/{LpSegmented-CiaF9DUK.js → LpSegmented-DD8MPj4j.js} +2 -2
  71. package/dist/chunks/{LpSelect-CB6Xbnfk.js → LpSelect-BeXz1TWh.js} +4 -4
  72. package/dist/chunks/{LpSidebar-CjE90o3s.js → LpSidebar-DUFlf6Uu.js} +4 -4
  73. package/dist/chunks/{LpSidebarNav-Bgz2tXSq.js → LpSidebarNav-C34YEZIR.js} +3 -3
  74. package/dist/chunks/{LpSidebarRow-CDBnvvd8.js → LpSidebarRow-BeEGgsZi.js} +3 -3
  75. package/dist/chunks/{LpSlider-DTb_Ivkm.js → LpSlider-BCy5rjwK.js} +1 -1
  76. package/dist/chunks/{LpStat-DM5Wfb6K.js → LpStat-eVz7iUfD.js} +2 -2
  77. package/dist/chunks/{LpStatus-_fIwWXQV.js → LpStatus-C6GqSHJj.js} +1 -1
  78. package/dist/chunks/{LpStepMark-iDZw1DYf.js → LpStepMark-CPGVj1XG.js} +1 -1
  79. package/dist/chunks/{LpStepper-CjC3cp1F.js → LpStepper-DBNRA6Q2.js} +1 -1
  80. package/dist/chunks/{LpSwitch-BNHyYDhX.js → LpSwitch-D7hmVsif.js} +1 -1
  81. package/dist/chunks/{LpTabFace-gATEe9pQ.js → LpTabFace-uoZgD_SN.js} +2 -2
  82. package/dist/chunks/{LpTableFilter-B_BFoBqS.js → LpTableFilter-BGFNKyUX.js} +2 -2
  83. package/dist/chunks/{LpTagsInput-By7LMb47.js → LpTagsInput-D9uOSlvf.js} +5 -5
  84. package/dist/chunks/{LpTextarea-Ck6RAfzu.js → LpTextarea-DwE-lQt4.js} +1 -1
  85. package/dist/chunks/{LpThemeStudio-RyI-SWiw.js → LpThemeStudio-COn2H76d.js} +5 -5
  86. package/dist/chunks/{LpThemeSwitcher-BZYJ0AXy.js → LpThemeSwitcher-B3R3nNid.js} +3 -3
  87. package/dist/chunks/{LpTimeField-BTKJVeNt.js → LpTimeField-Mi8H1g_9.js} +2 -2
  88. package/dist/chunks/{LpToaster-YcLJFSsH.js → LpToaster-DOJn6Vey.js} +2 -2
  89. package/dist/chunks/{LpTopologyCanvas-paC1Dup-.js → LpTopologyCanvas-5RFMP4gR.js} +4 -4
  90. package/dist/chunks/{LpTour-D_AN_SsZ.js → LpTour-DUI_hoPv.js} +1 -1
  91. package/dist/chunks/{LpTruncate-DCZjfcE-.js → LpTruncate-CynJhsEw.js} +1 -1
  92. package/dist/chunks/{LpVideoCompress-BfulQ8Rs.js → LpVideoCompress-CPUxXh-c.js} +1 -1
  93. package/dist/chunks/{LpVideoPlayer--87I5Kqu.js → LpVideoPlayer-BbCjEQAx.js} +4 -4
  94. package/dist/chunks/{LpWindow-Bo5qQgVY.js → LpWindow-Dp_0nNqg.js} +2 -2
  95. package/dist/chunks/{LpWorkspaceSwitcher-D50sHs9N.js → LpWorkspaceSwitcher-bjkncjSl.js} +3 -3
  96. package/dist/chunks/{MenuTitle-DCHcfyPH.js → MenuTitle-YcSjF8xo.js} +1 -1
  97. package/dist/chunks/{OptionContent-o58kS7Zh.js → OptionContent-DZb5eKRV.js} +1 -1
  98. package/dist/chunks/{PickerField-DNo1k89A.js → PickerField-CjOTUXDK.js} +1 -1
  99. package/dist/chunks/{RevealToggle-w7-BMcgC.js → RevealToggle-Bl1NcfxB.js} +1 -1
  100. package/dist/chunks/{TourCard-0yYxSdd4.js → TourCard-BovXtMbO.js} +1 -1
  101. package/dist/chunks/{VideoThumb-DL_QkAJY.js → VideoThumb-BfDkIXqE.js} +1 -1
  102. package/dist/chunks/{VideoVolume-D-2TmsVj.js → VideoVolume-DE3i1ree.js} +2 -2
  103. package/dist/chunks/{icons-V0k93Puc.js → icons-C8ccRCKw.js} +1 -1
  104. package/dist/components/ContextMenuItems.vue.js +1 -1
  105. package/dist/components/DropzoneLinkField.vue.js +1 -1
  106. package/dist/components/FieldLeading.vue.js +1 -1
  107. package/dist/components/FieldWrapper.vue.js +1 -1
  108. package/dist/components/IconCloseButton.vue.js +1 -1
  109. package/dist/components/LayoutCanvas.vue.js +1 -1
  110. package/dist/components/LayoutNode.vue.js +1 -1
  111. package/dist/components/LpActionBar.vue.js +1 -1
  112. package/dist/components/LpAddressInput.vue.js +1 -1
  113. package/dist/components/LpAlert.vue.js +1 -1
  114. package/dist/components/LpAppShell.vue.js +1 -1
  115. package/dist/components/LpAutocomplete.vue.js +1 -1
  116. package/dist/components/LpAvatar.vue.js +1 -1
  117. package/dist/components/LpBadge.vue.js +1 -1
  118. package/dist/components/LpBottomNav.vue.js +1 -1
  119. package/dist/components/LpBreadcrumbs.vue.js +1 -1
  120. package/dist/components/LpCalendar.vue.js +1 -1
  121. package/dist/components/LpChart.vue.js +2 -2
  122. package/dist/components/LpCheckbox.vue.js +1 -1
  123. package/dist/components/LpCodeBlock.vue.js +1 -1
  124. package/dist/components/LpCodeDisplay.vue.js +1 -1
  125. package/dist/components/LpColorPicker.vue.js +1 -1
  126. package/dist/components/LpCommandPalette.vue.js +2 -2
  127. package/dist/components/LpConfirmDialog.vue.js +1 -1
  128. package/dist/components/LpConfirmHost.vue.js +1 -1
  129. package/dist/components/LpContextMenu.vue.d.ts +7 -0
  130. package/dist/components/LpContextMenu.vue.js +1 -1
  131. package/dist/components/LpContextSwitcher.vue.js +1 -1
  132. package/dist/components/LpCopyButton.vue.js +1 -1
  133. package/dist/components/LpDataList.vue.js +1 -1
  134. package/dist/components/LpDatePicker.vue.js +1 -1
  135. package/dist/components/LpDateRangePicker.vue.js +1 -1
  136. package/dist/components/LpDisclosure.vue.js +1 -1
  137. package/dist/components/LpDock.vue.js +1 -1
  138. package/dist/components/LpDrawer.vue.js +1 -1
  139. package/dist/components/LpDropdownMenu.vue.js +1 -1
  140. package/dist/components/LpDropzone.vue.js +2 -2
  141. package/dist/components/LpEditable.vue.js +1 -1
  142. package/dist/components/LpEmptyState.vue.js +1 -1
  143. package/dist/components/LpFieldNotice.vue.js +1 -1
  144. package/dist/components/LpFileTree.vue.js +1 -1
  145. package/dist/components/LpFileTreeNode.vue.js +1 -1
  146. package/dist/components/LpFormField.vue.js +1 -1
  147. package/dist/components/LpHintLayer.vue.js +1 -1
  148. package/dist/components/LpHints.vue.js +1 -1
  149. package/dist/components/LpIcon.vue.js +1 -1
  150. package/dist/components/LpImageEditor.vue.js +1 -1
  151. package/dist/components/LpInfraNode.vue.js +1 -1
  152. package/dist/components/LpInput.vue.js +1 -1
  153. package/dist/components/LpInspector.vue.js +1 -1
  154. package/dist/components/LpLightbox.vue.js +1 -1
  155. package/dist/components/LpLogInspector.vue.js +1 -1
  156. package/dist/components/LpLogViewer.vue.js +1 -1
  157. package/dist/components/LpMapPicker.vue.js +1 -1
  158. package/dist/components/LpMediaGallery.vue.js +1 -1
  159. package/dist/components/LpModal.vue.js +1 -1
  160. package/dist/components/LpModalNav.vue.js +1 -1
  161. package/dist/components/LpNotificationBell.vue.js +1 -1
  162. package/dist/components/LpNotificationFeed.vue.js +1 -1
  163. package/dist/components/LpNumberField.vue.js +1 -1
  164. package/dist/components/LpOtpInput.vue.js +1 -1
  165. package/dist/components/LpPagination.vue.js +1 -1
  166. package/dist/components/LpPaletteFacts.vue.js +1 -1
  167. package/dist/components/LpPaletteHeader.vue.js +2 -2
  168. package/dist/components/LpPaletteTheme.vue.js +1 -1
  169. package/dist/components/LpPasswordInput.vue.js +1 -1
  170. package/dist/components/LpPhoneInput.vue.js +1 -1
  171. package/dist/components/LpPie.vue.js +1 -1
  172. package/dist/components/LpPipeline.vue.js +1 -1
  173. package/dist/components/LpQuota.vue.js +1 -1
  174. package/dist/components/LpRadioGroup.vue.js +1 -1
  175. package/dist/components/LpRangeCalendar.vue.js +1 -1
  176. package/dist/components/LpRangeSlider.vue.js +1 -1
  177. package/dist/components/LpRepeater.vue.js +1 -1
  178. package/dist/components/LpSecretField.vue.js +1 -1
  179. package/dist/components/LpSection.vue.js +1 -1
  180. package/dist/components/LpSegmented.vue.js +1 -1
  181. package/dist/components/LpSelect.vue.js +1 -1
  182. package/dist/components/LpShortcutsDialog.vue.js +1 -1
  183. package/dist/components/LpSidebar.vue.js +1 -1
  184. package/dist/components/LpSidebarNav.vue.js +1 -1
  185. package/dist/components/LpSidebarRow.vue.js +1 -1
  186. package/dist/components/LpSlider.vue.js +1 -1
  187. package/dist/components/LpStat.vue.js +1 -1
  188. package/dist/components/LpStatus.vue.js +1 -1
  189. package/dist/components/LpStepMark.vue.js +1 -1
  190. package/dist/components/LpStepper.vue.js +1 -1
  191. package/dist/components/LpSwitch.vue.js +1 -1
  192. package/dist/components/LpTabFace.vue.js +1 -1
  193. package/dist/components/LpTable.vue.d.ts +76 -1
  194. package/dist/components/LpTable.vue.js +516 -102
  195. package/dist/components/LpTableFilter.vue.js +1 -1
  196. package/dist/components/LpTabs.vue.js +2 -2
  197. package/dist/components/LpTagsInput.vue.js +1 -1
  198. package/dist/components/LpTextarea.vue.js +1 -1
  199. package/dist/components/LpThemeStudio.vue.js +1 -1
  200. package/dist/components/LpThemeSwitcher.vue.js +1 -1
  201. package/dist/components/LpTimeField.vue.js +1 -1
  202. package/dist/components/LpToaster.vue.js +1 -1
  203. package/dist/components/LpTopologyCanvas.vue.js +1 -1
  204. package/dist/components/LpTour.vue.js +1 -1
  205. package/dist/components/LpTruncate.vue.js +1 -1
  206. package/dist/components/LpVideoCompress.vue.js +1 -1
  207. package/dist/components/LpVideoPlayer.vue.js +1 -1
  208. package/dist/components/LpVideoTrim.vue.js +4 -4
  209. package/dist/components/LpWindow.vue.js +1 -1
  210. package/dist/components/LpWorkspaceSwitcher.vue.js +1 -1
  211. package/dist/components/MenuTitle.vue.js +1 -1
  212. package/dist/components/OptionContent.vue.js +1 -1
  213. package/dist/components/PickerField.vue.js +1 -1
  214. package/dist/components/RevealToggle.vue.js +1 -1
  215. package/dist/components/TourCard.vue.js +1 -1
  216. package/dist/components/VideoFlash.vue.js +1 -1
  217. package/dist/components/VideoThumb.vue.js +1 -1
  218. package/dist/components/VideoVolume.vue.js +1 -1
  219. package/dist/components/menuWhen.js +1 -1
  220. package/dist/components/tableFeatures.d.ts +9 -0
  221. package/dist/icons-all.js +1 -1
  222. package/dist/index.d.ts +1 -1
  223. package/dist/index.js +90 -85
  224. package/package.json +1 -1
  225. package/src/components/ContextMenuItems.vue +22 -0
  226. package/src/components/LpContextMenu.vue +7 -0
  227. package/src/components/LpTable.vue +401 -3
  228. package/src/components/tableFeatures.ts +10 -0
  229. package/src/index.ts +1 -1
  230. package/src/kit-icons.ts +1 -1
  231. package/src/locales/uk.ts +5 -0
@@ -1,20 +1,22 @@
1
- import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, useSlots, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, renderSlot, createCommentVNode, Fragment, renderList, createBlock, createElementVNode, toDisplayString, createTextVNode, Transition, mergeProps, normalizeStyle, withModifiers, TransitionGroup, unref, nextTick } from "vue";
1
+ import { defineComponent, computed, useAttrs, ref, shallowRef, watch, onMounted, useSlots, onBeforeUnmount, useId, h, openBlock, createElementBlock, normalizeClass, createVNode, withCtx, renderSlot, createCommentVNode, createBlock, createTextVNode, toDisplayString, Fragment, renderList, createElementVNode, Transition, 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-Due909Cy.js";
5
- import { _ as _sfc_main$9 } from "../chunks/LpCheckbox-DcXC2qd5.js";
6
- import { _ as _sfc_main$8 } from "../chunks/LpContextMenu-CUFZIQX2.js";
7
- import { _ as _sfc_main$e } from "../chunks/LpEditable-DCPdDDBb.js";
8
- import { _ as _sfc_main$d } from "../chunks/LpEmptyState-DT8U4R8L.js";
9
- import { _ as _sfc_main$3 } from "../chunks/LpBadge-RFp8uHFt.js";
10
- import { _ as _sfc_main$6 } from "../chunks/LpIcon-DCGhNsCU.js";
11
- import { _ as _sfc_main$c } from "../chunks/LpSkeleton-leTl53V9.js";
12
- import { _ as _sfc_main$f } from "../chunks/LpPagination-V1wEhu1K.js";
13
- import { _ as _sfc_main$a } from "../chunks/LpPopover-BQSuxtai.js";
14
- import { _ as _sfc_main$7 } from "../chunks/LpScrollArea-CqvwfZs2.js";
15
- import { _ as _sfc_main$4 } from "../chunks/LpRollingText-B54Pje7P.js";
4
+ import { _ as _sfc_main$1 } from "../chunks/LpDataList-DCtF7krm.js";
5
+ import { _ as _sfc_main$d } from "../chunks/LpCheckbox-P7tEw8GO.js";
6
+ import { _ as _sfc_main$c } from "../chunks/LpContextMenu-DYpDm6iI.js";
7
+ import { _ as _sfc_main$g } from "../chunks/LpEditable-CeRAzYMv.js";
8
+ import { _ as _sfc_main$f } from "../chunks/LpEmptyState-DrHBR3yh.js";
9
+ import { _ as _sfc_main$8 } from "../chunks/LpBadge-Bh5roBr_.js";
10
+ import { _ as _sfc_main$5 } from "../chunks/LpIcon-CxHFPwKt.js";
11
+ import { _ as _sfc_main$e } from "../chunks/LpSkeleton-leTl53V9.js";
12
+ import { _ as _sfc_main$h } from "../chunks/LpPagination-DGLntZJN.js";
13
+ import { _ as _sfc_main$6 } from "../chunks/LpPopover-BQSuxtai.js";
14
+ import { _ as _sfc_main$b } from "../chunks/LpScrollArea-CqvwfZs2.js";
15
+ import { _ as _sfc_main$9 } from "../chunks/LpRollingText-B54Pje7P.js";
16
16
  import { _ as _sfc_main$2 } from "../chunks/LpShift-DAgS_d2x.js";
17
- import { _ as _sfc_main$b } from "../chunks/LpTableFilter-B_BFoBqS.js";
17
+ import { _ as _sfc_main$7 } from "../chunks/LpTableFilter-BGFNKyUX.js";
18
+ import { _ as _sfc_main$3 } from "../chunks/LpDropdownMenu-BPEsqZCN.js";
19
+ import { _ as _sfc_main$a } from "../chunks/LpSegmented-DD8MPj4j.js";
18
20
  import { useKitStorage } from "../composables/usePersisted.js";
19
21
  import { useAsyncTask } from "../composables/useAsyncTask.js";
20
22
  import { useTableFacets } from "./tableFacets.js";
@@ -27,12 +29,12 @@ import { orderPinned, pinOffsets, groupRows, rowWindow, presetHidden, sortByKeys
27
29
  import { devWarn } from "../composables/devWarn.js";
28
30
  import { startPointerDrag } from "../composables/pointerDrag.js";
29
31
  import { isHTMLElement, nodeWindow } from "../composables/realm.js";
30
- import { _ as _sfc_main$5 } from "../chunks/LpButton-DSHioIfD.js";
32
+ import { _ as _sfc_main$4 } from "../chunks/LpButton-DSHioIfD.js";
31
33
  import { toCsv, downloadFile, fileStem } from "./exportData.js";
32
34
  import { toHiddenSets, sameHidden, summarizeShown, parseTableState, mergeRestored, serializeTableState, fromHiddenSets } from "./tableFilter.js";
33
35
  import { resolveRowMenu } from "./tableRowMenu.js";
34
36
  import { _ as _export_sfc } from "../chunks/_plugin-vue_export-helper-1tPrXgE0.js";
35
- import '../assets/LpTable-CEFsRz5J.css';const _hoisted_1 = {
37
+ import '../assets/LpTable-BqZNpWgC.css';const _hoisted_1 = {
36
38
  key: 0,
37
39
  class: "flex min-h-8 flex-wrap items-center gap-x-3 gap-y-2 pb-3 text-xs"
38
40
  };
@@ -42,61 +44,101 @@ const _hoisted_2 = {
42
44
  };
43
45
  const _hoisted_3 = {
44
46
  key: 1,
47
+ class: "flex flex-wrap items-center gap-1 text-sm"
48
+ };
49
+ const _hoisted_4 = {
50
+ key: 2,
45
51
  class: "flex min-w-0 flex-1 flex-wrap items-center gap-1.5"
46
52
  };
47
- const _hoisted_4 = { class: "truncate" };
48
- const _hoisted_5 = { class: "text-muted" };
49
- const _hoisted_6 = { class: "flex items-center gap-2 whitespace-nowrap text-muted" };
50
- const _hoisted_7 = {
53
+ const _hoisted_5 = { class: "truncate" };
54
+ const _hoisted_6 = { class: "text-muted" };
55
+ const _hoisted_7 = { class: "flex items-center gap-2 whitespace-nowrap text-muted" };
56
+ const _hoisted_8 = {
51
57
  key: 0,
52
58
  class: "flex items-center gap-2"
53
59
  };
54
- const _hoisted_8 = {
60
+ const _hoisted_9 = {
55
61
  key: 0,
56
62
  class: "flex items-center gap-2"
57
63
  };
58
- const _hoisted_9 = { class: "hidden sm:inline" };
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"];
64
- const _hoisted_15 = {
64
+ const _hoisted_10 = { class: "hidden sm:inline" };
65
+ const _hoisted_11 = ["aria-rowcount"];
66
+ const _hoisted_12 = { class: "border-b border-line bg-surface-soft" };
67
+ const _hoisted_13 = ["inert"];
68
+ const _hoisted_14 = ["data-lp-col", "aria-sort"];
69
+ const _hoisted_15 = ["onClick"];
70
+ const _hoisted_16 = {
65
71
  key: 1,
66
72
  class: "tabular-nums text-brand"
67
73
  };
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 = {
74
+ const _hoisted_17 = ["aria-label", "data-lp-filter"];
75
+ const _hoisted_18 = ["aria-label", "aria-valuenow", "data-lp-resize", "onPointerdown", "onDblclick", "onKeydown"];
76
+ const _hoisted_19 = {
71
77
  key: 0,
72
78
  class: "sr-only"
73
79
  };
74
- const _hoisted_19 = {
80
+ const _hoisted_20 = {
75
81
  key: "lp-table-empty",
76
82
  class: "lp-row-empty"
77
83
  };
78
- const _hoisted_20 = ["colspan"];
79
- const _hoisted_21 = {
84
+ const _hoisted_21 = ["colspan"];
85
+ const _hoisted_22 = {
80
86
  key: "lp-virtual-before",
81
87
  "aria-hidden": "true"
82
88
  };
83
- const _hoisted_22 = ["colspan"];
84
89
  const _hoisted_23 = ["colspan"];
85
- const _hoisted_24 = ["aria-expanded", "aria-label", "onClick"];
86
- const _hoisted_25 = {
90
+ const _hoisted_24 = ["colspan"];
91
+ const _hoisted_25 = ["aria-expanded", "aria-label", "onClick"];
92
+ const _hoisted_26 = {
87
93
  key: 1,
88
94
  class: "border-b border-line/60 last:border-0",
89
95
  "data-lp-row-detail": ""
90
96
  };
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 = {
97
+ const _hoisted_27 = ["colspan"];
98
+ const _hoisted_28 = ["onContextmenu", "aria-rowindex", "data-paint-key", "data-lp-context-row", "onClick", "onPointerdown"];
99
+ const _hoisted_29 = ["aria-expanded", "aria-label", "onClick"];
100
+ const _hoisted_30 = ["onPointerdown"];
101
+ const _hoisted_31 = {
96
102
  key: "lp-virtual-after",
97
103
  "aria-hidden": "true"
98
104
  };
99
- const _hoisted_31 = ["colspan"];
105
+ const _hoisted_32 = ["colspan"];
106
+ const _hoisted_33 = {
107
+ key: 1,
108
+ class: "sr-only"
109
+ };
110
+ const _hoisted_34 = ["aria-expanded", "aria-label", "onClick"];
111
+ const _hoisted_35 = ["data-paint-key", "data-lp-context-row", "onContextmenu", "onClick", "onPointerdown"];
112
+ const _hoisted_36 = ["onPointerdown"];
113
+ const _hoisted_37 = ["data-cue", "inert"];
114
+ const _hoisted_38 = { class: "flex min-w-0 flex-col gap-2 p-4" };
115
+ const _hoisted_39 = {
116
+ key: 0,
117
+ class: "min-w-0 truncate pr-6 font-medium text-ink"
118
+ };
119
+ const _hoisted_40 = {
120
+ key: 1,
121
+ class: "grid grid-cols-[auto_minmax(0,1fr)] items-baseline gap-x-3 gap-y-1 text-sm"
122
+ };
123
+ const _hoisted_41 = { class: "text-xs text-muted" };
124
+ const _hoisted_42 = { class: "min-w-0 truncate text-ink" };
125
+ const _hoisted_43 = {
126
+ key: 2,
127
+ class: "min-w-0 flex-1"
128
+ };
129
+ const _hoisted_44 = {
130
+ key: 0,
131
+ class: "min-w-0 truncate font-medium text-ink"
132
+ };
133
+ const _hoisted_45 = {
134
+ key: 1,
135
+ class: "flex min-w-0 flex-wrap items-center gap-x-2 gap-y-0.5 text-xs text-muted"
136
+ };
137
+ const _hoisted_46 = {
138
+ key: 0,
139
+ "aria-hidden": "true"
140
+ };
141
+ const _hoisted_47 = ["title"];
100
142
  const __default__ = { inheritAttrs: false };
101
143
  const _sfc_main = /* @__PURE__ */ defineComponent({
102
144
  ...__default__,
@@ -148,9 +190,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
148
190
  expandable: { type: [Boolean, Function] },
149
191
  expanded: { default: void 0 },
150
192
  virtualRowHeight: { default: void 0 },
151
- virtualOverscan: { default: 6 }
193
+ virtualOverscan: { default: 6 },
194
+ layout: { default: void 0 },
195
+ layouts: { default: void 0 },
196
+ layoutBelow: { default: void 0 },
197
+ variant: { default: "framed" },
198
+ cardWidth: { default: "16rem" }
152
199
  },
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"],
200
+ emits: ["update:selected", "update:sort", "update:filters", "resetFilters", "update:allMatching", "update:selectionToken", "update:sorts", "update:columnWidths", "update:columnPreset", "update:collapsedGroups", "update:expanded", "cellEdit", "rowClick", "update:layout"],
154
201
  setup(__props, { expose: __expose, emit: __emit }) {
155
202
  const props = __props;
156
203
  const labelSet = useLabels(
@@ -195,7 +242,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
195
242
  collapseRow: "Collapse row",
196
243
  groupCount: "{label} ({count})",
197
244
  expandGroup: "Expand {label}",
198
- collapseGroup: "Collapse {label}"
245
+ collapseGroup: "Collapse {label}",
246
+ layoutTable: "Table",
247
+ layoutCards: "Cards",
248
+ layoutList: "List",
249
+ layoutSwitch: "View",
250
+ sortBy: "Sort"
199
251
  },
200
252
  () => props.labels
201
253
  );
@@ -647,6 +699,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
647
699
  if (state.hidden) writeHidden(mergeRestored(hiddenValues.value, state.hidden));
648
700
  if (state.columns) hiddenColumns.value = new Set(state.columns);
649
701
  }
702
+ const layout = store.get(`${storageKey.value}:layout`);
703
+ if ((layout === "table" || layout === "cards" || layout === "list") && (!props.layouts || props.layouts.includes(layout))) {
704
+ ownLayout.value = layout;
705
+ if (props.layout !== void 0 && props.layout !== layout) emit("update:layout", layout);
706
+ }
650
707
  }
651
708
  restored.value = true;
652
709
  });
@@ -801,7 +858,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
801
858
  });
802
859
  const slots = useSlots();
803
860
  const showBar = computed(
804
- () => props.summary || props.exportable || !!slots.toolbar || !!props.selectable && props.selected.length > 0 || activeFilters.value.length > 0
861
+ () => props.summary || props.exportable || !!slots.toolbar || layoutChoices.value.length > 0 || !!props.selectable && props.selected.length > 0 || activeFilters.value.length > 0
805
862
  );
806
863
  const filteredOut = computed(() => {
807
864
  if (busy.value || failed.value || displayRows.value.length) return false;
@@ -810,6 +867,78 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
810
867
  return props.rows.length > 0;
811
868
  });
812
869
  const cellY = computed(() => props.density === "compact" ? "py-1.5" : "py-3");
870
+ const ownLayout = ref("table");
871
+ const chosenLayout = computed(() => props.layout ?? ownLayout.value);
872
+ const frameWidth = ref(Number.POSITIVE_INFINITY);
873
+ useResizeObserver(frameEl, (_, el) => frameWidth.value = el.clientWidth, { immediate: true });
874
+ const activeLayout = computed(
875
+ () => chosenLayout.value === "table" && props.layoutBelow && frameWidth.value < props.layoutBelow ? "list" : chosenLayout.value
876
+ );
877
+ const forcedList = computed(() => chosenLayout.value === "table" && activeLayout.value === "list");
878
+ const layoutChoices = computed(
879
+ () => props.layouts && props.layouts.length > 1 && !forcedList.value ? props.layouts : []
880
+ );
881
+ const LAYOUT_ICONS = {
882
+ table: "lucide:table-2",
883
+ cards: "lucide:layout-grid",
884
+ list: "lucide:list"
885
+ };
886
+ const layoutOptions = computed(
887
+ () => layoutChoices.value.map((value) => {
888
+ const label = text.value[`layout${value[0].toUpperCase()}${value.slice(1)}`] ?? value;
889
+ return { value, icon: LAYOUT_ICONS[value], ariaLabel: label };
890
+ })
891
+ );
892
+ function chooseLayout(next) {
893
+ const layout = next;
894
+ if (layout === chosenLayout.value) return;
895
+ ownLayout.value = layout;
896
+ emit("update:layout", layout);
897
+ }
898
+ const headerless = computed(() => activeLayout.value !== "table");
899
+ const sortableColumns = computed(() => props.columns.filter((col) => col.sortable && col.label));
900
+ const filterableColumns = computed(() => props.columns.filter((col) => col.filterable && col.label));
901
+ function sortMenu() {
902
+ const current = activeSort.value;
903
+ const dir = current?.dir ?? "asc";
904
+ return [
905
+ // The columns, the one sorted by ticked; picking one keeps the direction.
906
+ ...sortableColumns.value.map((col) => ({
907
+ label: col.label,
908
+ selected: current?.key === col.key,
909
+ onSelect: () => writeSorts([{ key: col.key, dir }])
910
+ })),
911
+ {
912
+ label: text.value.sortAsc,
913
+ icon: "lucide:arrow-up",
914
+ separatorBefore: true,
915
+ disabled: !current,
916
+ selected: current?.dir === "asc",
917
+ onSelect: () => current && writeSorts([{ key: current.key, dir: "asc" }])
918
+ },
919
+ {
920
+ label: text.value.sortDesc,
921
+ icon: "lucide:arrow-down",
922
+ disabled: !current,
923
+ selected: current?.dir === "desc",
924
+ onSelect: () => current && writeSorts([{ key: current.key, dir: "desc" }])
925
+ },
926
+ { label: text.value.sortClear, icon: "lucide:x", separatorBefore: true, disabled: !current, onSelect: () => writeSorts([]) }
927
+ ];
928
+ }
929
+ const sortSummary = computed(() => {
930
+ const current = activeSort.value;
931
+ const col = current && props.columns.find((c) => c.key === current.key);
932
+ return col ? col.label : text.value.sortBy;
933
+ });
934
+ const cardColumns = computed(
935
+ () => orderPinned(props.columns.filter((col) => !hiddenColumns.value.has(col.key)))
936
+ );
937
+ const titleColumn = computed(() => cardColumns.value[0]);
938
+ const fieldColumns = computed(() => cardColumns.value.slice(1).filter((col) => col.label));
939
+ watch(chosenLayout, (layout) => {
940
+ if (storageKey.value && restored.value) store.set(`${storageKey.value}:layout`, layout);
941
+ });
813
942
  const SKELETON_WIDTHS = [72, 48, 88, 60, 40, 80, 56];
814
943
  function skeletonWidth(row, col) {
815
944
  return `${SKELETON_WIDTHS[(row * 3 + col * 2) % SKELETON_WIDTHS.length]}%`;
@@ -874,7 +1003,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
874
1003
  });
875
1004
  useResizeObserver(viewportEl, (_, el) => viewportHeight.value = el.clientHeight, { immediate: true });
876
1005
  const rowWindowed = computed(
877
- () => props.virtualRowHeight ? rowWindow(scrollTop.value, viewportHeight.value, props.virtualRowHeight, allEntries.value.length, props.virtualOverscan) : null
1006
+ () => props.virtualRowHeight && !headerless.value ? rowWindow(scrollTop.value, viewportHeight.value, props.virtualRowHeight, allEntries.value.length, props.virtualOverscan) : null
878
1007
  );
879
1008
  const viewEntries = computed(
880
1009
  () => rowWindowed.value ? allEntries.value.slice(rowWindowed.value.start, rowWindowed.value.end) : allEntries.value
@@ -987,9 +1116,69 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
987
1116
  _ctx.$slots.toolbar ? (openBlock(), createElementBlock("div", _hoisted_2, [
988
1117
  renderSlot(_ctx.$slots, "toolbar", {}, void 0, true)
989
1118
  ])) : createCommentVNode("", true),
990
- activeFilters.value.length ? (openBlock(), createElementBlock("div", _hoisted_3, [
1119
+ headerless.value && (sortableColumns.value.length || filterableColumns.value.length) ? (openBlock(), createElementBlock("div", _hoisted_3, [
1120
+ sortableColumns.value.length ? (openBlock(), createBlock(_sfc_main$3, {
1121
+ key: 0,
1122
+ items: sortMenu()
1123
+ }, {
1124
+ trigger: withCtx(() => [
1125
+ createVNode(_sfc_main$4, {
1126
+ variant: "ghost",
1127
+ size: "sm",
1128
+ "aria-label": text.value.sortBy
1129
+ }, {
1130
+ default: withCtx(() => [
1131
+ createVNode(_sfc_main$5, {
1132
+ name: activeSort.value ? activeSort.value.dir === "asc" ? "lucide:arrow-up" : "lucide:arrow-down" : "lucide:arrow-up-down",
1133
+ size: 14
1134
+ }, null, 8, ["name"]),
1135
+ createTextVNode(" " + toDisplayString(sortSummary.value), 1)
1136
+ ]),
1137
+ _: 1
1138
+ }, 8, ["aria-label"])
1139
+ ]),
1140
+ _: 1
1141
+ }, 8, ["items"])) : createCommentVNode("", true),
1142
+ (openBlock(true), createElementBlock(Fragment, null, renderList(filterableColumns.value, (col) => {
1143
+ return openBlock(), createBlock(_sfc_main$6, {
1144
+ key: col.key,
1145
+ align: "start",
1146
+ "panel-class": "w-72",
1147
+ "aria-label": text.value.filterColumn.replace("{column}", col.label)
1148
+ }, {
1149
+ trigger: withCtx(() => [
1150
+ createVNode(_sfc_main$4, {
1151
+ variant: "ghost",
1152
+ size: "sm",
1153
+ class: normalizeClass(hiddenValues.value[col.key]?.size ? "text-brand" : ""),
1154
+ "aria-label": text.value.filterColumn.replace("{column}", col.label),
1155
+ "data-lp-filter": col.key
1156
+ }, {
1157
+ default: withCtx(() => [
1158
+ createVNode(_sfc_main$5, {
1159
+ name: hiddenValues.value[col.key]?.size ? "lucide:filter-x" : "lucide:filter",
1160
+ size: 14
1161
+ }, null, 8, ["name"]),
1162
+ createTextVNode(" " + toDisplayString(col.label), 1)
1163
+ ]),
1164
+ _: 2
1165
+ }, 1032, ["class", "aria-label", "data-lp-filter"])
1166
+ ]),
1167
+ default: withCtx(() => [
1168
+ createVNode(_sfc_main$7, {
1169
+ options: facetOptions.value.get(col.key)?.value ?? [],
1170
+ hidden: hiddenValues.value[col.key] ?? /* @__PURE__ */ new Set(),
1171
+ labels: filterLabels(),
1172
+ "onUpdate:hidden": (next) => setHidden(col.key, next)
1173
+ }, null, 8, ["options", "hidden", "labels", "onUpdate:hidden"])
1174
+ ]),
1175
+ _: 2
1176
+ }, 1032, ["aria-label"]);
1177
+ }), 128))
1178
+ ])) : createCommentVNode("", true),
1179
+ activeFilters.value.length ? (openBlock(), createElementBlock("div", _hoisted_4, [
991
1180
  (openBlock(true), createElementBlock(Fragment, null, renderList(activeFilters.value, (f) => {
992
- return openBlock(), createBlock(_sfc_main$3, {
1181
+ return openBlock(), createBlock(_sfc_main$8, {
993
1182
  key: f.col.key,
994
1183
  tone: "brand",
995
1184
  removable: "",
@@ -998,8 +1187,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
998
1187
  onRemove: ($event) => showAllValues(f.col.key)
999
1188
  }, {
1000
1189
  default: withCtx(() => [
1001
- createElementVNode("span", _hoisted_4, [
1002
- createElementVNode("span", _hoisted_5, toDisplayString(f.col.label) + ":", 1),
1190
+ createElementVNode("span", _hoisted_5, [
1191
+ createElementVNode("span", _hoisted_6, toDisplayString(f.col.label) + ":", 1),
1003
1192
  createTextVNode(" " + toDisplayString(f.text), 1)
1004
1193
  ])
1005
1194
  ]),
@@ -1018,8 +1207,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1018
1207
  class: "ml-auto shrink-0"
1019
1208
  }, {
1020
1209
  default: withCtx(() => [
1021
- createElementVNode("div", _hoisted_6, [
1022
- createVNode(_sfc_main$4, {
1210
+ createElementVNode("div", _hoisted_7, [
1211
+ createVNode(_sfc_main$9, {
1023
1212
  value: statusText.value,
1024
1213
  align: "end",
1025
1214
  class: normalizeClass(["tabular-nums", __props.selectable && __props.selected.length ? "font-medium text-ink" : ""]),
@@ -1032,7 +1221,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1032
1221
  "leave-to-class": "opacity-0"
1033
1222
  }, {
1034
1223
  default: withCtx(() => [
1035
- __props.selectable && __props.selected.length ? (openBlock(), createElementBlock("span", _hoisted_7, [
1224
+ __props.selectable && __props.selected.length ? (openBlock(), createElementBlock("span", _hoisted_8, [
1036
1225
  createVNode(Transition, {
1037
1226
  "enter-active-class": "transition-opacity duration-fast motion-reduce:transition-none",
1038
1227
  "leave-active-class": "transition-opacity duration-fast motion-reduce:transition-none",
@@ -1040,8 +1229,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1040
1229
  "leave-to-class": "opacity-0"
1041
1230
  }, {
1042
1231
  default: withCtx(() => [
1043
- __props.load && pageAllSelected.value && !__props.allMatching && total.value > pageKeys.value.length ? (openBlock(), createElementBlock("span", _hoisted_8, [
1044
- createElementVNode("span", _hoisted_9, toDisplayString(text.value.pageSelected.replace("{count}", String(pageKeys.value.length))), 1),
1232
+ __props.load && pageAllSelected.value && !__props.allMatching && total.value > pageKeys.value.length ? (openBlock(), createElementBlock("span", _hoisted_9, [
1233
+ createElementVNode("span", _hoisted_10, toDisplayString(text.value.pageSelected.replace("{count}", String(pageKeys.value.length))), 1),
1045
1234
  createElementVNode("button", {
1046
1235
  type: "button",
1047
1236
  class: "rounded-control px-1.5 py-0.5 font-medium text-brand outline-none transition-colors duration-fast hover:bg-brand-soft focus-visible:ring-2 focus-visible:ring-ring",
@@ -1065,14 +1254,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1065
1254
  ]),
1066
1255
  _: 3
1067
1256
  }),
1068
- __props.exportable ? (openBlock(), createBlock(_sfc_main$5, {
1257
+ layoutOptions.value.length ? (openBlock(), createBlock(_sfc_main$a, {
1069
1258
  key: 0,
1259
+ "model-value": chosenLayout.value,
1260
+ options: layoutOptions.value,
1261
+ size: "sm",
1262
+ "aria-label": text.value.layoutSwitch,
1263
+ "onUpdate:modelValue": chooseLayout
1264
+ }, null, 8, ["model-value", "options", "aria-label"])) : createCommentVNode("", true),
1265
+ __props.exportable ? (openBlock(), createBlock(_sfc_main$4, {
1266
+ key: 1,
1070
1267
  variant: "ghost",
1071
1268
  size: "sm",
1072
1269
  onClick: _cache[1] || (_cache[1] = ($event) => exportCsv())
1073
1270
  }, {
1074
1271
  default: withCtx(() => [
1075
- createVNode(_sfc_main$6, {
1272
+ createVNode(_sfc_main$5, {
1076
1273
  name: "lucide:download",
1077
1274
  size: 14
1078
1275
  }),
@@ -1093,14 +1290,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1093
1290
  class: "flex min-h-0 flex-auto flex-col"
1094
1291
  }, {
1095
1292
  default: withCtx(() => [
1096
- createVNode(_sfc_main$7, mergeProps(scrollAttrs.value, {
1293
+ !headerless.value ? (openBlock(), createBlock(_sfc_main$b, mergeProps({ key: 0 }, scrollAttrs.value, {
1097
1294
  fade: false,
1098
- class: "min-h-0 flex-1 rounded-card border border-line bg-surface",
1295
+ class: ["min-h-0 flex-1", __props.variant === "framed" ? "rounded-card border border-line bg-surface" : ""],
1099
1296
  style: __props.load && floor.value ? { minHeight: `${floor.value + 2}px` } : void 0,
1100
1297
  "bar-inset-top": barInsetTop.value
1101
1298
  }), {
1102
1299
  default: withCtx(() => [
1103
- createVNode(_sfc_main$8, {
1300
+ createVNode(_sfc_main$c, {
1104
1301
  items: contextMenu.value,
1105
1302
  always: "",
1106
1303
  "no-hint": !__props.rowMenu,
@@ -1122,7 +1319,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1122
1319
  ref: headEl,
1123
1320
  class: normalizeClass(__props.stickyHeader ? "sticky top-0 z-10 bg-surface-soft" : "")
1124
1321
  }, [
1125
- createElementVNode("tr", _hoisted_11, [
1322
+ createElementVNode("tr", _hoisted_12, [
1126
1323
  expansionOn.value ? (openBlock(), createElementBlock("th", {
1127
1324
  key: 0,
1128
1325
  class: normalizeClass(["w-px p-0", cellY.value]),
@@ -1137,12 +1334,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1137
1334
  class: normalizeClass(["lp-tick lp-tick-open", ticksShown.value ? "" : "lp-tick-hidden"]),
1138
1335
  inert: !ticksShown.value
1139
1336
  }, [
1140
- createVNode(_sfc_main$9, {
1337
+ createVNode(_sfc_main$d, {
1141
1338
  "model-value": allChecked.value,
1142
1339
  indeterminate: someChecked.value,
1143
1340
  "onUpdate:modelValue": toggleAll
1144
1341
  }, null, 8, ["model-value", "indeterminate"])
1145
- ], 10, _hoisted_12)
1342
+ ], 10, _hoisted_13)
1146
1343
  ], 6)) : createCommentVNode("", true),
1147
1344
  (openBlock(true), createElementBlock(Fragment, null, renderList(shownColumns.value, (col) => {
1148
1345
  return openBlock(), createElementBlock("th", {
@@ -1152,21 +1349,21 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1152
1349
  "data-lp-col": measuredCol(col),
1153
1350
  "aria-sort": sortOf(col) ? sortOf(col).dir === "asc" ? "ascending" : "descending" : void 0
1154
1351
  }, [
1155
- col.sortable || col.filterable ? (openBlock(), createBlock(_sfc_main$8, {
1352
+ col.sortable || col.filterable ? (openBlock(), createBlock(_sfc_main$c, {
1156
1353
  key: 0,
1157
1354
  items: headerMenu(col)
1158
1355
  }, {
1159
1356
  default: withCtx(() => [
1160
1357
  createElementVNode("button", {
1161
1358
  type: "button",
1162
- 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", [
1359
+ class: normalizeClass(["group/sort -mx-1 inline-flex items-center gap-1 rounded-small px-1 uppercase outline-none transition-colors duration-[var(--duration-fast)] hover:text-ink focus-visible:ring-2 focus-visible:ring-ring", [
1163
1360
  col.align === "right" ? "flex-row-reverse" : "",
1164
1361
  sortOf(col) ? "text-ink" : ""
1165
1362
  ]]),
1166
1363
  onClick: ($event) => toggleSort(col, $event)
1167
1364
  }, [
1168
1365
  createTextVNode(toDisplayString(col.label) + " ", 1),
1169
- col.sortable ? (openBlock(), createBlock(_sfc_main$6, {
1366
+ col.sortable ? (openBlock(), createBlock(_sfc_main$5, {
1170
1367
  key: 0,
1171
1368
  name: sortIcon(col),
1172
1369
  size: 13,
@@ -1175,14 +1372,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1175
1372
  sortOf(col) ? "opacity-100" : "opacity-40 group-hover/sort:opacity-70"
1176
1373
  ])
1177
1374
  }, null, 8, ["name", "class"])) : createCommentVNode("", true),
1178
- sortPosition(col) ? (openBlock(), createElementBlock("span", _hoisted_15, toDisplayString(sortPosition(col)), 1)) : createCommentVNode("", true)
1179
- ], 10, _hoisted_14)
1375
+ sortPosition(col) ? (openBlock(), createElementBlock("span", _hoisted_16, toDisplayString(sortPosition(col)), 1)) : createCommentVNode("", true)
1376
+ ], 10, _hoisted_15)
1180
1377
  ]),
1181
1378
  _: 2
1182
1379
  }, 1032, ["items"])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1183
1380
  createTextVNode(toDisplayString(col.label), 1)
1184
1381
  ], 64)),
1185
- col.filterable ? (openBlock(), createBlock(_sfc_main$a, {
1382
+ col.filterable ? (openBlock(), createBlock(_sfc_main$6, {
1186
1383
  key: 2,
1187
1384
  align: "start",
1188
1385
  "panel-class": "w-72",
@@ -1195,14 +1392,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1195
1392
  "aria-label": text.value.filterColumn.replace("{column}", col.label),
1196
1393
  "data-lp-filter": col.key
1197
1394
  }, [
1198
- createVNode(_sfc_main$6, {
1395
+ createVNode(_sfc_main$5, {
1199
1396
  name: hiddenValues.value[col.key]?.size ? "lucide:filter-x" : "lucide:filter",
1200
1397
  size: 12
1201
1398
  }, null, 8, ["name"])
1202
- ], 10, _hoisted_16)
1399
+ ], 10, _hoisted_17)
1203
1400
  ]),
1204
1401
  default: withCtx(() => [
1205
- createVNode(_sfc_main$b, {
1402
+ createVNode(_sfc_main$7, {
1206
1403
  options: facetOptions.value.get(col.key)?.value ?? [],
1207
1404
  hidden: hiddenValues.value[col.key] ?? /* @__PURE__ */ new Set(),
1208
1405
  labels: filterLabels(),
@@ -1225,8 +1422,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1225
1422
  }, ["stop"])),
1226
1423
  onDblclick: withModifiers(($event) => clearWidth(col), ["stop"]),
1227
1424
  onKeydown: ($event) => onResizeKey($event, col)
1228
- }, null, 40, _hoisted_17)) : createCommentVNode("", true)
1229
- ], 14, _hoisted_13);
1425
+ }, null, 40, _hoisted_18)) : createCommentVNode("", true)
1426
+ ], 14, _hoisted_14);
1230
1427
  }), 128))
1231
1428
  ])
1232
1429
  ], 2),
@@ -1257,26 +1454,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1257
1454
  key: col.key,
1258
1455
  class: normalizeClass(["px-4", [alignClass(col.align), cellY.value]])
1259
1456
  }, [
1260
- createVNode(_sfc_main$c, {
1457
+ createVNode(_sfc_main$e, {
1261
1458
  class: "inline-block h-3 align-middle",
1262
1459
  style: normalizeStyle({ width: skeletonWidth(n, ci) })
1263
1460
  }, null, 8, ["style"]),
1264
- n === 1 && ci === 0 ? (openBlock(), createElementBlock("span", _hoisted_18, toDisplayString(text.value.loading), 1)) : createCommentVNode("", true)
1461
+ n === 1 && ci === 0 ? (openBlock(), createElementBlock("span", _hoisted_19, toDisplayString(text.value.loading), 1)) : createCommentVNode("", true)
1265
1462
  ], 2);
1266
1463
  }), 128))
1267
1464
  ]);
1268
- }), 128)) : displayRows.value.length === 0 ? (openBlock(), createElementBlock("tr", _hoisted_19, [
1465
+ }), 128)) : displayRows.value.length === 0 ? (openBlock(), createElementBlock("tr", _hoisted_20, [
1269
1466
  createElementVNode("td", {
1270
1467
  colspan: colSpan.value,
1271
1468
  class: "p-0"
1272
1469
  }, [
1273
- createVNode(_sfc_main$d, {
1470
+ createVNode(_sfc_main$f, {
1274
1471
  compact: "",
1275
1472
  icon: failed.value ? "lucide:circle-alert" : filteredOut.value ? "lucide:filter-x" : __props.emptyIcon,
1276
1473
  title: failed.value ? text.value.error : filteredOut.value ? text.value.noMatches : text.value.empty
1277
1474
  }, {
1278
1475
  default: withCtx(() => [
1279
- filteredOut.value ? (openBlock(), createBlock(_sfc_main$5, {
1476
+ filteredOut.value ? (openBlock(), createBlock(_sfc_main$4, {
1280
1477
  key: 0,
1281
1478
  variant: "outline",
1282
1479
  size: "sm",
@@ -1290,14 +1487,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1290
1487
  ]),
1291
1488
  _: 1
1292
1489
  }, 8, ["icon", "title"])
1293
- ], 8, _hoisted_20)
1490
+ ], 8, _hoisted_21)
1294
1491
  ])) : createCommentVNode("", true),
1295
- rowWindowed.value?.before ? (openBlock(), createElementBlock("tr", _hoisted_21, [
1492
+ rowWindowed.value?.before ? (openBlock(), createElementBlock("tr", _hoisted_22, [
1296
1493
  createElementVNode("td", {
1297
1494
  colspan: colSpan.value,
1298
1495
  class: "p-0",
1299
1496
  style: normalizeStyle({ height: `${rowWindowed.value.before}px` })
1300
- }, null, 12, _hoisted_22)
1497
+ }, null, 12, _hoisted_23)
1301
1498
  ])) : createCommentVNode("", true),
1302
1499
  (openBlock(true), createElementBlock(Fragment, null, renderList(viewEntries.value, (entry) => {
1303
1500
  return openBlock(), createElementBlock(Fragment, {
@@ -1326,16 +1523,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1326
1523
  "aria-label": (entry.collapsed ? text.value.expandGroup : text.value.collapseGroup).replace("{label}", entry.label),
1327
1524
  onClick: ($event) => toggleGroup(entry.group)
1328
1525
  }, [
1329
- createVNode(_sfc_main$6, {
1526
+ createVNode(_sfc_main$5, {
1330
1527
  name: "lucide:chevron-right",
1331
1528
  size: 14,
1332
1529
  class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", entry.collapsed ? "" : "rotate-90"])
1333
1530
  }, null, 8, ["class"]),
1334
1531
  createTextVNode(" " + toDisplayString(entry.label), 1)
1335
- ], 8, _hoisted_24)
1532
+ ], 8, _hoisted_25)
1336
1533
  ], true)
1337
- ], 10, _hoisted_23)
1338
- ], 4)) : entry.kind === "detail" ? (openBlock(), createElementBlock("tr", _hoisted_25, [
1534
+ ], 10, _hoisted_24)
1535
+ ], 4)) : entry.kind === "detail" ? (openBlock(), createElementBlock("tr", _hoisted_26, [
1339
1536
  createElementVNode("td", {
1340
1537
  colspan: colSpan.value,
1341
1538
  class: "px-4 py-3"
@@ -1344,7 +1541,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1344
1541
  row: entry.row,
1345
1542
  close: () => toggleExpanded(keyFor(entry.row, entry.index))
1346
1543
  }, void 0, true)
1347
- ], 8, _hoisted_26)
1544
+ ], 8, _hoisted_27)
1348
1545
  ])) : (openBlock(), createElementBlock("tr", mergeProps({
1349
1546
  key: 2,
1350
1547
  onContextmenu: ($event) => onRowContextMenu(entry.row),
@@ -1374,12 +1571,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1374
1571
  "aria-label": expandedKeys.value.has(keyFor(entry.row, entry.index)) ? text.value.collapseRow : text.value.expandRow,
1375
1572
  onClick: ($event) => toggleExpanded(keyFor(entry.row, entry.index))
1376
1573
  }, [
1377
- createVNode(_sfc_main$6, {
1574
+ createVNode(_sfc_main$5, {
1378
1575
  name: "lucide:chevron-right",
1379
1576
  size: 14,
1380
1577
  class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", expandedKeys.value.has(keyFor(entry.row, entry.index)) ? "rotate-90" : ""])
1381
1578
  }, null, 8, ["class"])
1382
- ], 8, _hoisted_28)) : createCommentVNode("", true)
1579
+ ], 8, _hoisted_29)) : createCommentVNode("", true)
1383
1580
  ], 34)) : createCommentVNode("", true),
1384
1581
  __props.selectable ? (openBlock(), createElementBlock("td", {
1385
1582
  key: 1,
@@ -1391,12 +1588,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1391
1588
  createElementVNode("div", {
1392
1589
  class: normalizeClass(["lp-tick lp-tick-open", ticksShown.value ? "" : "lp-tick-cue"])
1393
1590
  }, [
1394
- createVNode(_sfc_main$9, {
1591
+ createVNode(_sfc_main$d, {
1395
1592
  "model-value": isSelected(keyFor(entry.row, entry.index)),
1396
1593
  "onUpdate:modelValue": (v) => toggleRow(keyFor(entry.row, entry.index), v)
1397
1594
  }, null, 8, ["model-value", "onUpdate:modelValue"])
1398
1595
  ], 2)
1399
- ], 42, _hoisted_29)) : createCommentVNode("", true),
1596
+ ], 42, _hoisted_30)) : createCommentVNode("", true),
1400
1597
  (openBlock(true), createElementBlock(Fragment, null, renderList(shownColumns.value, (col) => {
1401
1598
  return openBlock(), createElementBlock("td", {
1402
1599
  key: col.key,
@@ -1418,7 +1615,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1418
1615
  onKeydown: _cache[8] || (_cache[8] = withModifiers(() => {
1419
1616
  }, ["stop"]))
1420
1617
  }, [
1421
- createVNode(_sfc_main$e, {
1618
+ createVNode(_sfc_main$g, {
1422
1619
  "model-value": String(entry.row[col.key] ?? ""),
1423
1620
  label: col.label,
1424
1621
  size: "sm",
@@ -1431,33 +1628,250 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1431
1628
  ], true)
1432
1629
  ], 6);
1433
1630
  }), 128))
1434
- ], 16, _hoisted_27))
1631
+ ], 16, _hoisted_28))
1435
1632
  ], 64);
1436
1633
  }), 128)),
1437
- rowWindowed.value?.after ? (openBlock(), createElementBlock("tr", _hoisted_30, [
1634
+ rowWindowed.value?.after ? (openBlock(), createElementBlock("tr", _hoisted_31, [
1438
1635
  createElementVNode("td", {
1439
1636
  colspan: colSpan.value,
1440
1637
  class: "p-0",
1441
1638
  style: normalizeStyle({ height: `${rowWindowed.value.after}px` })
1442
- }, null, 12, _hoisted_31)
1639
+ }, null, 12, _hoisted_32)
1443
1640
  ])) : createCommentVNode("", true)
1444
1641
  ]),
1445
1642
  _: 3
1446
1643
  }, 8, ["css", "class", "aria-busy"])
1447
- ], 14, _hoisted_10)
1644
+ ], 14, _hoisted_11)
1448
1645
  ]),
1449
1646
  _: 3
1450
1647
  }, 8, ["items", "no-hint", "title", "subtitle", "title-icon", "title-image"])
1451
1648
  ]),
1452
1649
  _: 3
1453
- }, 16, ["style", "bar-inset-top"])
1650
+ }, 16, ["class", "style", "bar-inset-top"])) : (openBlock(), createBlock(_sfc_main$c, {
1651
+ key: 1,
1652
+ items: contextMenu.value,
1653
+ always: "",
1654
+ "no-hint": !__props.rowMenu,
1655
+ title: menuHead.value?.title,
1656
+ subtitle: menuHead.value?.subtitle,
1657
+ "title-icon": menuHead.value?.icon,
1658
+ "title-image": menuHead.value?.image
1659
+ }, {
1660
+ default: withCtx(() => [
1661
+ (openBlock(), createBlock(TransitionGroup, mergeProps({
1662
+ key: activeLayout.value,
1663
+ tag: "div",
1664
+ name: "lp-row",
1665
+ css: animating.value
1666
+ }, scrollAttrs.value, {
1667
+ class: ["min-h-0 transition-opacity", [
1668
+ busy.value && displayRows.value.length ? "opacity-60" : "",
1669
+ activeLayout.value === "cards" ? "grid gap-3" : __props.variant === "framed" ? "overflow-hidden rounded-card border border-line bg-surface" : ""
1670
+ ]],
1671
+ style: activeLayout.value === "cards" ? { gridTemplateColumns: `repeat(auto-fill, minmax(min(${__props.cardWidth}, 100%), 1fr))` } : void 0,
1672
+ "aria-busy": busy.value || void 0,
1673
+ ref: (el) => unref(roving).setContainer(el?.$el ?? null)
1674
+ }), {
1675
+ default: withCtx(() => [
1676
+ displayRows.value.length === 0 && busy.value ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(__props.skeletonRows, (n) => {
1677
+ return openBlock(), createElementBlock("div", {
1678
+ key: `lp-table-skeleton-${n}`,
1679
+ class: normalizeClass(["lp-row-empty", activeLayout.value === "cards" ? "flex flex-col gap-3 rounded-card border border-line bg-surface p-4" : ["flex flex-col gap-2 border-b border-line/60 px-4 last:border-0", cellY.value]])
1680
+ }, [
1681
+ createVNode(_sfc_main$e, {
1682
+ class: "h-3.5",
1683
+ style: normalizeStyle({ width: skeletonWidth(n, 0) })
1684
+ }, null, 8, ["style"]),
1685
+ createVNode(_sfc_main$e, {
1686
+ class: "h-3",
1687
+ style: normalizeStyle({ width: skeletonWidth(n, 1) })
1688
+ }, null, 8, ["style"]),
1689
+ activeLayout.value === "cards" ? (openBlock(), createBlock(_sfc_main$e, {
1690
+ key: 0,
1691
+ class: "h-3",
1692
+ style: normalizeStyle({ width: skeletonWidth(n, 2) })
1693
+ }, null, 8, ["style"])) : createCommentVNode("", true),
1694
+ n === 1 ? (openBlock(), createElementBlock("span", _hoisted_33, toDisplayString(text.value.loading), 1)) : createCommentVNode("", true)
1695
+ ], 2);
1696
+ }), 128)) : displayRows.value.length === 0 ? (openBlock(), createElementBlock("div", {
1697
+ key: "lp-table-empty",
1698
+ class: normalizeClass(["lp-row-empty", activeLayout.value === "cards" ? "col-span-full rounded-card border border-line bg-surface" : ""])
1699
+ }, [
1700
+ createVNode(_sfc_main$f, {
1701
+ compact: "",
1702
+ icon: failed.value ? "lucide:circle-alert" : filteredOut.value ? "lucide:filter-x" : __props.emptyIcon,
1703
+ title: failed.value ? text.value.error : filteredOut.value ? text.value.noMatches : text.value.empty
1704
+ }, {
1705
+ default: withCtx(() => [
1706
+ filteredOut.value ? (openBlock(), createBlock(_sfc_main$4, {
1707
+ key: 0,
1708
+ variant: "outline",
1709
+ size: "sm",
1710
+ onClick: resetFilters
1711
+ }, {
1712
+ default: withCtx(() => [
1713
+ createTextVNode(toDisplayString(text.value.resetFilters), 1)
1714
+ ]),
1715
+ _: 1
1716
+ })) : createCommentVNode("", true)
1717
+ ]),
1718
+ _: 1
1719
+ }, 8, ["icon", "title"])
1720
+ ], 2)) : createCommentVNode("", true),
1721
+ (openBlock(true), createElementBlock(Fragment, null, renderList(allEntries.value, (entry) => {
1722
+ return openBlock(), createElementBlock(Fragment, {
1723
+ key: entry.id
1724
+ }, [
1725
+ entry.kind === "group" ? (openBlock(), createElementBlock("div", {
1726
+ key: 0,
1727
+ class: normalizeClass(["text-xs font-medium text-muted", activeLayout.value === "cards" ? "col-span-full pt-2" : ["border-b border-line/60 bg-surface-soft/60 px-4", cellY.value]])
1728
+ }, [
1729
+ renderSlot(_ctx.$slots, "group", {
1730
+ value: entry.value,
1731
+ rows: entry.rows,
1732
+ label: entry.label,
1733
+ collapsed: entry.collapsed,
1734
+ toggle: () => toggleGroup(entry.group)
1735
+ }, () => [
1736
+ createElementVNode("button", {
1737
+ type: "button",
1738
+ 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",
1739
+ "aria-expanded": !entry.collapsed,
1740
+ "aria-label": (entry.collapsed ? text.value.expandGroup : text.value.collapseGroup).replace("{label}", entry.label),
1741
+ onClick: ($event) => toggleGroup(entry.group)
1742
+ }, [
1743
+ createVNode(_sfc_main$5, {
1744
+ name: "lucide:chevron-right",
1745
+ size: 14,
1746
+ class: normalizeClass(["transition-transform duration-fast motion-reduce:transition-none", entry.collapsed ? "" : "rotate-90"])
1747
+ }, null, 8, ["class"]),
1748
+ createTextVNode(" " + toDisplayString(entry.label), 1)
1749
+ ], 8, _hoisted_34)
1750
+ ], true)
1751
+ ], 2)) : entry.kind === "detail" ? (openBlock(), createElementBlock("div", {
1752
+ key: 1,
1753
+ class: normalizeClass(["px-4 py-3", activeLayout.value === "cards" ? "col-span-full" : "border-b border-line/60 last:border-0"]),
1754
+ "data-lp-row-detail": ""
1755
+ }, [
1756
+ renderSlot(_ctx.$slots, "expanded", {
1757
+ row: entry.row,
1758
+ close: () => toggleExpanded(keyFor(entry.row, entry.index))
1759
+ }, void 0, true)
1760
+ ], 2)) : (openBlock(), createElementBlock("div", mergeProps({
1761
+ key: 2,
1762
+ class: ["lp-item group relative outline-none transition-colors focus-visible:ring-2 focus-visible:ring-ring", [
1763
+ activeLayout.value === "cards" ? ["flex min-w-0 flex-col overflow-hidden rounded-card border bg-surface hover:border-line-strong focus-visible:ring-offset-0", isSelected(keyFor(entry.row, entry.index)) ? "border-brand bg-brand-soft/30" : "border-line"] : ["flex min-w-0 items-center gap-3 border-b border-line/60 px-4 last:border-0 hover:bg-surface-soft/60 focus-visible:ring-inset data-[active]:bg-surface-soft/40", cellY.value, isSelected(keyFor(entry.row, entry.index)) ? "bg-brand-soft/40" : ""]
1764
+ ]]
1765
+ }, { ref_for: true }, unref(roving).itemProps(String(keyFor(entry.row, entry.index))), {
1766
+ "data-paint-key": __props.selectable ? String(keyFor(entry.row, entry.index)) : void 0,
1767
+ "data-lp-context-row": __props.rowMenu ? "" : void 0,
1768
+ onContextmenu: ($event) => onRowContextMenu(entry.row),
1769
+ onClick: ($event) => onRowClick(entry.row, keyFor(entry.row, entry.index)),
1770
+ onPointerdown: ($event) => onRowPointerDown($event, keyFor(entry.row, entry.index)),
1771
+ onKeydown: onRowKeydown
1772
+ }), [
1773
+ __props.selectable ? (openBlock(), createElementBlock("div", {
1774
+ key: 0,
1775
+ class: normalizeClass(["cursor-pointer select-none", activeLayout.value === "cards" ? "absolute top-2 right-2 z-[1]" : ["shrink-0 transition-[margin] duration-medium ease-[var(--ease-emphasized)] motion-reduce:transition-none", ticksShown.value ? "" : "-mr-3"]]),
1776
+ onClick: _cache[9] || (_cache[9] = withModifiers(() => {
1777
+ }, ["stop"])),
1778
+ onPointerdown: withModifiers(($event) => unref(paint).onPointerDown($event, keyFor(entry.row, entry.index)), ["stop"])
1779
+ }, [
1780
+ createElementVNode("div", {
1781
+ class: normalizeClass(["lp-tick", activeLayout.value === "cards" ? "lp-tick-card" : ticksShown.value ? "lp-tick-line" : ""]),
1782
+ "data-cue": activeLayout.value === "cards" && !ticksShown.value ? "" : void 0,
1783
+ inert: activeLayout.value !== "cards" && !ticksShown.value
1784
+ }, [
1785
+ createVNode(_sfc_main$d, {
1786
+ "model-value": isSelected(keyFor(entry.row, entry.index)),
1787
+ "onUpdate:modelValue": (v) => toggleRow(keyFor(entry.row, entry.index), v)
1788
+ }, null, 8, ["model-value", "onUpdate:modelValue"])
1789
+ ], 10, _hoisted_37)
1790
+ ], 42, _hoisted_36)) : createCommentVNode("", true),
1791
+ activeLayout.value === "cards" ? renderSlot(_ctx.$slots, "card", {
1792
+ key: 1,
1793
+ row: entry.row,
1794
+ selected: isSelected(keyFor(entry.row, entry.index)),
1795
+ toggle: () => toggleRow(keyFor(entry.row, entry.index), !isSelected(keyFor(entry.row, entry.index))),
1796
+ openMenu: openRowMenu
1797
+ }, () => [
1798
+ createElementVNode("div", _hoisted_38, [
1799
+ titleColumn.value ? (openBlock(), createElementBlock("div", _hoisted_39, [
1800
+ renderSlot(_ctx.$slots, `cell-${titleColumn.value.key}`, {
1801
+ row: entry.row,
1802
+ value: entry.row[titleColumn.value.key],
1803
+ openMenu: openRowMenu
1804
+ }, () => [
1805
+ createTextVNode(toDisplayString(entry.row[titleColumn.value.key]), 1)
1806
+ ], true)
1807
+ ])) : createCommentVNode("", true),
1808
+ fieldColumns.value.length ? (openBlock(), createElementBlock("dl", _hoisted_40, [
1809
+ (openBlock(true), createElementBlock(Fragment, null, renderList(fieldColumns.value, (col) => {
1810
+ return openBlock(), createElementBlock(Fragment, {
1811
+ key: col.key
1812
+ }, [
1813
+ createElementVNode("dt", _hoisted_41, toDisplayString(col.label), 1),
1814
+ createElementVNode("dd", _hoisted_42, [
1815
+ renderSlot(_ctx.$slots, `cell-${col.key}`, {
1816
+ row: entry.row,
1817
+ value: entry.row[col.key],
1818
+ openMenu: openRowMenu
1819
+ }, () => [
1820
+ createTextVNode(toDisplayString(entry.row[col.key]), 1)
1821
+ ], true)
1822
+ ])
1823
+ ], 64);
1824
+ }), 128))
1825
+ ])) : createCommentVNode("", true)
1826
+ ])
1827
+ ], true) : (openBlock(), createElementBlock("div", _hoisted_43, [
1828
+ titleColumn.value ? (openBlock(), createElementBlock("div", _hoisted_44, [
1829
+ renderSlot(_ctx.$slots, `cell-${titleColumn.value.key}`, {
1830
+ row: entry.row,
1831
+ value: entry.row[titleColumn.value.key],
1832
+ openMenu: openRowMenu
1833
+ }, () => [
1834
+ createTextVNode(toDisplayString(entry.row[titleColumn.value.key]), 1)
1835
+ ], true)
1836
+ ])) : createCommentVNode("", true),
1837
+ fieldColumns.value.length ? (openBlock(), createElementBlock("div", _hoisted_45, [
1838
+ (openBlock(true), createElementBlock(Fragment, null, renderList(fieldColumns.value, (col, ci) => {
1839
+ return openBlock(), createElementBlock(Fragment, {
1840
+ key: col.key
1841
+ }, [
1842
+ ci > 0 ? (openBlock(), createElementBlock("span", _hoisted_46, "·")) : createCommentVNode("", true),
1843
+ createElementVNode("span", {
1844
+ class: "min-w-0 truncate",
1845
+ title: col.label
1846
+ }, [
1847
+ renderSlot(_ctx.$slots, `cell-${col.key}`, {
1848
+ row: entry.row,
1849
+ value: entry.row[col.key],
1850
+ openMenu: openRowMenu
1851
+ }, () => [
1852
+ createTextVNode(toDisplayString(entry.row[col.key]), 1)
1853
+ ], true)
1854
+ ], 8, _hoisted_47)
1855
+ ], 64);
1856
+ }), 128))
1857
+ ])) : createCommentVNode("", true)
1858
+ ]))
1859
+ ], 16, _hoisted_35))
1860
+ ], 64);
1861
+ }), 128))
1862
+ ]),
1863
+ _: 3
1864
+ }, 16, ["css", "class", "style", "aria-busy"]))
1865
+ ]),
1866
+ _: 3
1867
+ }, 8, ["items", "no-hint", "title", "subtitle", "title-icon", "title-image"]))
1454
1868
  ]),
1455
1869
  _: 3
1456
1870
  }, 8, ["disabled"]),
1457
- __props.load && total.value > __props.pageSize ? (openBlock(), createBlock(_sfc_main$f, {
1871
+ __props.load && total.value > __props.pageSize ? (openBlock(), createBlock(_sfc_main$h, {
1458
1872
  key: 0,
1459
1873
  page: page.value,
1460
- "onUpdate:page": _cache[9] || (_cache[9] = ($event) => page.value = $event),
1874
+ "onUpdate:page": _cache[10] || (_cache[10] = ($event) => page.value = $event),
1461
1875
  total: total.value,
1462
1876
  "page-size": __props.pageSize,
1463
1877
  disabled: busy.value
@@ -1466,7 +1880,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1466
1880
  };
1467
1881
  }
1468
1882
  });
1469
- const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3fb24315"]]);
1883
+ const LpTable = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c73bcf2c"]]);
1470
1884
  export {
1471
1885
  LpTable as default
1472
1886
  };