cisse-vue-ui 0.8.4 → 0.10.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 (147) hide show
  1. package/README.md +666 -4
  2. package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-B190Yija.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js} +2 -2
  3. package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-B190Yija.js.map → CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js.map} +1 -1
  4. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js} +37 -184
  5. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js.map +1 -0
  6. 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
  7. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs.map +1 -0
  8. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-BmJHgkBs.js → FilterTabs.vue_vue_type_script_setup_true_lang-CJnvcF8Z.js} +1568 -384
  9. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CJnvcF8Z.js.map +1 -0
  10. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-DYxh-wFx.cjs → FilterTabs.vue_vue_type_script_setup_true_lang-l8lJzwoY.cjs} +1564 -380
  11. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-l8lJzwoY.cjs.map +1 -0
  12. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js +298 -0
  13. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js.map +1 -0
  14. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs +297 -0
  15. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs.map +1 -0
  16. package/dist/components/core/Breadcrumb.stories.d.ts +5 -0
  17. package/dist/components/core/CardWrapper.stories.d.ts +32 -0
  18. package/dist/components/core/CardWrapper.vue.d.ts +129 -0
  19. package/dist/components/core/CollapsibleCard.vue.d.ts +1 -1
  20. package/dist/components/core/DataTable.stories.d.ts +38 -0
  21. package/dist/components/core/Dropdown.vue.d.ts +1 -1
  22. package/dist/components/core/Popover.vue.d.ts +2 -2
  23. package/dist/components/core/StatItem.stories.d.ts +25 -0
  24. package/dist/components/core/StatItem.test.d.ts +1 -0
  25. package/dist/components/core/StatItem.vue.d.ts +81 -0
  26. package/dist/components/core/Stats.stories.d.ts +24 -0
  27. package/dist/components/core/Stats.test.d.ts +1 -0
  28. package/dist/components/core/Stats.vue.d.ts +41 -0
  29. package/dist/components/core/Tooltip.stories.d.ts +3 -0
  30. package/dist/components/core/index.cjs +41 -22
  31. package/dist/components/core/index.cjs.map +1 -1
  32. package/dist/components/core/index.d.ts +10 -4
  33. package/dist/components/core/index.js +41 -22
  34. package/dist/components/core/table/DataTable.test.d.ts +1 -0
  35. package/dist/components/core/{TableComponent.vue.d.ts → table/DataTable.vue.d.ts} +60 -7
  36. package/dist/components/core/table/Table.stories.d.ts +27 -0
  37. package/dist/components/core/table/atoms/Caption.test.d.ts +1 -0
  38. package/dist/components/core/table/atoms/Caption.vue.d.ts +26 -0
  39. package/dist/components/core/table/atoms/Col.test.d.ts +1 -0
  40. package/dist/components/core/table/atoms/Col.vue.d.ts +8 -0
  41. package/dist/components/core/table/atoms/Colgroup.test.d.ts +1 -0
  42. package/dist/components/core/table/atoms/Colgroup.vue.d.ts +17 -0
  43. package/dist/components/core/table/atoms/Table.test.d.ts +1 -0
  44. package/dist/components/core/table/atoms/Table.vue.d.ts +46 -0
  45. package/dist/components/core/table/atoms/Tbody.test.d.ts +1 -0
  46. package/dist/components/core/table/atoms/Tbody.vue.d.ts +17 -0
  47. package/dist/components/core/table/atoms/Td.test.d.ts +1 -0
  48. package/dist/components/core/table/atoms/Td.vue.d.ts +43 -0
  49. package/dist/components/core/table/atoms/Tfoot.test.d.ts +1 -0
  50. package/dist/components/core/table/atoms/Tfoot.vue.d.ts +17 -0
  51. package/dist/components/core/table/atoms/Th.test.d.ts +1 -0
  52. package/dist/components/core/table/atoms/Th.vue.d.ts +64 -0
  53. package/dist/components/core/table/atoms/Thead.test.d.ts +1 -0
  54. package/dist/components/core/table/atoms/Thead.vue.d.ts +17 -0
  55. package/dist/components/core/table/atoms/Tr.test.d.ts +1 -0
  56. package/dist/components/core/table/atoms/Tr.vue.d.ts +35 -0
  57. package/dist/components/core/table/atoms/index.d.ts +10 -0
  58. package/dist/components/core/table/index.d.ts +3 -0
  59. package/dist/components/core/table/molecules/ExpandableRow.test.d.ts +1 -0
  60. package/dist/components/core/table/molecules/ExpandableRow.vue.d.ts +47 -0
  61. package/dist/components/core/table/molecules/TableFooter.test.d.ts +1 -0
  62. package/dist/components/core/table/molecules/TableFooter.vue.d.ts +21 -0
  63. package/dist/components/core/table/molecules/TableHeader.test.d.ts +1 -0
  64. package/dist/components/core/table/molecules/TableHeader.vue.d.ts +49 -0
  65. package/dist/components/core/table/molecules/TableRow.test.d.ts +1 -0
  66. package/dist/components/core/table/molecules/TableRow.vue.d.ts +59 -0
  67. package/dist/components/core/table/molecules/index.d.ts +4 -0
  68. package/dist/components/feedback/Progress.vue.d.ts +1 -1
  69. package/dist/components/feedback/TableSkeleton.vue.d.ts +1 -1
  70. package/dist/components/feedback/index.cjs +14 -14
  71. package/dist/components/feedback/index.js +14 -14
  72. package/dist/components/form/Combobox.vue.d.ts +1 -1
  73. package/dist/components/form/DatePicker.vue.d.ts +1 -1
  74. package/dist/components/form/FormSection.vue.d.ts +1 -1
  75. package/dist/components/form/IconPicker.stories.d.ts +19 -0
  76. package/dist/components/form/IconPicker.test.d.ts +1 -0
  77. package/dist/components/form/InputWrapper.stories.d.ts +0 -5
  78. package/dist/components/form/Rating.vue.d.ts +1 -1
  79. package/dist/components/form/SearchInput.vue.d.ts +1 -1
  80. package/dist/components/form/index.js +2 -2
  81. package/dist/components/index.cjs +55 -36
  82. package/dist/components/index.cjs.map +1 -1
  83. package/dist/components/index.js +67 -48
  84. package/dist/composables/index.cjs +15 -8
  85. package/dist/composables/index.cjs.map +1 -1
  86. package/dist/composables/index.d.ts +7 -0
  87. package/dist/composables/index.js +12 -5
  88. package/dist/composables/useColumnResize.d.ts +38 -0
  89. package/dist/composables/useColumnResize.test.d.ts +1 -0
  90. package/dist/composables/useColumnVisibility.d.ts +44 -0
  91. package/dist/composables/useColumnVisibility.test.d.ts +1 -0
  92. package/dist/composables/useEditableCell.d.ts +51 -0
  93. package/dist/composables/useEditableCell.test.d.ts +1 -0
  94. package/dist/composables/usePagination.d.ts +44 -0
  95. package/dist/composables/usePagination.test.d.ts +1 -0
  96. package/dist/composables/usePinnedRows.d.ts +41 -0
  97. package/dist/composables/usePinnedRows.test.d.ts +1 -0
  98. package/dist/composables/useTableKeyboardNavigation.d.ts +52 -0
  99. package/dist/composables/useTableKeyboardNavigation.test.d.ts +1 -0
  100. package/dist/composables/useVirtualScroll.d.ts +32 -0
  101. package/dist/composables/useVirtualScroll.test.d.ts +1 -0
  102. package/dist/{index-SNefWfX0.js → index-BaWpldIJ.js} +3 -3
  103. package/dist/{index-SNefWfX0.js.map → index-BaWpldIJ.js.map} +1 -1
  104. package/dist/{index-LFQFhClN.cjs → index-CYXOfUOG.cjs} +56 -37
  105. package/dist/{index-LFQFhClN.cjs.map → index-CYXOfUOG.cjs.map} +1 -1
  106. package/dist/index-C_N7WRnM.js +116 -0
  107. package/dist/index-C_N7WRnM.js.map +1 -0
  108. package/dist/index.cjs +71 -45
  109. package/dist/index.cjs.map +1 -1
  110. package/dist/index.js +81 -55
  111. package/dist/style.css +1 -1
  112. package/dist/types/components.d.ts +1 -1
  113. package/dist/types/property.d.ts +8 -0
  114. package/dist/usePagination-BGwbICFC.js +135 -0
  115. package/dist/usePagination-BGwbICFC.js.map +1 -0
  116. package/dist/usePagination-gvvh1zqA.cjs +134 -0
  117. package/dist/usePagination-gvvh1zqA.cjs.map +1 -0
  118. package/dist/useVirtualScroll-BivP86fA.cjs +869 -0
  119. package/dist/useVirtualScroll-BivP86fA.cjs.map +1 -0
  120. package/dist/useVirtualScroll-YeZru2Eo.js +870 -0
  121. package/dist/useVirtualScroll-YeZru2Eo.js.map +1 -0
  122. package/package.json +1 -1
  123. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs.map +0 -1
  124. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js.map +0 -1
  125. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-BmJHgkBs.js.map +0 -1
  126. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-DYxh-wFx.cjs.map +0 -1
  127. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js +0 -150
  128. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +0 -1
  129. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs +0 -149
  130. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +0 -1
  131. package/dist/components/core/StatsCard.stories.d.ts +0 -15
  132. package/dist/components/core/StatsCard.vue.d.ts +0 -44
  133. package/dist/components/core/StatsGrid.stories.d.ts +0 -12
  134. package/dist/components/core/StatsGrid.vue.d.ts +0 -16
  135. package/dist/components/core/TableComponent.stories.d.ts +0 -16
  136. package/dist/index-CyL_6V7D.js +0 -97
  137. package/dist/index-CyL_6V7D.js.map +0 -1
  138. package/dist/useDarkMode-Cl5QWTlC.js +0 -53
  139. package/dist/useDarkMode-Cl5QWTlC.js.map +0 -1
  140. package/dist/useDarkMode-DLZcJEUQ.cjs +0 -52
  141. package/dist/useDarkMode-DLZcJEUQ.cjs.map +0 -1
  142. package/dist/useToast-Bk60GArg.cjs +0 -176
  143. package/dist/useToast-Bk60GArg.cjs.map +0 -1
  144. package/dist/useToast-ina5g3mj.js +0 -177
  145. package/dist/useToast-ina5g3mj.js.map +0 -1
  146. /package/dist/components/core/{StatsCard.test.d.ts → AccordionItem.test.d.ts} +0 -0
  147. /package/dist/components/core/{StatsGrid.test.d.ts → CardWrapper.test.d.ts} +0 -0
