cisse-vue-ui 0.8.3 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/README.md +666 -4
  2. package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-DuJr8cz3.cjs → CheckboxGroup.vue_vue_type_script_setup_true_lang-BC86pBlY.cjs} +70 -70
  3. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BC86pBlY.cjs.map +1 -0
  4. package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-N4oS_DJD.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js} +72 -72
  5. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js.map +1 -0
  6. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js} +37 -184
  7. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js.map +1 -0
  8. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs} +33 -180
  9. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs.map +1 -0
  10. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DoJKvn30.cjs → Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs} +2 -2
  11. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DoJKvn30.cjs.map → Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs.map} +1 -1
  12. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-A9Ax6iob.js → Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js} +2 -2
  13. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-A9Ax6iob.js.map → Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js.map} +1 -1
  14. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-jW6Ikbvy.cjs → FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs} +1260 -209
  15. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs.map +1 -0
  16. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-CcOgc2Y_.js → FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js} +1269 -218
  17. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js.map +1 -0
  18. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js +298 -0
  19. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js.map +1 -0
  20. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs +297 -0
  21. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs.map +1 -0
  22. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-rbvfGvll.cjs → PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs} +2 -2
  23. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-rbvfGvll.cjs.map → PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs.map} +1 -1
  24. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-Gvocjdqh.js → PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js} +2 -2
  25. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-Gvocjdqh.js.map → PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js.map} +1 -1
  26. package/dist/cisse-vue-ui.css +4 -4
  27. package/dist/components/core/AccordionItem.test.d.ts +1 -0
  28. package/dist/components/core/Breadcrumb.stories.d.ts +5 -0
  29. package/dist/components/core/CardWrapper.stories.d.ts +32 -0
  30. package/dist/components/core/CardWrapper.test.d.ts +1 -0
  31. package/dist/components/core/CardWrapper.vue.d.ts +129 -0
  32. package/dist/components/core/CollapsibleCard.vue.d.ts +1 -1
  33. package/dist/components/core/DataTable.stories.d.ts +38 -0
  34. package/dist/components/core/Dropdown.vue.d.ts +1 -1
  35. package/dist/components/core/Popover.vue.d.ts +2 -2
  36. package/dist/components/core/Tooltip.stories.d.ts +3 -0
  37. package/dist/components/core/index.cjs +40 -23
  38. package/dist/components/core/index.cjs.map +1 -1
  39. package/dist/components/core/index.d.ts +4 -1
  40. package/dist/components/core/index.js +40 -23
  41. package/dist/components/core/table/DataTable.test.d.ts +1 -0
  42. package/dist/components/core/{TableComponent.vue.d.ts → table/DataTable.vue.d.ts} +60 -7
  43. package/dist/components/core/table/Table.stories.d.ts +27 -0
  44. package/dist/components/core/table/atoms/Caption.test.d.ts +1 -0
  45. package/dist/components/core/table/atoms/Caption.vue.d.ts +26 -0
  46. package/dist/components/core/table/atoms/Col.test.d.ts +1 -0
  47. package/dist/components/core/table/atoms/Col.vue.d.ts +8 -0
  48. package/dist/components/core/table/atoms/Colgroup.test.d.ts +1 -0
  49. package/dist/components/core/table/atoms/Colgroup.vue.d.ts +17 -0
  50. package/dist/components/core/table/atoms/Table.test.d.ts +1 -0
  51. package/dist/components/core/table/atoms/Table.vue.d.ts +46 -0
  52. package/dist/components/core/table/atoms/Tbody.test.d.ts +1 -0
  53. package/dist/components/core/table/atoms/Tbody.vue.d.ts +17 -0
  54. package/dist/components/core/table/atoms/Td.test.d.ts +1 -0
  55. package/dist/components/core/table/atoms/Td.vue.d.ts +43 -0
  56. package/dist/components/core/table/atoms/Tfoot.test.d.ts +1 -0
  57. package/dist/components/core/table/atoms/Tfoot.vue.d.ts +17 -0
  58. package/dist/components/core/table/atoms/Th.test.d.ts +1 -0
  59. package/dist/components/core/table/atoms/Th.vue.d.ts +64 -0
  60. package/dist/components/core/table/atoms/Thead.test.d.ts +1 -0
  61. package/dist/components/core/table/atoms/Thead.vue.d.ts +17 -0
  62. package/dist/components/core/table/atoms/Tr.test.d.ts +1 -0
  63. package/dist/components/core/table/atoms/Tr.vue.d.ts +35 -0
  64. package/dist/components/core/table/atoms/index.d.ts +10 -0
  65. package/dist/components/core/table/index.d.ts +3 -0
  66. package/dist/components/core/table/molecules/ExpandableRow.test.d.ts +1 -0
  67. package/dist/components/core/table/molecules/ExpandableRow.vue.d.ts +47 -0
  68. package/dist/components/core/table/molecules/TableFooter.test.d.ts +1 -0
  69. package/dist/components/core/table/molecules/TableFooter.vue.d.ts +21 -0
  70. package/dist/components/core/table/molecules/TableHeader.test.d.ts +1 -0
  71. package/dist/components/core/table/molecules/TableHeader.vue.d.ts +49 -0
  72. package/dist/components/core/table/molecules/TableRow.test.d.ts +1 -0
  73. package/dist/components/core/table/molecules/TableRow.vue.d.ts +59 -0
  74. package/dist/components/core/table/molecules/index.d.ts +4 -0
  75. package/dist/components/feedback/Progress.vue.d.ts +1 -1
  76. package/dist/components/feedback/TableSkeleton.vue.d.ts +1 -1
  77. package/dist/components/feedback/index.cjs +14 -14
  78. package/dist/components/feedback/index.js +14 -14
  79. package/dist/components/form/Combobox.stories.d.ts +2 -0
  80. package/dist/components/form/Combobox.vue.d.ts +4 -0
  81. package/dist/components/form/DatePicker.stories.d.ts +2 -0
  82. package/dist/components/form/DatePicker.vue.d.ts +4 -0
  83. package/dist/components/form/FormSection.vue.d.ts +1 -1
  84. package/dist/components/form/FormSelect.stories.d.ts +2 -0
  85. package/dist/components/form/FormSelect.vue.d.ts +4 -0
  86. package/dist/components/form/IconPicker.stories.d.ts +19 -0
  87. package/dist/components/form/IconPicker.test.d.ts +1 -0
  88. package/dist/components/form/InputWrapper.stories.d.ts +1 -5
  89. package/dist/components/form/InputWrapper.vue.d.ts +6 -3
  90. package/dist/components/form/Rating.vue.d.ts +1 -1
  91. package/dist/components/form/SearchInput.vue.d.ts +1 -1
  92. package/dist/components/form/TagsInput.stories.d.ts +1 -0
  93. package/dist/components/form/TagsInput.vue.d.ts +3 -3
  94. package/dist/components/form/TextArea.stories.d.ts +3 -1
  95. package/dist/components/form/TextArea.vue.d.ts +4 -0
  96. package/dist/components/form/index.cjs +1 -1
  97. package/dist/components/form/index.js +2 -2
  98. package/dist/components/index.cjs +56 -39
  99. package/dist/components/index.cjs.map +1 -1
  100. package/dist/components/index.js +66 -49
  101. package/dist/components/layout/index.cjs +1 -1
  102. package/dist/components/layout/index.js +1 -1
  103. package/dist/composables/index.cjs +18 -9
  104. package/dist/composables/index.cjs.map +1 -1
  105. package/dist/composables/index.d.ts +8 -0
  106. package/dist/composables/index.js +15 -6
  107. package/dist/composables/index.js.map +1 -1
  108. package/dist/composables/useColumnResize.d.ts +38 -0
  109. package/dist/composables/useColumnResize.test.d.ts +1 -0
  110. package/dist/composables/useColumnVisibility.d.ts +44 -0
  111. package/dist/composables/useColumnVisibility.test.d.ts +1 -0
  112. package/dist/composables/useEditableCell.d.ts +51 -0
  113. package/dist/composables/useEditableCell.test.d.ts +1 -0
  114. package/dist/composables/useInputStyles.d.ts +32 -0
  115. package/dist/composables/useInputStyles.test.d.ts +1 -0
  116. package/dist/composables/usePagination.d.ts +44 -0
  117. package/dist/composables/usePagination.test.d.ts +1 -0
  118. package/dist/composables/usePinnedRows.d.ts +41 -0
  119. package/dist/composables/usePinnedRows.test.d.ts +1 -0
  120. package/dist/composables/useTableKeyboardNavigation.d.ts +52 -0
  121. package/dist/composables/useTableKeyboardNavigation.test.d.ts +1 -0
  122. package/dist/composables/useVirtualScroll.d.ts +32 -0
  123. package/dist/composables/useVirtualScroll.test.d.ts +1 -0
  124. package/dist/index-0kwQORZJ.js +114 -0
  125. package/dist/index-0kwQORZJ.js.map +1 -0
  126. package/dist/{index-5dQNEzd8.cjs → index-BMSH4AOz.cjs} +57 -40
  127. package/dist/{index-5dQNEzd8.cjs.map → index-BMSH4AOz.cjs.map} +1 -1
  128. package/dist/{index-SNefWfX0.js → index-BaWpldIJ.js} +3 -3
  129. package/dist/{index-SNefWfX0.js.map → index-BaWpldIJ.js.map} +1 -1
  130. package/dist/index.cjs +75 -49
  131. package/dist/index.cjs.map +1 -1
  132. package/dist/index.js +83 -57
  133. package/dist/index.js.map +1 -1
  134. package/dist/style.css +1 -1
  135. package/dist/types/components.d.ts +1 -1
  136. package/dist/types/property.d.ts +8 -0
  137. package/dist/{useDropdown-DK4c5JGL.cjs → useDropdown-HI7ABBLe.cjs} +5 -4
  138. package/dist/{useDropdown-DK4c5JGL.cjs.map → useDropdown-HI7ABBLe.cjs.map} +1 -1
  139. package/dist/{useDropdown-De0cKI83.js → useDropdown-XITCE_SM.js} +5 -4
  140. package/dist/{useDropdown-De0cKI83.js.map → useDropdown-XITCE_SM.js.map} +1 -1
  141. package/dist/useInputStyles-BFTJdXHL.js +127 -0
  142. package/dist/useInputStyles-BFTJdXHL.js.map +1 -0
  143. package/dist/useInputStyles-DMfvW6N5.cjs +126 -0
  144. package/dist/useInputStyles-DMfvW6N5.cjs.map +1 -0
  145. package/dist/usePagination-BGwbICFC.js +135 -0
  146. package/dist/usePagination-BGwbICFC.js.map +1 -0
  147. package/dist/usePagination-gvvh1zqA.cjs +134 -0
  148. package/dist/usePagination-gvvh1zqA.cjs.map +1 -0
  149. package/dist/useVirtualScroll-BivP86fA.cjs +869 -0
  150. package/dist/useVirtualScroll-BivP86fA.cjs.map +1 -0
  151. package/dist/useVirtualScroll-YeZru2Eo.js +870 -0
  152. package/dist/useVirtualScroll-YeZru2Eo.js.map +1 -0
  153. package/package.json +1 -1
  154. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-DuJr8cz3.cjs.map +0 -1
  155. package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-N4oS_DJD.js.map +0 -1
  156. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs.map +0 -1
  157. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js.map +0 -1
  158. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CcOgc2Y_.js.map +0 -1
  159. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-jW6Ikbvy.cjs.map +0 -1
  160. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js +0 -150
  161. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +0 -1
  162. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs +0 -149
  163. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +0 -1
  164. package/dist/components/core/TableComponent.stories.d.ts +0 -16
  165. package/dist/index-CDDUEkXf.js +0 -97
  166. package/dist/index-CDDUEkXf.js.map +0 -1
  167. package/dist/useDarkMode-Cl5QWTlC.js +0 -53
  168. package/dist/useDarkMode-Cl5QWTlC.js.map +0 -1
  169. package/dist/useDarkMode-DLZcJEUQ.cjs +0 -52
  170. package/dist/useDarkMode-DLZcJEUQ.cjs.map +0 -1
  171. package/dist/useToast-Bk60GArg.cjs +0 -176
  172. package/dist/useToast-Bk60GArg.cjs.map +0 -1
  173. package/dist/useToast-ina5g3mj.js +0 -177
  174. package/dist/useToast-ina5g3mj.js.map +0 -1
