cisse-vue-ui 0.9.0 → 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-DhPNxKgF.js} +40 -94
  2. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DhPNxKgF.js.map +1 -0
  3. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-DwW3MT85.cjs} +37 -91
  4. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DwW3MT85.cjs.map +1 -0
  5. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs → FilterTabs.vue_vue_type_script_setup_true_lang-CwcJkw3D.cjs} +499 -165
  6. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CwcJkw3D.cjs.map +1 -0
  7. package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js → FilterTabs.vue_vue_type_script_setup_true_lang-aPs8YGWB.js} +494 -160
  8. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-aPs8YGWB.js.map +1 -0
  9. package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs → Skeleton.vue_vue_type_script_setup_true_lang-ahmyY81P.cjs} +70 -16
  10. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-ahmyY81P.cjs.map +1 -0
  11. package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js → Skeleton.vue_vue_type_script_setup_true_lang-mcD2ZqKf.js} +70 -16
  12. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-mcD2ZqKf.js.map +1 -0
  13. package/dist/components/core/StatItem.stories.d.ts +44 -0
  14. package/dist/components/core/StatItem.vue.d.ts +135 -0
  15. package/dist/components/core/Stats.stories.d.ts +45 -0
  16. package/dist/components/core/Stats.vue.d.ts +97 -0
  17. package/dist/components/core/index.cjs +3 -1
  18. package/dist/components/core/index.cjs.map +1 -1
  19. package/dist/components/core/index.d.ts +6 -3
  20. package/dist/components/core/index.js +5 -3
  21. package/dist/components/feedback/index.cjs +8 -8
  22. package/dist/components/feedback/index.js +7 -7
  23. package/dist/components/index.cjs +11 -9
  24. package/dist/components/index.cjs.map +1 -1
  25. package/dist/components/index.js +12 -10
  26. package/dist/{index-BMSH4AOz.cjs → index-CKd33NtQ.cjs} +12 -10
  27. package/dist/{index-BMSH4AOz.cjs.map → index-CKd33NtQ.cjs.map} +1 -1
  28. package/dist/{index-0kwQORZJ.js → index-D-VE0o-l.js} +6 -4
  29. package/dist/{index-0kwQORZJ.js.map → index-D-VE0o-l.js.map} +1 -1
  30. package/dist/index.cjs +12 -10
  31. package/dist/index.cjs.map +1 -1
  32. package/dist/index.js +16 -14
  33. package/dist/style.css +1 -1
  34. package/package.json +1 -1
  35. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js.map +0 -1
  36. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs.map +0 -1
  37. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs.map +0 -1
  38. package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js.map +0 -1
  39. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js.map +0 -1
  40. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs.map +0 -1
  41. package/dist/components/core/StatsCard.stories.d.ts +0 -15
  42. package/dist/components/core/StatsCard.vue.d.ts +0 -44
  43. package/dist/components/core/StatsGrid.stories.d.ts +0 -12
  44. package/dist/components/core/StatsGrid.vue.d.ts +0 -16
  45. /package/dist/components/core/{StatsCard.test.d.ts → StatItem.test.d.ts} +0 -0
  46. /package/dist/components/core/{StatsGrid.test.d.ts → Stats.test.d.ts} +0 -0
@@ -1,21 +1,21 @@
1
1
  import { defineComponent, computed, createBlock, createElementBlock, openBlock, createCommentVNode, renderSlot, normalizeClass, createElementVNode, createTextVNode, toDisplayString, useSlots, withKeys, withModifiers, normalizeStyle, unref, useAttrs, toRefs, provide, reactive, mergeProps, normalizeProps, guardReactiveProps, inject, Fragment, withCtx, createVNode, renderList, resolveDynamicComponent, ref, createSlots, watch, withDirectives, vModelText, Teleport, Transition, nextTick, resolveComponent, vShow, onMounted, onUnmounted, mergeModels, useModel } from "vue";
2
- import { Icon } from "@iconify/vue";
3
- import { b as _sfc_main$B, a as _sfc_main$I, _ as _sfc_main$J, c as _sfc_main$K } from "./ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js";
4
2
  import { _ as _sfc_main$C, a as useBreakpoints } from "./index-BaWpldIJ.js";
3
+ import { c as _sfc_main$B, b as _sfc_main$I, _ as _sfc_main$J, d as _sfc_main$K, a as _sfc_main$L } from "./Skeleton.vue_vue_type_script_setup_true_lang-mcD2ZqKf.js";
5
4
  import { e as _sfc_main$D, d as _sfc_main$E, c as _sfc_main$F, b as _sfc_main$G, a as _sfc_main$H } from "./BadgeType.vue_vue_type_script_setup_true_lang-tHRMWBb-.js";
6
5
  import { a as usePagination, u as useDarkMode } from "./usePagination-BGwbICFC.js";
6
+ import { Icon } from "@iconify/vue";
7
7
  import { u as useDropdown } from "./useDropdown-XITCE_SM.js";
8
8
  import { u as useId } from "./useId-xeHj7rkg.js";
9
9
  const _hoisted_1$o = {
10
10
  key: 1,
11
11
  class: "flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950"
12
12
  };
13
- const _hoisted_2$g = { class: "flex flex-col gap-0.5" };
14
- const _hoisted_3$a = {
13
+ const _hoisted_2$h = { class: "flex flex-col gap-0.5" };
14
+ const _hoisted_3$b = {
15
15
  key: 1,
16
16
  class: "text-sm font-normal text-gray-600 dark:text-gray-400"
17
17
  };
18
- const _hoisted_4$7 = { class: "flex gap-2" };
18
+ const _hoisted_4$8 = { class: "flex gap-2" };
19
19
  const _sfc_main$A = /* @__PURE__ */ defineComponent({
20
20
  __name: "CardComponent",
21
21
  props: {
@@ -52,7 +52,7 @@ const _sfc_main$A = /* @__PURE__ */ defineComponent({
52
52
  key: 1,
53
53
  class: normalizeClass(["flex items-center justify-between border-b px-5 py-3", dividerClasses.value])
54
54
  }, [
55
- createElementVNode("div", _hoisted_2$g, [
55
+ createElementVNode("div", _hoisted_2$h, [
56
56
  __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", {
57
57
  key: 0,
58
58
  class: normalizeClass(["text-md font-semibold", titleClasses.value])
@@ -61,13 +61,13 @@ const _sfc_main$A = /* @__PURE__ */ defineComponent({
61
61
  createTextVNode(toDisplayString(__props.title), 1)
62
62
  ])
63
63
  ], 2)) : createCommentVNode("", true),
64
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("span", _hoisted_3$a, [
64
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("span", _hoisted_3$b, [
65
65
  renderSlot(_ctx.$slots, "description", {}, () => [
66
66
  createTextVNode(toDisplayString(__props.description), 1)
67
67
  ])
68
68
  ])) : createCommentVNode("", true)
69
69
  ]),
70
- createElementVNode("div", _hoisted_4$7, [
70
+ createElementVNode("div", _hoisted_4$8, [
71
71
  renderSlot(_ctx.$slots, "actions")
72
72
  ])
73
73
  ], 2)) : createCommentVNode("", true),
@@ -77,9 +77,9 @@ const _sfc_main$A = /* @__PURE__ */ defineComponent({
77
77
  }
78
78
  });
79
79
  const _hoisted_1$n = ["role", "tabindex", "onKeydown"];
80
- const _hoisted_2$f = ["src", "alt"];
81
- const _hoisted_3$9 = ["src", "alt"];
82
- const _hoisted_4$6 = { class: "flex items-center gap-3" };
80
+ const _hoisted_2$g = ["src", "alt"];
81
+ const _hoisted_3$a = ["src", "alt"];
82
+ const _hoisted_4$7 = { class: "flex items-center gap-3" };
83
83
  const _hoisted_5$4 = { class: "flex flex-col gap-0.5" };
84
84
  const _hoisted_6$3 = ["src", "alt"];
85
85
  const _sfc_main$z = /* @__PURE__ */ defineComponent({
@@ -310,7 +310,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
310
310
  src: __props.image,
311
311
  alt: __props.imageAlt || "",
312
312
  class: normalizeClass(["w-full h-full object-cover", __props.imageClass])
313
- }, null, 10, _hoisted_2$f)) : createCommentVNode("", true)
313
+ }, null, 10, _hoisted_2$g)) : createCommentVNode("", true)
314
314
  ]),