@@ -1,118 +1,1130 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
3
  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");
4
+ const ListSkeleton_vue_vue_type_script_setup_true_lang = require("./ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("./BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs");
6
+ const usePagination = require("./usePagination-gvvh1zqA.cjs");
6
7
  const vue$1 = require("@iconify/vue");
7
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$h = { 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
- title: {},
24
- description: {},
25
- titleClass: {},
26
- dividerClass: {},
27
- loading: { type: Boolean, default: false },
28
- loadingLines: { default: 3 },
29
- loadingAvatar: { type: Boolean, default: false },
30
- loadingActions: { type: Boolean, default: false }
23
+ title: {},
24
+ description: {},
25
+ titleClass: {},
26
+ dividerClass: {},
27
+ loading: { type: Boolean, default: false },
28
+ loadingLines: { default: 3 },
29
+ loadingAvatar: { type: Boolean, default: false },
30
+ loadingActions: { type: Boolean, default: false }
31
+ },
32
+ setup(__props) {
33
+ const props = __props;
34
+ const titleClasses = vue.computed(
35
+ () => props.titleClass || "text-gray-800 dark:text-gray-200"
36
+ );
37
+ const dividerClasses = vue.computed(
38
+ () => props.dividerClass || "border-gray-200 dark:border-gray-700"
39
+ );
40
+ return (_ctx, _cache) => {
41
+ return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$2, {
42
+ key: 0,
43
+ lines: __props.loadingLines,
44
+ "show-avatar": __props.loadingAvatar,
45
+ "show-actions": __props.loadingActions
46
+ }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$o, [
47
+ _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", {
48
+ key: 0,
49
+ class: vue.normalizeClass(["border-b", dividerClasses.value])
50
+ }, [
51
+ vue.renderSlot(_ctx.$slots, "header")
52
+ ], 2)) : __props.title || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (vue.openBlock(), vue.createElementBlock("div", {
53
+ key: 1,
54
+ class: vue.normalizeClass(["flex items-center justify-between border-b px-5 py-3", dividerClasses.value])
55
+ }, [
56
+ vue.createElementVNode("div", _hoisted_2$h, [
57
+ __props.title || _ctx.$slots.title ? (vue.openBlock(), vue.createElementBlock("span", {
58
+ key: 0,
59
+ class: vue.normalizeClass(["text-md font-semibold", titleClasses.value])
60
+ }, [
61
+ vue.renderSlot(_ctx.$slots, "title", {}, () => [
62
+ vue.createTextVNode(vue.toDisplayString(__props.title), 1)
63
+ ])
64
+ ], 2)) : vue.createCommentVNode("", true),
65
+ __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$a, [
66
+ vue.renderSlot(_ctx.$slots, "description", {}, () => [
67
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
68
+ ])
69
+ ])) : vue.createCommentVNode("", true)
70
+ ]),
71
+ vue.createElementVNode("div", _hoisted_4$7, [
72
+ vue.renderSlot(_ctx.$slots, "actions")
73
+ ])
74
+ ], 2)) : vue.createCommentVNode("", true),
75
+ vue.renderSlot(_ctx.$slots, "default")
76
+ ]));
77
+ };
78
+ }
79
+ });
80
+ const _hoisted_1$n = ["role", "tabindex", "onKeydown"];
81
+ const _hoisted_2$g = ["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$g)) : 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$f = {
652
+ key: 0,
653
+ d: "M7 14l5-5 5 5H7z"
654
+ };
655
+ const _hoisted_3$8 = {
656
+ key: 1,
657
+ d: "M7 10l5 5 5-5H7z"
658
+ };
659
+ const _sfc_main$q = /* @__PURE__ */ vue.defineComponent({
660
+ ...{
661
+ inheritAttrs: false
662
+ },
663
+ __name: "Th",
664
+ props: {
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$f)) : __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: {},
825
+ selectable: { type: Boolean, default: false },
826
+ allSelected: { type: Boolean, default: false },
827
+ someSelected: { type: Boolean, default: false },
828
+ selectableCount: { default: 0 },
829
+ sortBy: {},
830
+ sortDirection: {},
831
+ showActions: { type: Boolean, default: false }
832
+ },
833
+ emits: ["selectAll", "sort"],
834
+ setup(__props, { emit: __emit }) {
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 }) {
905
+ const emit = __emit;
906
+ const typeComponents = {
907
+ text: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1,
908
+ number: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$2,
909
+ date: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$3,
910
+ boolean: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$4,
911
+ badge: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$5
912
+ };
913
+ const getTypeComponent = (type = "text") => {
914
+ return typeComponents[type] || BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1;
915
+ };
916
+ const getItemValue = (item, property) => {
917
+ if (property.name.includes(".")) {
918
+ let value = item;
919
+ for (const key of property.name.split(".")) {
920
+ if (value && typeof value === "object" && key in value) {
921
+ value = value[key];
922
+ } else {
923
+ return void 0;
924
+ }
925
+ }
926
+ return value;
927
+ }
928
+ return item[property.name];
929
+ };
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$e = { 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 }
31
1029
  },
