cisse-vue-ui 0.8.3 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +666 -4
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-DuJr8cz3.cjs → CheckboxGroup.vue_vue_type_script_setup_true_lang-BC86pBlY.cjs} +70 -70
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BC86pBlY.cjs.map +1 -0
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-N4oS_DJD.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js} +72 -72
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-ZP02bMgY.js.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js} +37 -184
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-C5KHLMvx.js.map +1 -0
- 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
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CLfy0-Wb.cjs.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DoJKvn30.cjs → Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs} +2 -2
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DoJKvn30.cjs.map → Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs.map} +1 -1
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-A9Ax6iob.js → Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js} +2 -2
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-A9Ax6iob.js.map → Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js.map} +1 -1
- package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-jW6Ikbvy.cjs → FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs} +1260 -209
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-COkZbeGG.cjs.map +1 -0
- package/dist/{FilterTabs.vue_vue_type_script_setup_true_lang-CcOgc2Y_.js → FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js} +1269 -218
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CzpYHtc5.js.map +1 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js +298 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js.map +1 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs +297 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs.map +1 -0
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-rbvfGvll.cjs → PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs} +2 -2
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-rbvfGvll.cjs.map → PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs.map} +1 -1
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-Gvocjdqh.js → PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js} +2 -2
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-Gvocjdqh.js.map → PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js.map} +1 -1
- package/dist/cisse-vue-ui.css +4 -4
- package/dist/components/core/AccordionItem.test.d.ts +1 -0
- package/dist/components/core/Breadcrumb.stories.d.ts +5 -0
- package/dist/components/core/CardWrapper.stories.d.ts +32 -0
- package/dist/components/core/CardWrapper.test.d.ts +1 -0
- package/dist/components/core/CardWrapper.vue.d.ts +129 -0
- package/dist/components/core/CollapsibleCard.vue.d.ts +1 -1
- package/dist/components/core/DataTable.stories.d.ts +38 -0
- package/dist/components/core/Dropdown.vue.d.ts +1 -1
- package/dist/components/core/Popover.vue.d.ts +2 -2
- package/dist/components/core/Tooltip.stories.d.ts +3 -0
- package/dist/components/core/index.cjs +40 -23
- package/dist/components/core/index.cjs.map +1 -1
- package/dist/components/core/index.d.ts +4 -1
- package/dist/components/core/index.js +40 -23
- package/dist/components/core/table/DataTable.test.d.ts +1 -0
- package/dist/components/core/{TableComponent.vue.d.ts → table/DataTable.vue.d.ts} +60 -7
- package/dist/components/core/table/Table.stories.d.ts +27 -0
- package/dist/components/core/table/atoms/Caption.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Caption.vue.d.ts +26 -0
- package/dist/components/core/table/atoms/Col.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Col.vue.d.ts +8 -0
- package/dist/components/core/table/atoms/Colgroup.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Colgroup.vue.d.ts +17 -0
- package/dist/components/core/table/atoms/Table.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Table.vue.d.ts +46 -0
- package/dist/components/core/table/atoms/Tbody.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Tbody.vue.d.ts +17 -0
- package/dist/components/core/table/atoms/Td.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Td.vue.d.ts +43 -0
- package/dist/components/core/table/atoms/Tfoot.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Tfoot.vue.d.ts +17 -0
- package/dist/components/core/table/atoms/Th.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Th.vue.d.ts +64 -0
- package/dist/components/core/table/atoms/Thead.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Thead.vue.d.ts +17 -0
- package/dist/components/core/table/atoms/Tr.test.d.ts +1 -0
- package/dist/components/core/table/atoms/Tr.vue.d.ts +35 -0
- package/dist/components/core/table/atoms/index.d.ts +10 -0
- package/dist/components/core/table/index.d.ts +3 -0
- package/dist/components/core/table/molecules/ExpandableRow.test.d.ts +1 -0
- package/dist/components/core/table/molecules/ExpandableRow.vue.d.ts +47 -0
- package/dist/components/core/table/molecules/TableFooter.test.d.ts +1 -0
- package/dist/components/core/table/molecules/TableFooter.vue.d.ts +21 -0
- package/dist/components/core/table/molecules/TableHeader.test.d.ts +1 -0
- package/dist/components/core/table/molecules/TableHeader.vue.d.ts +49 -0
- package/dist/components/core/table/molecules/TableRow.test.d.ts +1 -0
- package/dist/components/core/table/molecules/TableRow.vue.d.ts +59 -0
- package/dist/components/core/table/molecules/index.d.ts +4 -0
- package/dist/components/feedback/Progress.vue.d.ts +1 -1
- package/dist/components/feedback/TableSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/index.cjs +14 -14
- package/dist/components/feedback/index.js +14 -14
- package/dist/components/form/Combobox.stories.d.ts +2 -0
- package/dist/components/form/Combobox.vue.d.ts +4 -0
- package/dist/components/form/DatePicker.stories.d.ts +2 -0
- package/dist/components/form/DatePicker.vue.d.ts +4 -0
- package/dist/components/form/FormSection.vue.d.ts +1 -1
- package/dist/components/form/FormSelect.stories.d.ts +2 -0
- package/dist/components/form/FormSelect.vue.d.ts +4 -0
- package/dist/components/form/IconPicker.stories.d.ts +19 -0
- package/dist/components/form/IconPicker.test.d.ts +1 -0
- package/dist/components/form/InputWrapper.stories.d.ts +1 -5
- package/dist/components/form/InputWrapper.vue.d.ts +6 -3
- package/dist/components/form/Rating.vue.d.ts +1 -1
- package/dist/components/form/SearchInput.vue.d.ts +1 -1
- package/dist/components/form/TagsInput.stories.d.ts +1 -0
- package/dist/components/form/TagsInput.vue.d.ts +3 -3
- package/dist/components/form/TextArea.stories.d.ts +3 -1
- package/dist/components/form/TextArea.vue.d.ts +4 -0
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +2 -2
- package/dist/components/index.cjs +56 -39
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +66 -49
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/composables/index.cjs +18 -9
- package/dist/composables/index.cjs.map +1 -1
- package/dist/composables/index.d.ts +8 -0
- package/dist/composables/index.js +15 -6
- package/dist/composables/index.js.map +1 -1
- package/dist/composables/useColumnResize.d.ts +38 -0
- package/dist/composables/useColumnResize.test.d.ts +1 -0
- package/dist/composables/useColumnVisibility.d.ts +44 -0
- package/dist/composables/useColumnVisibility.test.d.ts +1 -0
- package/dist/composables/useEditableCell.d.ts +51 -0
- package/dist/composables/useEditableCell.test.d.ts +1 -0
- package/dist/composables/useInputStyles.d.ts +32 -0
- package/dist/composables/useInputStyles.test.d.ts +1 -0
- package/dist/composables/usePagination.d.ts +44 -0
- package/dist/composables/usePagination.test.d.ts +1 -0
- package/dist/composables/usePinnedRows.d.ts +41 -0
- package/dist/composables/usePinnedRows.test.d.ts +1 -0
- package/dist/composables/useTableKeyboardNavigation.d.ts +52 -0
- package/dist/composables/useTableKeyboardNavigation.test.d.ts +1 -0
- package/dist/composables/useVirtualScroll.d.ts +32 -0
- package/dist/composables/useVirtualScroll.test.d.ts +1 -0
- package/dist/index-0kwQORZJ.js +114 -0
- package/dist/index-0kwQORZJ.js.map +1 -0
- package/dist/{index-5dQNEzd8.cjs → index-BMSH4AOz.cjs} +57 -40
- package/dist/{index-5dQNEzd8.cjs.map → index-BMSH4AOz.cjs.map} +1 -1
- package/dist/{index-SNefWfX0.js → index-BaWpldIJ.js} +3 -3
- package/dist/{index-SNefWfX0.js.map → index-BaWpldIJ.js.map} +1 -1
- package/dist/index.cjs +75 -49
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +83 -57
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/types/components.d.ts +1 -1
- package/dist/types/property.d.ts +8 -0
- package/dist/{useDropdown-DK4c5JGL.cjs → useDropdown-HI7ABBLe.cjs} +5 -4
- package/dist/{useDropdown-DK4c5JGL.cjs.map → useDropdown-HI7ABBLe.cjs.map} +1 -1
- package/dist/{useDropdown-De0cKI83.js → useDropdown-XITCE_SM.js} +5 -4
- package/dist/{useDropdown-De0cKI83.js.map → useDropdown-XITCE_SM.js.map} +1 -1
- package/dist/useInputStyles-BFTJdXHL.js +127 -0
- package/dist/useInputStyles-BFTJdXHL.js.map +1 -0
- package/dist/useInputStyles-DMfvW6N5.cjs +126 -0
- package/dist/useInputStyles-DMfvW6N5.cjs.map +1 -0
- package/dist/usePagination-BGwbICFC.js +135 -0
- package/dist/usePagination-BGwbICFC.js.map +1 -0
- package/dist/usePagination-gvvh1zqA.cjs +134 -0
- package/dist/usePagination-gvvh1zqA.cjs.map +1 -0
- package/dist/useVirtualScroll-BivP86fA.cjs +869 -0
- package/dist/useVirtualScroll-BivP86fA.cjs.map +1 -0
- package/dist/useVirtualScroll-YeZru2Eo.js +870 -0
- package/dist/useVirtualScroll-YeZru2Eo.js.map +1 -0
- package/package.json +1 -1
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-DuJr8cz3.cjs.map +0 -1
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-N4oS_DJD.js.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js.map +0 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-CcOgc2Y_.js.map +0 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-jW6Ikbvy.cjs.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js +0 -150
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs +0 -149
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +0 -1
- package/dist/components/core/TableComponent.stories.d.ts +0 -16
- package/dist/index-CDDUEkXf.js +0 -97
- package/dist/index-CDDUEkXf.js.map +0 -1
- package/dist/useDarkMode-Cl5QWTlC.js +0 -53
- package/dist/useDarkMode-Cl5QWTlC.js.map +0 -1
- package/dist/useDarkMode-DLZcJEUQ.cjs +0 -52
- package/dist/useDarkMode-DLZcJEUQ.cjs.map +0 -1
- package/dist/useToast-Bk60GArg.cjs +0 -176
- package/dist/useToast-Bk60GArg.cjs.map +0 -1
- package/dist/useToast-ina5g3mj.js +0 -177
- package/dist/useToast-ina5g3mj.js.map +0 -1
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import { defineComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, Fragment, renderList, normalizeStyle, computed, toDisplayString, createVNode, unref, normalizeClass } from "vue";
|
|
2
|
+
import { Icon } from "@iconify/vue";
|
|
3
|
+
const _hoisted_1$3 = {
|
|
4
|
+
class: "bg-white dark:bg-gray-900 rounded-lg shadow-md p-4 space-y-4",
|
|
5
|
+
"aria-hidden": "true"
|
|
6
|
+
};
|
|
7
|
+
const _hoisted_2$3 = {
|
|
8
|
+
key: 0,
|
|
9
|
+
class: "flex items-center gap-3"
|
|
10
|
+
};
|
|
11
|
+
const _hoisted_3$2 = { class: "space-y-2" };
|
|
12
|
+
const _hoisted_4$2 = {
|
|
13
|
+
key: 1,
|
|
14
|
+
class: "flex justify-end gap-2 pt-2"
|
|
15
|
+
};
|
|
16
|
+
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
17
|
+
__name: "CardSkeleton",
|
|
18
|
+
props: {
|
|
19
|
+
showAvatar: { type: Boolean, default: false },
|
|
20
|
+
lines: { default: 3 },
|
|
21
|
+
showActions: { type: Boolean, default: false }
|
|
22
|
+
},
|
|
23
|
+
setup(__props) {
|
|
24
|
+
return (_ctx, _cache) => {
|
|
25
|
+
return openBlock(), createElementBlock("div", _hoisted_1$3, [
|
|
26
|
+
__props.showAvatar ? (openBlock(), createElementBlock("div", _hoisted_2$3, [..._cache[0] || (_cache[0] = [
|
|
27
|
+
createElementVNode("div", { class: "size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse" }, null, -1),
|
|
28
|
+
createElementVNode("div", { class: "flex-1 space-y-2" }, [
|
|
29
|
+
createElementVNode("div", { class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/2" }),
|
|
30
|
+
createElementVNode("div", { class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/3" })
|
|
31
|
+
], -1)
|
|
32
|
+
])])) : createCommentVNode("", true),
|
|
33
|
+
createElementVNode("div", _hoisted_3$2, [
|
|
34
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.lines, (line) => {
|
|
35
|
+
return openBlock(), createElementBlock("div", {
|
|
36
|
+
key: line,
|
|
37
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
38
|
+
style: normalizeStyle({ width: line === __props.lines ? "60%" : "100%" })
|
|
39
|
+
}, null, 4);
|
|
40
|
+
}), 128))
|
|
41
|
+
]),
|
|
42
|
+
__props.showActions ? (openBlock(), createElementBlock("div", _hoisted_4$2, [..._cache[1] || (_cache[1] = [
|
|
43
|
+
createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1),
|
|
44
|
+
createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1)
|
|
45
|
+
])])) : createCommentVNode("", true)
|
|
46
|
+
]);
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
});
|
|
50
|
+
const _hoisted_1$2 = {
|
|
51
|
+
class: "w-full",
|
|
52
|
+
"aria-hidden": "true"
|
|
53
|
+
};
|
|
54
|
+
const _hoisted_2$2 = {
|
|
55
|
+
key: 0,
|
|
56
|
+
class: "flex gap-4 px-4 py-3 border-b border-gray-200 dark:border-gray-700"
|
|
57
|
+
};
|
|
58
|
+
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
59
|
+
__name: "TableSkeleton",
|
|
60
|
+
props: {
|
|
61
|
+
rows: { default: 5 },
|
|
62
|
+
columns: { default: 4 },
|
|
63
|
+
showHeader: { type: Boolean, default: true }
|
|
64
|
+
},
|
|
65
|
+
setup(__props) {
|
|
66
|
+
return (_ctx, _cache) => {
|
|
67
|
+
return openBlock(), createElementBlock("div", _hoisted_1$2, [
|
|
68
|
+
__props.showHeader ? (openBlock(), createElementBlock("div", _hoisted_2$2, [
|
|
69
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
|
|
70
|
+
return openBlock(), createElementBlock("div", {
|
|
71
|
+
key: `header-${col}`,
|
|
72
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
73
|
+
style: normalizeStyle({ maxWidth: col === 1 ? "30%" : "20%" })
|
|
74
|
+
}, null, 4);
|
|
75
|
+
}), 128))
|
|
76
|
+
])) : createCommentVNode("", true),
|
|
77
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
|
|
78
|
+
return openBlock(), createElementBlock("div", {
|
|
79
|
+
key: `row-${row}`,
|
|
80
|
+
class: "flex items-center gap-4 px-4 py-4 border-b border-gray-100 dark:border-gray-800"
|
|
81
|
+
}, [
|
|
82
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
|
|
83
|
+
return openBlock(), createElementBlock("div", {
|
|
84
|
+
key: `cell-${row}-${col}`,
|
|
85
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
86
|
+
style: normalizeStyle({
|
|
87
|
+
maxWidth: col === 1 ? "40%" : col === __props.columns ? "15%" : "25%",
|
|
88
|
+
opacity: 1 - row * 0.1
|
|
89
|
+
})
|
|
90
|
+
}, null, 4);
|
|
91
|
+
}), 128))
|
|
92
|
+
]);
|
|
93
|
+
}), 128))
|
|
94
|
+
]);
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
const _hoisted_1$1 = {
|
|
99
|
+
key: 0,
|
|
100
|
+
class: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700"
|
|
101
|
+
};
|
|
102
|
+
const _hoisted_2$1 = { class: "flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4" };
|
|
103
|
+
const _hoisted_3$1 = { class: "text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left" };
|
|
104
|
+
const _hoisted_4$1 = {
|
|
105
|
+
key: 0,
|
|
106
|
+
class: "flex items-center justify-center sm:justify-start gap-2"
|
|
107
|
+
};
|
|
108
|
+
const _hoisted_5 = {
|
|
109
|
+
class: "text-sm text-gray-600 dark:text-gray-400 hidden sm:inline",
|
|
110
|
+
for: "page-size"
|
|
111
|
+
};
|
|
112
|
+
const _hoisted_6 = ["value"];
|
|
113
|
+
const _hoisted_7 = ["value"];
|
|
114
|
+
const _hoisted_8 = { class: "flex justify-center sm:justify-end items-center gap-1" };
|
|
115
|
+
const _hoisted_9 = ["disabled"];
|
|
116
|
+
const _hoisted_10 = { class: "hidden sm:inline" };
|
|
117
|
+
const _hoisted_11 = {
|
|
118
|
+
key: 0,
|
|
119
|
+
class: "px-2 py-2 text-sm text-gray-500 dark:text-gray-400"
|
|
120
|
+
};
|
|
121
|
+
const _hoisted_12 = ["disabled", "onClick"];
|
|
122
|
+
const _hoisted_13 = ["disabled"];
|
|
123
|
+
const _hoisted_14 = { class: "hidden sm:inline" };
|
|
124
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
125
|
+
__name: "PaginationControls",
|
|
126
|
+
props: {
|
|
127
|
+
currentPage: {},
|
|
128
|
+
totalPages: {},
|
|
129
|
+
loading: { type: Boolean, default: false },
|
|
130
|
+
pageSize: { default: 10 },
|
|
131
|
+
pageSizeOptions: { default: () => [10, 20, 50, 100] },
|
|
132
|
+
showPageSize: { type: Boolean, default: true },
|
|
133
|
+
showPageNumbers: { type: Boolean, default: true },
|
|
134
|
+
maxVisiblePages: { default: 7 },
|
|
135
|
+
pageLabel: { default: "Page" },
|
|
136
|
+
ofLabel: { default: "of" },
|
|
137
|
+
itemsPerPageLabel: { default: "Items per page:" },
|
|
138
|
+
previousLabel: { default: "Previous" },
|
|
139
|
+
nextLabel: { default: "Next" }
|
|
140
|
+
},
|
|
141
|
+
emits: ["update:page", "update:pageSize"],
|
|
142
|
+
setup(__props, { emit: __emit }) {
|
|
143
|
+
const visiblePages = computed(() => {
|
|
144
|
+
if (__props.totalPages <= __props.maxVisiblePages) {
|
|
145
|
+
return Array.from({ length: __props.totalPages }, (_, i) => i + 1);
|
|
146
|
+
}
|
|
147
|
+
const pages = [];
|
|
148
|
+
const sidePages = Math.floor((__props.maxVisiblePages - 3) / 2);
|
|
149
|
+
pages.push(1);
|
|
150
|
+
let rangeStart = Math.max(2, __props.currentPage - sidePages);
|
|
151
|
+
let rangeEnd = Math.min(__props.totalPages - 1, __props.currentPage + sidePages);
|
|
152
|
+
if (__props.currentPage <= sidePages + 2) {
|
|
153
|
+
rangeEnd = Math.min(__props.totalPages - 1, __props.maxVisiblePages - 2);
|
|
154
|
+
} else if (__props.currentPage >= __props.totalPages - sidePages - 1) {
|
|
155
|
+
rangeStart = Math.max(2, __props.totalPages - __props.maxVisiblePages + 3);
|
|
156
|
+
}
|
|
157
|
+
if (rangeStart > 2) {
|
|
158
|
+
pages.push("ellipsis-start");
|
|
159
|
+
}
|
|
160
|
+
for (let i = rangeStart; i <= rangeEnd; i++) {
|
|
161
|
+
pages.push(i);
|
|
162
|
+
}
|
|
163
|
+
if (rangeEnd < __props.totalPages - 1) {
|
|
164
|
+
pages.push("ellipsis-end");
|
|
165
|
+
}
|
|
166
|
+
if (__props.totalPages > 1) {
|
|
167
|
+
pages.push(__props.totalPages);
|
|
168
|
+
}
|
|
169
|
+
return pages;
|
|
170
|
+
});
|
|
171
|
+
const emit = __emit;
|
|
172
|
+
const changePage = (page) => {
|
|
173
|
+
if (page >= 1 && page <= __props.totalPages && !__props.loading) {
|
|
174
|
+
emit("update:page", page);
|
|
175
|
+
}
|
|
176
|
+
};
|
|
177
|
+
const changePageSize = (event) => {
|
|
178
|
+
const target = event.target;
|
|
179
|
+
emit("update:pageSize", Number(target.value));
|
|
180
|
+
};
|
|
181
|
+
return (_ctx, _cache) => {
|
|
182
|
+
return __props.totalPages > 1 ? (openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
183
|
+
createElementVNode("div", _hoisted_2$1, [
|
|
184
|
+
createElementVNode("div", _hoisted_3$1, toDisplayString(__props.pageLabel) + " " + toDisplayString(__props.currentPage) + " " + toDisplayString(__props.ofLabel) + " " + toDisplayString(__props.totalPages), 1),
|
|
185
|
+
__props.showPageSize ? (openBlock(), createElementBlock("div", _hoisted_4$1, [
|
|
186
|
+
createElementVNode("label", _hoisted_5, toDisplayString(__props.itemsPerPageLabel), 1),
|
|
187
|
+
createElementVNode("select", {
|
|
188
|
+
id: "page-size",
|
|
189
|
+
value: __props.pageSize,
|
|
190
|
+
class: "focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100",
|
|
191
|
+
onChange: changePageSize
|
|
192
|
+
}, [
|
|
193
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.pageSizeOptions, (size) => {
|
|
194
|
+
return openBlock(), createElementBlock("option", {
|
|
195
|
+
key: size,
|
|
196
|
+
value: size
|
|
197
|
+
}, toDisplayString(size), 9, _hoisted_7);
|
|
198
|
+
}), 128))
|
|
199
|
+
], 40, _hoisted_6)
|
|
200
|
+
])) : createCommentVNode("", true)
|
|
201
|
+
]),
|
|
202
|
+
createElementVNode("div", _hoisted_8, [
|
|
203
|
+
createElementVNode("button", {
|
|
204
|
+
disabled: __props.currentPage === 1 || __props.loading,
|
|
205
|
+
class: "focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700",
|
|
206
|
+
onClick: _cache[0] || (_cache[0] = ($event) => changePage(__props.currentPage - 1))
|
|
207
|
+
}, [
|
|
208
|
+
createVNode(unref(Icon), {
|
|
209
|
+
class: "size-4",
|
|
210
|
+
icon: "lucide:chevron-left"
|
|
211
|
+
}),
|
|
212
|
+
createElementVNode("span", _hoisted_10, toDisplayString(__props.previousLabel), 1)
|
|
213
|
+
], 8, _hoisted_9),
|
|
214
|
+
__props.showPageNumbers ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(visiblePages.value, (page) => {
|
|
215
|
+
return openBlock(), createElementBlock(Fragment, { key: page }, [
|
|
216
|
+
page === "ellipsis-start" || page === "ellipsis-end" ? (openBlock(), createElementBlock("span", _hoisted_11, " … ")) : (openBlock(), createElementBlock("button", {
|
|
217
|
+
key: 1,
|
|
218
|
+
disabled: __props.loading,
|
|
219
|
+
class: normalizeClass([
|
|
220
|
+
"min-w-[40px] px-3 py-2 text-sm font-medium rounded-lg border transition-colors",
|
|
221
|
+
page === __props.currentPage ? "bg-primary-600 text-white border-primary-600 dark:bg-primary-500 dark:border-primary-500" : "bg-white text-gray-700 border-gray-300 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-200 dark:border-gray-600 dark:hover:bg-gray-700",
|
|
222
|
+
__props.loading ? "cursor-not-allowed opacity-50" : ""
|
|
223
|
+
]),
|
|
224
|
+
onClick: ($event) => changePage(page)
|
|
225
|
+
}, toDisplayString(page), 11, _hoisted_12))
|
|
226
|
+
], 64);
|
|
227
|
+
}), 128)) : createCommentVNode("", true),
|
|
228
|
+
createElementVNode("button", {
|
|
229
|
+
disabled: __props.currentPage === __props.totalPages || __props.loading,
|
|
230
|
+
class: "focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700",
|
|
231
|
+
onClick: _cache[1] || (_cache[1] = ($event) => changePage(__props.currentPage + 1))
|
|
232
|
+
}, [
|
|
233
|
+
createElementVNode("span", _hoisted_14, toDisplayString(__props.nextLabel), 1),
|
|
234
|
+
createVNode(unref(Icon), {
|
|
235
|
+
class: "size-4",
|
|
236
|
+
icon: "lucide:chevron-right"
|
|
237
|
+
})
|
|
238
|
+
], 8, _hoisted_13)
|
|
239
|
+
])
|
|
240
|
+
])) : createCommentVNode("", true);
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
});
|
|
244
|
+
const _hoisted_1 = {
|
|
245
|
+
class: "divide-y divide-gray-200 dark:divide-gray-700",
|
|
246
|
+
"aria-hidden": "true"
|
|
247
|
+
};
|
|
248
|
+
const _hoisted_2 = {
|
|
249
|
+
key: 0,
|
|
250
|
+
class: "shrink-0 size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
251
|
+
};
|
|
252
|
+
const _hoisted_3 = { class: "flex-1 min-w-0 space-y-2" };
|
|
253
|
+
const _hoisted_4 = {
|
|
254
|
+
key: 1,
|
|
255
|
+
class: "shrink-0 size-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
256
|
+
};
|
|
257
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
258
|
+
__name: "ListSkeleton",
|
|
259
|
+
props: {
|
|
260
|
+
items: { default: 5 },
|
|
261
|
+
showAvatar: { type: Boolean, default: true },
|
|
262
|
+
showSecondary: { type: Boolean, default: true },
|
|
263
|
+
showAction: { type: Boolean, default: false }
|
|
264
|
+
},
|
|
265
|
+
setup(__props) {
|
|
266
|
+
return (_ctx, _cache) => {
|
|
267
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
268
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
|
|
269
|
+
return openBlock(), createElementBlock("div", {
|
|
270
|
+
key: item,
|
|
271
|
+
class: "flex items-center gap-4 py-4 px-4"
|
|
272
|
+
}, [
|
|
273
|
+
__props.showAvatar ? (openBlock(), createElementBlock("div", _hoisted_2)) : createCommentVNode("", true),
|
|
274
|
+
createElementVNode("div", _hoisted_3, [
|
|
275
|
+
createElementVNode("div", {
|
|
276
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
277
|
+
style: normalizeStyle({ width: `${60 + Math.random() * 30}%` })
|
|
278
|
+
}, null, 4),
|
|
279
|
+
__props.showSecondary ? (openBlock(), createElementBlock("div", {
|
|
280
|
+
key: 0,
|
|
281
|
+
class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
282
|
+
style: normalizeStyle({ width: `${40 + Math.random() * 20}%` })
|
|
283
|
+
}, null, 4)) : createCommentVNode("", true)
|
|
284
|
+
]),
|
|
285
|
+
__props.showAction ? (openBlock(), createElementBlock("div", _hoisted_4)) : createCommentVNode("", true)
|
|
286
|
+
]);
|
|
287
|
+
}), 128))
|
|
288
|
+
]);
|
|
289
|
+
};
|
|
290
|
+
}
|
|
291
|
+
});
|
|
292
|
+
export {
|
|
293
|
+
_sfc_main$1 as _,
|
|
294
|
+
_sfc_main$2 as a,
|
|
295
|
+
_sfc_main$3 as b,
|
|
296
|
+
_sfc_main as c
|
|
297
|
+
};
|
|
298
|
+
//# sourceMappingURL=ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ListSkeleton.vue_vue_type_script_setup_true_lang-BHopJ9RG.js","sources":["../src/components/feedback/CardSkeleton.vue","../src/components/feedback/TableSkeleton.vue","../src/components/feedback/PaginationControls.vue","../src/components/feedback/ListSkeleton.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nwithDefaults(\r\n defineProps<{\r\n /** Show avatar/icon placeholder */\r\n showAvatar?: boolean\r\n /** Number of text lines */\r\n lines?: number\r\n /** Show action buttons */\r\n showActions?: boolean\r\n }>(),\r\n {\r\n showAvatar: false,\r\n lines: 3,\r\n showActions: false,\r\n },\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"bg-white dark:bg-gray-900 rounded-lg shadow-md p-4 space-y-4\" aria-hidden=\"true\">\r\n <!-- Header with avatar -->\r\n <div v-if=\"showAvatar\" class=\"flex items-center gap-3\">\r\n <div class=\"size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse\" />\r\n <div class=\"flex-1 space-y-2\">\r\n <div class=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/2\" />\r\n <div class=\"h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/3\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Content lines -->\r\n <div class=\"space-y-2\">\r\n <div\r\n v-for=\"line in lines\"\r\n :key=\"line\"\r\n class=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\"\r\n :style=\"{ width: line === lines ? '60%' : '100%' }\"\r\n />\r\n </div>\r\n\r\n <!-- Actions -->\r\n <div v-if=\"showActions\" class=\"flex justify-end gap-2 pt-2\">\r\n <div class=\"h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\r\n <div class=\"h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\" />\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nwithDefaults(\r\n defineProps<{\r\n /** Number of rows */\r\n rows?: number\r\n /** Number of columns */\r\n columns?: number\r\n /** Show header */\r\n showHeader?: boolean\r\n }>(),\r\n {\r\n rows: 5,\r\n columns: 4,\r\n showHeader: true,\r\n },\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"w-full\" aria-hidden=\"true\">\r\n <!-- Header -->\r\n <div\r\n v-if=\"showHeader\"\r\n class=\"flex gap-4 px-4 py-3 border-b border-gray-200 dark:border-gray-700\"\r\n >\r\n <div\r\n v-for=\"col in columns\"\r\n :key=\"`header-${col}`\"\r\n class=\"flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\"\r\n :style=\"{ maxWidth: col === 1 ? '30%' : '20%' }\"\r\n />\r\n </div>\r\n <!-- Rows -->\r\n <div\r\n v-for=\"row in rows\"\r\n :key=\"`row-${row}`\"\r\n class=\"flex items-center gap-4 px-4 py-4 border-b border-gray-100 dark:border-gray-800\"\r\n >\r\n <div\r\n v-for=\"col in columns\"\r\n :key=\"`cell-${row}-${col}`\"\r\n class=\"flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\"\r\n :style=\"{\r\n maxWidth: col === 1 ? '40%' : col === columns ? '15%' : '25%',\r\n opacity: 1 - (row * 0.1)\r\n }\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nconst {\r\n currentPage,\r\n totalPages,\r\n loading = false,\r\n pageSize = 10,\r\n pageSizeOptions = [10, 20, 50, 100],\r\n showPageSize = true,\r\n showPageNumbers = true,\r\n maxVisiblePages = 7,\r\n pageLabel = 'Page',\r\n ofLabel = 'of',\r\n itemsPerPageLabel = 'Items per page:',\r\n previousLabel = 'Previous',\r\n nextLabel = 'Next',\r\n} = defineProps<{\r\n currentPage: number\r\n totalPages: number\r\n loading?: boolean\r\n pageSize?: number\r\n pageSizeOptions?: number[]\r\n showPageSize?: boolean\r\n showPageNumbers?: boolean\r\n maxVisiblePages?: number\r\n pageLabel?: string\r\n ofLabel?: string\r\n itemsPerPageLabel?: string\r\n previousLabel?: string\r\n nextLabel?: string\r\n}>()\r\n\r\ntype PageItem = number | 'ellipsis-start' | 'ellipsis-end'\r\n\r\nconst visiblePages = computed<PageItem[]>(() => {\r\n if (totalPages <= maxVisiblePages) {\r\n return Array.from({ length: totalPages }, (_, i) => i + 1)\r\n }\r\n\r\n const pages: PageItem[] = []\r\n const sidePages = Math.floor((maxVisiblePages - 3) / 2)\r\n\r\n // Always show first page\r\n pages.push(1)\r\n\r\n // Calculate range around current page\r\n let rangeStart = Math.max(2, currentPage - sidePages)\r\n let rangeEnd = Math.min(totalPages - 1, currentPage + sidePages)\r\n\r\n // Adjust range to show more pages on one side if near edges\r\n if (currentPage <= sidePages + 2) {\r\n rangeEnd = Math.min(totalPages - 1, maxVisiblePages - 2)\r\n } else if (currentPage >= totalPages - sidePages - 1) {\r\n rangeStart = Math.max(2, totalPages - maxVisiblePages + 3)\r\n }\r\n\r\n // Add ellipsis or pages after first page\r\n if (rangeStart > 2) {\r\n pages.push('ellipsis-start')\r\n }\r\n\r\n // Add range pages\r\n for (let i = rangeStart; i <= rangeEnd; i++) {\r\n pages.push(i)\r\n }\r\n\r\n // Add ellipsis or pages before last page\r\n if (rangeEnd < totalPages - 1) {\r\n pages.push('ellipsis-end')\r\n }\r\n\r\n // Always show last page\r\n if (totalPages > 1) {\r\n pages.push(totalPages)\r\n }\r\n\r\n return pages\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:page': [page: number]\r\n 'update:pageSize': [size: number]\r\n}>()\r\n\r\nconst changePage = (page: number) => {\r\n if (page >= 1 && page <= totalPages && !loading) {\r\n emit('update:page', page)\r\n }\r\n}\r\n\r\nconst changePageSize = (event: Event) => {\r\n const target = event.target as HTMLSelectElement\r\n emit('update:pageSize', Number(target.value))\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n v-if=\"totalPages > 1\"\r\n class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700\"\r\n >\r\n <!-- Info and page size -->\r\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4\">\r\n <div class=\"text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left\">\r\n {{ pageLabel }} {{ currentPage }} {{ ofLabel }} {{ totalPages }}\r\n </div>\r\n <div\r\n v-if=\"showPageSize\"\r\n class=\"flex items-center justify-center sm:justify-start gap-2\"\r\n >\r\n <label\r\n class=\"text-sm text-gray-600 dark:text-gray-400 hidden sm:inline\"\r\n for=\"page-size\"\r\n >\r\n {{ itemsPerPageLabel }}\r\n </label>\r\n <select\r\n id=\"page-size\"\r\n :value=\"pageSize\"\r\n class=\"focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\r\n @change=\"changePageSize\"\r\n >\r\n <option\r\n v-for=\"size in pageSizeOptions\"\r\n :key=\"size\"\r\n :value=\"size\"\r\n >\r\n {{ size }}\r\n </option>\r\n </select>\r\n </div>\r\n </div>\r\n\r\n <!-- Navigation buttons -->\r\n <div class=\"flex justify-center sm:justify-end items-center gap-1\">\r\n <!-- Previous button -->\r\n <button\r\n :disabled=\"currentPage === 1 || loading\"\r\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\r\n @click=\"changePage(currentPage - 1)\"\r\n >\r\n <Icon\r\n class=\"size-4\"\r\n icon=\"lucide:chevron-left\"\r\n />\r\n <span class=\"hidden sm:inline\">{{ previousLabel }}</span>\r\n </button>\r\n\r\n <!-- Page numbers -->\r\n <template v-if=\"showPageNumbers\">\r\n <template\r\n v-for=\"page in visiblePages\"\r\n :key=\"page\"\r\n >\r\n <!-- Ellipsis -->\r\n <span\r\n v-if=\"page === 'ellipsis-start' || page === 'ellipsis-end'\"\r\n class=\"px-2 py-2 text-sm text-gray-500 dark:text-gray-400\"\r\n >\r\n …\r\n </span>\r\n <!-- Page number button -->\r\n <button\r\n v-else\r\n :disabled=\"loading\"\r\n :class=\"[\r\n 'min-w-[40px] px-3 py-2 text-sm font-medium rounded-lg border transition-colors',\r\n page === currentPage\r\n ? 'bg-primary-600 text-white border-primary-600 dark:bg-primary-500 dark:border-primary-500'\r\n : 'bg-white text-gray-700 border-gray-300 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-200 dark:border-gray-600 dark:hover:bg-gray-700',\r\n loading ? 'cursor-not-allowed opacity-50' : ''\r\n ]\"\r\n @click=\"changePage(page)\"\r\n >\r\n {{ page }}\r\n </button>\r\n </template>\r\n </template>\r\n\r\n <!-- Next button -->\r\n <button\r\n :disabled=\"currentPage === totalPages || loading\"\r\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\r\n @click=\"changePage(currentPage + 1)\"\r\n >\r\n <span class=\"hidden sm:inline\">{{ nextLabel }}</span>\r\n <Icon\r\n class=\"size-4\"\r\n icon=\"lucide:chevron-right\"\r\n />\r\n </button>\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nwithDefaults(\r\n defineProps<{\r\n /** Number of items */\r\n items?: number\r\n /** Show avatar/icon placeholder */\r\n showAvatar?: boolean\r\n /** Show secondary text */\r\n showSecondary?: boolean\r\n /** Show action button */\r\n showAction?: boolean\r\n }>(),\r\n {\r\n items: 5,\r\n showAvatar: true,\r\n showSecondary: true,\r\n showAction: false,\r\n },\r\n)\r\n</script>\r\n\r\n<template>\r\n <div class=\"divide-y divide-gray-200 dark:divide-gray-700\" aria-hidden=\"true\">\r\n <div\r\n v-for=\"item in items\"\r\n :key=\"item\"\r\n class=\"flex items-center gap-4 py-4 px-4\"\r\n >\r\n <!-- Avatar -->\r\n <div\r\n v-if=\"showAvatar\"\r\n class=\"shrink-0 size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse\"\r\n />\r\n\r\n <!-- Content -->\r\n <div class=\"flex-1 min-w-0 space-y-2\">\r\n <div\r\n class=\"h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\"\r\n :style=\"{ width: `${60 + Math.random() * 30}%` }\"\r\n />\r\n <div\r\n v-if=\"showSecondary\"\r\n class=\"h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse\"\r\n :style=\"{ width: `${40 + Math.random() * 20}%` }\"\r\n />\r\n </div>\r\n\r\n <!-- Action -->\r\n <div\r\n v-if=\"showAction\"\r\n class=\"shrink-0 size-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_renderList","_normalizeStyle","_hoisted_4","_toDisplayString","_createVNode","_unref","_normalizeClass"],"mappings":"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"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const vue = require("vue");
|
|
3
|
+
const vue$1 = require("@iconify/vue");
|
|
4
|
+
const _hoisted_1$3 = {
|
|
5
|
+
class: "bg-white dark:bg-gray-900 rounded-lg shadow-md p-4 space-y-4",
|
|
6
|
+
"aria-hidden": "true"
|
|
7
|
+
};
|
|
8
|
+
const _hoisted_2$3 = {
|
|
9
|
+
key: 0,
|
|
10
|
+
class: "flex items-center gap-3"
|
|
11
|
+
};
|
|
12
|
+
const _hoisted_3$2 = { class: "space-y-2" };
|
|
13
|
+
const _hoisted_4$2 = {
|
|
14
|
+
key: 1,
|
|
15
|
+
class: "flex justify-end gap-2 pt-2"
|
|
16
|
+
};
|
|
17
|
+
const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
18
|
+
__name: "CardSkeleton",
|
|
19
|
+
props: {
|
|
20
|
+
showAvatar: { type: Boolean, default: false },
|
|
21
|
+
lines: { default: 3 },
|
|
22
|
+
showActions: { type: Boolean, default: false }
|
|
23
|
+
},
|
|
24
|
+
setup(__props) {
|
|
25
|
+
return (_ctx, _cache) => {
|
|
26
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$3, [
|
|
27
|
+
__props.showAvatar ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$3, [..._cache[0] || (_cache[0] = [
|
|
28
|
+
vue.createElementVNode("div", { class: "size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse" }, null, -1),
|
|
29
|
+
vue.createElementVNode("div", { class: "flex-1 space-y-2" }, [
|
|
30
|
+
vue.createElementVNode("div", { class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/2" }),
|
|
31
|
+
vue.createElementVNode("div", { class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/3" })
|
|
32
|
+
], -1)
|
|
33
|
+
])])) : vue.createCommentVNode("", true),
|
|
34
|
+
vue.createElementVNode("div", _hoisted_3$2, [
|
|
35
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.lines, (line) => {
|
|
36
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
37
|
+
key: line,
|
|
38
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
39
|
+
style: vue.normalizeStyle({ width: line === __props.lines ? "60%" : "100%" })
|
|
40
|
+
}, null, 4);
|
|
41
|
+
}), 128))
|
|
42
|
+
]),
|
|
43
|
+
__props.showActions ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$2, [..._cache[1] || (_cache[1] = [
|
|
44
|
+
vue.createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1),
|
|
45
|
+
vue.createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1)
|
|
46
|
+
])])) : vue.createCommentVNode("", true)
|
|
47
|
+
]);
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
});
|
|
51
|
+
const _hoisted_1$2 = {
|
|
52
|
+
class: "w-full",
|
|
53
|
+
"aria-hidden": "true"
|
|
54
|
+
};
|
|
55
|
+
const _hoisted_2$2 = {
|
|
56
|
+
key: 0,
|
|
57
|
+
class: "flex gap-4 px-4 py-3 border-b border-gray-200 dark:border-gray-700"
|
|
58
|
+
};
|
|
59
|
+
const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
60
|
+
__name: "TableSkeleton",
|
|
61
|
+
props: {
|
|
62
|
+
rows: { default: 5 },
|
|
63
|
+
columns: { default: 4 },
|
|
64
|
+
showHeader: { type: Boolean, default: true }
|
|
65
|
+
},
|
|
66
|
+
setup(__props) {
|
|
67
|
+
return (_ctx, _cache) => {
|
|
68
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [
|
|
69
|
+
__props.showHeader ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2, [
|
|
70
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (col) => {
|
|
71
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
72
|
+
key: `header-${col}`,
|
|
73
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
74
|
+
style: vue.normalizeStyle({ maxWidth: col === 1 ? "30%" : "20%" })
|
|
75
|
+
}, null, 4);
|
|
76
|
+
}), 128))
|
|
77
|
+
])) : vue.createCommentVNode("", true),
|
|
78
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.rows, (row) => {
|
|
79
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
80
|
+
key: `row-${row}`,
|
|
81
|
+
class: "flex items-center gap-4 px-4 py-4 border-b border-gray-100 dark:border-gray-800"
|
|
82
|
+
}, [
|
|
83
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (col) => {
|
|
84
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
85
|
+
key: `cell-${row}-${col}`,
|
|
86
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
87
|
+
style: vue.normalizeStyle({
|
|
88
|
+
maxWidth: col === 1 ? "40%" : col === __props.columns ? "15%" : "25%",
|
|
89
|
+
opacity: 1 - row * 0.1
|
|
90
|
+
})
|
|
91
|
+
}, null, 4);
|
|
92
|
+
}), 128))
|
|
93
|
+
]);
|
|
94
|
+
}), 128))
|
|
95
|
+
]);
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
const _hoisted_1$1 = {
|
|
100
|
+
key: 0,
|
|
101
|
+
class: "flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700"
|
|
102
|
+
};
|
|
103
|
+
const _hoisted_2$1 = { class: "flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4" };
|
|
104
|
+
const _hoisted_3$1 = { class: "text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left" };
|
|
105
|
+
const _hoisted_4$1 = {
|
|
106
|
+
key: 0,
|
|
107
|
+
class: "flex items-center justify-center sm:justify-start gap-2"
|
|
108
|
+
};
|
|
109
|
+
const _hoisted_5 = {
|
|
110
|
+
class: "text-sm text-gray-600 dark:text-gray-400 hidden sm:inline",
|
|
111
|
+
for: "page-size"
|
|
112
|
+
};
|
|
113
|
+
const _hoisted_6 = ["value"];
|
|
114
|
+
const _hoisted_7 = ["value"];
|
|
115
|
+
const _hoisted_8 = { class: "flex justify-center sm:justify-end items-center gap-1" };
|
|
116
|
+
const _hoisted_9 = ["disabled"];
|
|
117
|
+
const _hoisted_10 = { class: "hidden sm:inline" };
|
|
118
|
+
const _hoisted_11 = {
|
|
119
|
+
key: 0,
|
|
120
|
+
class: "px-2 py-2 text-sm text-gray-500 dark:text-gray-400"
|
|
121
|
+
};
|
|
122
|
+
const _hoisted_12 = ["disabled", "onClick"];
|
|
123
|
+
const _hoisted_13 = ["disabled"];
|
|
124
|
+
const _hoisted_14 = { class: "hidden sm:inline" };
|
|
125
|
+
const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
126
|
+
__name: "PaginationControls",
|
|
127
|
+
props: {
|
|
128
|
+
currentPage: {},
|
|
129
|
+
totalPages: {},
|
|
130
|
+
loading: { type: Boolean, default: false },
|
|
131
|
+
pageSize: { default: 10 },
|
|
132
|
+
pageSizeOptions: { default: () => [10, 20, 50, 100] },
|
|
133
|
+
showPageSize: { type: Boolean, default: true },
|
|
134
|
+
showPageNumbers: { type: Boolean, default: true },
|
|
135
|
+
maxVisiblePages: { default: 7 },
|
|
136
|
+
pageLabel: { default: "Page" },
|
|
137
|
+
ofLabel: { default: "of" },
|
|
138
|
+
itemsPerPageLabel: { default: "Items per page:" },
|
|
139
|
+
previousLabel: { default: "Previous" },
|
|
140
|
+
nextLabel: { default: "Next" }
|
|
141
|
+
},
|
|
142
|
+
emits: ["update:page", "update:pageSize"],
|
|
143
|
+
setup(__props, { emit: __emit }) {
|
|
144
|
+
const visiblePages = vue.computed(() => {
|
|
145
|
+
if (__props.totalPages <= __props.maxVisiblePages) {
|
|
146
|
+
return Array.from({ length: __props.totalPages }, (_, i) => i + 1);
|
|
147
|
+
}
|
|
148
|
+
const pages = [];
|
|
149
|
+
const sidePages = Math.floor((__props.maxVisiblePages - 3) / 2);
|
|
150
|
+
pages.push(1);
|
|
151
|
+
let rangeStart = Math.max(2, __props.currentPage - sidePages);
|
|
152
|
+
let rangeEnd = Math.min(__props.totalPages - 1, __props.currentPage + sidePages);
|
|
153
|
+
if (__props.currentPage <= sidePages + 2) {
|
|
154
|
+
rangeEnd = Math.min(__props.totalPages - 1, __props.maxVisiblePages - 2);
|
|
155
|
+
} else if (__props.currentPage >= __props.totalPages - sidePages - 1) {
|
|
156
|
+
rangeStart = Math.max(2, __props.totalPages - __props.maxVisiblePages + 3);
|
|
157
|
+
}
|
|
158
|
+
if (rangeStart > 2) {
|
|
159
|
+
pages.push("ellipsis-start");
|
|
160
|
+
}
|
|
161
|
+
for (let i = rangeStart; i <= rangeEnd; i++) {
|
|
162
|
+
pages.push(i);
|
|
163
|
+
}
|
|
164
|
+
if (rangeEnd < __props.totalPages - 1) {
|
|
165
|
+
pages.push("ellipsis-end");
|
|
166
|
+
}
|
|
167
|
+
if (__props.totalPages > 1) {
|
|
168
|
+
pages.push(__props.totalPages);
|
|
169
|
+
}
|
|
170
|
+
return pages;
|
|
171
|
+
});
|
|
172
|
+
const emit = __emit;
|
|
173
|
+
const changePage = (page) => {
|
|
174
|
+
if (page >= 1 && page <= __props.totalPages && !__props.loading) {
|
|
175
|
+
emit("update:page", page);
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
const changePageSize = (event) => {
|
|
179
|
+
const target = event.target;
|
|
180
|
+
emit("update:pageSize", Number(target.value));
|
|
181
|
+
};
|
|
182
|
+
return (_ctx, _cache) => {
|
|
183
|
+
return __props.totalPages > 1 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
|
|
184
|
+
vue.createElementVNode("div", _hoisted_2$1, [
|
|
185
|
+
vue.createElementVNode("div", _hoisted_3$1, vue.toDisplayString(__props.pageLabel) + " " + vue.toDisplayString(__props.currentPage) + " " + vue.toDisplayString(__props.ofLabel) + " " + vue.toDisplayString(__props.totalPages), 1),
|
|
186
|
+
__props.showPageSize ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [
|
|
187
|
+
vue.createElementVNode("label", _hoisted_5, vue.toDisplayString(__props.itemsPerPageLabel), 1),
|
|
188
|
+
vue.createElementVNode("select", {
|
|
189
|
+
id: "page-size",
|
|
190
|
+
value: __props.pageSize,
|
|
191
|
+
class: "focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100",
|
|
192
|
+
onChange: changePageSize
|
|
193
|
+
}, [
|
|
194
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.pageSizeOptions, (size) => {
|
|
195
|
+
return vue.openBlock(), vue.createElementBlock("option", {
|
|
196
|
+
key: size,
|
|
197
|
+
value: size
|
|
198
|
+
}, vue.toDisplayString(size), 9, _hoisted_7);
|
|
199
|
+
}), 128))
|
|
200
|
+
], 40, _hoisted_6)
|
|
201
|
+
])) : vue.createCommentVNode("", true)
|
|
202
|
+
]),
|
|
203
|
+
vue.createElementVNode("div", _hoisted_8, [
|
|
204
|
+
vue.createElementVNode("button", {
|
|
205
|
+
disabled: __props.currentPage === 1 || __props.loading,
|
|
206
|
+
class: "focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700",
|
|
207
|
+
onClick: _cache[0] || (_cache[0] = ($event) => changePage(__props.currentPage - 1))
|
|
208
|
+
}, [
|
|
209
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
210
|
+
class: "size-4",
|
|
211
|
+
icon: "lucide:chevron-left"
|
|
212
|
+
}),
|
|
213
|
+
vue.createElementVNode("span", _hoisted_10, vue.toDisplayString(__props.previousLabel), 1)
|
|
214
|
+
], 8, _hoisted_9),
|
|
215
|
+
__props.showPageNumbers ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, { key: 0 }, vue.renderList(visiblePages.value, (page) => {
|
|
216
|
+
return vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: page }, [
|
|
217
|
+
page === "ellipsis-start" || page === "ellipsis-end" ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_11, " … ")) : (vue.openBlock(), vue.createElementBlock("button", {
|
|
218
|
+
key: 1,
|
|
219
|
+
disabled: __props.loading,
|
|
220
|
+
class: vue.normalizeClass([
|
|
221
|
+
"min-w-[40px] px-3 py-2 text-sm font-medium rounded-lg border transition-colors",
|
|
222
|
+
page === __props.currentPage ? "bg-primary-600 text-white border-primary-600 dark:bg-primary-500 dark:border-primary-500" : "bg-white text-gray-700 border-gray-300 hover:bg-gray-50 dark:bg-gray-800 dark:text-gray-200 dark:border-gray-600 dark:hover:bg-gray-700",
|
|
223
|
+
__props.loading ? "cursor-not-allowed opacity-50" : ""
|
|
224
|
+
]),
|
|
225
|
+
onClick: ($event) => changePage(page)
|
|
226
|
+
}, vue.toDisplayString(page), 11, _hoisted_12))
|
|
227
|
+
], 64);
|
|
228
|
+
}), 128)) : vue.createCommentVNode("", true),
|
|
229
|
+
vue.createElementVNode("button", {
|
|
230
|
+
disabled: __props.currentPage === __props.totalPages || __props.loading,
|
|
231
|
+
class: "focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700",
|
|
232
|
+
onClick: _cache[1] || (_cache[1] = ($event) => changePage(__props.currentPage + 1))
|
|
233
|
+
}, [
|
|
234
|
+
vue.createElementVNode("span", _hoisted_14, vue.toDisplayString(__props.nextLabel), 1),
|
|
235
|
+
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
236
|
+
class: "size-4",
|
|
237
|
+
icon: "lucide:chevron-right"
|
|
238
|
+
})
|
|
239
|
+
], 8, _hoisted_13)
|
|
240
|
+
])
|
|
241
|
+
])) : vue.createCommentVNode("", true);
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
});
|
|
245
|
+
const _hoisted_1 = {
|
|
246
|
+
class: "divide-y divide-gray-200 dark:divide-gray-700",
|
|
247
|
+
"aria-hidden": "true"
|
|
248
|
+
};
|
|
249
|
+
const _hoisted_2 = {
|
|
250
|
+
key: 0,
|
|
251
|
+
class: "shrink-0 size-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
252
|
+
};
|
|
253
|
+
const _hoisted_3 = { class: "flex-1 min-w-0 space-y-2" };
|
|
254
|
+
const _hoisted_4 = {
|
|
255
|
+
key: 1,
|
|
256
|
+
class: "shrink-0 size-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
257
|
+
};
|
|
258
|
+
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
259
|
+
__name: "ListSkeleton",
|
|
260
|
+
props: {
|
|
261
|
+
items: { default: 5 },
|
|
262
|
+
showAvatar: { type: Boolean, default: true },
|
|
263
|
+
showSecondary: { type: Boolean, default: true },
|
|
264
|
+
showAction: { type: Boolean, default: false }
|
|
265
|
+
},
|
|
266
|
+
setup(__props) {
|
|
267
|
+
return (_ctx, _cache) => {
|
|
268
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
269
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
|
|
270
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
271
|
+
key: item,
|
|
272
|
+
class: "flex items-center gap-4 py-4 px-4"
|
|
273
|
+
}, [
|
|
274
|
+
__props.showAvatar ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2)) : vue.createCommentVNode("", true),
|
|
275
|
+
vue.createElementVNode("div", _hoisted_3, [
|
|
276
|
+
vue.createElementVNode("div", {
|
|
277
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
278
|
+
style: vue.normalizeStyle({ width: `${60 + Math.random() * 30}%` })
|
|
279
|
+
}, null, 4),
|
|
280
|
+
__props.showSecondary ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
281
|
+
key: 0,
|
|
282
|
+
class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
283
|
+
style: vue.normalizeStyle({ width: `${40 + Math.random() * 20}%` })
|
|
284
|
+
}, null, 4)) : vue.createCommentVNode("", true)
|
|
285
|
+
]),
|
|
286
|
+
__props.showAction ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4)) : vue.createCommentVNode("", true)
|
|
287
|
+
]);
|
|
288
|
+
}), 128))
|
|
289
|
+
]);
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
});
|
|
293
|
+
exports._sfc_main = _sfc_main$1;
|
|
294
|
+
exports._sfc_main$1 = _sfc_main$2;
|
|
295
|
+
exports._sfc_main$2 = _sfc_main$3;
|
|
296
|
+
exports._sfc_main$3 = _sfc_main;
|
|
297
|
+
//# sourceMappingURL=ListSkeleton.vue_vue_type_script_setup_true_lang-Bo3HqgX0.cjs.map
|