@@ -1,23 +1,23 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
+ const vue$1 = require("@iconify/vue");
4
+ const ListSkeleton_vue_vue_type_script_setup_true_lang = require("./ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs");
3
5
  const index = require("./index-D1x3TH9k.cjs");
4
- const ListSkeleton_vue_vue_type_script_setup_true_lang = require("./ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs");
5
6
  const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs");
6
- const vue$1 = require("@iconify/vue");
7
- const useDropdown = require("./useDropdown-DK4c5JGL.cjs");
7
+ const usePagination = require("./usePagination-gvvh1zqA.cjs");
8
+ const useDropdown = require("./useDropdown-HI7ABBLe.cjs");
8
9
  const useId = require("./useId-nxrBaIC9.cjs");
9
- const useDarkMode = require("./useDarkMode-DLZcJEUQ.cjs");
10
- const _hoisted_1$h = {
10
+ const _hoisted_1$o = {
11
11
  key: 1,
12
12
  class: "flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950"
13
13
  };
14
- const _hoisted_2$d = { class: "flex flex-col gap-0.5" };
15
- const _hoisted_3$8 = {
14
+ const _hoisted_2$g = { class: "flex flex-col gap-0.5" };
15
+ const _hoisted_3$a = {
16
16
  key: 1,
17
17
  class: "text-sm font-normal text-gray-600 dark:text-gray-400"
18
18
  };
19
- const _hoisted_4$6 = { class: "flex gap-2" };
20
- const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
19
+ const _hoisted_4$7 = { class: "flex gap-2" };
20
+ const _sfc_main$A = /* @__PURE__ */ vue.defineComponent({
21
21
  __name: "CardComponent",
22
22
  props: {
23
23
  title: {},
@@ -38,12 +38,12 @@ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
38
38
  () => props.dividerClass || "border-gray-200 dark:border-gray-700"
39
39
  );
40
40
  return (_ctx, _cache) => {
41
- return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$1, {
41
+ return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$2, {
42
42
  key: 0,
43
43
  lines: __props.loadingLines,
44
44
  "show-avatar": __props.loadingAvatar,
45
45
  "show-actions": __props.loadingActions
46
- }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$h, [
46
+ }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$o, [
47
47
  _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", {
48
48
  key: 0,
49
49
  class: vue.normalizeClass(["border-b", dividerClasses.value])
@@ -53,7 +53,7 @@ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
53
53
  key: 1,
54
54
  class: vue.normalizeClass(["flex items-center justify-between border-b px-5 py-3", dividerClasses.value])
55
55
  }, [
56
- vue.createElementVNode("div", _hoisted_2$d, [
56
+ vue.createElementVNode("div", _hoisted_2$g, [
57
57
  __props.title || _ctx.$slots.title ? (vue.openBlock(), vue.createElementBlock("span", {
58
58
  key: 0,
59
59
  class: vue.normalizeClass(["text-md font-semibold", titleClasses.value])
@@ -62,13 +62,13 @@ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
62
62
  vue.createTextVNode(vue.toDisplayString(__props.title), 1)
63
63
  ])
64
64
  ], 2)) : vue.createCommentVNode("", true),
65
- __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$8, [
65
+ __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$a, [
66
66
  vue.renderSlot(_ctx.$slots, "description", {}, () => [
67
67
  vue.createTextVNode(vue.toDisplayString(__props.description), 1)
68
68
  ])
69
69
  ])) : vue.createCommentVNode("", true)
70
70
  ]),
71
- vue.createElementVNode("div", _hoisted_4$6, [
71
+ vue.createElementVNode("div", _hoisted_4$7, [
72
72
  vue.renderSlot(_ctx.$slots, "actions")
73
73
  ])
74
74
  ], 2)) : vue.createCommentVNode("", true),
@@ -77,58 +77,831 @@ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
77
77
  };
78
78
  }
79
79
  });
80
- const _hoisted_1$g = { class: "overflow-hidden" };
81
- const _hoisted_2$c = {
82
- key: 1,
83
- class: "overflow-x-auto"
84
- };
85
- const _hoisted_3$7 = { class: "w-full divide-y divide-black/10 text-left dark:divide-white/10" };
86
- const _hoisted_4$5 = { class: "bg-black/5 text-sm font-semibold text-gray-600 uppercase dark:bg-white/5 dark:text-gray-400" };
87
- const _hoisted_5$3 = {
88
- key: 0,
89
- class: "w-12 px-3 py-3"
90
- };
91
- const _hoisted_6$3 = ["onClick"];
92
- const _hoisted_7$3 = {
80
+ const _hoisted_1$n = ["role", "tabindex", "onKeydown"];
81
+ const _hoisted_2$f = ["src", "alt"];
82
+ const _hoisted_3$9 = ["src", "alt"];
83
+ const _hoisted_4$6 = { class: "flex items-center gap-3" };
84
+ const _hoisted_5$4 = { class: "flex flex-col gap-0.5" };
85
+ const _hoisted_6$3 = ["src", "alt"];
86
+ const _sfc_main$z = /* @__PURE__ */ vue.defineComponent({
87
+ __name: "CardWrapper",
88
+ props: {
89
+ title: {},
90
+ description: {},
91
+ icon: {},
92
+ shadow: { default: "md" },
93
+ rounded: { default: "lg" },
94
+ padding: { default: "none" },
95
+ headerPadding: { default: "md" },
96
+ border: { default: "none" },
97
+ variant: { default: "default" },
98
+ accent: { default: "none" },
99
+ headerDivider: { type: Boolean, default: true },
100
+ footerDivider: { type: Boolean, default: true },
101
+ clickable: { type: Boolean, default: false },
102
+ selected: { type: Boolean, default: false },
103
+ disabled: { type: Boolean, default: false },
104
+ image: {},
105
+ imageAlt: {},
106
+ imagePosition: { default: "top" },
107
+ imageHeight: { default: "200px" },
108
+ imageWidth: { default: "200px" },
109
+ loading: { type: Boolean, default: false },
110
+ loadingLines: { default: 3 },
111
+ loadingAvatar: { type: Boolean, default: false },
112
+ loadingActions: { type: Boolean, default: false },
113
+ cardClass: {},
114
+ headerClass: {},
115
+ titleClass: {},
116
+ descriptionClass: {},
117
+ iconClass: {},
118
+ iconElementClass: {},
119
+ contentClass: {},
120
+ footerClass: {},
121
+ dividerClass: {},
122
+ actionsClass: {},
123
+ imageClass: {}
124
+ },
125
+ emits: ["click"],
126
+ setup(__props, { emit: __emit }) {
127
+ const props = __props;
128
+ const emit = __emit;
129
+ const slots = vue.useSlots();
130
+ const hasHeader = vue.computed(
131
+ () => props.title || props.description || props.icon || slots.header || slots.title || slots.description || slots.icon || slots.actions
132
+ );
133
+ const hasFooter = vue.computed(() => !!slots.footer);
134
+ const hasImage = vue.computed(() => !!props.image || !!slots.image);
135
+ const isHorizontal = vue.computed(() => props.imagePosition === "left" || props.imagePosition === "right");
136
+ const shadowClasses = vue.computed(() => {
137
+ const map = {
138
+ none: "",
139
+ sm: "shadow-sm",
140
+ md: "shadow-md",
141
+ lg: "shadow-lg",
142
+ xl: "shadow-xl"
143
+ };
144
+ return map[props.shadow];
145
+ });
146
+ const roundedClasses = vue.computed(() => {
147
+ const map = {
148
+ none: "rounded-none",
149
+ sm: "rounded-sm",
150
+ md: "rounded-md",
151
+ lg: "rounded-lg",
152
+ xl: "rounded-xl",
153
+ full: "rounded-3xl"
154
+ };
155
+ return map[props.rounded];
156
+ });
157
+ const paddingClasses = vue.computed(() => {
158
+ const map = {
159
+ none: "",
160
+ sm: "p-3",
161
+ md: "p-5",
162
+ lg: "p-6"
163
+ };
164
+ return map[props.padding];
165
+ });
166
+ const headerPaddingClasses = vue.computed(() => {
167
+ const map = {
168
+ none: "",
169
+ sm: "px-3 py-2",
170
+ md: "px-5 py-3",
171
+ lg: "px-6 py-4"
172
+ };
173
+ return map[props.headerPadding];
174
+ });
175
+ const footerPaddingClasses = vue.computed(() => {
176
+ const map = {
177
+ none: "",
178
+ sm: "px-3 py-2",
179
+ md: "px-5 py-3",
180
+ lg: "px-6 py-4"
181
+ };
182
+ return map[props.headerPadding];
183
+ });
184
+ const borderClasses = vue.computed(() => {
185
+ const map = {
186
+ none: "",
187
+ default: "border border-gray-200 dark:border-gray-700",
188
+ primary: "border border-primary-500 dark:border-primary-400",
189
+ secondary: "border border-secondary-500 dark:border-secondary-400"
190
+ };
191
+ return map[props.border];
192
+ });
193
+ const variantClasses = vue.computed(() => {
194
+ const map = {
195
+ default: "bg-white dark:bg-slate-950",
196
+ glass: "bg-white/15 backdrop-blur-sm",
197
+ outline: "bg-transparent",
198
+ flat: "bg-gray-50 dark:bg-slate-900"
199
+ };
200
+ return map[props.variant];
201
+ });
202
+ const accentClasses = vue.computed(() => {
203
+ if (props.accent === "none") return "";
204
+ const colorMap = {
205
+ primary: "border-primary-500",
206
+ secondary: "border-secondary-500",
207
+ success: "border-emerald-500",
208
+ warning: "border-amber-500",
209
+ danger: "border-red-500",
210
+ info: "border-blue-500"
211
+ };
212
+ const position = isHorizontal.value ? "border-l-4" : "border-t-4";
213
+ return `${position} ${colorMap[props.accent]}`;
214
+ });
215
+ const interactiveClasses = vue.computed(() => {
216
+ if (props.disabled) {
217
+ return "opacity-60 cursor-not-allowed";
218
+ }
219
+ if (props.clickable) {
220
+ return "cursor-pointer transition-all duration-200 hover:shadow-lg hover:-translate-y-0.5 active:translate-y-0 active:shadow-md";
221
+ }
222
+ return "";
223
+ });
224
+ const selectedClasses = vue.computed(() => {
225
+ if (!props.selected) return "";
226
+ return "ring-2 ring-primary-500 ring-offset-2 dark:ring-offset-slate-900";
227
+ });
228
+ const computedDividerClass = vue.computed(
229
+ () => props.dividerClass || "border-gray-200 dark:border-gray-700"
230
+ );
231
+ const computedTitleClass = vue.computed(
232
+ () => props.titleClass || "text-gray-800 dark:text-gray-200"
233
+ );
234
+ const computedDescriptionClass = vue.computed(
235
+ () => props.descriptionClass || "text-gray-600 dark:text-gray-400"
236
+ );
237
+ const computedIconClass = vue.computed(
238
+ () => props.iconClass || "flex items-center justify-center size-10 rounded-lg bg-primary-100 dark:bg-primary-900/30"
239
+ );
240
+ const computedIconElementClass = vue.computed(
241
+ () => props.iconElementClass || "size-5 text-primary-600 dark:text-primary-400"
242
+ );
243
+ const imageContainerClasses = vue.computed(() => {
244
+ const base = "overflow-hidden flex-shrink-0";
245
+ switch (props.imagePosition) {
246
+ case "left":
247
+ return `${base} rounded-l-lg`;
248
+ case "right":
249
+ return `${base} rounded-r-lg`;
250
+ case "top":
251
+ return `${base} rounded-t-lg`;
252
+ case "bottom":
253
+ return `${base} rounded-b-lg`;
254
+ case "background":
255
+ return "absolute inset-0";
256
+ default:
257
+ return base;
258
+ }
259
+ });
260
+ const imageStyle = vue.computed(() => {
261
+ if (props.imagePosition === "background") {
262
+ return {};
263
+ }
264
+ if (isHorizontal.value) {
265
+ return { width: props.imageWidth };
266
+ }
267
+ return { height: props.imageHeight };
268
+ });
269
+ const handleClick = (event) => {
270
+ if (props.disabled) return;
271
+ if (props.clickable) {
272
+ emit("click", event);
273
+ }
274
+ };
275
+ return (_ctx, _cache) => {
276
+ return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$2, {
277
+ key: 0,
278
+ lines: __props.loadingLines,
279
+ "show-avatar": __props.loadingAvatar,
280
+ "show-actions": __props.loadingActions
281
+ }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", {
282
+ key: 1,
283
+ class: vue.normalizeClass([
284
+ "overflow-hidden relative",
285
+ isHorizontal.value ? "flex" : "flex flex-col",
286
+ __props.imagePosition === "right" && "flex-row-reverse",
287
+ shadowClasses.value,
288
+ roundedClasses.value,
289
+ borderClasses.value,
290
+ variantClasses.value,
291
+ accentClasses.value,
292
+ interactiveClasses.value,
293
+ selectedClasses.value,
294
+ __props.cardClass
295
+ ]),
296
+ role: __props.clickable ? "button" : void 0,
297
+ tabindex: __props.clickable && !__props.disabled ? 0 : void 0,
298
+ onClick: handleClick,
299
+ onKeydown: [
300
+ vue.withKeys(handleClick, ["enter"]),
301
+ vue.withKeys(vue.withModifiers(handleClick, ["prevent"]), ["space"])
302
+ ]
303
+ }, [
304
+ hasImage.value && __props.imagePosition === "background" ? (vue.openBlock(), vue.createElementBlock("div", {
305
+ key: 0,
306
+ class: vue.normalizeClass(imageContainerClasses.value)
307
+ }, [
308
+ vue.renderSlot(_ctx.$slots, "image", {}, () => [
309
+ __props.image ? (vue.openBlock(), vue.createElementBlock("img", {
310
+ key: 0,
311
+ src: __props.image,
312
+ alt: __props.imageAlt || "",
313
+ class: vue.normalizeClass(["w-full h-full object-cover", __props.imageClass])
314
+ }, null, 10, _hoisted_2$f)) : vue.createCommentVNode("", true)
315
+ ]),
316
+ _cache[0] || (_cache[0] = vue.createElementVNode("div", { class: "absolute inset-0 bg-gradient-to-t from-black/60 to-transparent" }, null, -1))
317
+ ], 2)) : vue.createCommentVNode("", true),
318
+ hasImage.value && (__props.imagePosition === "left" || __props.imagePosition === "top") ? (vue.openBlock(), vue.createElementBlock("div", {
319
+ key: 1,
320
+ class: vue.normalizeClass(imageContainerClasses.value),
321
+ style: vue.normalizeStyle(imageStyle.value)
322
+ }, [
323
+ vue.renderSlot(_ctx.$slots, "image", {}, () => [
324
+ __props.image ? (vue.openBlock(), vue.createElementBlock("img", {
325
+ key: 0,
326
+ src: __props.image,
327
+ alt: __props.imageAlt || "",
328
+ class: vue.normalizeClass(["w-full h-full object-cover", __props.imageClass])
329
+ }, null, 10, _hoisted_3$9)) : vue.createCommentVNode("", true)
330
+ ])
331
+ ], 6)) : vue.createCommentVNode("", true),
332
+ vue.createElementVNode("div", {
333
+ class: vue.normalizeClass(["flex flex-col flex-1 min-w-0", __props.imagePosition === "background" && "relative z-10"])
334
+ }, [
335
+ _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", {
336
+ key: 0,
337
+ class: vue.normalizeClass([
338
+ __props.headerDivider && "border-b",
339
+ computedDividerClass.value,
340
+ __props.headerClass
341
+ ])
342
+ }, [
343
+ vue.renderSlot(_ctx.$slots, "header")
344
+ ], 2)) : hasHeader.value ? (vue.openBlock(), vue.createElementBlock("div", {
345
+ key: 1,
346
+ class: vue.normalizeClass([
347
+ "flex items-center justify-between gap-4",
348
+ headerPaddingClasses.value,
349
+ __props.headerDivider && "border-b",
350
+ computedDividerClass.value,
351
+ __props.headerClass,
352
+ __props.imagePosition === "background" && "text-white border-white/20"
353
+ ])
354
+ }, [
355
+ vue.createElementVNode("div", _hoisted_4$6, [
356
+ __props.icon || _ctx.$slots.icon ? (vue.openBlock(), vue.createElementBlock("div", {
357
+ key: 0,
358
+ class: vue.normalizeClass(computedIconClass.value)
359
+ }, [
360
+ vue.renderSlot(_ctx.$slots, "icon", {}, () => [
361
+ __props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
362
+ key: 0,
363
+ icon: __props.icon,
364
+ class: vue.normalizeClass(computedIconElementClass.value)
365
+ }, null, 8, ["icon", "class"])) : vue.createCommentVNode("", true)
366
+ ])
367
+ ], 2)) : vue.createCommentVNode("", true),
368
+ vue.createElementVNode("div", _hoisted_5$4, [
369
+ __props.title || _ctx.$slots.title ? (vue.openBlock(), vue.createElementBlock("span", {
370
+ key: 0,
371
+ class: vue.normalizeClass([
372
+ "text-md font-semibold",
373
+ __props.imagePosition === "background" ? "text-white" : computedTitleClass.value
374
+ ])
375
+ }, [
376
+ vue.renderSlot(_ctx.$slots, "title", {}, () => [
377
+ vue.createTextVNode(vue.toDisplayString(__props.title), 1)
378
+ ])
379
+ ], 2)) : vue.createCommentVNode("", true),
380
+ __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", {
381
+ key: 1,
382
+ class: vue.normalizeClass([
383
+ "text-sm font-normal",
384
+ __props.imagePosition === "background" ? "text-white/80" : computedDescriptionClass.value
385
+ ])
386
+ }, [
387
+ vue.renderSlot(_ctx.$slots, "description", {}, () => [
388
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
389
+ ])
390
+ ], 2)) : vue.createCommentVNode("", true)
391
+ ])
392
+ ]),
393
+ _ctx.$slots.actions ? (vue.openBlock(), vue.createElementBlock("div", {
394
+ key: 0,
395
+ class: vue.normalizeClass(["flex gap-2", __props.actionsClass])
396
+ }, [
397
+ vue.renderSlot(_ctx.$slots, "actions")
398
+ ], 2)) : vue.createCommentVNode("", true)
399
+ ], 2)) : vue.createCommentVNode("", true),
400
+ vue.createElementVNode("div", {
401
+ class: vue.normalizeClass(["flex-1", paddingClasses.value, __props.contentClass])
402
+ }, [
403
+ vue.renderSlot(_ctx.$slots, "default")
404
+ ], 2),
405
+ hasFooter.value ? (vue.openBlock(), vue.createElementBlock("div", {
406
+ key: 2,
407
+ class: vue.normalizeClass([
408
+ __props.footerDivider && "border-t",
409
+ computedDividerClass.value,
410
+ footerPaddingClasses.value,
411
+ __props.footerClass,
412
+ __props.imagePosition === "background" && "text-white border-white/20"
413
+ ])
414
+ }, [
415
+ vue.renderSlot(_ctx.$slots, "footer")
416
+ ], 2)) : vue.createCommentVNode("", true)
417
+ ], 2),
418
+ hasImage.value && (__props.imagePosition === "right" || __props.imagePosition === "bottom") ? (vue.openBlock(), vue.createElementBlock("div", {
419
+ key: 2,
420
+ class: vue.normalizeClass(imageContainerClasses.value),
421
+ style: vue.normalizeStyle(imageStyle.value)
422
+ }, [
423
+ vue.renderSlot(_ctx.$slots, "image", {}, () => [
424
+ __props.image ? (vue.openBlock(), vue.createElementBlock("img", {
425
+ key: 0,
426
+ src: __props.image,
427
+ alt: __props.imageAlt || "",
428
+ class: vue.normalizeClass(["w-full h-full object-cover", __props.imageClass])
429
+ }, null, 10, _hoisted_6$3)) : vue.createCommentVNode("", true)
430
+ ])
431
+ ], 6)) : vue.createCommentVNode("", true)
432
+ ], 42, _hoisted_1$n));
433
+ };
434
+ }
435
+ });
436
+ const _hoisted_1$m = { class: "overflow-x-auto" };
437
+ const TableContextKey = Symbol("TableContext");
438
+ const _sfc_main$y = /* @__PURE__ */ vue.defineComponent({
439
+ ...{
440
+ inheritAttrs: false
441
+ },
442
+ __name: "Table",
443
+ props: {
444
+ striped: { type: Boolean, default: false },
445
+ bordered: { type: Boolean, default: false },
446
+ hover: { type: Boolean, default: true },
447
+ compact: { type: Boolean, default: false },
448
+ stickyHeader: { type: Boolean, default: false }
449
+ },
450
+ setup(__props) {
451
+ const attrs = vue.useAttrs();
452
+ const props = __props;
453
+ const tableClasses = vue.computed(() => [
454
+ "w-full text-left",
455
+ props.bordered ? "border border-gray-200 dark:border-gray-700" : ""
456
+ ]);
457
+ const wrapperClasses = vue.computed(() => [
458
+ "overflow-hidden",
459
+ props.stickyHeader ? "max-h-[600px] overflow-y-auto" : ""
460
+ ]);
461
+ const { striped, bordered, hover, compact, stickyHeader } = vue.toRefs(props);
462
+ vue.provide(TableContextKey, vue.reactive({
463
+ striped,
464
+ bordered,
465
+ hover,
466
+ compact,
467
+ stickyHeader
468
+ }));
469
+ return (_ctx, _cache) => {
470
+ return vue.openBlock(), vue.createElementBlock("div", {
471
+ class: vue.normalizeClass(wrapperClasses.value)
472
+ }, [
473
+ vue.createElementVNode("div", _hoisted_1$m, [
474
+ vue.createElementVNode("table", vue.mergeProps(vue.unref(attrs), { class: tableClasses.value }), [
475
+ vue.renderSlot(_ctx.$slots, "default")
476
+ ], 16)
477
+ ])
478
+ ], 2);
479
+ };
480
+ }
481
+ });
482
+ const _sfc_main$x = /* @__PURE__ */ vue.defineComponent({
483
+ ...{
484
+ inheritAttrs: false
485
+ },
486
+ __name: "Caption",
487
+ props: {
488
+ position: { default: "top" },
489
+ srOnly: { type: Boolean, default: false }
490
+ },
491
+ setup(__props) {
492
+ const attrs = vue.useAttrs();
493
+ return (_ctx, _cache) => {
494
+ return vue.openBlock(), vue.createElementBlock("caption", vue.mergeProps(vue.unref(attrs), {
495
+ class: [
496
+ __props.position === "bottom" ? "caption-bottom" : "caption-top",
497
+ __props.srOnly ? "sr-only" : "py-2 text-sm text-gray-600 dark:text-gray-400"
498
+ ]
499
+ }), [
500
+ vue.renderSlot(_ctx.$slots, "default")
501
+ ], 16);
502
+ };
503
+ }
504
+ });
505
+ const _sfc_main$w = /* @__PURE__ */ vue.defineComponent({
506
+ ...{
507
+ inheritAttrs: false
508
+ },
509
+ __name: "Colgroup",
510
+ setup(__props) {
511
+ const attrs = vue.useAttrs();
512
+ return (_ctx, _cache) => {
513
+ return vue.openBlock(), vue.createElementBlock("colgroup", vue.normalizeProps(vue.guardReactiveProps(vue.unref(attrs))), [
514
+ vue.renderSlot(_ctx.$slots, "default")
515
+ ], 16);
516
+ };
517
+ }
518
+ });
519
+ const _hoisted_1$l = ["span"];
520
+ const _sfc_main$v = /* @__PURE__ */ vue.defineComponent({
521
+ ...{
522
+ inheritAttrs: false
523
+ },
524
+ __name: "Col",
525
+ props: {
526
+ span: {},
527
+ width: {}
528
+ },
529
+ setup(__props) {
530
+ const props = __props;
531
+ const attrs = vue.useAttrs();
532
+ const colStyles = vue.computed(() => ({
533
+ width: props.width
534
+ }));
535
+ return (_ctx, _cache) => {
536
+ return vue.openBlock(), vue.createElementBlock("col", vue.mergeProps(vue.unref(attrs), {
537
+ span: __props.span,
538
+ style: colStyles.value
539
+ }), null, 16, _hoisted_1$l);
540
+ };
541
+ }
542
+ });
543
+ const _sfc_main$u = /* @__PURE__ */ vue.defineComponent({
544
+ ...{
545
+ inheritAttrs: false
546
+ },
547
+ __name: "Thead",
548
+ setup(__props) {
549
+ const context = vue.inject(TableContextKey);
550
+ const attrs = vue.useAttrs();
551
+ const theadClasses = vue.computed(() => [
552
+ "text-sm font-semibold text-gray-600 uppercase dark:text-gray-400",
553
+ (context == null ? void 0 : context.bordered) ? "border-b border-gray-200 dark:border-gray-700" : "border-b border-black/10 dark:border-white/10",
554
+ (context == null ? void 0 : context.stickyHeader) ? "sticky top-0 z-10" : ""
555
+ ]);
556
+ return (_ctx, _cache) => {
557
+ return vue.openBlock(), vue.createElementBlock("thead", vue.mergeProps(vue.unref(attrs), {
558
+ class: [theadClasses.value, "bg-black/5 dark:bg-white/5"]
559
+ }), [
560
+ vue.renderSlot(_ctx.$slots, "default")
561
+ ], 16);
562
+ };
563
+ }
564
+ });
565
+ const _sfc_main$t = /* @__PURE__ */ vue.defineComponent({
566
+ ...{
567
+ inheritAttrs: false
568
+ },
569
+ __name: "Tbody",
570
+ setup(__props) {
571
+ const context = vue.inject(TableContextKey);
572
+ const attrs = vue.useAttrs();
573
+ const tbodyClasses = vue.computed(() => [
574
+ "font-medium",
575
+ (context == null ? void 0 : context.bordered) ? "divide-y divide-gray-200 dark:divide-gray-700" : "divide-y divide-black/10 dark:divide-white/10"
576
+ ]);
577
+ return (_ctx, _cache) => {
578
+ return vue.openBlock(), vue.createElementBlock("tbody", vue.mergeProps(vue.unref(attrs), { class: tbodyClasses.value }), [
579
+ vue.renderSlot(_ctx.$slots, "default")
580
+ ], 16);
581
+ };
582
+ }
583
+ });
584
+ const _sfc_main$s = /* @__PURE__ */ vue.defineComponent({
585
+ ...{
586
+ inheritAttrs: false
587
+ },
588
+ __name: "Tfoot",
589
+ setup(__props) {
590
+ const context = vue.inject(TableContextKey);
591
+ const attrs = vue.useAttrs();
592
+ const tfootClasses = vue.computed(() => [
593
+ "text-sm font-medium text-gray-600 dark:text-gray-400",
594
+ (context == null ? void 0 : context.bordered) ? "border-t border-gray-200 dark:border-gray-700" : "border-t border-black/10 dark:border-white/10"
595
+ ]);
596
+ return (_ctx, _cache) => {
597
+ return vue.openBlock(), vue.createElementBlock("tfoot", vue.mergeProps(vue.unref(attrs), {
598
+ class: [tfootClasses.value, "bg-black/5 dark:bg-white/5"]
599
+ }), [
600
+ vue.renderSlot(_ctx.$slots, "default")
601
+ ], 16);
602
+ };
603
+ }
604
+ });
605
+ const _sfc_main$r = /* @__PURE__ */ vue.defineComponent({
606
+ ...{
607
+ inheritAttrs: false
608
+ },
609
+ __name: "Tr",
610
+ props: {
611
+ selected: { type: Boolean, default: false },
612
+ clickable: { type: Boolean, default: false },
613
+ disabled: { type: Boolean, default: false },
614
+ even: { type: Boolean }
615
+ },
616
+ emits: ["click"],
617
+ setup(__props, { emit: __emit }) {
618
+ const props = __props;
619
+ const attrs = vue.useAttrs();
620
+ const emit = __emit;
621
+ const context = vue.inject(TableContextKey);
622
+ const rowClasses = vue.computed(() => [
623
+ "transition-colors",
624
+ // Hover effect
625
+ (context == null ? void 0 : context.hover) && !props.disabled ? "hover:bg-black/5 dark:hover:bg-white/5" : "",
626
+ // Selected state
627
+ props.selected ? "bg-primary-50 dark:bg-primary-900/20" : "",
628
+ // Striped (only apply if not selected)
629
+ (context == null ? void 0 : context.striped) && props.even && !props.selected ? "bg-black/[0.02] dark:bg-white/[0.02]" : "",
630
+ // Clickable
631
+ props.clickable && !props.disabled ? "cursor-pointer" : "",
632
+ // Disabled
633
+ props.disabled ? "opacity-50 cursor-not-allowed" : ""
634
+ ]);
635
+ const handleClick = (event) => {
636
+ if (props.clickable && !props.disabled) {
637
+ emit("click", event);
638
+ }
639
+ };
640
+ return (_ctx, _cache) => {
641
+ return vue.openBlock(), vue.createElementBlock("tr", vue.mergeProps(vue.unref(attrs), {
642
+ class: rowClasses.value,
643
+ onClick: handleClick
644
+ }), [
645
+ vue.renderSlot(_ctx.$slots, "default")
646
+ ], 16);
647
+ };
648
+ }
649
+ });
650
+ const _hoisted_1$k = ["colspan", "rowspan", "scope", "aria-sort"];
651
+ const _hoisted_2$e = {
93
652
  key: 0,
94
653
  d: "M7 14l5-5 5 5H7z"
95
654
  };