32
- setup(__props) {
1030
+ emits: ["update:expanded", "click"],
1031
+ setup(__props, { expose: __expose, emit: __emit }) {
33
1032
  const props = __props;
34
- const titleClasses = vue.computed(
35
- () => props.titleClass || "text-gray-800 dark:text-gray-200"
36
- );
37
- const dividerClasses = vue.computed(
38
- () => props.dividerClass || "border-gray-200 dark:border-gray-700"
39
- );
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;
1046
+ }
1047
+ };
1048
+ const handleRowClick = (event) => {
1049
+ emit("click", event);
1050
+ if (props.expandOnRowClick) {
1051
+ toggle();
1052
+ }
1053
+ };
1054
+ __expose({ toggle, isExpanded });
40
1055
  return (_ctx, _cache) => {
41
- return __props.loading ? (vue.openBlock(), vue.createBlock(ListSkeleton_vue_vue_type_script_setup_true_lang._sfc_main$1, {
42
- key: 0,
43
- lines: __props.loadingLines,
44
- "show-avatar": __props.loadingAvatar,
45
- "show-actions": __props.loadingActions
46
- }, null, 8, ["lines", "show-avatar", "show-actions"])) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$h, [
47
- _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", {
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, {
48
1093
  key: 0,
49
- class: vue.normalizeClass(["border-b", dividerClasses.value])
50
- }, [
51
- vue.renderSlot(_ctx.$slots, "header")
52
- ], 2)) : __props.title || __props.description || _ctx.$slots.title || _ctx.$slots.description || _ctx.$slots.actions ? (vue.openBlock(), vue.createElementBlock("div", {
53
- key: 1,
54
- class: vue.normalizeClass(["flex items-center justify-between border-b px-5 py-3", dividerClasses.value])
55
- }, [
56
- vue.createElementVNode("div", _hoisted_2$d, [
57
- __props.title || _ctx.$slots.title ? (vue.openBlock(), vue.createElementBlock("span", {
58
- key: 0,
59
- class: vue.normalizeClass(["text-md font-semibold", titleClasses.value])
60
- }, [
61
- vue.renderSlot(_ctx.$slots, "title", {}, () => [
62
- vue.createTextVNode(vue.toDisplayString(__props.title), 1)
63
- ])
64
- ], 2)) : vue.createCommentVNode("", true),
65
- __props.description || _ctx.$slots.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$8, [
66
- vue.renderSlot(_ctx.$slots, "description", {}, () => [
67
- vue.createTextVNode(vue.toDisplayString(__props.description), 1)
68
- ])
69
- ])) : vue.createCommentVNode("", true)
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$e, [
1103
+ vue.renderSlot(_ctx.$slots, "expanded")
1104
+ ])
1105
+ ]),
1106
+ _: 3
1107
+ }, 8, ["colspan"])
70
1108
  ]),
71
- vue.createElementVNode("div", _hoisted_4$6, [
72
- vue.renderSlot(_ctx.$slots, "actions")
73
- ])
74
- ], 2)) : vue.createCommentVNode("", true),
75
- vue.renderSlot(_ctx.$slots, "default")
76
- ]));
1109
+ _: 3
1110
+ })) : vue.createCommentVNode("", true)
1111
+ ], 64);
77
1112
  };
78
1113
  }
79
1114
  });
80
1115
  const _hoisted_1$g = { class: "overflow-hidden" };
81
- const _hoisted_2$c = {
1116
+ const _hoisted_2$d = {
82
1117
  key: 1,
83
- class: "overflow-x-auto"
1118
+ class: "flex flex-col items-center justify-center py-12 text-center"
84
1119
  };
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" };
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" };
87
1122
  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 = {
93
- key: 0,
94
- d: "M7 14l5-5 5 5H7z"
95
- };
96
- const _hoisted_8$3 = {
97
- key: 1,
98
- d: "M7 10l5 5 5-5H7z"
1123
+ key: 3,
1124
+ class: "flex flex-col items-center justify-center py-12 text-center"
99
1125
  };
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
1126
  const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
115
- __name: "TableComponent",
1127
+ __name: "DataTable",
116
1128
  props: {
117
1129
  properties: {},
118
1130
  items: {},
@@ -123,58 +1135,65 @@ const _sfc_main$k = /* @__PURE__ */ vue.defineComponent({
123
1135
  sortBy: {},
124
1136
  sortDirection: {},
125
1137
  loading: { type: Boolean, default: false },
126
- loadingRows: { default: 5 }
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: {}
127
1153
  },
128
- emits: ["select", "selectAll", "sort"],
1154
+ emits: ["select", "selectAll", "sort", "rowClick", "update:currentPage", "update:pageSize"],
129
1155
  setup(__props, { emit: __emit }) {
130
1156
  const slots = vue.useSlots();
131
1157
  const props = __props;
132
1158
  const emit = __emit;
133
- const typeComponents = {
134
- text: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1,
135
- number: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$2,
136
- date: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$3,
137
- boolean: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$4,
138
- badge: BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$5
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);
1177
+ }
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);
139
1188
  };
140
- const getTypeComponent = (type = "text") => {
141
- return typeComponents[type] || BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$1;
1189
+ const handlePageSizeChange = (size) => {
1190
+ setInternalPageSize(size);
1191
+ emit("update:pageSize", size);
142
1192
  };
143
- const visibleProperties = vue.computed(() => props.properties.filter((p) => !p.hidden));
144
1193
  const getKey = (item) => {
145
1194
  const keyValue = item[props.keyField];
146
1195
  return String(keyValue ?? Math.random());
147
1196
  };
148
- const getItemValue = (item, property) => {
149
- if (property.name.includes(".")) {
150
- let value = item;
151
- for (const key of property.name.split(".")) {
152
- if (value && typeof value === "object" && key in value) {
153
- value = value[key];
154
- } else {
155
- return void 0;
156
- }
157
- }
158
- return value;
159
- }
160
- return item[property.name];
161
- };
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";
170
- }
171
- };
172
- const getMainClass = (main) => {
173
- if (main) {
174
- return "text-sm font-semibold text-gray-900 dark:text-gray-100";
175
- }
176
- return "text-xs font-medium text-gray-600 dark:text-gray-400";
177
- };
178
1197
  const selectableItems = vue.computed(() => {
179
1198
  if (!props.selectableFilter) return props.items;
180
1199
  return props.items.filter(props.selectableFilter);
@@ -202,129 +1221,145 @@ 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$d, [
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
  }
325
1360
  });