315
315
  _cache[0] || (_cache[0] = createElementVNode("div", { class: "absolute inset-0 bg-gradient-to-t from-black/60 to-transparent" }, null, -1))
316
316
  ], 2)) : createCommentVNode("", true),
@@ -325,7 +325,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
325
325
  src: __props.image,
326
326
  alt: __props.imageAlt || "",
327
327
  class: normalizeClass(["w-full h-full object-cover", __props.imageClass])
328
- }, null, 10, _hoisted_3$9)) : createCommentVNode("", true)
328
+ }, null, 10, _hoisted_3$a)) : createCommentVNode("", true)
329
329
  ])
330
330
  ], 6)) : createCommentVNode("", true),
331
331
  createElementVNode("div", {
@@ -351,7 +351,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
351
351
  __props.imagePosition === "background" && "text-white border-white/20"
352
352
  ])
353
353
  }, [
354
- createElementVNode("div", _hoisted_4$6, [
354
+ createElementVNode("div", _hoisted_4$7, [
355
355
  __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("div", {
356
356
  key: 0,
357
357
  class: normalizeClass(computedIconClass.value)
@@ -647,11 +647,11 @@ const _sfc_main$r = /* @__PURE__ */ defineComponent({
647
647
  }
648
648
  });
649
649
  const _hoisted_1$k = ["colspan", "rowspan", "scope", "aria-sort"];
650
- const _hoisted_2$e = {
650
+ const _hoisted_2$f = {
651
651
  key: 0,
652
652
  d: "M7 14l5-5 5 5H7z"
653
653
  };
654
- const _hoisted_3$8 = {
654
+ const _hoisted_3$9 = {
655
655
  key: 1,
656
656
  d: "M7 10l5 5 5-5H7z"
657
657
  };
@@ -733,7 +733,7 @@ const _sfc_main$q = /* @__PURE__ */ defineComponent({
733
733
  viewBox: "0 0 24 24",
734
734
  fill: "currentColor"
735
735
  }, [
736
- __props.sorted && __props.sortDirection === "asc" ? (openBlock(), createElementBlock("path", _hoisted_2$e)) : __props.sorted && __props.sortDirection === "desc" ? (openBlock(), createElementBlock("path", _hoisted_3$8)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
736
+ __props.sorted && __props.sortDirection === "asc" ? (openBlock(), createElementBlock("path", _hoisted_2$f)) : __props.sorted && __props.sortDirection === "desc" ? (openBlock(), createElementBlock("path", _hoisted_3$9)) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [
737
737
  _cache[2] || (_cache[2] = createElementVNode("path", {
738
738
  d: "M7 14l5-5 5 5H7z",
739
739
  class: "opacity-40"
@@ -1012,7 +1012,7 @@ const _sfc_main$m = /* @__PURE__ */ defineComponent({
1012
1012
  }
1013
1013
  });
1014
1014
  const _hoisted_1$h = ["disabled", "aria-expanded"];
1015
- const _hoisted_2$d = { class: "p-4" };
1015
+ const _hoisted_2$e = { class: "p-4" };
1016
1016
  const _sfc_main$l = /* @__PURE__ */ defineComponent({
1017
1017
  ...{
1018
1018
  inheritAttrs: false
@@ -1098,7 +1098,7 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
1098
1098
  class: "!p-0"
1099
1099
  }, {
1100
1100
  default: withCtx(() => [
1101
- createElementVNode("div", _hoisted_2$d, [
1101
+ createElementVNode("div", _hoisted_2$e, [
1102
1102
  renderSlot(_ctx.$slots, "expanded")
1103
1103
  ])
1104
1104
  ]),
@@ -1112,12 +1112,12 @@ const _sfc_main$l = /* @__PURE__ */ defineComponent({
1112
1112
  }
1113
1113
  });
1114
1114
  const _hoisted_1$g = { class: "overflow-hidden" };
1115
- const _hoisted_2$c = {
1115
+ const _hoisted_2$d = {
1116
1116
  key: 1,
1117
1117
  class: "flex flex-col items-center justify-center py-12 text-center"
1118
1118
  };
1119
- const _hoisted_3$7 = { class: "flex flex-col items-center gap-3" };
1120
- const _hoisted_4$5 = { class: "text-sm text-gray-600 dark:text-gray-400" };
1119
+ const _hoisted_3$8 = { class: "flex flex-col items-center gap-3" };
1120
+ const _hoisted_4$6 = { class: "text-sm text-gray-600 dark:text-gray-400" };
1121
1121
  const _hoisted_5$3 = {
1122
1122
  key: 3,
1123
1123
  class: "flex flex-col items-center justify-center py-12 text-center"
@@ -1232,9 +1232,9 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
1232
1232
  key: 0,
1233
1233
  rows: __props.loadingRows,
1234
1234
  columns: visibleProperties.value.length
1235
- }, null, 8, ["rows", "columns"])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_2$c, [
1235
+ }, null, 8, ["rows", "columns"])) : __props.error ? (openBlock(), createElementBlock("div", _hoisted_2$d, [
1236
1236
  renderSlot(_ctx.$slots, "error", {}, () => [
1237
- createElementVNode("div", _hoisted_3$7, [
1237
+ createElementVNode("div", _hoisted_3$8, [
1238
1238
  _cache[2] || (_cache[2] = createElementVNode("svg", {
1239
1239
  class: "size-12 text-red-400",
1240
1240
  fill: "none",
@@ -1248,7 +1248,7 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
1248
1248
  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"
1249
1249
  })
1250
1250
  ], -1)),
1251
- createElementVNode("p", _hoisted_4$5, toDisplayString(__props.errorMessage), 1)
1251
+ createElementVNode("p", _hoisted_4$6, toDisplayString(__props.errorMessage), 1)
1252
1252
  ])
1253
1253
  ])
1254
1254
  ])) : __props.items && __props.items.length > 0 ? (openBlock(), createBlock(_sfc_main$y, {
@@ -1358,9 +1358,9 @@ const _sfc_main$k = /* @__PURE__ */ defineComponent({
1358
1358
  }
1359
1359
  });
1360
1360
  const _hoisted_1$f = { class: "space-y-3" };
1361
- const _hoisted_2$b = { class: "flex items-center gap-3 p-3" };
1362
- const _hoisted_3$6 = { class: "text-sm text-gray-600 dark:text-gray-400" };
1363
- const _hoisted_4$4 = {
1361
+ const _hoisted_2$c = { class: "flex items-center gap-3 p-3" };
1362
+ const _hoisted_3$7 = { class: "text-sm text-gray-600 dark:text-gray-400" };
1363
+ const _hoisted_4$5 = {
1364
1364
  key: 0,
1365
1365
  class: "text-sm text-primary font-medium"
1366
1366
  };
@@ -1439,14 +1439,14 @@ const _sfc_main$j = /* @__PURE__ */ defineComponent({
1439
1439
  })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
1440
1440
  __props.selectable && selectableItems.value.length > 0 ? (openBlock(), createBlock(_sfc_main$A, { key: 0 }, {
1441
1441
  default: withCtx(() => [
1442
- createElementVNode("div", _hoisted_2$b, [
1442
+ createElementVNode("div", _hoisted_2$c, [
1443
1443
  createVNode(_sfc_main$C, {
1444
1444
  "model-value": allSelected.value,
1445
1445
  indeterminate: someSelected.value,
1446
1446
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => emit("selectAll"))
1447
1447
  }, null, 8, ["model-value", "indeterminate"]),
1448
- createElementVNode("span", _hoisted_3$6, toDisplayString(allSelected.value ? "Tout désélectionner" : "Tout sélectionner"), 1),
1449
- __props.selectedItems && __props.selectedItems.size > 0 ? (openBlock(), createElementBlock("span", _hoisted_4$4, " (" + toDisplayString(__props.selectedItems.size) + " sélectionné" + toDisplayString(__props.selectedItems.size > 1 ? "s" : "") + ") ", 1)) : createCommentVNode("", true)
1448
+ createElementVNode("span", _hoisted_3$7, toDisplayString(allSelected.value ? "Tout désélectionner" : "Tout sélectionner"), 1),
1449
+ __props.selectedItems && __props.selectedItems.size > 0 ? (openBlock(), createElementBlock("span", _hoisted_4$5, " (" + toDisplayString(__props.selectedItems.size) + " sélectionné" + toDisplayString(__props.selectedItems.size > 1 ? "s" : "") + ") ", 1)) : createCommentVNode("", true)
1450
1450
  ])
1451
1451
  ]),
1452
1452
  _: 1
@@ -1628,9 +1628,9 @@ const _hoisted_1$e = {
1628
1628
  key: 0,
1629
1629
  class: "mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300"
1630
1630
  };
1631
- const _hoisted_2$a = { class: "relative" };
1632
- const _hoisted_3$5 = ["disabled", "placeholder"];
1633
- const _hoisted_4$3 = ["disabled"];
1631
+ const _hoisted_2$b = { class: "relative" };
1632
+ const _hoisted_3$6 = ["disabled", "placeholder"];
1633
+ const _hoisted_4$4 = ["disabled"];
1634
1634
  const _hoisted_5$1 = {
1635
1635
  key: 0,
1636
1636
  class: "px-4 py-3 text-sm text-gray-500"
@@ -1745,7 +1745,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1745
1745
  class: "autocomplete-container"
1746
1746
  }, [
1747
1747
  __props.label ? (openBlock(), createElementBlock("label", _hoisted_1$e, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
1748
- createElementVNode("div", _hoisted_2$a, [
1748
+ createElementVNode("div", _hoisted_2$b, [
1749
1749
  createElementVNode("div", {
1750
1750
  ref_key: "inputWrapperRef",
1751
1751
  ref: inputWrapperRef,
@@ -1770,7 +1770,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1770
1770
  type: "text",
1771
1771
  onFocus: openDropdown,
1772
1772
  onKeydown: handleKeydown
1773
- }, null, 40, _hoisted_3$5), [
1773
+ }, null, 40, _hoisted_3$6), [
1774
1774
  [vModelText, searchQuery.value]
1775
1775
  ]),
1776
1776
  __props.modelValue && !__props.disabled ? (openBlock(), createElementBlock("button", {
@@ -1794,7 +1794,7 @@ const _sfc_main$h = /* @__PURE__ */ defineComponent({
1794
1794
  class: normalizeClass([{ "rotate-180": unref(isOpen) }, "size-4 text-gray-400 transition"]),
1795
1795
  icon: "lucide:chevron-down"
1796
1796
  }, null, 8, ["class"])
1797
- ], 8, _hoisted_4$3)
1797
+ ], 8, _hoisted_4$4)
1798
1798
  ], 2),
1799
1799
  (openBlock(), createBlock(Teleport, {
1800
1800
  to: "body",
@@ -1921,8 +1921,8 @@ const _sfc_main$g = /* @__PURE__ */ defineComponent({
1921
1921
  }
1922
1922
  });
1923
1923
  const _hoisted_1$d = { class: "relative inline-block" };
1924
- const _hoisted_2$9 = ["src", "alt"];
1925
- const _hoisted_3$4 = { key: 1 };
1924
+ const _hoisted_2$a = ["src", "alt"];
1925
+ const _hoisted_3$5 = { key: 1 };
1926
1926
  const _sfc_main$f = /* @__PURE__ */ defineComponent({
1927
1927
  __name: "Avatar",
1928
1928
  props: {
@@ -2043,7 +2043,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2043
2043
  alt: __props.alt || __props.name,
2044
2044
  class: "size-full object-cover",
2045
2045
  onError: _cache[0] || (_cache[0] = ($event) => imageError.value = true)
2046
- }, null, 40, _hoisted_2$9)) : initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$4, toDisplayString(initials.value), 1)) : (openBlock(), createBlock(unref(Icon), {
2046
+ }, null, 40, _hoisted_2$a)) : initials.value ? (openBlock(), createElementBlock("span", _hoisted_3$5, toDisplayString(initials.value), 1)) : (openBlock(), createBlock(unref(Icon), {
2047
2047
  key: 2,
2048
2048
  icon: "lucide:user",
2049
2049
  class: "size-1/2"
@@ -2062,7 +2062,7 @@ const _sfc_main$f = /* @__PURE__ */ defineComponent({
2062
2062
  }
2063
2063
  });
2064
2064
  const _hoisted_1$c = ["aria-selected", "disabled", "onClick"];
2065
- const _hoisted_2$8 = { class: "mt-4" };
2065
+ const _hoisted_2$9 = { class: "mt-4" };
2066
2066
  const _sfc_main$e = /* @__PURE__ */ defineComponent({
2067
2067
  __name: "Tabs",
2068
2068
  props: {
@@ -2131,7 +2131,7 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
2131
2131
  }, toDisplayString(tab.label), 11, _hoisted_1$c);
2132
2132
  }), 128))
2133
2133
  ], 2),
2134
- createElementVNode("div", _hoisted_2$8, [
2134
+ createElementVNode("div", _hoisted_2$9, [
2135
2135
  renderSlot(_ctx.$slots, "default", { activeTab: activeTab.value })
2136
2136
  ])
2137
2137
  ]);
@@ -2355,7 +2355,7 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
2355
2355
  }
2356
2356
  });
2357
2357
  const _hoisted_1$9 = ["aria-describedby"];
2358
- const _hoisted_2$7 = ["id"];
2358
+ const _hoisted_2$8 = ["id"];
2359
2359
  const _sfc_main$a = /* @__PURE__ */ defineComponent({
2360
2360
  __name: "Tooltip",
2361
2361
  props: {
@@ -2427,7 +2427,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
2427
2427
  id: unref(tooltipId),
2428
2428
  class: normalizeClass(positionClasses.value),
2429
2429
  role: "tooltip"
2430
- }, toDisplayString(__props.content), 11, _hoisted_2$7)) : createCommentVNode("", true)
2430
+ }, toDisplayString(__props.content), 11, _hoisted_2$8)) : createCommentVNode("", true)
2431
2431
  ]),
2432
2432
  _: 1
2433
2433
  })
@@ -2436,7 +2436,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
2436
2436
  }
2437
2437
  });
2438
2438
  const _hoisted_1$8 = ["id", "aria-expanded", "aria-controls"];
2439
- const _hoisted_2$6 = ["id", "aria-labelledby"];
2439
+ const _hoisted_2$7 = ["id", "aria-labelledby"];
2440
2440
  const _sfc_main$9 = /* @__PURE__ */ defineComponent({
2441
2441
  __name: "Popover",
2442
2442
  props: {
@@ -2521,7 +2521,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
2521
2521
  ])
2522
2522
  }, [
2523
2523
  renderSlot(_ctx.$slots, "default", { close: unref(close) })
2524
- ], 14, _hoisted_2$6)) : createCommentVNode("", true)
2524
+ ], 14, _hoisted_2$7)) : createCommentVNode("", true)
2525
2525
  ]),
2526
2526
  _: 3
2527
2527
  })