96
- const _hoisted_8$3 = {
655
+ const _hoisted_3$8 = {
97
656
  key: 1,
98
657
  d: "M7 10l5 5 5-5H7z"
99
658
  };
100
- const _hoisted_9$3 = {
101
- key: 1,
102
- class: "px-3 py-3 text-right"
103
- };
104
- const _hoisted_10$2 = { class: "divide-y divide-black/10 font-medium dark:divide-white/10" };
105
- const _hoisted_11$1 = {
106
- key: 0,
107
- class: "px-3 py-4"
108
- };
109
- const _hoisted_12$1 = {
110
- key: 1,
111
- class: "flex items-center justify-end gap-2 px-3 py-4"
112
- };
113
- const _hoisted_13 = { key: 0 };
114
- const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
115
- __name: "TableComponent",
659
+ const _sfc_main$q = /* @__PURE__ */ vue.defineComponent({
660
+ ...{
661
+ inheritAttrs: false
662
+ },
663
+ __name: "Th",
116
664
  props: {
117
- properties: {},
118
- items: {},
665
+ sortable: { type: Boolean, default: false },
666
+ sorted: { type: Boolean, default: false },
667
+ sortDirection: { default: "asc" },
668
+ align: { default: "left" },
669
+ width: {},
670
+ minWidth: {},
671
+ maxWidth: {},
672
+ sticky: { type: Boolean, default: false },
673
+ stickyLeft: { default: "0" },
674
+ colspan: {},
675
+ rowspan: {},
676
+ scope: { default: "col" },
677
+ resizable: { type: Boolean, default: false },
678
+ resizing: { type: Boolean, default: false }
679
+ },
680
+ emits: ["sort", "resizeStart"],
681
+ setup(__props, { emit: __emit }) {
682
+ const props = __props;
683
+ const attrs = vue.useAttrs();
684
+ const emit = __emit;
685
+ const context = vue.inject(TableContextKey);
686
+ const thClasses = vue.computed(() => [
687
+ // Padding
688
+ (context == null ? void 0 : context.compact) ? "px-2 py-2" : "px-3 py-3",
689
+ // Alignment
690
+ props.align === "center" ? "text-center" : props.align === "right" ? "text-right" : "text-left",
691
+ // Sortable hover
692
+ props.sortable ? "cursor-pointer select-none hover:bg-black/5 dark:hover:bg-white/5" : "",
693
+ // Border for bordered tables
694
+ (context == null ? void 0 : context.bordered) ? "border-r border-gray-200 dark:border-gray-700 last:border-r-0" : "",
695
+ // Sticky column
696
+ props.sticky ? "sticky bg-black/5 dark:bg-white/5 z-20" : "",
697
+ // Resizable
698
+ props.resizable ? "relative" : ""
699
+ ]);
700
+ const thStyles = vue.computed(() => ({
701
+ width: props.width,
702
+ minWidth: props.minWidth,
703
+ maxWidth: props.maxWidth,
704
+ left: props.sticky ? props.stickyLeft : void 0
705
+ }));
706
+ const handleSort = () => {
707
+ if (props.sortable) {
708
+ emit("sort");
709
+ }
710
+ };
711
+ return (_ctx, _cache) => {
712
+ return vue.openBlock(), vue.createElementBlock("th", vue.mergeProps(vue.unref(attrs), {
713
+ class: thClasses.value,
714
+ style: thStyles.value,
715
+ colspan: __props.colspan,
716
+ rowspan: __props.rowspan,
717
+ scope: __props.scope,
718
+ "aria-sort": __props.sortable ? __props.sorted ? __props.sortDirection === "asc" ? "ascending" : "descending" : "none" : void 0,
719
+ onClick: handleSort
720
+ }), [
721
+ vue.createElementVNode("div", {
722
+ class: vue.normalizeClass(["flex items-center gap-1", {
723
+ "justify-center": __props.align === "center",
724
+ "justify-end": __props.align === "right"
725
+ }])
726
+ }, [
727
+ vue.renderSlot(_ctx.$slots, "default"),
728
+ __props.sortable ? (vue.openBlock(), vue.createElementBlock("svg", {
729
+ key: 0,
730
+ class: vue.normalizeClass([
731
+ "size-4 transition-colors flex-shrink-0",
732
+ __props.sorted ? "text-primary-500" : "text-gray-400"
733
+ ]),
734
+ viewBox: "0 0 24 24",
735
+ fill: "currentColor"
736
+ }, [
737
+ __props.sorted && __props.sortDirection === "asc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_2$e)) : __props.sorted && __props.sortDirection === "desc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_3$8)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 2 }, [
738
+ _cache[2] || (_cache[2] = vue.createElementVNode("path", {
739
+ d: "M7 14l5-5 5 5H7z",
740
+ class: "opacity-40"
741
+ }, null, -1)),
742
+ _cache[3] || (_cache[3] = vue.createElementVNode("path", {
743
+ d: "M7 10l5 5 5-5H7z",
744
+ class: "opacity-40"
745
+ }, null, -1))
746
+ ], 64))
747
+ ], 2)) : vue.createCommentVNode("", true)
748
+ ], 2),
749
+ __props.resizable ? (vue.openBlock(), vue.createElementBlock("div", {
750
+ key: 0,
751
+ class: vue.normalizeClass([
752
+ "absolute top-0 right-0 bottom-0 w-1 cursor-col-resize select-none",
753
+ "hover:bg-primary-400 dark:hover:bg-primary-500",
754
+ "transition-colors",
755
+ __props.resizing ? "bg-primary-500" : "bg-transparent"
756
+ ]),
757
+ role: "separator",
758
+ "aria-orientation": "vertical",
759
+ tabindex: "-1",
760
+ onMousedown: _cache[0] || (_cache[0] = vue.withModifiers(($event) => emit("resizeStart", $event), ["stop"])),
761
+ onTouchstart: _cache[1] || (_cache[1] = vue.withModifiers(($event) => emit("resizeStart", $event), ["stop"]))
762
+ }, null, 34)) : vue.createCommentVNode("", true)
763
+ ], 16, _hoisted_1$k);
764
+ };
765
+ }
766
+ });
767
+ const _hoisted_1$j = ["colspan", "rowspan"];
768
+ const _sfc_main$p = /* @__PURE__ */ vue.defineComponent({
769
+ ...{
770
+ inheritAttrs: false
771
+ },
772
+ __name: "Td",
773
+ props: {
774
+ align: { default: "left" },
775
+ main: { type: Boolean, default: false },
776
+ className: {},
777
+ truncate: { type: Boolean, default: false },
778
+ width: {},
779
+ sticky: { type: Boolean, default: false },
780
+ stickyLeft: { default: "0" },
781
+ colspan: {},
782
+ rowspan: {}
783
+ },
784
+ setup(__props) {
785
+ const props = __props;
786
+ const attrs = vue.useAttrs();
787
+ const context = vue.inject(TableContextKey);
788
+ const tdClasses = vue.computed(() => [
789
+ // Padding
790
+ (context == null ? void 0 : context.compact) ? "px-2 py-2" : "px-3 py-4",
791
+ // Alignment
792
+ props.align === "center" ? "text-center" : props.align === "right" ? "text-right" : "text-left",
793
+ // Main column styling
794
+ props.main ? "text-sm font-semibold text-gray-900 dark:text-gray-100" : "text-xs font-medium text-gray-600 dark:text-gray-400",
795
+ // Truncate
796
+ props.truncate ? "truncate" : "",
797
+ // Border for bordered tables
798
+ (context == null ? void 0 : context.bordered) ? "border-r border-gray-200 dark:border-gray-700 last:border-r-0" : "",
799
+ // Sticky column
800
+ props.sticky ? "sticky bg-white dark:bg-gray-900 z-10" : "",
801
+ // Custom className
802
+ props.className || ""
803
+ ]);
804
+ const tdStyles = vue.computed(() => ({
805
+ width: props.width,
806
+ maxWidth: props.truncate ? props.width || "200px" : void 0,
807
+ left: props.sticky ? props.stickyLeft : void 0
808
+ }));
809
+ return (_ctx, _cache) => {
810
+ return vue.openBlock(), vue.createElementBlock("td", vue.mergeProps(vue.unref(attrs), {
811
+ class: tdClasses.value,
812
+ style: tdStyles.value,
813
+ colspan: __props.colspan,
814
+ rowspan: __props.rowspan
815
+ }), [
816
+ vue.renderSlot(_ctx.$slots, "default")
817
+ ], 16, _hoisted_1$j);
818
+ };
819
+ }
820
+ });
821
+ const _sfc_main$o = /* @__PURE__ */ vue.defineComponent({
822
+ __name: "TableHeader",
823
+ props: {
824
+ columns: {},
119
825
  selectable: { type: Boolean, default: false },
120
- selectedItems: {},
121
- selectableFilter: {},
122
- keyField: { default: "id" },
826
+ allSelected: { type: Boolean, default: false },
827
+ someSelected: { type: Boolean, default: false },
828
+ selectableCount: { default: 0 },
123
829
  sortBy: {},
124
830
  sortDirection: {},
125
- loading: { type: Boolean, default: false },
126
- loadingRows: { default: 5 }
831
+ showActions: { type: Boolean, default: false }
127
832
  },
128
- emits: ["select", "selectAll", "sort"],
833
+ emits: ["selectAll", "sort"],
129
834
  setup(__props, { emit: __emit }) {
130
- const slots = vue.useSlots();
131
835
  const props = __props;
836
+ const emit = __emit;
837
+ const handleSort = (property) => {
838
+ if (!property.sortable) return;
839
+ const newDirection = props.sortBy === property.name && props.sortDirection === "asc" ? "desc" : "asc";
840
+ emit("sort", property.name, newDirection);
841
+ };
842
+ return (_ctx, _cache) => {
843
+ return vue.openBlock(), vue.createBlock(_sfc_main$r, null, {
844
+ default: vue.withCtx(() => [
845
+ __props.selectable ? (vue.openBlock(), vue.createBlock(_sfc_main$q, {
846
+ key: 0,
847
+ width: "48px"
848
+ }, {
849
+ default: vue.withCtx(() => [
850
+ vue.createVNode(index._sfc_main, {
851
+ "model-value": __props.allSelected,
852
+ indeterminate: __props.someSelected,
853
+ disabled: __props.selectableCount === 0,
854
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("selectAll"))
855
+ }, null, 8, ["model-value", "indeterminate", "disabled"])
856
+ ]),
857
+ _: 1
858
+ })) : vue.createCommentVNode("", true),
859
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (column) => {
860
+ return vue.openBlock(), vue.createBlock(_sfc_main$q, {
861
+ key: column.name,
862
+ sortable: column.sortable,
863
+ sorted: __props.sortBy === column.name,
864
+ "sort-direction": __props.sortDirection,
865
+ align: column.align,
866
+ width: column.width,
867
+ "min-width": column.minWidth,
868
+ "max-width": column.maxWidth,
869
+ onSort: ($event) => handleSort(column)
870
+ }, {
871
+ default: vue.withCtx(() => [
872
+ vue.renderSlot(_ctx.$slots, "header-" + column.name, { column }, () => [
873
+ vue.createTextVNode(vue.toDisplayString(column.label ?? column.name), 1)
874
+ ])
875
+ ]),
876
+ _: 2
877
+ }, 1032, ["sortable", "sorted", "sort-direction", "align", "width", "min-width", "max-width", "onSort"]);
878
+ }), 128)),
879
+ __props.showActions ? (vue.openBlock(), vue.createBlock(_sfc_main$q, {
880
+ key: 1,
881
+ align: "right",
882
+ width: "100px"
883
+ })) : vue.createCommentVNode("", true)
884
+ ]),
885
+ _: 3
886
+ });
887
+ };
888
+ }
889
+ });
890
+ const _hoisted_1$i = { class: "flex items-center justify-end gap-2" };
891
+ const _sfc_main$n = /* @__PURE__ */ vue.defineComponent({
892
+ __name: "TableRow",
893
+ props: {
894
+ item: {},
895
+ columns: {},
896
+ selectable: { type: Boolean, default: false },
897
+ selected: { type: Boolean, default: false },
898
+ canSelect: { type: Boolean, default: true },
899
+ clickable: { type: Boolean, default: false },
900
+ even: { type: Boolean, default: false },
901
+ showActions: { type: Boolean, default: false }
902
+ },
903
+ emits: ["select", "click"],
904
+ setup(__props, { emit: __emit }) {
132
905
  const emit = __emit;
133
906
  const typeComponents = {
134
907
  text: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1,
@@ -140,11 +913,6 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
140
913
  const getTypeComponent = (type = "text") => {
141
914
  return typeComponents[type] || BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1;
142
915
  };
143
- const visibleProperties = vue.computed(() => props.properties.filter((p) => !p.hidden));
144
- const getKey = (item) => {
145
- const keyValue = item[props.keyField];
146
- return String(keyValue ?? Math.random());
147
- };
148
916
  const getItemValue = (item, property) => {
149
917
  if (property.name.includes(".")) {
150
918
  let value = item;
@@ -159,21 +927,272 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
159
927
  }
160
928
  return item[property.name];
161
929
  };
162
- const getAlignmentClass = (align) => {
163
- switch (align) {
164
- case "center":
165
- return "text-center";
166
- case "right":
167
- return "text-right";
168
- default:
169
- return "text-left";
930
+ return (_ctx, _cache) => {
931
+ return vue.openBlock(), vue.createBlock(_sfc_main$r, {
932
+ selected: __props.selected,
933
+ clickable: __props.clickable,
934
+ even: __props.even,
935
+ onClick: _cache[1] || (_cache[1] = (e) => emit("click", e))
936
+ }, {
937
+ default: vue.withCtx(() => [
938
+ __props.selectable ? (vue.openBlock(), vue.createBlock(_sfc_main$p, {
939
+ key: 0,
940
+ width: "48px"
941
+ }, {
942
+ default: vue.withCtx(() => [
943
+ __props.canSelect ? (vue.openBlock(), vue.createBlock(index._sfc_main, {
944
+ key: 0,
945
+ "model-value": __props.selected,
946
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("select"))
947
+ }, null, 8, ["model-value"])) : vue.createCommentVNode("", true)
948
+ ]),
949
+ _: 1
950
+ })) : vue.createCommentVNode("", true),
951
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (column) => {
952
+ return vue.openBlock(), vue.createBlock(_sfc_main$p, {
953
+ key: column.name,
954
+ align: column.align,
955
+ main: column.main,
956
+ "class-name": column.className,
957
+ truncate: column.truncate,
958
+ width: column.width
959
+ }, {
960
+ default: vue.withCtx(() => [
961
+ vue.renderSlot(_ctx.$slots, "cell-" + column.name, {
962
+ item: __props.item,
963
+ value: getItemValue(__props.item, column),
964
+ column
965
+ }, () => [
966
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(getTypeComponent(column.type || "text")), {
967
+ value: getItemValue(__props.item, column)
968
+ }, null, 8, ["value"]))
969
+ ])
970
+ ]),
971
+ _: 2
972
+ }, 1032, ["align", "main", "class-name", "truncate", "width"]);
973
+ }), 128)),
974
+ __props.showActions ? (vue.openBlock(), vue.createBlock(_sfc_main$p, {
975
+ key: 1,
976
+ align: "right"
977
+ }, {
978
+ default: vue.withCtx(() => [
979
+ vue.createElementVNode("div", _hoisted_1$i, [
980
+ vue.renderSlot(_ctx.$slots, "actions", { item: __props.item })
981
+ ])
982
+ ]),
983
+ _: 3
984
+ })) : vue.createCommentVNode("", true)
985
+ ]),
986
+ _: 3
987
+ }, 8, ["selected", "clickable", "even"]);
988
+ };
989
+ }
990
+ });
991
+ const _sfc_main$m = /* @__PURE__ */ vue.defineComponent({
992
+ __name: "TableFooter",
993
+ props: {
994
+ colSpan: {}
995
+ },
996
+ setup(__props) {
997
+ return (_ctx, _cache) => {
998
+ return vue.openBlock(), vue.createBlock(_sfc_main$r, null, {
999
+ default: vue.withCtx(() => [
1000
+ vue.createVNode(_sfc_main$p, {
1001
+ colspan: __props.colSpan,
1002
+ class: "text-center"
1003
+ }, {
1004
+ default: vue.withCtx(() => [
1005
+ vue.renderSlot(_ctx.$slots, "default")
1006
+ ]),
1007
+ _: 3
1008
+ }, 8, ["colspan"])
1009
+ ]),
1010
+ _: 3
1011
+ });
1012
+ };
1013
+ }
1014
+ });
1015
+ const _hoisted_1$h = ["disabled", "aria-expanded"];
1016
+ const _hoisted_2$d = { class: "p-4" };
1017
+ const _sfc_main$l = /* @__PURE__ */ vue.defineComponent({
1018
+ ...{
1019
+ inheritAttrs: false
1020
+ },
1021
+ __name: "ExpandableRow",
1022
+ props: {
1023
+ colspan: {},
1024
+ defaultExpanded: { type: Boolean, default: false },
1025
+ expanded: { type: Boolean, default: void 0 },
1026
+ selected: { type: Boolean, default: false },
1027
+ disabled: { type: Boolean, default: false },
1028
+ expandOnRowClick: { type: Boolean, default: false }
1029
+ },
1030
+ emits: ["update:expanded", "click"],
1031
+ setup(__props, { expose: __expose, emit: __emit }) {
1032
+ const props = __props;
1033
+ const emit = __emit;
1034
+ const attrs = vue.useAttrs();
1035
+ const internalExpanded = vue.ref(props.defaultExpanded);
1036
+ const isExpanded = vue.computed({
1037
+ get: () => props.expanded !== void 0 ? props.expanded : internalExpanded.value,
1038
+ set: (value) => {
1039
+ internalExpanded.value = value;
1040
+ emit("update:expanded", value);
1041
+ }
1042
+ });
1043
+ const toggle = () => {
1044
+ if (!props.disabled) {
1045
+ isExpanded.value = !isExpanded.value;
170
1046
  }
171
1047
  };
172
- const getMainClass = (main) => {
173
- if (main) {
174
- return "text-sm font-semibold text-gray-900 dark:text-gray-100";
1048
+ const handleRowClick = (event) => {
1049
+ emit("click", event);
1050
+ if (props.expandOnRowClick) {
1051
+ toggle();
1052
+ }
1053
+ };
1054
+ __expose({ toggle, isExpanded });
1055
+ return (_ctx, _cache) => {
1056
+ return vue.openBlock(), vue.createElementBlock(vue.Fragment, null, [
1057
+ vue.createVNode(_sfc_main$r, vue.mergeProps(vue.unref(attrs), {
1058
+ selected: __props.selected,
1059
+ disabled: __props.disabled,
1060
+ clickable: "",
1061
+ onClick: handleRowClick
1062
+ }), {
1063
+ default: vue.withCtx(() => [
1064
+ vue.createVNode(_sfc_main$p, {
1065
+ width: "40px",
1066
+ class: "!p-2"
1067
+ }, {
1068
+ default: vue.withCtx(() => [
1069
+ vue.createElementVNode("button", {
1070
+ type: "button",
1071
+ disabled: __props.disabled,
1072
+ class: "flex size-6 items-center justify-center rounded transition-colors hover:bg-black/10 dark:hover:bg-white/10 disabled:opacity-50 disabled:cursor-not-allowed",
1073
+ "aria-expanded": isExpanded.value,
1074
+ "aria-label": "Toggle row details",
1075
+ onClick: vue.withModifiers(toggle, ["stop"])
1076
+ }, [
1077
+ (vue.openBlock(), vue.createElementBlock("svg", {
1078
+ class: vue.normalizeClass(["size-4 transition-transform", { "rotate-90": isExpanded.value }]),
1079
+ viewBox: "0 0 24 24",
1080
+ fill: "currentColor"
1081
+ }, [..._cache[0] || (_cache[0] = [
1082
+ vue.createElementVNode("path", { d: "M8.59 16.59L13.17 12 8.59 7.41 10 6l6 6-6 6-1.41-1.41z" }, null, -1)
1083
+ ])], 2))
1084
+ ], 8, _hoisted_1$h)
1085
+ ]),
1086
+ _: 1
1087
+ }),
1088
+ vue.renderSlot(_ctx.$slots, "row")
1089
+ ]),
1090
+ _: 3
1091
+ }, 16, ["selected", "disabled"]),
1092
+ isExpanded.value ? (vue.openBlock(), vue.createBlock(_sfc_main$r, {
1093
+ key: 0,
1094
+ class: "bg-gray-50 dark:bg-gray-800/50"
1095
+ }, {
1096
+ default: vue.withCtx(() => [
1097
+ vue.createVNode(_sfc_main$p, {
1098
+ colspan: __props.colspan + 1,
1099
+ class: "!p-0"
1100
+ }, {
1101
+ default: vue.withCtx(() => [
1102
+ vue.createElementVNode("div", _hoisted_2$d, [
1103
+ vue.renderSlot(_ctx.$slots, "expanded")
1104
+ ])
1105
+ ]),
1106
+ _: 3
1107
+ }, 8, ["colspan"])
1108
+ ]),
1109
+ _: 3
1110
+ })) : vue.createCommentVNode("", true)
1111
+ ], 64);
1112
+ };
1113
+ }
1114
+ });
1115
+ const _hoisted_1$g = { class: "overflow-hidden" };
1116
+ const _hoisted_2$c = {
1117
+ key: 1,
1118
+ class: "flex flex-col items-center justify-center py-12 text-center"
1119
+ };
1120
+ const _hoisted_3$7 = { class: "flex flex-col items-center gap-3" };
1121
+ const _hoisted_4$5 = { class: "text-sm text-gray-600 dark:text-gray-400" };
1122
+ const _hoisted_5$3 = {
1123
+ key: 3,
1124
+ class: "flex flex-col items-center justify-center py-12 text-center"
1125
+ };
1126
+ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
1127
+ __name: "DataTable",
1128
+ props: {
1129
+ properties: {},
1130
+ items: {},
1131
+ selectable: { type: Boolean, default: false },
1132
+ selectedItems: {},
1133
+ selectableFilter: {},
1134
+ keyField: { default: "id" },
1135
+ sortBy: {},
1136
+ sortDirection: {},
1137
+ loading: { type: Boolean, default: false },
1138
+ loadingRows: { default: 5 },
1139
+ error: { type: Boolean, default: false },
1140
+ errorMessage: { default: "An error occurred while loading data." },
1141
+ striped: { type: Boolean, default: false },
1142
+ bordered: { type: Boolean, default: false },
1143
+ hover: { type: Boolean, default: true },
1144
+ compact: { type: Boolean, default: false },
1145
+ stickyHeader: { type: Boolean, default: false },
1146
+ clickableRows: { type: Boolean, default: false },
1147
+ paginated: { type: Boolean, default: false },
1148
+ pageSize: { default: 10 },
1149
+ pageSizeOptions: { default: () => [10, 20, 50, 100] },
1150
+ showPageSize: { type: Boolean, default: true },
1151
+ currentPage: {},
1152
+ totalItems: {}
1153
+ },
1154
+ emits: ["select", "selectAll", "sort", "rowClick", "update:currentPage", "update:pageSize"],
1155
+ setup(__props, { emit: __emit }) {
1156
+ const slots = vue.useSlots();
1157
+ const props = __props;
1158
+ const emit = __emit;
1159
+ const visibleProperties = vue.computed(() => props.properties.filter((p) => !p.hidden));
1160
+ const {
1161
+ currentPage: internalPage,
1162
+ pageSize: internalPageSize,
1163
+ totalPages,
1164
+ paginatedItems,
1165
+ setPageSize: setInternalPageSize,
1166
+ goToPage
1167
+ } = usePagination.usePagination({
1168
+ items: vue.computed(() => props.items),
1169
+ pageSize: props.pageSize,
1170
+ initialPage: props.currentPage ?? 1
1171
+ });
1172
+ const effectivePage = vue.computed(() => props.currentPage ?? internalPage.value);
1173
+ const effectivePageSize = vue.computed(() => props.pageSize ?? internalPageSize.value);
1174
+ const effectiveTotalPages = vue.computed(() => {
1175
+ if (props.totalItems !== void 0) {
1176
+ return Math.ceil(props.totalItems / effectivePageSize.value);
175
1177
  }
176
- return "text-xs font-medium text-gray-600 dark:text-gray-400";
1178
+ return totalPages.value;
1179
+ });
1180
+ const displayItems = vue.computed(() => {
1181
+ if (!props.paginated) return props.items;
1182
+ if (props.totalItems !== void 0) return props.items;
1183
+ return paginatedItems.value;
1184
+ });
1185
+ const handlePageChange = (page) => {
1186
+ goToPage(page);
1187
+ emit("update:currentPage", page);
1188
+ };
1189
+ const handlePageSizeChange = (size) => {
1190
+ setInternalPageSize(size);
1191
+ emit("update:pageSize", size);
1192
+ };
1193
+ const getKey = (item) => {
1194
+ const keyValue = item[props.keyField];
1195
+ return String(keyValue ?? Math.random());
177
1196
  };
178
1197
  const selectableItems = vue.computed(() => {
179
1198
  if (!props.selectableFilter) return props.items;
@@ -202,123 +1221,139 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
202
1221
  const handleSelect = (item) => {
203
1222
  emit("select", getKey(item));
204
1223
  };
205
- const hasActionSlot = vue.computed(() => !!slots.action);
206
- const handleSort = (property) => {
207
- if (!property.sortable) return;
208
- const newDirection = props.sortBy === property.name && props.sortDirection === "asc" ? "desc" : "asc";
209
- emit("sort", property.name, newDirection);
210
- };
211
- const isSortedColumn = (property) => {
212
- return props.sortBy === property.name;
1224
+ const handleRowClick = (item, event) => {
1225
+ if (props.clickableRows) {
1226
+ emit("rowClick", item, event);
1227
+ }
213
1228
  };
1229
+ const hasActionSlot = vue.computed(() => !!slots.action);
214
1230
  return (_ctx, _cache) => {
215
1231
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$g, [
216
- __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main, {
1232
+ __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$1, {
217
1233
  key: 0,
218
1234
  rows: __props.loadingRows,
219
1235
  columns: visibleProperties.value.length
220
- }, null, 8, ["rows", "columns"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$c, [
221
- vue.createElementVNode("table", _hoisted_3$7, [
222
- vue.createElementVNode("thead", _hoisted_4$5, [
223
- vue.createElementVNode("tr", null, [
224
- __props.selectable ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_5$3, [
225
- vue.createVNode(index._sfc_main, {
226
- "model-value": allSelected.value,
227
- indeterminate: someSelected.value,
228
- disabled: selectableItems.value.length === 0,
229
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("selectAll"))
230
- }, null, 8, ["model-value", "indeterminate", "disabled"])
231
- ])) : vue.createCommentVNode("", true),
232
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleProperties.value, (property) => {
233
- return vue.openBlock(), vue.createElementBlock("th", {
234
- key: property.name,
235
- class: vue.normalizeClass([
236
- getAlignmentClass(property.align),
237
- "px-3 py-3",
238
- property.sortable ? "cursor-pointer select-none hover:bg-black/5 dark:hover:bg-white/5" : ""
1236
+ }, null, 8, ["rows", "columns"])) : __props.error ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$c, [
1237
+ vue.renderSlot(_ctx.$slots, "error", {}, () => [
1238
+ vue.createElementVNode("div", _hoisted_3$7, [
1239
+ _cache[2] || (_cache[2] = vue.createElementVNode("svg", {
1240
+ class: "size-12 text-red-400",
1241
+ fill: "none",
1242
+ viewBox: "0 0 24 24",
1243
+ stroke: "currentColor"
1244
+ }, [
1245
+ vue.createElementVNode("path", {
1246
+ "stroke-linecap": "round",
1247
+ "stroke-linejoin": "round",
1248
+ "stroke-width": "1.5",
1249
+ d: "M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-3L13.732 4c-.77-1.333-2.694-1.333-3.464 0L3.34 16c-.77 1.333.192 3 1.732 3z"
1250
+ })
1251
+ ], -1)),
1252
+ vue.createElementVNode("p", _hoisted_4$5, vue.toDisplayString(__props.errorMessage), 1)
1253
+ ])
1254
+ ])
1255
+ ])) : __props.items && __props.items.length > 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$y, {
1256
+ key: 2,
1257
+ striped: __props.striped,
1258
+ bordered: __props.bordered,
1259
+ hover: __props.hover,
1260
+ compact: __props.compact,
1261
+ "sticky-header": __props.stickyHeader
1262
+ }, {
1263
+ default: vue.withCtx(() => [
1264
+ vue.createVNode(_sfc_main$u, null, {
1265
+ default: vue.withCtx(() => [
1266
+ vue.createVNode(_sfc_main$o, {
1267
+ columns: visibleProperties.value,
1268
+ selectable: __props.selectable,
1269
+ "all-selected": allSelected.value,
1270
+ "some-selected": someSelected.value,
1271
+ "selectable-count": selectableItems.value.length,
1272
+ "sort-by": __props.sortBy,
1273
+ "sort-direction": __props.sortDirection,
1274
+ "show-actions": hasActionSlot.value,
1275
+ onSelectAll: _cache[0] || (_cache[0] = ($event) => emit("selectAll")),
1276
+ onSort: _cache[1] || (_cache[1] = (col, dir) => emit("sort", col, dir))
1277
+ }, vue.createSlots({ _: 2 }, [
1278
+ vue.renderList(visibleProperties.value, (column) => {
1279
+ return {
1280
+ name: `header-${column.name}`,
1281
+ fn: vue.withCtx((slotProps) => [
1282
+ vue.renderSlot(_ctx.$slots, "header-" + column.name, vue.normalizeProps(vue.guardReactiveProps(slotProps)))
1283
+ ])
1284
+ };
1285
+ })
1286
+ ]), 1032, ["columns", "selectable", "all-selected", "some-selected", "selectable-count", "sort-by", "sort-direction", "show-actions"])
1287
+ ]),
1288
+ _: 3
1289
+ }),
1290
+ vue.createVNode(_sfc_main$t, null, {
1291
+ default: vue.withCtx(() => [
1292
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(displayItems.value, (item, index2) => {
1293
+ return vue.openBlock(), vue.createBlock(_sfc_main$n, {
1294
+ key: getKey(item),
1295
+ item,
1296
+ columns: visibleProperties.value,
1297
+ selectable: __props.selectable,
1298
+ selected: isSelected(item),
1299
+ "can-select": isSelectable(item),
1300
+ clickable: __props.clickableRows,
1301
+ even: index2 % 2 === 1,
1302
+ "show-actions": hasActionSlot.value,
1303
+ onSelect: ($event) => handleSelect(item),
1304
+ onClick: (e) => handleRowClick(item, e)
1305
+ }, vue.createSlots({
1306
+ actions: vue.withCtx(({ item: rowItem }) => [
1307
+ vue.renderSlot(_ctx.$slots, "action", { item: rowItem })
239
1308
  ]),
240
- onClick: ($event) => handleSort(property)
1309
+ _: 2
241
1310
  }, [
242
- vue.createElementVNode("div", {
243
- class: vue.normalizeClass(["flex items-center gap-1", {
244
- "justify-center": property.align === "center",
245
- "justify-end": property.align === "right"
246
- }])
247
- }, [
248
- vue.renderSlot(_ctx.$slots, "header-" + property.name, { property }, () => [
249
- vue.createTextVNode(vue.toDisplayString(property.label ?? property.name), 1)
250
- ]),
251
- property.sortable ? (vue.openBlock(), vue.createElementBlock("svg", {
252
- key: 0,
253
- class: vue.normalizeClass([
254
- "size-4 transition-colors",
255
- isSortedColumn(property) ? "text-primary-500" : "text-gray-400"
256
- ]),
257
- viewBox: "0 0 24 24",
258
- fill: "currentColor"
259
- }, [
260
- isSortedColumn(property) && __props.sortDirection === "asc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_7$3)) : isSortedColumn(property) && __props.sortDirection === "desc" ? (vue.openBlock(), vue.createElementBlock("path", _hoisted_8$3)) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 2 }, [
261
- _cache[1] || (_cache[1] = vue.createElementVNode("path", {
262
- d: "M7 14l5-5 5 5H7z",
263
- class: "opacity-40"
264
- }, null, -1)),
265
- _cache[2] || (_cache[2] = vue.createElementVNode("path", {
266
- d: "M7 10l5 5 5-5H7z",
267
- class: "opacity-40"
268
- }, null, -1))
269
- ], 64))
270
- ], 2)) : vue.createCommentVNode("", true)
271
- ], 2)
272
- ], 10, _hoisted_6$3);
273
- }), 128)),
274
- hasActionSlot.value ? (vue.openBlock(), vue.createElementBlock("th", _hoisted_9$3)) : vue.createCommentVNode("", true)
275
- ])
276
- ]),
277
- vue.createElementVNode("tbody", _hoisted_10$2, [
278
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
279
- return vue.openBlock(), vue.createElementBlock("tr", {
280
- key: getKey(item),
281
- class: vue.normalizeClass(["hover:bg-black/5 dark:hover:bg-white/5 transition-colors", { "bg-primary/5 dark:bg-primary/10": isSelected(item) }])
282
- }, [
283
- __props.selectable ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_11$1, [
284
- isSelectable(item) ? (vue.openBlock(), vue.createBlock(index._sfc_main, {
285
- key: 0,
286
- "model-value": isSelected(item),
287
- "onUpdate:modelValue": ($event) => handleSelect(item)
288
- }, null, 8, ["model-value", "onUpdate:modelValue"])) : vue.createCommentVNode("", true)
289
- ])) : vue.createCommentVNode("", true),
290
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleProperties.value, (property) => {
291
- return vue.openBlock(), vue.createElementBlock("td", {
292
- key: property.name,
293
- class: vue.normalizeClass([
294
- getAlignmentClass(property.align),
295
- getMainClass(property.main),
296
- property.className,
297
- "px-3 py-4"
298
- ])
299
- }, [
300
- vue.renderSlot(_ctx.$slots, "item-" + property.name, {
301
- item,
302
- property,
303
- value: getItemValue(item, property)
304
- }, () => [
305
- (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(getTypeComponent(property.type || "text")), {
306
- value: getItemValue(item, property)
307
- }, null, 8, ["value"]))
308
- ])
309
- ], 2);
310
- }), 128)),
311
- hasActionSlot.value ? (vue.openBlock(), vue.createElementBlock("td", _hoisted_12$1, [
312
- vue.renderSlot(_ctx.$slots, "action", { item })
313
- ])) : vue.createCommentVNode("", true)
314
- ], 2);
315
- }), 128))
316
- ])
1311
+ vue.renderList(visibleProperties.value, (column) => {
1312
+ return {
1313
+ name: `cell-${column.name}`,
1314
+ fn: vue.withCtx((slotProps) => [
1315
+ vue.renderSlot(_ctx.$slots, "item-" + column.name, vue.mergeProps({ ref_for: true }, slotProps))
1316
+ ])
1317
+ };
1318
+ })
1319
+ ]), 1032, ["item", "columns", "selectable", "selected", "can-select", "clickable", "even", "show-actions", "onSelect", "onClick"]);
1320
+ }), 128))
1321
+ ]),
1322
+ _: 3
1323
+ })
317
1324
  ]),