326
1361
  const _hoisted_1$f = { class: "space-y-3" };
327
- const _hoisted_2$b = { class: "flex items-center gap-3 p-3" };
1362
+ const _hoisted_2$c = { class: "flex items-center gap-3 p-3" };
328
1363
  const _hoisted_3$6 = { class: "text-sm text-gray-600 dark:text-gray-400" };
329
1364
  const _hoisted_4$4 = {
330
1365
  key: 0,
@@ -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,9 +1438,9 @@ 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
- vue.createElementVNode("div", _hoisted_2$b, [
1443
+ vue.createElementVNode("div", _hoisted_2$c, [
409
1444
  vue.createVNode(index._sfc_main, {
410
1445
  "model-value": allSelected.value,
411
1446
  indeterminate: someSelected.value,
@@ -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,
@@ -594,7 +1629,7 @@ const _hoisted_1$e = {
594
1629
  key: 0,
595
1630
  class: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"
596
1631
  };
597
- const _hoisted_2$a = { class: "relative" };
1632
+ const _hoisted_2$b = { class: "relative" };
598
1633
  const _hoisted_3$5 = ["disabled", "placeholder"];
599
1634
  const _hoisted_4$3 = ["disabled"];
600
1635
  const _hoisted_5$1 = {
@@ -711,7 +1746,7 @@ const _sfc_main$h = /* @__PURE__ */ vue.defineComponent({
711
1746
  class: "autocomplete-container"
712
1747
  }, [
713
1748
  __props.label ? (vue.openBlock(), vue.createElementBlock("label", _hoisted_1$e, vue.toDisplayString(__props.label), 1)) : vue.createCommentVNode("", true),
714
- vue.createElementVNode("div", _hoisted_2$a, [
1749
+ vue.createElementVNode("div", _hoisted_2$b, [
715
1750
  vue.createElementVNode("div", {
716
1751
  ref_key: "inputWrapperRef",
717
1752
  ref: inputWrapperRef,
@@ -887,7 +1922,7 @@ const _sfc_main$g = /* @__PURE__ */ vue.defineComponent({
887
1922
  }
888
1923
  });
889
1924
  const _hoisted_1$d = { class: "relative inline-block" };
890
- const _hoisted_2$9 = ["src", "alt"];
1925
+ const _hoisted_2$a = ["src", "alt"];
891
1926
  const _hoisted_3$4 = { key: 1 };
892
1927
  const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
893
1928
  __name: "Avatar",
@@ -1009,7 +2044,7 @@ const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
1009
2044
  alt: __props.alt || __props.name,
1010
2045
  class: "size-full object-cover",
1011
2046
  onError: _cache[0] || (_cache[0] = ($event) => imageError.value = true)
1012
- }, null, 40, _hoisted_2$9)) : initials.value ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$4, vue.toDisplayString(initials.value), 1)) : (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
2047
+ }, null, 40, _hoisted_2$a)) : initials.value ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$4, vue.toDisplayString(initials.value), 1)) : (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1013
2048
  key: 2,
1014
2049
  icon: "lucide:user",
1015
2050
  class: "size-1/2"
@@ -1028,7 +2063,7 @@ const _sfc_main$f = /* @__PURE__ */ vue.defineComponent({
1028
2063
  }
1029
2064
  });
1030
2065
  const _hoisted_1$c = ["aria-selected", "disabled", "onClick"];
1031
- const _hoisted_2$8 = { class: "mt-4" };
2066
+ const _hoisted_2$9 = { class: "mt-4" };
1032
2067
  const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
1033
2068
  __name: "Tabs",
1034
2069
  props: {
@@ -1097,7 +2132,7 @@ const _sfc_main$e = /* @__PURE__ */ vue.defineComponent({
1097
2132
  }, vue.toDisplayString(tab.label), 11, _hoisted_1$c);
1098
2133
  }), 128))
1099
2134
  ], 2),
1100
- vue.createElementVNode("div", _hoisted_2$8, [
2135
+ vue.createElementVNode("div", _hoisted_2$9, [
1101
2136
  vue.renderSlot(_ctx.$slots, "default", { activeTab: activeTab.value })
1102
2137
  ])
1103
2138
  ]);
@@ -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",
@@ -1321,7 +2356,7 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
1321
2356
  }
1322
2357
  });
1323
2358
  const _hoisted_1$9 = ["aria-describedby"];
1324
- const _hoisted_2$7 = ["id"];
2359
+ const _hoisted_2$8 = ["id"];
1325
2360
  const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
1326
2361
  __name: "Tooltip",
1327
2362
  props: {
@@ -1393,7 +2428,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
1393
2428
  id: vue.unref(tooltipId),
1394
2429
  class: vue.normalizeClass(positionClasses.value),
1395
2430
  role: "tooltip"
1396
- }, vue.toDisplayString(__props.content), 11, _hoisted_2$7)) : vue.createCommentVNode("", true)
2431
+ }, vue.toDisplayString(__props.content), 11, _hoisted_2$8)) : vue.createCommentVNode("", true)
1397
2432
  ]),
1398
2433
  _: 1
1399
2434
  })
@@ -1402,7 +2437,7 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
1402
2437
  }
1403
2438
  });
1404
2439
  const _hoisted_1$8 = ["id", "aria-expanded", "aria-controls"];
1405
- const _hoisted_2$6 = ["id", "aria-labelledby"];
2440
+ const _hoisted_2$7 = ["id", "aria-labelledby"];
1406
2441
  const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
1407
2442
  __name: "Popover",