@@ -2534,9 +2534,9 @@ const _hoisted_1$7 = {
2534
2534
  key: 0,
2535
2535
  class: "flex items-center justify-between px-4 py-3 border-b border-gray-200 dark:border-gray-700"
2536
2536
  };
2537
- const _hoisted_2$5 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
2538
- const _hoisted_3$3 = { class: "flex-1 overflow-y-auto p-4" };
2539
- const _hoisted_4$2 = {
2537
+ const _hoisted_2$6 = { class: "text-lg font-semibold text-gray-900 dark:text-white" };
2538
+ const _hoisted_3$4 = { class: "flex-1 overflow-y-auto p-4" };
2539
+ const _hoisted_4$3 = {
2540
2540
  key: 1,
2541
2541
  class: "px-4 py-3 border-t border-gray-200 dark:border-gray-700"
2542
2542
  };
@@ -2661,7 +2661,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
2661
2661
  }, [
2662
2662
  __props.title || __props.showClose || _ctx.$slots.header ? (openBlock(), createElementBlock("div", _hoisted_1$7, [
2663
2663
  renderSlot(_ctx.$slots, "header", {}, () => [
2664
- createElementVNode("h2", _hoisted_2$5, toDisplayString(__props.title), 1)
2664
+ createElementVNode("h2", _hoisted_2$6, toDisplayString(__props.title), 1)
2665
2665
  ]),
2666
2666
  __props.showClose ? (openBlock(), createElementBlock("button", {
2667
2667
  key: 0,
@@ -2675,10 +2675,10 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
2675
2675
  })
2676
2676
  ])) : createCommentVNode("", true)
2677
2677
  ])) : createCommentVNode("", true),