318
- !__props.items || __props.items.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_13, [
319
- vue.renderSlot(_ctx.$slots, "empty")
320
- ])) : vue.createCommentVNode("", true)
321
- ]))
1325
+ _: 3
1326
+ }, 8, ["striped", "bordered", "hover", "compact", "sticky-header"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$3, [
1327
+ vue.renderSlot(_ctx.$slots, "empty", {}, () => [
1328
+ _cache[3] || (_cache[3] = vue.createElementVNode("div", { class: "flex flex-col items-center gap-3" }, [
1329
+ vue.createElementVNode("svg", {
1330
+ class: "size-12 text-gray-300 dark:text-gray-600",
1331
+ fill: "none",
1332
+ viewBox: "0 0 24 24",
1333
+ stroke: "currentColor"
1334
+ }, [
1335
+ vue.createElementVNode("path", {
1336
+ "stroke-linecap": "round",
1337
+ "stroke-linejoin": "round",
1338
+ "stroke-width": "1.5",
1339
+ d: "M20 13V6a2 2 0 00-2-2H6a2 2 0 00-2 2v7m16 0v5a2 2 0 01-2 2H6a2 2 0 01-2-2v-5m16 0h-2.586a1 1 0 00-.707.293l-2.414 2.414a1 1 0 01-.707.293h-3.172a1 1 0 01-.707-.293l-2.414-2.414A1 1 0 006.586 13H4"
1340
+ })
1341
+ ]),
1342
+ vue.createElementVNode("p", { class: "text-sm text-gray-500 dark:text-gray-400" }, "No data available")
1343
+ ], -1))
1344
+ ])
1345
+ ])),
1346
+ __props.paginated && __props.items && __props.items.length > 0 && !__props.loading && !__props.error ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main, {
1347
+ key: 4,
1348
+ "current-page": effectivePage.value,
1349
+ "total-pages": effectiveTotalPages.value,
1350
+ "page-size": effectivePageSize.value,
1351
+ "page-size-options": __props.pageSizeOptions,
1352
+ "show-page-size": __props.showPageSize,
1353
+ class: "mt-4",
1354
+ "onUpdate:currentPage": handlePageChange,
1355
+ "onUpdate:pageSize": handlePageSizeChange
1356
+ }, null, 8, ["current-page", "total-pages", "page-size", "page-size-options", "show-page-size"])) : vue.createCommentVNode("", true)
322
1357
  ]);