1408
2443
  props: {
@@ -1487,7 +2522,7 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
1487
2522
  ])
1488
2523
  }, [
1489
2524
  vue.renderSlot(_ctx.$slots, "default", { close: vue.unref(close) })
1490
- ], 14, _hoisted_2$6)) : vue.createCommentVNode("", true)
2525
+ ], 14, _hoisted_2$7)) : vue.createCommentVNode("", true)
1491
2526
  ]),
1492
2527
  _: 3
1493
2528
  })
@@ -1500,7 +2535,7 @@ const _hoisted_1$7 = {
1500
2535
  key: 0,
1501
2536
  class: "flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700"
1502
2537
  };
1503
- const _hoisted_2$5 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
2538
+ const _hoisted_2$6 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
1504
2539
  const _hoisted_3$3 = { class: "flex-1 overflow-y-auto p-4" };
1505
2540
  const _hoisted_4$2 = {
1506
2541
  key: 1,
@@ -1627,7 +2662,7 @@ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
1627
2662
  }, [
1628
2663
  __props.title || __props.showClose || _ctx.$slots.header ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$7, [
1629
2664
  vue.renderSlot(_ctx.$slots, "header", {}, () => [
1630
- vue.createElementVNode("h2", _hoisted_2$5, vue.toDisplayString(__props.title), 1)
2665
+ vue.createElementVNode("h2", _hoisted_2$6, vue.toDisplayString(__props.title), 1)
1631
2666
  ]),
1632
2667
  __props.showClose ? (vue.openBlock(), vue.createElementBlock("button", {
1633
2668
  key: 0,
@@ -1656,7 +2691,7 @@ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
1656
2691
  }
1657
2692
  });
1658
2693
  const _hoisted_1$6 = { "aria-label": "Breadcrumb" };
1659
- const _hoisted_2$4 = { class: "flex items-center flex-wrap gap-1 text-sm" };
2694
+ const _hoisted_2$5 = { class: "flex items-center flex-wrap gap-1 text-sm" };
1660
2695
  const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
1661
2696
  __name: "Breadcrumb",
1662
2697
  props: {
@@ -1669,7 +2704,7 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
1669
2704
  setup(__props) {
1670
2705
  return (_ctx, _cache) => {
1671
2706
  return vue.openBlock(), vue.createElementBlock("nav", _hoisted_1$6, [
1672
- vue.createElementVNode("ol", _hoisted_2$4, [
2707
+ vue.createElementVNode("ol", _hoisted_2$5, [
1673
2708
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item, index2) => {
1674
2709
  return vue.openBlock(), vue.createElementBlock("li", {
1675
2710
  key: index2,
@@ -1745,7 +2780,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
1745
2780
  }
1746
2781
  });
1747
2782
  const _hoisted_1$4 = ["id", "disabled", "aria-expanded", "aria-controls"];
1748
- const _hoisted_2$3 = { class: "flex items-center gap-2 font-medium" };
2783
+ const _hoisted_2$4 = { class: "flex items-center gap-2 font-medium" };
1749
2784
  const _hoisted_3$2 = ["id", "aria-labelledby"];
1750
2785
  const _hoisted_4$1 = { class: "px-4 py-3 bg-gray-50 dark:bg-gray-900 text-gray-700 dark:text-gray-300" };
1751
2786
  const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
@@ -1782,7 +2817,7 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
1782
2817
  "aria-controls": panelId.value,
1783
2818
  onClick: toggle
1784
2819
  }, [
1785
- vue.createElementVNode("span", _hoisted_2$3, [
2820
+ vue.createElementVNode("span", _hoisted_2$4, [
1786
2821
  __props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1787
2822
  key: 0,
1788
2823
  icon: __props.icon,
@@ -1829,7 +2864,7 @@ const _hoisted_1$3 = {
1829
2864
  key: 0,
1830
2865
  class: "relative"
1831
2866
  };
1832
- const _hoisted_2$2 = { class: "flex items-start gap-4" };
2867
+ const _hoisted_2$3 = { class: "flex items-start gap-4" };
1833
2868
  const _hoisted_3$1 = { class: "flex-1 min-w-0 pt-0.5" };
1834
2869
  const _hoisted_4 = { class: "flex items-center justify-between gap-2" };
1835
2870
  const _hoisted_5 = { class: "text-sm font-medium text-gray-900 dark:text-white" };
@@ -1908,7 +2943,7 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
1908
2943
  key: 0,
1909
2944
  class: vue.normalizeClass(["absolute left-4 top-8 w-0.5 h-full -ml-px", getStatusClasses(item.status).line])
1910
2945
  }, null, 2)) : vue.createCommentVNode("", true),
1911
- vue.createElementVNode("div", _hoisted_2$2, [
2946
+ vue.createElementVNode("div", _hoisted_2$3, [
1912
2947
  vue.createElementVNode("div", {
1913
2948
  class: vue.normalizeClass(["relative z-10 flex items-center justify-center size-8 rounded-full shrink-0", getStatusClasses(item.status).dot])
1914
2949
  }, [
@@ -1961,7 +2996,7 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
1961
2996
  }
1962
2997
  });
1963
2998
  const _hoisted_1$2 = ["aria-label"];
1964
- const _hoisted_2$1 = {
2999
+ const _hoisted_2$2 = {
1965
3000
  key: 0,
1966
3001
  class: "text-sm font-medium"
1967
3002
  };
@@ -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" },
@@ -2000,129 +3035,258 @@ const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
2000
3035
  icon: vue.unref(isDark) ? __props.darkIcon : __props.lightIcon,
2001
3036
  class: vue.normalizeClass(sizeClasses[__props.size].icon)
2002
3037
  }, null, 8, ["icon", "class"]),
2003
- __props.showLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1, vue.toDisplayString(vue.unref(isDark) ? "Dark" : "Light"), 1)) : vue.createCommentVNode("", true)
3038
+ __props.showLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$2, vue.toDisplayString(vue.unref(isDark) ? "Dark" : "Light"), 1)) : vue.createCommentVNode("", true)
2004
3039
  ], 10, _hoisted_1$2);
2005
3040
  };
2006
3041
  }
2007
3042
  });
2008
- const _hoisted_1$1 = {
2009
- key: 0,
3043
+ const _hoisted_1$1 = { key: 0 };
3044
+ const _hoisted_2$1 = {
3045
+ key: 1,
2010
3046
  class: "text-gray-400"
2011
3047
  };
2012
3048
  const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
2013
- __name: "StatsCard",
3049
+ __name: "StatItem",
2014
3050
  props: {
2015
3051
  label: {},
2016
3052
  value: {},
2017
3053
  icon: {},
3054
+ iconPosition: { default: "top" },
2018
3055
  change: {},
2019
3056
  changeLabel: {},
3057
+ trend: {},
3058
+ trendOnly: { type: Boolean, default: false },
3059
+ size: { default: "md" },
2020
3060
  variant: { default: "default" },
2021
- color: { default: "primary" }
3061
+ color: { default: "primary" },
3062
+ clickable: { type: Boolean, default: false },
3063
+ centered: { type: Boolean },
3064
+ cardClass: {},
3065
+ iconClass: {},
3066
+ valueClass: {},
3067
+ labelClass: {}
2022
3068
  },
3069
+ emits: ["click"],
2023
3070
  setup(__props) {
3071
+ const props = __props;
3072
+ const isCentered = vue.computed(() => {
3073
+ if (props.centered !== void 0) return props.centered;
3074
+ return props.iconPosition === "top";
3075
+ });
3076
+ const effectiveTrend = vue.computed(() => {
3077
+ if (props.trend) return props.trend;
3078
+ if (props.change === void 0) return void 0;
3079
+ if (props.change > 0) return "up";
3080
+ if (props.change < 0) return "down";
3081
+ return "neutral";
3082
+ });
3083
+ const sizeClasses = vue.computed(() => {
3084
+ const sizes = {
3085
+ sm: {
3086
+ padding: "sm",
3087
+ icon: "size-8",
3088
+ iconInner: "size-4",
3089
+ value: "text-xl font-bold",
3090
+ label: "text-xs",
3091
+ change: "text-xs",
3092
+ gap: "gap-1"
3093
+ },
3094
+ md: {
3095
+ padding: "md",
3096
+ icon: "size-10",
3097
+ iconInner: "size-5",
3098
+ value: "text-2xl sm:text-3xl font-bold",
3099
+ label: "text-xs sm:text-sm",
3100
+ change: "text-xs",
3101
+ gap: "gap-2"
3102
+ },
3103
+ lg: {
3104
+ padding: "lg",
3105
+ icon: "size-12",
3106
+ iconInner: "size-6",
3107
+ value: "text-3xl sm:text-4xl font-bold",
3108
+ label: "text-sm sm:text-base",
3109
+ change: "text-sm",
3110
+ gap: "gap-3"
3111
+ }
3112
+ };
3113
+ return sizes[props.size];
3114
+ });
3115
+ const iconBgClasses = vue.computed(() => {
3116
+ if (props.variant === "glass") return "bg-white/20";
3117
+ const colors = {
3118
+ primary: "bg-primary-100 dark:bg-primary-900/30",
3119
+ secondary: "bg-secondary-100 dark:bg-secondary-900/30",
3120
+ success: "bg-emerald-100 dark:bg-emerald-900/30",
3121
+ warning: "bg-amber-100 dark:bg-amber-900/30",
3122
+ danger: "bg-red-100 dark:bg-red-900/30",
3123
+ info: "bg-blue-100 dark:bg-blue-900/30"
3124
+ };
3125
+ return colors[props.color];
3126
+ });
3127
+ const iconColorClasses = vue.computed(() => {
3128
+ if (props.variant === "glass") return "text-white";
3129
+ const colors = {
3130
+ primary: "text-primary-600 dark:text-primary-400",
3131
+ secondary: "text-secondary-600 dark:text-secondary-400",
3132
+ success: "text-emerald-600 dark:text-emerald-400",
3133
+ warning: "text-amber-600 dark:text-amber-400",
3134
+ danger: "text-red-600 dark:text-red-400",
3135
+ info: "text-blue-600 dark:text-blue-400"
3136
+ };
3137
+ return colors[props.color];
3138
+ });
3139
+ const valueTextClasses = vue.computed(() => {
3140
+ if (props.variant === "glass") return "text-white";
3141
+ return "text-gray-900 dark:text-white";
3142
+ });
3143
+ const labelTextClasses = vue.computed(() => {
3144
+ if (props.variant === "glass") return "text-white/80";
3145
+ return "text-gray-500 dark:text-gray-400";
3146
+ });
3147
+ const trendColorClasses = vue.computed(() => {
3148
+ if (!effectiveTrend.value || effectiveTrend.value === "neutral") {
3149
+ return "text-gray-500";
3150
+ }
3151
+ return effectiveTrend.value === "up" ? "text-emerald-500" : "text-red-500";
3152
+ });
3153
+ const trendIcon = vue.computed(() => {
3154
+ if (!effectiveTrend.value || effectiveTrend.value === "neutral") {
3155
+ return "heroicons:minus";
3156
+ }
3157
+ return effectiveTrend.value === "up" ? "heroicons:arrow-trending-up" : "heroicons:arrow-trending-down";
3158
+ });
3159
+ const cardVariant = vue.computed(() => {
3160
+ const map = {
3161
+ default: "default",
3162
+ glass: "glass",
3163
+ outline: "outline",
3164
+ flat: "flat"
3165
+ };
3166
+ return map[props.variant];
3167
+ });
3168
+ const layoutClasses = vue.computed(() => {
3169
+ if (props.iconPosition === "top") {
3170
+ return isCentered.value ? "flex flex-col items-center text-center" : "flex flex-col";
3171
+ }
3172
+ if (props.iconPosition === "left") {
3173
+ return "flex flex-row items-center";
3174
+ }
3175
+ return "flex flex-row-reverse items-center";
3176
+ });
3177
+ const contentClasses = vue.computed(() => {
3178
+ if (props.iconPosition === "top") {
3179
+ return "flex flex-col " + sizeClasses.value.gap;
3180
+ }
3181
+ return "flex flex-col flex-1 min-w-0 " + (props.iconPosition === "left" ? "ml-3" : "mr-3");
3182
+ });
2024
3183
  return (_ctx, _cache) => {
2025
- return vue.openBlock(), vue.createElementBlock("div", {
2026
- class: vue.normalizeClass([
2027
- "rounded-2xl p-4 text-center transition-all",
2028
- __props.variant === "default" && "bg-white dark:bg-slate-800 border border-gray-100 dark:border-slate-700 shadow-sm",
2029
- __props.variant === "glass" && "bg-white/15 backdrop-blur-sm border border-white/20",
2030
- __props.variant === "outline" && "border-2 border-gray-200 dark:border-slate-600",
2031
- __props.variant === "solid" && __props.color === "primary" && "bg-primary-500 text-white",
2032
- __props.variant === "solid" && __props.color === "success" && "bg-emerald-500 text-white",
2033
- __props.variant === "solid" && __props.color === "warning" && "bg-amber-500 text-white",
2034
- __props.variant === "solid" && __props.color === "danger" && "bg-red-500 text-white",
2035
- __props.variant === "solid" && __props.color === "info" && "bg-blue-500 text-white"
2036
- ])
2037
- }, [
2038
- __props.icon ? (vue.openBlock(), vue.createElementBlock("div", {
2039
- key: 0,
2040
- class: vue.normalizeClass([
2041
- "size-10 mx-auto mb-2 rounded-xl flex items-center justify-center",
2042
- __props.variant === "glass" && "bg-white/20",
2043
- __props.variant === "solid" && "bg-white/20",
2044
- __props.variant === "default" && __props.color === "primary" && "bg-primary-100 dark:bg-primary-900/30",
2045
- __props.variant === "default" && __props.color === "success" && "bg-emerald-100 dark:bg-emerald-900/30",
2046
- __props.variant === "default" && __props.color === "warning" && "bg-amber-100 dark:bg-amber-900/30",
2047
- __props.variant === "default" && __props.color === "danger" && "bg-red-100 dark:bg-red-900/30",
2048
- __props.variant === "default" && __props.color === "info" && "bg-blue-100 dark:bg-blue-900/30",
2049
- __props.variant === "outline" && "bg-gray-100 dark:bg-slate-700"
2050
- ])
2051
- }, [
2052
- vue.createVNode(vue.unref(vue$1.Icon), {
2053
- icon: __props.icon,
2054
- class: vue.normalizeClass([
2055
- "size-5",
2056
- (__props.variant === "glass" || __props.variant === "solid") && "text-white",
2057
- __props.variant === "default" && __props.color === "primary" && "text-primary-600 dark:text-primary-400",
2058
- __props.variant === "default" && __props.color === "success" && "text-emerald-600 dark:text-emerald-400",
2059
- __props.variant === "default" && __props.color === "warning" && "text-amber-600 dark:text-amber-400",
2060
- __props.variant === "default" && __props.color === "danger" && "text-red-600 dark:text-red-400",
2061
- __props.variant === "default" && __props.color === "info" && "text-blue-600 dark:text-blue-400",
2062
- __props.variant === "outline" && "text-gray-600 dark:text-gray-400"
2063
- ])
2064
- }, null, 8, ["icon", "class"])
2065
- ], 2)) : vue.createCommentVNode("", true),
2066
- vue.createElementVNode("div", {
2067
- class: vue.normalizeClass([
2068
- "text-2xl sm:text-3xl font-bold",
2069
- (__props.variant === "glass" || __props.variant === "solid") && "text-white",
2070
- (__props.variant === "default" || __props.variant === "outline") && "text-gray-900 dark:text-white"
2071
- ])
2072
- }, [
2073
- vue.renderSlot(_ctx.$slots, "value", {}, () => [
2074
- vue.createTextVNode(vue.toDisplayString(__props.value), 1)
2075
- ])
2076
- ], 2),
2077
- vue.createElementVNode("div", {
2078
- class: vue.normalizeClass([
2079
- "text-xs sm:text-sm",
2080
- __props.variant === "glass" && "text-white/80",
2081
- __props.variant === "solid" && "text-white/90",
2082
- (__props.variant === "default" || __props.variant === "outline") && "text-gray-500 dark:text-gray-400"
2083
- ])
2084
- }, [
2085
- vue.renderSlot(_ctx.$slots, "label", {}, () => [
2086
- vue.createTextVNode(vue.toDisplayString(__props.label), 1)
2087
- ])
2088
- ], 2),
2089
- __props.change !== void 0 ? (vue.openBlock(), vue.createElementBlock("div", {
2090
- key: 1,
2091
- class: vue.normalizeClass([
2092
- "mt-2 text-xs font-medium inline-flex items-center gap-1",
2093
- __props.change >= 0 ? "text-emerald-500" : "text-red-500"
2094
- ])
2095
- }, [
2096
- vue.createVNode(vue.unref(vue$1.Icon), {
2097
- icon: __props.change >= 0 ? "heroicons:arrow-trending-up" : "heroicons:arrow-trending-down",
2098
- class: "size-3.5"
2099
- }, null, 8, ["icon"]),
2100
- vue.createElementVNode("span", null, vue.toDisplayString(__props.change >= 0 ? "+" : "") + vue.toDisplayString(__props.change) + "%", 1),
2101
- __props.changeLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$1, vue.toDisplayString(__props.changeLabel), 1)) : vue.createCommentVNode("", true)
2102
- ], 2)) : vue.createCommentVNode("", true)
2103
- ], 2);
3184
+ return vue.openBlock(), vue.createBlock(_sfc_main$z, {
3185
+ variant: cardVariant.value,
3186
+ padding: sizeClasses.value.padding,
3187
+ clickable: __props.clickable,
3188
+ shadow: __props.variant === "glass" ? "none" : "sm",
3189
+ border: __props.variant === "outline" ? "default" : "none",
3190
+ rounded: "xl",
3191
+ "header-divider": false,
3192
+ class: vue.normalizeClass(__props.cardClass),
3193
+ onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event))
3194
+ }, {
3195
+ default: vue.withCtx(() => [
3196
+ vue.createElementVNode("div", {
3197
+ class: vue.normalizeClass(layoutClasses.value)
3198
+ }, [
3199
+ __props.icon ? (vue.openBlock(), vue.createElementBlock("div", {
3200
+ key: 0,
3201
+ class: vue.normalizeClass([
3202
+ "rounded-xl flex items-center justify-center flex-shrink-0",
3203
+ sizeClasses.value.icon,
3204
+ iconBgClasses.value,
3205
+ __props.iconPosition === "top" && "mb-2",
3206
+ __props.iconClass
3207
+ ])
3208
+ }, [
3209
+ vue.renderSlot(_ctx.$slots, "icon", {}, () => [
3210
+ vue.createVNode(vue.unref(vue$1.Icon), {
3211
+ icon: __props.icon,
3212
+ class: vue.normalizeClass([sizeClasses.value.iconInner, iconColorClasses.value])
3213
+ }, null, 8, ["icon", "class"])
3214
+ ])
3215
+ ], 2)) : vue.createCommentVNode("", true),
3216
+ vue.createElementVNode("div", {
3217
+ class: vue.normalizeClass(contentClasses.value)
3218
+ }, [
3219
+ vue.createElementVNode("div", {
3220
+ class: vue.normalizeClass([sizeClasses.value.value, valueTextClasses.value, __props.valueClass])
3221
+ }, [
3222
+ vue.renderSlot(_ctx.$slots, "value", {}, () => [
3223
+ vue.createTextVNode(vue.toDisplayString(__props.value), 1)
3224
+ ])
3225
+ ], 2),
3226
+ vue.createElementVNode("div", {
3227
+ class: vue.normalizeClass([sizeClasses.value.label, labelTextClasses.value, __props.labelClass])
3228
+ }, [
3229
+ vue.renderSlot(_ctx.$slots, "label", {}, () => [
3230
+ vue.createTextVNode(vue.toDisplayString(__props.label), 1)
3231
+ ])
3232
+ ], 2),
3233
+ __props.change !== void 0 || __props.trend ? (vue.openBlock(), vue.createElementBlock("div", {
3234
+ key: 0,
3235
+ class: vue.normalizeClass([
3236
+ "mt-1 font-medium inline-flex items-center gap-1",
3237
+ sizeClasses.value.change,
3238
+ trendColorClasses.value
3239
+ ])
3240
+ }, [
3241
+ vue.createVNode(vue.unref(vue$1.Icon), {
3242
+ icon: trendIcon.value,
3243
+ class: "size-3.5"
3244
+ }, null, 8, ["icon"]),
3245
+ !__props.trendOnly && __props.change !== void 0 ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_1$1, vue.toDisplayString(__props.change >= 0 ? "+" : "") + vue.toDisplayString(__props.change) + "% ", 1)) : vue.createCommentVNode("", true),
3246
+ __props.changeLabel ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1, vue.toDisplayString(__props.changeLabel), 1)) : vue.createCommentVNode("", true)
3247
+ ], 2)) : vue.createCommentVNode("", true)
3248
+ ], 2)
3249
+ ], 2),
3250
+ vue.renderSlot(_ctx.$slots, "extra")
3251
+ ]),
3252
+ _: 3
3253
+ }, 8, ["variant", "padding", "clickable", "shadow", "border", "class"]);
2104
3254
  };