2678
- createElementVNode("div", _hoisted_3$3, [
2678
+ createElementVNode("div", _hoisted_3$4, [
2679
2679
  renderSlot(_ctx.$slots, "default")
2680
2680
  ]),
2681
- _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_4$2, [
2681
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("div", _hoisted_4$3, [
2682
2682
  renderSlot(_ctx.$slots, "footer")
2683
2683
  ])) : createCommentVNode("", true)
2684
2684
  ], 2)) : createCommentVNode("", true)
@@ -2690,7 +2690,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
2690
2690
  }
2691
2691
  });
2692
2692
  const _hoisted_1$6 = { "aria-label": "Breadcrumb" };
2693
- const _hoisted_2$4 = { class: "flex items-center flex-wrap gap-1 text-sm" };
2693
+ const _hoisted_2$5 = { class: "flex items-center flex-wrap gap-1 text-sm" };
2694
2694
  const _sfc_main$7 = /* @__PURE__ */ defineComponent({
2695
2695
  __name: "Breadcrumb",
2696
2696
  props: {
@@ -2703,7 +2703,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
2703
2703
  setup(__props) {
2704
2704
  return (_ctx, _cache) => {
2705
2705
  return openBlock(), createElementBlock("nav", _hoisted_1$6, [
2706
- createElementVNode("ol", _hoisted_2$4, [
2706
+ createElementVNode("ol", _hoisted_2$5, [
2707
2707
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, index) => {
2708
2708
  return openBlock(), createElementBlock("li", {
2709
2709
  key: index,
@@ -2779,9 +2779,9 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
2779
2779
  }
2780
2780
  });
2781
2781
  const _hoisted_1$4 = ["id", "disabled", "aria-expanded", "aria-controls"];
2782
- const _hoisted_2$3 = { class: "flex items-center gap-2 font-medium" };
2783
- const _hoisted_3$2 = ["id", "aria-labelledby"];
2784
- const _hoisted_4$1 = { class: "px-4 py-3 bg-gray-50 dark:bg-gray-900 text-gray-700 dark:text-gray-300" };
2782
+ const _hoisted_2$4 = { class: "flex items-center gap-2 font-medium" };
2783
+ const _hoisted_3$3 = ["id", "aria-labelledby"];
2784
+ const _hoisted_4$2 = { class: "px-4 py-3 bg-gray-50 dark:bg-gray-900 text-gray-700 dark:text-gray-300" };
2785
2785
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
2786
2786
  __name: "AccordionItem",
2787
2787
  props: {
@@ -2816,7 +2816,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
2816
2816
  "aria-controls": panelId.value,
2817
2817
  onClick: toggle
2818
2818
  }, [
2819
- createElementVNode("span", _hoisted_2$3, [
2819
+ createElementVNode("span", _hoisted_2$4, [
2820
2820
  __props.icon ? (openBlock(), createBlock(unref(Icon), {
2821
2821
  key: 0,
2822
2822
  icon: __props.icon,
@@ -2846,10 +2846,10 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
2846
2846
  "aria-labelledby": headerId.value,
2847
2847
  class: "overflow-hidden"
2848
2848
  }, [
2849
- createElementVNode("div", _hoisted_4$1, [
2849
+ createElementVNode("div", _hoisted_4$2, [
2850
2850
  renderSlot(_ctx.$slots, "default")
2851
2851
  ])
2852
- ], 8, _hoisted_3$2), [
2852
+ ], 8, _hoisted_3$3), [
2853
2853
  [vShow, isOpen.value]
2854
2854
  ])
2855
2855
  ]),
@@ -2863,9 +2863,9 @@ const _hoisted_1$3 = {
2863
2863
  key: 0,
2864
2864
  class: "relative"
2865
2865
  };
2866
- const _hoisted_2$2 = { class: "flex items-start gap-4" };
2867
- const _hoisted_3$1 = { class: "flex-1 min-w-0 pt-0.5" };
2868
- const _hoisted_4 = { class: "flex items-center justify-between gap-2" };
2866
+ const _hoisted_2$3 = { class: "flex items-start gap-4" };
2867
+ const _hoisted_3$2 = { class: "flex-1 min-w-0 pt-0.5" };
2868
+ const _hoisted_4$1 = { class: "flex items-center justify-between gap-2" };
2869
2869
  const _hoisted_5 = { class: "text-sm font-medium text-gray-900 dark:text-white" };
2870
2870
  const _hoisted_6 = {
2871
2871
  key: 0,
@@ -2942,7 +2942,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
2942
2942
  key: 0,
2943
2943
  class: normalizeClass(["absolute left-4 top-8 w-0.5 h-full -ml-px", getStatusClasses(item.status).line])
2944
2944
  }, null, 2)) : createCommentVNode("", true),
2945
- createElementVNode("div", _hoisted_2$2, [
2945
+ createElementVNode("div", _hoisted_2$3, [
2946
2946
  createElementVNode("div", {
2947
2947
  class: normalizeClass(["relative z-10 flex items-center justify-center size-8 rounded-full shrink-0", getStatusClasses(item.status).dot])
2948
2948
  }, [
@@ -2952,8 +2952,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
2952
2952
  class: normalizeClass(["size-4", getStatusClasses(item.status).icon])
2953
2953
  }, null, 8, ["icon", "class"])) : createCommentVNode("", true)
2954
2954
  ], 2),
2955
- createElementVNode("div", _hoisted_3$1, [
2956
- createElementVNode("div", _hoisted_4, [
2955
+ createElementVNode("div", _hoisted_3$2, [
2956
+ createElementVNode("div", _hoisted_4$1, [
2957
2957
  createElementVNode("h3", _hoisted_5, toDisplayString(item.title), 1),
2958
2958
  item.date ? (openBlock(), createElementBlock("time", _hoisted_6, toDisplayString(item.date), 1)) : createCommentVNode("", true)
2959
2959
  ]),
@@ -2995,7 +2995,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
2995
2995
  }
2996
2996
  });
2997
2997
  const _hoisted_1$2 = ["aria-label"];
2998
- const _hoisted_2$1 = {
2998
+ const _hoisted_2$2 = {
2999
2999
  key: 0,
3000
3000
  class: "text-sm font-medium"
3001
3001
  };
@@ -3034,129 +3034,437 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
3034
3034
  icon: unref(isDark) ? __props.darkIcon : __props.lightIcon,
3035
3035
  class: normalizeClass(sizeClasses[__props.size].icon)
3036
3036
  }, null, 8, ["icon", "class"]),
3037
- __props.showLabel ? (openBlock(), createElementBlock("span", _hoisted_2$1, toDisplayString(unref(isDark) ? "Dark" : "Light"), 1)) : createCommentVNode("", true)
3037
+ __props.showLabel ? (openBlock(), createElementBlock("span", _hoisted_2$2, toDisplayString(unref(isDark) ? "Dark" : "Light"), 1)) : createCommentVNode("", true)
3038
3038
  ], 10, _hoisted_1$2);
3039
3039
  };
3040
3040
  }
3041
3041
  });
3042
3042
  const _hoisted_1$1 = {
3043
3043
  key: 0,
3044
+ class: "mr-0.5"
3045
+ };
3046
+ const _hoisted_2$1 = {
3047
+ key: 1,
3048
+ class: "ml-0.5"
3049
+ };
3050
+ const _hoisted_3$1 = { key: 1 };
3051
+ const _hoisted_4 = {
3052
+ key: 2,
3044
3053
  class: "text-gray-400"
3045
3054
  };
3046
3055
  const _sfc_main$2 = /* @__PURE__ */ defineComponent({
3047
- __name: "StatsCard",
3056
+ __name: "StatItem",
3048
3057
  props: {
3049
3058
  label: {},
3050
3059
  value: {},
3060
+ description: {},
3061
+ prefix: {},
3062
+ suffix: {},
3051
3063
  icon: {},
3064
+ iconPosition: { default: "top" },
3065
+ iconRounded: { default: "xl" },
3066
+ hideIconBg: { type: Boolean, default: false },
3052
3067
  change: {},
3053
3068
  changeLabel: {},
3069
+ trend: {},
3070
+ trendOnly: { type: Boolean, default: false },
3071
+ hideTrendIcon: { type: Boolean, default: false },
3072
+ invertTrendColors: { type: Boolean, default: false },
3073
+ size: { default: "md" },
3054
3074
  variant: { default: "default" },
3055
- color: { default: "primary" }
3075
+ color: { default: "primary" },
3076
+ clickable: { type: Boolean, default: false },
3077
+ centered: { type: Boolean },
3078
+ labelFirst: { type: Boolean, default: false },
3079
+ compact: { type: Boolean, default: false },
3080
+ loading: { type: Boolean, default: false },
3081
+ shadow: { default: "sm" },
3082
+ rounded: { default: "xl" },
3083
+ border: { default: "none" },
3084
+ accent: { default: "none" },
3085
+ cardClass: {},
3086
+ iconWrapperClass: {},
3087
+ iconClass: {},
3088
+ valueClass: {},
3089
+ labelClass: {},
3090
+ descriptionClass: {},
3091
+ trendClass: {},
3092
+ contentClass: {}
3056
3093
  },
3094
+ emits: ["click"],
3057
3095
  setup(__props) {
3096
+ const props = __props;
3097
+ const isCentered = computed(() => {
3098
+ if (props.centered !== void 0) return props.centered;
3099
+ return props.iconPosition === "top" || props.iconPosition === "bottom";
3100
+ });
3101
+ const effectiveTrend = computed(() => {
3102
+ if (props.trend) return props.trend;
3103
+ if (props.change === void 0) return void 0;
3104
+ if (props.change > 0) return "up";
3105
+ if (props.change < 0) return "down";
3106
+ return "neutral";
3107
+ });
3108
+ const sizeClasses = computed(() => {
3109
+ const sizes = {
3110
+ xs: {
3111
+ padding: props.compact ? "none" : "sm",
3112
+ icon: "size-6",
3113
+ iconInner: "size-3",
3114
+ value: "text-lg font-bold",
3115
+ label: "text-xs",
3116
+ description: "text-xs",
3117
+ change: "text-xs",
3118
+ gap: "gap-0.5"
3119
+ },
3120
+ sm: {
3121
+ padding: props.compact ? "sm" : "sm",
3122
+ icon: "size-8",
3123
+ iconInner: "size-4",
3124
+ value: "text-xl font-bold",
3125
+ label: "text-xs",
3126
+ description: "text-xs",
3127
+ change: "text-xs",
3128
+ gap: "gap-1"
3129
+ },
3130
+ md: {
3131
+ padding: props.compact ? "sm" : "md",
3132
+ icon: "size-10",
3133
+ iconInner: "size-5",
3134
+ value: "text-2xl sm:text-3xl font-bold",
3135
+ label: "text-xs sm:text-sm",
3136
+ description: "text-xs sm:text-sm",
3137
+ change: "text-xs",
3138
+ gap: "gap-2"
3139
+ },
3140
+ lg: {
3141
+ padding: props.compact ? "md" : "lg",
3142
+ icon: "size-12",
3143
+ iconInner: "size-6",
3144
+ value: "text-3xl sm:text-4xl font-bold",
3145
+ label: "text-sm sm:text-base",
3146
+ description: "text-sm",
3147
+ change: "text-sm",
3148
+ gap: "gap-3"
3149
+ },
3150
+ xl: {
3151
+ padding: props.compact ? "md" : "lg",
3152
+ icon: "size-14",
3153
+ iconInner: "size-7",
3154
+ value: "text-4xl sm:text-5xl font-bold",
3155
+ label: "text-base sm:text-lg",
3156
+ description: "text-sm sm:text-base",
3157
+ change: "text-sm",
3158
+ gap: "gap-4"
3159
+ }
3160
+ };
3161
+ return sizes[props.size];
3162
+ });
3163
+ const iconRoundedClasses = computed(() => {
3164
+ const map = {
3165
+ none: "rounded-none",
3166
+ sm: "rounded-sm",
3167
+ md: "rounded-md",
3168
+ lg: "rounded-lg",
3169
+ xl: "rounded-xl",
3170
+ full: "rounded-full"
3171
+ };
3172
+ return map[props.iconRounded];
3173
+ });
3174
+ const iconBgClasses = computed(() => {
3175
+ if (props.hideIconBg) return "";
3176
+ if (props.variant === "glass" || props.variant === "solid") return "bg-white/20";
3177
+ const colors = {
3178
+ primary: "bg-primary-100 dark:bg-primary-900/30",
3179
+ secondary: "bg-secondary-100 dark:bg-secondary-900/30",
3180
+ success: "bg-emerald-100 dark:bg-emerald-900/30",
3181
+ warning: "bg-amber-100 dark:bg-amber-900/30",
3182
+ danger: "bg-red-100 dark:bg-red-900/30",
3183
+ info: "bg-blue-100 dark:bg-blue-900/30"
3184
+ };
3185
+ return colors[props.color];
3186
+ });
3187
+ const iconColorClasses = computed(() => {
3188
+ if (props.variant === "glass" || props.variant === "solid") return "text-white";
3189
+ const colors = {
3190
+ primary: "text-primary-600 dark:text-primary-400",
3191
+ secondary: "text-secondary-600 dark:text-secondary-400",
3192
+ success: "text-emerald-600 dark:text-emerald-400",
3193
+ warning: "text-amber-600 dark:text-amber-400",
3194
+ danger: "text-red-600 dark:text-red-400",
3195
+ info: "text-blue-600 dark:text-blue-400"
3196
+ };
3197
+ return colors[props.color];
3198
+ });
3199
+ const solidBgClasses = computed(() => {
3200
+ if (props.variant !== "solid") return "";
3201
+ const colors = {
3202
+ primary: "bg-primary-500",
3203
+ secondary: "bg-secondary-500",
3204
+ success: "bg-emerald-500",
3205
+ warning: "bg-amber-500",
3206
+ danger: "bg-red-500",
3207
+ info: "bg-blue-500"
3208
+ };
3209
+ return colors[props.color];
3210
+ });
3211
+ const valueTextClasses = computed(() => {
3212
+ if (props.variant === "glass" || props.variant === "solid") return "text-white";
3213
+ return "text-gray-900 dark:text-white";
3214
+ });
3215
+ const labelTextClasses = computed(() => {
3216
+ if (props.variant === "glass") return "text-white/80";
3217
+ if (props.variant === "solid") return "text-white/90";
3218
+ return "text-gray-500 dark:text-gray-400";
3219
+ });
3220
+ const descriptionTextClasses = computed(() => {
3221
+ if (props.variant === "glass") return "text-white/70";
3222
+ if (props.variant === "solid") return "text-white/80";
3223
+ return "text-gray-400 dark:text-gray-500";
3224
+ });
3225
+ const trendColorClasses = computed(() => {
3226
+ if (!effectiveTrend.value || effectiveTrend.value === "neutral") {
3227
+ return "text-gray-500";
3228
+ }
3229
+ const isUp = effectiveTrend.value === "up";
3230
+ const greenColor = "text-emerald-500";
3231
+ const redColor = "text-red-500";
3232
+ if (props.invertTrendColors) {
3233
+ return isUp ? redColor : greenColor;
3234
+ }
3235
+ return isUp ? greenColor : redColor;
3236
+ });
3237
+ const trendIcon = computed(() => {
3238
+ if (!effectiveTrend.value || effectiveTrend.value === "neutral") {
3239
+ return "heroicons:minus";
3240
+ }
3241
+ return effectiveTrend.value === "up" ? "heroicons:arrow-trending-up" : "heroicons:arrow-trending-down";
3242
+ });
3243
+ const cardVariant = computed(() => {
3244
+ if (props.variant === "solid") return "default";
3245
+ return props.variant;
3246
+ });
3247
+ const effectiveShadow = computed(() => {
3248
+ if (props.variant === "glass") return "none";
3249
+ return props.shadow;
3250
+ });
3251
+ const effectiveBorder = computed(() => {
3252
+ if (props.variant === "outline") return "default";
3253
+ return props.border;
3254
+ });
3255
+ const layoutClasses = computed(() => {
3256
+ const centered = isCentered.value ? "items-center text-center" : "";
3257
+ switch (props.iconPosition) {
3258
+ case "top":
3259
+ return `flex flex-col ${centered}`;
3260
+ case "bottom":
3261
+ return `flex flex-col-reverse ${centered}`;
3262
+ case "left":
3263
+ return "flex flex-row items-center";
3264
+ case "right":
3265
+ return "flex flex-row-reverse items-center";
3266
+ default:
3267
+ return `flex flex-col ${centered}`;
3268
+ }
3269
+ });
3270
+ const iconMarginClasses = computed(() => {
3271
+ switch (props.iconPosition) {
3272
+ case "top":
3273
+ return "mb-2";
3274
+ case "bottom":
3275
+ return "mt-2";
3276
+ case "left":
3277
+ return "mr-3";
3278
+ case "right":
3279
+ return "ml-3";
3280
+ default:
3281
+ return "";
3282
+ }
3283
+ });
3284
+ const computedContentClasses = computed(() => {
3285
+ const isVertical = props.iconPosition === "top" || props.iconPosition === "bottom";
3286
+ if (isVertical) {
3287
+ return `flex flex-col ${sizeClasses.value.gap}`;
3288
+ }
3289
+ return `flex flex-col flex-1 min-w-0 ${sizeClasses.value.gap}`;
3290
+ });
3058
3291
  return (_ctx, _cache) => {
3059
- return openBlock(), createElementBlock("div", {
3060
- class: normalizeClass([
3061
- "rounded-2xl p-4 text-center transition-all",
3062
- __props.variant === "default" && "bg-white dark:bg-slate-800 border border-gray-100 dark:border-slate-700 shadow-sm",
3063
- __props.variant === "glass" && "bg-white/15 backdrop-blur-sm border border-white/20",
3064
- __props.variant === "outline" && "border-2 border-gray-200 dark:border-slate-600",
3065
- __props.variant === "solid" && __props.color === "primary" && "bg-primary-500 text-white",
3066
- __props.variant === "solid" && __props.color === "success" && "bg-emerald-500 text-white",
3067
- __props.variant === "solid" && __props.color === "warning" && "bg-amber-500 text-white",
3068
- __props.variant === "solid" && __props.color === "danger" && "bg-red-500 text-white",
3069
- __props.variant === "solid" && __props.color === "info" && "bg-blue-500 text-white"
3070
- ])
3071
- }, [
3072
- __props.icon ? (openBlock(), createElementBlock("div", {
3073
- key: 0,
3074
- class: normalizeClass([
3075
- "size-10 mx-auto mb-2 rounded-xl flex items-center justify-center",
3076
- __props.variant === "glass" && "bg-white/20",
3077
- __props.variant === "solid" && "bg-white/20",
3078
- __props.variant === "default" && __props.color === "primary" && "bg-primary-100 dark:bg-primary-900/30",
3079
- __props.variant === "default" && __props.color === "success" && "bg-emerald-100 dark:bg-emerald-900/30",
3080
- __props.variant === "default" && __props.color === "warning" && "bg-amber-100 dark:bg-amber-900/30",
3081
- __props.variant === "default" && __props.color === "danger" && "bg-red-100 dark:bg-red-900/30",
3082
- __props.variant === "default" && __props.color === "info" && "bg-blue-100 dark:bg-blue-900/30",
3083
- __props.variant === "outline" && "bg-gray-100 dark:bg-slate-700"
3084
- ])
3085
- }, [
3086
- createVNode(unref(Icon), {
3087
- icon: __props.icon,
3088
- class: normalizeClass([
3089
- "size-5",
3090
- (__props.variant === "glass" || __props.variant === "solid") && "text-white",
3091
- __props.variant === "default" && __props.color === "primary" && "text-primary-600 dark:text-primary-400",
3092
- __props.variant === "default" && __props.color === "success" && "text-emerald-600 dark:text-emerald-400",
3093
- __props.variant === "default" && __props.color === "warning" && "text-amber-600 dark:text-amber-400",
3094
- __props.variant === "default" && __props.color === "danger" && "text-red-600 dark:text-red-400",
3095
- __props.variant === "default" && __props.color === "info" && "text-blue-600 dark:text-blue-400",
3096
- __props.variant === "outline" && "text-gray-600 dark:text-gray-400"
3097
- ])
3098
- }, null, 8, ["icon", "class"])
3099
- ], 2)) : createCommentVNode("", true),
3100
- createElementVNode("div", {
3101
- class: normalizeClass([
3102
- "text-2xl sm:text-3xl font-bold",
3103
- (__props.variant === "glass" || __props.variant === "solid") && "text-white",
3104
- (__props.variant === "default" || __props.variant === "outline") && "text-gray-900 dark:text-white"
3105
- ])
3106
- }, [
3107
- renderSlot(_ctx.$slots, "value", {}, () => [
3108
- createTextVNode(toDisplayString(__props.value), 1)
3109
- ])
3110
- ], 2),
3111
- createElementVNode("div", {
3112
- class: normalizeClass([
3113
- "text-xs sm:text-sm",
3114
- __props.variant === "glass" && "text-white/80",
3115
- __props.variant === "solid" && "text-white/90",
3116
- (__props.variant === "default" || __props.variant === "outline") && "text-gray-500 dark:text-gray-400"
3117
- ])
3118
- }, [
3119
- renderSlot(_ctx.$slots, "label", {}, () => [
3120
- createTextVNode(toDisplayString(__props.label), 1)
3121
- ])
3122
- ], 2),
3123
- __props.change !== void 0 ? (openBlock(), createElementBlock("div", {
3124
- key: 1,
3125
- class: normalizeClass([
3126
- "mt-2 text-xs font-medium inline-flex items-center gap-1",
3127
- __props.change >= 0 ? "text-emerald-500" : "text-red-500"
3128
- ])
3129
- }, [
3130
- createVNode(unref(Icon), {
3131
- icon: __props.change >= 0 ? "heroicons:arrow-trending-up" : "heroicons:arrow-trending-down",
3132
- class: "size-3.5"
3133
- }, null, 8, ["icon"]),
3134
- createElementVNode("span", null, toDisplayString(__props.change >= 0 ? "+" : "") + toDisplayString(__props.change) + "%", 1),
3135
- __props.changeLabel ? (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(__props.changeLabel), 1)) : createCommentVNode("", true)
3136
- ], 2)) : createCommentVNode("", true)
3137
- ], 2);
3292
+ return openBlock(), createBlock(_sfc_main$z, {
3293
+ variant: cardVariant.value,
3294
+ padding: sizeClasses.value.padding,
3295
+ clickable: __props.clickable,
3296
+ shadow: effectiveShadow.value,
3297
+ border: effectiveBorder.value,
3298
+ rounded: __props.rounded,
3299
+ accent: __props.accent,
3300
+ "header-divider": false,
3301
+ class: normalizeClass([__props.cardClass, solidBgClasses.value, __props.variant === "solid" && "text-white"]),
3302
+ onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event))
3303
+ }, {
3304
+ default: withCtx(() => [
3305
+ __props.loading ? (openBlock(), createElementBlock("div", {
3306
+ key: 0,
3307
+ class: normalizeClass(layoutClasses.value)
3308
+ }, [
3309
+ __props.icon ? (openBlock(), createBlock(_sfc_main$L, {
3310
+ key: 0,
3311
+ class: normalizeClass([sizeClasses.value.icon, iconRoundedClasses.value, iconMarginClasses.value])
3312
+ }, null, 8, ["class"])) : createCommentVNode("", true),
3313
+ createElementVNode("div", {
3314
+ class: normalizeClass(computedContentClasses.value)
3315
+ }, [
3316
+ createVNode(_sfc_main$L, {
3317
+ class: normalizeClass(sizeClasses.value.value),
3318
+ width: "60%",
3319
+ height: "1.5em"
3320
+ }, null, 8, ["class"]),
3321
+ createVNode(_sfc_main$L, {
3322
+ class: normalizeClass(sizeClasses.value.label),
3323
+ width: "80%",
3324
+ height: "1em"
3325
+ }, null, 8, ["class"])
3326
+ ], 2)
3327
+ ], 2)) : (openBlock(), createElementBlock("div", {
3328
+ key: 1,
3329
+ class: normalizeClass(layoutClasses.value)
3330
+ }, [
3331
+ __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("div", {
3332
+ key: 0,
3333
+ class: normalizeClass([
3334
+ "flex items-center justify-center flex-shrink-0",
3335
+ sizeClasses.value.icon,
3336
+ iconRoundedClasses.value,
3337
+ iconBgClasses.value,
3338
+ iconMarginClasses.value,
3339
+ __props.iconWrapperClass
3340
+ ])
3341
+ }, [
3342
+ renderSlot(_ctx.$slots, "icon", {}, () => [
3343
+ createVNode(unref(Icon), {
3344
+ icon: __props.icon,
3345
+ class: normalizeClass([sizeClasses.value.iconInner, iconColorClasses.value, __props.iconClass])
3346
+ }, null, 8, ["icon", "class"])
3347
+ ])
3348
+ ], 2)) : createCommentVNode("", true),
3349
+ createElementVNode("div", {
3350
+ class: normalizeClass([computedContentClasses.value, __props.contentClass])
3351
+ }, [
3352
+ __props.labelFirst ? (openBlock(), createElementBlock("div", {
3353
+ key: 0,
3354
+ class: normalizeClass([sizeClasses.value.label, labelTextClasses.value, __props.labelClass])
3355
+ }, [
3356
+ renderSlot(_ctx.$slots, "label", {}, () => [
3357
+ createTextVNode(toDisplayString(__props.label), 1)
3358
+ ])
3359
+ ], 2)) : createCommentVNode("", true),
3360
+ createElementVNode("div", {
3361
+ class: normalizeClass([sizeClasses.value.value, valueTextClasses.value, __props.valueClass])
3362
+ }, [
3363
+ renderSlot(_ctx.$slots, "value", {}, () => [
3364
+ __props.prefix ? (openBlock(), createElementBlock("span", _hoisted_1$1, toDisplayString(__props.prefix), 1)) : createCommentVNode("", true),
3365
+ createTextVNode(" " + toDisplayString(__props.value) + " ", 1),
3366
+ __props.suffix ? (openBlock(), createElementBlock("span", _hoisted_2$1, toDisplayString(__props.suffix), 1)) : createCommentVNode("", true)
3367
+ ])
3368
+ ], 2),
3369
+ !__props.labelFirst ? (openBlock(), createElementBlock("div", {
3370
+ key: 1,
3371
+ class: normalizeClass([sizeClasses.value.label, labelTextClasses.value, __props.labelClass])
3372
+ }, [
3373
+ renderSlot(_ctx.$slots, "label", {}, () => [
3374
+ createTextVNode(toDisplayString(__props.label), 1)
3375
+ ])
3376
+ ], 2)) : createCommentVNode("", true),
3377
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("div", {
3378
+ key: 2,
3379
+ class: normalizeClass([sizeClasses.value.description, descriptionTextClasses.value, __props.descriptionClass])
3380
+ }, [
3381
+ renderSlot(_ctx.$slots, "description", {}, () => [
3382
+ createTextVNode(toDisplayString(__props.description), 1)
3383
+ ])
3384
+ ], 2)) : createCommentVNode("", true),
3385
+ __props.change !== void 0 || __props.trend ? (openBlock(), createElementBlock("div", {
3386
+ key: 3,
3387
+ class: normalizeClass([
3388
+ "mt-1 font-medium inline-flex items-center gap-1",
3389
+ sizeClasses.value.change,
3390
+ trendColorClasses.value,
3391
+ __props.trendClass
3392
+ ])
3393
+ }, [
3394
+ !__props.hideTrendIcon ? (openBlock(), createBlock(unref(Icon), {
3395
+ key: 0,
3396
+ icon: trendIcon.value,
3397
+ class: "size-3.5"
3398
+ }, null, 8, ["icon"])) : createCommentVNode("", true),
3399
+ !__props.trendOnly && __props.change !== void 0 ? (openBlock(), createElementBlock("span", _hoisted_3$1, toDisplayString(__props.change >= 0 ? "+" : "") + toDisplayString(__props.change) + "% ", 1)) : createCommentVNode("", true),
3400
+ __props.changeLabel ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.changeLabel), 1)) : createCommentVNode("", true)
3401
+ ], 2)) : createCommentVNode("", true)
3402
+ ], 2)
3403
+ ], 2)),
3404
+ renderSlot(_ctx.$slots, "extra")
3405
+ ]),
3406
+ _: 3
3407
+ }, 8, ["variant", "padding", "clickable", "shadow", "border", "rounded", "accent", "class"]);
3138
3408
  };
3139
3409
  }
3140
3410
  });
3141
3411
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
3142
- __name: "StatsGrid",
3412
+ __name: "Stats",
3143
3413
  props: {
3144
3414
  stats: {},
3145
3415
  cols: {},
3416
+ gap: { default: "md" },
3146
3417
  variant: { default: "default" },
3147
- color: { default: "primary" }
3418
+ size: { default: "md" },
3419
+ iconPosition: { default: "top" },
3420
+ iconRounded: { default: "xl" },
3421
+ hideIconBg: { type: Boolean, default: false },
3422
+ color: { default: "primary" },
3423
+ labelFirst: { type: Boolean, default: false },
3424
+ compact: { type: Boolean, default: false },
3425
+ loading: { type: Boolean, default: false },
3426
+ shadow: { default: "sm" },
3427
+ rounded: { default: "xl" },
3428
+ border: { default: "none" },
3429
+ accent: { default: "none" },
3430
+ clickable: { type: Boolean, default: false },
3431
+ centered: { type: Boolean },
3432
+ invertTrendColors: { type: Boolean, default: false },
3433
+ hideTrendIcon: { type: Boolean, default: false },
3434
+ gridClass: {},
3435
+ cardClass: {},
3436
+ iconWrapperClass: {},
3437
+ iconClass: {},
3438
+ valueClass: {},
3439
+ labelClass: {}
3148
3440
  },
3441
+ emits: ["item-click"],
3149
3442
  setup(__props) {
3150
3443
  return (_ctx, _cache) => {
3444
+ var _a, _b, _c, _d;
3151
3445
  return openBlock(), createElementBlock("div", {
3152
- class: normalizeClass(["grid gap-3 sm:gap-4", [
3446
+ class: normalizeClass(["grid", [
3447
+ __props.gridClass,
3448
+ // Gap classes
3449
+ __props.gap === "none" && "gap-0",
3450
+ __props.gap === "xs" && "gap-1 sm:gap-2",
3451
+ __props.gap === "sm" && "gap-2 sm:gap-3",
3452
+ __props.gap === "md" && "gap-3 sm:gap-4",
3453
+ __props.gap === "lg" && "gap-4 sm:gap-6",
3454
+ __props.gap === "xl" && "gap-6 sm:gap-8",
3455
+ // Column classes
3456
+ __props.cols === 1 && "grid-cols-1",
3153
3457
  __props.cols === 2 && "grid-cols-2",
3154
3458
  __props.cols === 3 && "grid-cols-3",
3155
3459
  __props.cols === 4 && "grid-cols-2 sm:grid-cols-4",
3156
- !__props.cols && __props.stats.length === 2 && "grid-cols-2",
3157
- !__props.cols && __props.stats.length === 3 && "grid-cols-3",
3158
- !__props.cols && __props.stats.length === 4 && "grid-cols-2 sm:grid-cols-4",
3159
- !__props.cols && __props.stats.length > 4 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"
3460
+ __props.cols === 5 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-5",
3461
+ __props.cols === 6 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-6",
3462
+ // Auto columns based on stats length
3463
+ !__props.cols && ((_a = __props.stats) == null ? void 0 : _a.length) === 1 && "grid-cols-1",
3464
+ !__props.cols && ((_b = __props.stats) == null ? void 0 : _b.length) === 2 && "grid-cols-2",
3465
+ !__props.cols && ((_c = __props.stats) == null ? void 0 : _c.length) === 3 && "grid-cols-3",
3466
+ !__props.cols && ((_d = __props.stats) == null ? void 0 : _d.length) === 4 && "grid-cols-2 sm:grid-cols-4",
3467
+ !__props.cols && __props.stats && __props.stats.length > 4 && "grid-cols-2 sm:grid-cols-3 lg:grid-cols-4"
3160
3468
  ]])
3161
3469
  }, [
3162
3470
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.stats, (stat, index) => {
@@ -3167,10 +3475,36 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
3167
3475
  icon: stat.icon,
3168
3476
  change: stat.change,
3169
3477
  "change-label": stat.changeLabel,
3478
+ trend: stat.trend,
3479
+ description: stat.description,
3480
+ prefix: stat.prefix,
3481
+ suffix: stat.suffix,
3170
3482
  variant: __props.variant,
3171
- color: __props.color
3172
- }, null, 8, ["label", "value", "icon", "change", "change-label", "variant", "color"]);
3173
- }), 128))
3483
+ size: __props.size,
3484
+ "icon-position": __props.iconPosition,
3485
+ "icon-rounded": __props.iconRounded,
3486
+ "hide-icon-bg": __props.hideIconBg,
3487
+ color: stat.color || __props.color,
3488
+ "label-first": __props.labelFirst,
3489
+ compact: __props.compact,
3490
+ loading: __props.loading,
3491
+ shadow: __props.shadow,
3492
+ rounded: __props.rounded,
3493
+ border: __props.border,
3494
+ accent: __props.accent,
3495
+ clickable: __props.clickable,
3496
+ centered: __props.centered,
3497
+ "invert-trend-colors": __props.invertTrendColors,
3498
+ "hide-trend-icon": __props.hideTrendIcon,
3499
+ "card-class": __props.cardClass,
3500
+ "icon-wrapper-class": __props.iconWrapperClass,
3501
+ "icon-class": __props.iconClass,
3502
+ "value-class": __props.valueClass,
3503
+ "label-class": __props.labelClass,
3504
+ onClick: ($event) => _ctx.$emit("item-click", index, stat, $event)
3505
+ }, null, 8, ["label", "value", "icon", "change", "change-label", "trend", "description", "prefix", "suffix", "variant", "size", "icon-position", "icon-rounded", "hide-icon-bg", "color", "label-first", "compact", "loading", "shadow", "rounded", "border", "accent", "clickable", "centered", "invert-trend-colors", "hide-trend-icon", "card-class", "icon-wrapper-class", "icon-class", "value-class", "label-class", "onClick"]);
3506
+ }), 128)),
3507
+ renderSlot(_ctx.$slots, "default")
3174
3508
  ], 2);
3175
3509
  };
3176
3510
  }
@@ -3351,4 +3685,4 @@ export {
3351
3685
  _sfc_main$b as y,
3352
3686
  _sfc_main$a as z
3353
3687
  };
3354
- //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js.map
3688
+ //# sourceMappingURL=FilterTabs.vue_vue_type_script_setup_true_lang-aPs8YGWB.js.map