323
1358
  };
324
1359
  }
@@ -392,9 +1427,9 @@ const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
392
1427
  const hasEmptySlot = vue.computed(() => !!slots.empty);
393
1428
  return (_ctx, _cache) => {
394
1429
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$f, [
395
- __props.loading ? (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 0 }, {
1430
+ __props.loading ? (vue.openBlock(), vue.createBlock(_sfc_main$A, { key: 0 }, {
396
1431
  default: vue.withCtx(() => [
397
- vue.createVNode(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$2, {
1432
+ vue.createVNode(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$3, {
398
1433
  items: __props.loadingItems,
399
1434
  "show-avatar": "",
400
1435
  "show-secondary": "",
@@ -403,7 +1438,7 @@ const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
403
1438
  ]),
404
1439
  _: 1
405
1440
  })) : (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
406
- __props.selectable && selectableItems.value.length > 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 0 }, {
1441
+ __props.selectable && selectableItems.value.length > 0 ? (vue.openBlock(), vue.createBlock(_sfc_main$A, { key: 0 }, {
407
1442
  default: vue.withCtx(() => [
408
1443
  vue.createElementVNode("div", _hoisted_2$b, [
409
1444
  vue.createVNode(index._sfc_main, {
@@ -418,7 +1453,7 @@ const _sfc_main$j = /* @__PURE__ */ vue.defineComponent({
418
1453
  _: 1
419
1454
  })) : vue.createCommentVNode("", true),
420
1455
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
421
- return vue.openBlock(), vue.createBlock(_sfc_main$l, {
1456
+ return vue.openBlock(), vue.createBlock(_sfc_main$A, {
422
1457
  key: getKey(item),
423
1458
  class: vue.normalizeClass(["hover:shadow-lg transition-all duration-200", {
424
1459
  "ring-2 ring-primary": isSelected(item)
@@ -539,9 +1574,9 @@ const _sfc_main$i = /* @__PURE__ */ vue.defineComponent({
539
1574
  vue.renderSlot(_ctx.$slots, "empty")
540
1575
  ]),
541
1576
  _: 3
542
- }, 8, ["items", "key-field", "selectable", "selected-items", "selectable-filter", "loading", "loading-items"])) : (vue.openBlock(), vue.createBlock(_sfc_main$l, { key: 1 }, {
1577
+ }, 8, ["items", "key-field", "selectable", "selected-items", "selectable-filter", "loading", "loading-items"])) : (vue.openBlock(), vue.createBlock(_sfc_main$A, { key: 1 }, {
543
1578
  default: vue.withCtx(() => [
544
- vue.createVNode(_sfc_main$k, {
1579
+ vue.createVNode(vue.unref(_sfc_main$k), {
545
1580
  items: __props.items,
546
1581
  properties: tableProperties.value,
547
1582
  "key-field": __props.keyField,
@@ -1242,7 +2277,7 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
1242
2277
  };
1243
2278
  const hasCustomHeader = () => !!slots.header;
1244
2279
  return (_ctx, _cache) => {
1245
- return vue.openBlock(), vue.createBlock(_sfc_main$l, null, vue.createSlots({
2280
+ return vue.openBlock(), vue.createBlock(_sfc_main$A, null, vue.createSlots({
1246
2281
  default: vue.withCtx(() => [
1247
2282
  vue.createVNode(vue.Transition, {
1248
2283
  "enter-active-class": "transition-all duration-200 ease-out",
@@ -1976,7 +3011,7 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
1976
3011
  },
1977
3012
  setup(__props) {
1978
3013
  const props = __props;
1979
- const { isDark, toggle } = useDarkMode.useDarkMode({ storageKey: props.storageKey });
3014
+ const { isDark, toggle } = usePagination.useDarkMode({ storageKey: props.storageKey });
1980
3015
  const sizeClasses = {
1981
3016
  sm: { button: "p-1.5", icon: "size-4" },
1982
3017
  md: { button: "p-2", icon: "size-5" },
@@ -2277,26 +3312,42 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
2277
3312
  };
2278
3313
  }
2279
3314
  });
2280
- exports._sfc_main = _sfc_main$l;
2281
- exports._sfc_main$1 = _sfc_main$k;
2282
- exports._sfc_main$10 = _sfc_main$b;
2283
- exports._sfc_main$11 = _sfc_main$a;
2284
- exports._sfc_main$12 = _sfc_main$9;
2285
- exports._sfc_main$13 = _sfc_main$8;
2286
- exports._sfc_main$14 = _sfc_main$7;
2287
- exports._sfc_main$15 = _sfc_main$6;
2288
- exports._sfc_main$16 = _sfc_main$5;
2289
- exports._sfc_main$17 = _sfc_main$4;
2290
- exports._sfc_main$18 = _sfc_main$3;
2291
- exports._sfc_main$19 = _sfc_main$2;
2292
- exports._sfc_main$2 = _sfc_main$j;
2293
- exports._sfc_main$20 = _sfc_main$1;
2294
- exports._sfc_main$21 = _sfc_main;
2295
- exports._sfc_main$3 = _sfc_main$i;
2296
- exports._sfc_main$4 = _sfc_main$h;
2297
- exports._sfc_main$5 = _sfc_main$g;
2298
- exports._sfc_main$6 = _sfc_main$f;
2299
- exports._sfc_main$7 = _sfc_main$e;
2300
- exports._sfc_main$8 = _sfc_main$d;
2301
- exports._sfc_main$9 = _sfc_main$c;
2302
- //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-jW6Ikbvy.cjs.map
3315
+ exports.TableContextKey = TableContextKey;
3316
+ exports._sfc_main = _sfc_main$A;
3317
+ exports._sfc_main$1 = _sfc_main$z;
3318
+ exports._sfc_main$10 = _sfc_main$q;
3319
+ exports._sfc_main$11 = _sfc_main$p;
3320
+ exports._sfc_main$12 = _sfc_main$o;
3321
+ exports._sfc_main$13 = _sfc_main$n;
3322
+ exports._sfc_main$14 = _sfc_main$m;
3323
+ exports._sfc_main$15 = _sfc_main$l;
3324
+ exports._sfc_main$16 = _sfc_main$k;
3325
+ exports._sfc_main$17 = _sfc_main$j;
3326
+ exports._sfc_main$18 = _sfc_main$i;
3327
+ exports._sfc_main$19 = _sfc_main$h;
3328
+ exports._sfc_main$2 = _sfc_main$y;
3329
+ exports._sfc_main$20 = _sfc_main$g;
3330
+ exports._sfc_main$21 = _sfc_main$f;
3331
+ exports._sfc_main$22 = _sfc_main$e;
3332
+ exports._sfc_main$23 = _sfc_main$d;
3333
+ exports._sfc_main$24 = _sfc_main$c;
3334
+ exports._sfc_main$25 = _sfc_main$b;
3335
+ exports._sfc_main$26 = _sfc_main$a;
3336
+ exports._sfc_main$27 = _sfc_main$9;
3337
+ exports._sfc_main$28 = _sfc_main$8;
3338
+ exports._sfc_main$29 = _sfc_main$7;
3339
+ exports._sfc_main$3 = _sfc_main$x;
3340
+ exports._sfc_main$30 = _sfc_main$6;
3341
+ exports._sfc_main$31 = _sfc_main$5;
3342
+ exports._sfc_main$32 = _sfc_main$4;
3343
+ exports._sfc_main$33 = _sfc_main$3;
3344
+ exports._sfc_main$34 = _sfc_main$2;
3345
+ exports._sfc_main$35 = _sfc_main$1;
3346
+ exports._sfc_main$36 = _sfc_main;
3347
+ exports._sfc_main$4 = _sfc_main$w;
3348
+ exports._sfc_main$5 = _sfc_main$v;
3349
+ exports._sfc_main$6 = _sfc_main$u;
3350
+ exports._sfc_main$7 = _sfc_main$t;
3351
+ exports._sfc_main$8 = _sfc_main$s;
3352
+ exports._sfc_main$9 = _sfc_main$r;
3353
+ //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs.map