2105
3255
  }
2106
3256
  });
2107
3257
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
2108
- __name: "StatsGrid",
3258
+ __name: "Stats",
2109
3259
  props: {
2110
3260
  stats: {},
2111
3261
  cols: {},
3262
+ gap: { default: "md" },
2112
3263
  variant: { default: "default" },
3264
+ size: { default: "md" },
3265
+ iconPosition: { default: "top" },
2113
3266
  color: { default: "primary" }
2114
3267
  },
2115
3268
  setup(__props) {
2116
3269
  return (_ctx, _cache) => {
3270
+ var _a, _b, _c, _d;
2117
3271
  return vue.openBlock(), vue.createElementBlock("div", {
2118
- class: vue.normalizeClass(["grid gap-3 sm:gap-4", [
3272
+ class: vue.normalizeClass(["grid", [
3273
+ // Gap classes
3274
+ __props.gap === "sm" && "gap-2 sm:gap-3",
3275
+ __props.gap === "md" && "gap-3 sm:gap-4",
3276
+ __props.gap === "lg" && "gap-4 sm:gap-6",
3277
+ // Column classes
3278
+ __props.cols === 1 && "grid-cols-1",
2119
3279
  __props.cols === 2 && "grid-cols-2",
2120
3280
  __props.cols === 3 && "grid-cols-3",
2121
3281
  __props.cols === 4 && "grid-cols-2 sm:grid-cols-4",
2122
- !__props.cols && __props.stats.length === 2 && "grid-cols-2",
2123
- !__props.cols && __props.stats.length === 3 && "grid-cols-3",
2124
- !__props.cols && __props.stats.length === 4 && "grid-cols-2 sm:grid-cols-4",
2125
- !__props.cols && __props.stats.length > 4 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"
3282
+ __props.cols === 5 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
3283
+ __props.cols === 6 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",
3284
+ // Auto columns based on stats length
3285
+ !__props.cols && ((_a = __props.stats) == null ? void 0 : _a.length) === 1 && "grid-cols-1",
3286
+ !__props.cols && ((_b = __props.stats) == null ? void 0 : _b.length) === 2 && "grid-cols-2",
3287
+ !__props.cols && ((_c = __props.stats) == null ? void 0 : _c.length) === 3 && "grid-cols-3",
3288
+ !__props.cols && ((_d = __props.stats) == null ? void 0 : _d.length) === 4 && "grid-cols-2 sm:grid-cols-4",
3289
+ !__props.cols && __props.stats && __props.stats.length > 4 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"
2126
3290
  ]])
2127
3291
  }, [
2128
3292
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.stats, (stat, index2) => {
@@ -2133,10 +3297,14 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
2133
3297
  icon: stat.icon,
2134
3298
  change: stat.change,
2135
3299
  "change-label": stat.changeLabel,
3300
+ trend: stat.trend,
2136
3301
  variant: __props.variant,
2137
- color: __props.color
2138
- }, null, 8, ["label", "value", "icon", "change", "change-label", "variant", "color"]);
2139
- }), 128))
3302
+ size: __props.size,
3303
+ "icon-position": __props.iconPosition,
3304
+ color: stat.color || __props.color
3305
+ }, null, 8, ["label", "value", "icon", "change", "change-label", "trend", "variant", "size", "icon-position", "color"]);
3306
+ }), 128)),
3307
+ vue.renderSlot(_ctx.$slots, "default")
2140
3308
  ], 2);
2141
3309
  };
2142
3310
  }
@@ -2277,26 +3445,42 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
2277
3445
  };
2278
3446
  }
2279
3447
  });
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-DYxh-wFx.cjs.map
3448
+ exports.TableContextKey = TableContextKey;
3449
+ exports._sfc_main = _sfc_main$A;
3450
+ exports._sfc_main$1 = _sfc_main$z;
3451
+ exports._sfc_main$10 = _sfc_main$q;
3452
+ exports._sfc_main$11 = _sfc_main$p;
3453
+ exports._sfc_main$12 = _sfc_main$o;
3454
+ exports._sfc_main$13 = _sfc_main$n;
3455
+ exports._sfc_main$14 = _sfc_main$m;
3456
+ exports._sfc_main$15 = _sfc_main$l;
3457
+ exports._sfc_main$16 = _sfc_main$k;
3458
+ exports._sfc_main$17 = _sfc_main$j;
3459
+ exports._sfc_main$18 = _sfc_main$i;
3460
+ exports._sfc_main$19 = _sfc_main$h;
3461
+ exports._sfc_main$2 = _sfc_main$y;
3462
+ exports._sfc_main$20 = _sfc_main$g;
3463
+ exports._sfc_main$21 = _sfc_main$f;
3464
+ exports._sfc_main$22 = _sfc_main$e;
3465
+ exports._sfc_main$23 = _sfc_main$d;
3466
+ exports._sfc_main$24 = _sfc_main$c;
3467
+ exports._sfc_main$25 = _sfc_main$b;
3468
+ exports._sfc_main$26 = _sfc_main$a;
3469
+ exports._sfc_main$27 = _sfc_main$9;
3470
+ exports._sfc_main$28 = _sfc_main$8;
3471
+ exports._sfc_main$29 = _sfc_main$7;
3472
+ exports._sfc_main$3 = _sfc_main$x;
3473
+ exports._sfc_main$30 = _sfc_main$6;
3474
+ exports._sfc_main$31 = _sfc_main$5;
3475
+ exports._sfc_main$32 = _sfc_main$4;
3476
+ exports._sfc_main$33 = _sfc_main$3;
3477
+ exports._sfc_main$34 = _sfc_main$2;
3478
+ exports._sfc_main$35 = _sfc_main$1;
3479
+ exports._sfc_main$36 = _sfc_main;
3480
+ exports._sfc_main$4 = _sfc_main$w;
3481
+ exports._sfc_main$5 = _sfc_main$v;
3482
+ exports._sfc_main$6 = _sfc_main$u;
3483
+ exports._sfc_main$7 = _sfc_main$t;
3484
+ exports._sfc_main$8 = _sfc_main$s;
3485
+ exports._sfc_main$9 = _sfc_main$r;
3486
+ //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-l8lJzwoY.cjs.map