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,134 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const vue = require("vue");
|
|
3
|
+
function useDarkMode(options = {}) {
|
|
4
|
+
const {
|
|
5
|
+
selector = "html",
|
|
6
|
+
attribute = "class",
|
|
7
|
+
storageKey = "dark-mode",
|
|
8
|
+
defaultValue = false
|
|
9
|
+
} = options;
|
|
10
|
+
const isDark = vue.ref(defaultValue);
|
|
11
|
+
const getInitialValue = () => {
|
|
12
|
+
if (typeof window === "undefined") return defaultValue;
|
|
13
|
+
const stored = localStorage.getItem(storageKey);
|
|
14
|
+
if (stored !== null) {
|
|
15
|
+
return stored === "true";
|
|
16
|
+
}
|
|
17
|
+
return window.matchMedia("(prefers-color-scheme: dark)").matches;
|
|
18
|
+
};
|
|
19
|
+
const updateDOM = (dark) => {
|
|
20
|
+
if (typeof document === "undefined") return;
|
|
21
|
+
const element = document.querySelector(selector);
|
|
22
|
+
if (!element) return;
|
|
23
|
+
if (attribute === "class") {
|
|
24
|
+
element.classList.toggle("dark", dark);
|
|
25
|
+
} else {
|
|
26
|
+
element.setAttribute(attribute, dark ? "dark" : "light");
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
const toggle = () => {
|
|
30
|
+
isDark.value = !isDark.value;
|
|
31
|
+
};
|
|
32
|
+
const set = (value) => {
|
|
33
|
+
isDark.value = value;
|
|
34
|
+
};
|
|
35
|
+
vue.watch(isDark, (newValue) => {
|
|
36
|
+
updateDOM(newValue);
|
|
37
|
+
if (typeof localStorage !== "undefined") {
|
|
38
|
+
localStorage.setItem(storageKey, String(newValue));
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
vue.onMounted(() => {
|
|
42
|
+
isDark.value = getInitialValue();
|
|
43
|
+
updateDOM(isDark.value);
|
|
44
|
+
});
|
|
45
|
+
return {
|
|
46
|
+
isDark,
|
|
47
|
+
toggle,
|
|
48
|
+
set
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
function usePagination(options) {
|
|
52
|
+
const {
|
|
53
|
+
items: itemsOption,
|
|
54
|
+
pageSize: initialPageSize = 10,
|
|
55
|
+
initialPage = 1
|
|
56
|
+
} = options;
|
|
57
|
+
const currentPage = vue.ref(initialPage);
|
|
58
|
+
const pageSize = vue.ref(initialPageSize);
|
|
59
|
+
const allItems = vue.computed(() => {
|
|
60
|
+
return "value" in itemsOption ? itemsOption.value : itemsOption;
|
|
61
|
+
});
|
|
62
|
+
const totalItems = vue.computed(() => allItems.value.length);
|
|
63
|
+
const totalPages = vue.computed(() => {
|
|
64
|
+
if (totalItems.value === 0) return 1;
|
|
65
|
+
return Math.ceil(totalItems.value / pageSize.value);
|
|
66
|
+
});
|
|
67
|
+
const startIndex = vue.computed(() => {
|
|
68
|
+
return (currentPage.value - 1) * pageSize.value;
|
|
69
|
+
});
|
|
70
|
+
const endIndex = vue.computed(() => {
|
|
71
|
+
return Math.min(startIndex.value + pageSize.value - 1, totalItems.value - 1);
|
|
72
|
+
});
|
|
73
|
+
const paginatedItems = vue.computed(() => {
|
|
74
|
+
const start = startIndex.value;
|
|
75
|
+
const end = start + pageSize.value;
|
|
76
|
+
return allItems.value.slice(start, end);
|
|
77
|
+
});
|
|
78
|
+
const hasPrevious = vue.computed(() => currentPage.value > 1);
|
|
79
|
+
const hasNext = vue.computed(() => currentPage.value < totalPages.value);
|
|
80
|
+
vue.watch(totalPages, (newTotalPages) => {
|
|
81
|
+
if (currentPage.value > newTotalPages) {
|
|
82
|
+
currentPage.value = Math.max(1, newTotalPages);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
const goToPage = (page) => {
|
|
86
|
+
const validPage = Math.max(1, Math.min(page, totalPages.value));
|
|
87
|
+
currentPage.value = validPage;
|
|
88
|
+
};
|
|
89
|
+
const nextPage = () => {
|
|
90
|
+
if (hasNext.value) {
|
|
91
|
+
currentPage.value++;
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
const previousPage = () => {
|
|
95
|
+
if (hasPrevious.value) {
|
|
96
|
+
currentPage.value--;
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
const firstPage = () => {
|
|
100
|
+
currentPage.value = 1;
|
|
101
|
+
};
|
|
102
|
+
const lastPage = () => {
|
|
103
|
+
currentPage.value = totalPages.value;
|
|
104
|
+
};
|
|
105
|
+
const setPageSize = (size) => {
|
|
106
|
+
pageSize.value = size;
|
|
107
|
+
currentPage.value = 1;
|
|
108
|
+
};
|
|
109
|
+
const reset = () => {
|
|
110
|
+
currentPage.value = initialPage;
|
|
111
|
+
pageSize.value = initialPageSize;
|
|
112
|
+
};
|
|
113
|
+
return {
|
|
114
|
+
currentPage,
|
|
115
|
+
pageSize,
|
|
116
|
+
totalPages,
|
|
117
|
+
totalItems,
|
|
118
|
+
paginatedItems,
|
|
119
|
+
startIndex,
|
|
120
|
+
endIndex,
|
|
121
|
+
hasPrevious,
|
|
122
|
+
hasNext,
|
|
123
|
+
goToPage,
|
|
124
|
+
nextPage,
|
|
125
|
+
previousPage,
|
|
126
|
+
firstPage,
|
|
127
|
+
lastPage,
|
|
128
|
+
setPageSize,
|
|
129
|
+
reset
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
exports.useDarkMode = useDarkMode;
|
|
133
|
+
exports.usePagination = usePagination;
|
|
134
|
+
//# sourceMappingURL=usePagination-gvvh1zqA.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePagination-gvvh1zqA.cjs","sources":["../src/composables/useDarkMode.ts","../src/composables/usePagination.ts"],"sourcesContent":["import { ref, watch, onMounted } from 'vue'\n\nexport interface DarkModeOptions {\n selector?: string\n attribute?: string\n storageKey?: string\n defaultValue?: boolean\n}\n\n/**\n * Composable for managing dark mode state\n */\nexport function useDarkMode(options: DarkModeOptions = {}) {\n const {\n selector = 'html',\n attribute = 'class',\n storageKey = 'dark-mode',\n defaultValue = false,\n } = options\n\n const isDark = ref(defaultValue)\n\n const getInitialValue = (): boolean => {\n if (typeof window === 'undefined') return defaultValue\n\n const stored = localStorage.getItem(storageKey)\n if (stored !== null) {\n return stored === 'true'\n }\n\n return window.matchMedia('(prefers-color-scheme: dark)').matches\n }\n\n const updateDOM = (dark: boolean) => {\n if (typeof document === 'undefined') return\n\n const element = document.querySelector(selector)\n if (!element) return\n\n if (attribute === 'class') {\n element.classList.toggle('dark', dark)\n } else {\n element.setAttribute(attribute, dark ? 'dark' : 'light')\n }\n }\n\n const toggle = () => {\n isDark.value = !isDark.value\n }\n\n const set = (value: boolean) => {\n isDark.value = value\n }\n\n watch(isDark, (newValue) => {\n updateDOM(newValue)\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(storageKey, String(newValue))\n }\n })\n\n onMounted(() => {\n isDark.value = getInitialValue()\n updateDOM(isDark.value)\n })\n\n return {\n isDark,\n toggle,\n set,\n }\n}\n","import { ref, computed, watch, type Ref, type ComputedRef } from 'vue'\r\n\r\nexport interface UsePaginationOptions<T> {\r\n /** The full array of items to paginate */\r\n items: T[] | Ref<T[]>\r\n /** Initial page size */\r\n pageSize?: number\r\n /** Initial page (1-indexed) */\r\n initialPage?: number\r\n}\r\n\r\nexport interface UsePaginationReturn<T> {\r\n /** Current page number (1-indexed) */\r\n currentPage: Ref<number>\r\n /** Current page size */\r\n pageSize: Ref<number>\r\n /** Total number of pages */\r\n totalPages: ComputedRef<number>\r\n /** Total number of items */\r\n totalItems: ComputedRef<number>\r\n /** Items for the current page */\r\n paginatedItems: ComputedRef<T[]>\r\n /** Index of the first item on current page (0-indexed) */\r\n startIndex: ComputedRef<number>\r\n /** Index of the last item on current page (0-indexed) */\r\n endIndex: ComputedRef<number>\r\n /** Whether there is a previous page */\r\n hasPrevious: ComputedRef<boolean>\r\n /** Whether there is a next page */\r\n hasNext: ComputedRef<boolean>\r\n /** Go to a specific page */\r\n goToPage: (page: number) => void\r\n /** Go to the next page */\r\n nextPage: () => void\r\n /** Go to the previous page */\r\n previousPage: () => void\r\n /** Go to the first page */\r\n firstPage: () => void\r\n /** Go to the last page */\r\n lastPage: () => void\r\n /** Set page size (resets to page 1) */\r\n setPageSize: (size: number) => void\r\n /** Reset to initial state */\r\n reset: () => void\r\n}\r\n\r\nexport function usePagination<T>(\r\n options: UsePaginationOptions<T>\r\n): UsePaginationReturn<T> {\r\n const {\r\n items: itemsOption,\r\n pageSize: initialPageSize = 10,\r\n initialPage = 1,\r\n } = options\r\n\r\n const currentPage = ref(initialPage)\r\n const pageSize = ref(initialPageSize)\r\n\r\n const allItems = computed(() => {\r\n return 'value' in itemsOption ? itemsOption.value : itemsOption\r\n })\r\n\r\n const totalItems = computed(() => allItems.value.length)\r\n\r\n const totalPages = computed(() => {\r\n if (totalItems.value === 0) return 1\r\n return Math.ceil(totalItems.value / pageSize.value)\r\n })\r\n\r\n const startIndex = computed(() => {\r\n return (currentPage.value - 1) * pageSize.value\r\n })\r\n\r\n const endIndex = computed(() => {\r\n return Math.min(startIndex.value + pageSize.value - 1, totalItems.value - 1)\r\n })\r\n\r\n const paginatedItems = computed(() => {\r\n const start = startIndex.value\r\n const end = start + pageSize.value\r\n return allItems.value.slice(start, end)\r\n })\r\n\r\n const hasPrevious = computed(() => currentPage.value > 1)\r\n const hasNext = computed(() => currentPage.value < totalPages.value)\r\n\r\n // Ensure current page is valid when items change\r\n watch(totalPages, (newTotalPages) => {\r\n if (currentPage.value > newTotalPages) {\r\n currentPage.value = Math.max(1, newTotalPages)\r\n }\r\n })\r\n\r\n const goToPage = (page: number) => {\r\n const validPage = Math.max(1, Math.min(page, totalPages.value))\r\n currentPage.value = validPage\r\n }\r\n\r\n const nextPage = () => {\r\n if (hasNext.value) {\r\n currentPage.value++\r\n }\r\n }\r\n\r\n const previousPage = () => {\r\n if (hasPrevious.value) {\r\n currentPage.value--\r\n }\r\n }\r\n\r\n const firstPage = () => {\r\n currentPage.value = 1\r\n }\r\n\r\n const lastPage = () => {\r\n currentPage.value = totalPages.value\r\n }\r\n\r\n const setPageSize = (size: number) => {\r\n pageSize.value = size\r\n currentPage.value = 1 // Reset to first page when changing page size\r\n }\r\n\r\n const reset = () => {\r\n currentPage.value = initialPage\r\n pageSize.value = initialPageSize\r\n }\r\n\r\n return {\r\n currentPage,\r\n pageSize,\r\n totalPages,\r\n totalItems,\r\n paginatedItems,\r\n startIndex,\r\n endIndex,\r\n hasPrevious,\r\n hasNext,\r\n goToPage,\r\n nextPage,\r\n previousPage,\r\n firstPage,\r\n lastPage,\r\n setPageSize,\r\n reset,\r\n }\r\n}\r\n"],"names":["ref","watch","onMounted","computed"],"mappings":";;AAYO,SAAS,YAAY,UAA2B,IAAI;AACzD,QAAM;AAAA,IACJ,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,aAAa;AAAA,IACb,eAAe;AAAA,EAAA,IACb;AAEJ,QAAM,SAASA,IAAAA,IAAI,YAAY;AAE/B,QAAM,kBAAkB,MAAe;AACrC,QAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,UAAM,SAAS,aAAa,QAAQ,UAAU;AAC9C,QAAI,WAAW,MAAM;AACnB,aAAO,WAAW;AAAA,IACpB;AAEA,WAAO,OAAO,WAAW,8BAA8B,EAAE;AAAA,EAC3D;AAEA,QAAM,YAAY,CAAC,SAAkB;AACnC,QAAI,OAAO,aAAa,YAAa;AAErC,UAAM,UAAU,SAAS,cAAc,QAAQ;AAC/C,QAAI,CAAC,QAAS;AAEd,QAAI,cAAc,SAAS;AACzB,cAAQ,UAAU,OAAO,QAAQ,IAAI;AAAA,IACvC,OAAO;AACL,cAAQ,aAAa,WAAW,OAAO,SAAS,OAAO;AAAA,IACzD;AAAA,EACF;AAEA,QAAM,SAAS,MAAM;AACnB,WAAO,QAAQ,CAAC,OAAO;AAAA,EACzB;AAEA,QAAM,MAAM,CAAC,UAAmB;AAC9B,WAAO,QAAQ;AAAA,EACjB;AAEAC,YAAM,QAAQ,CAAC,aAAa;AAC1B,cAAU,QAAQ;AAClB,QAAI,OAAO,iBAAiB,aAAa;AACvC,mBAAa,QAAQ,YAAY,OAAO,QAAQ,CAAC;AAAA,IACnD;AAAA,EACF,CAAC;AAEDC,MAAAA,UAAU,MAAM;AACd,WAAO,QAAQ,gBAAA;AACf,cAAU,OAAO,KAAK;AAAA,EACxB,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;ACzBO,SAAS,cACd,SACwB;AACxB,QAAM;AAAA,IACJ,OAAO;AAAA,IACP,UAAU,kBAAkB;AAAA,IAC5B,cAAc;AAAA,EAAA,IACZ;AAEJ,QAAM,cAAcF,IAAAA,IAAI,WAAW;AACnC,QAAM,WAAWA,IAAAA,IAAI,eAAe;AAEpC,QAAM,WAAWG,IAAAA,SAAS,MAAM;AAC9B,WAAO,WAAW,cAAc,YAAY,QAAQ;AAAA,EACtD,CAAC;AAED,QAAM,aAAaA,IAAAA,SAAS,MAAM,SAAS,MAAM,MAAM;AAEvD,QAAM,aAAaA,IAAAA,SAAS,MAAM;AAChC,QAAI,WAAW,UAAU,EAAG,QAAO;AACnC,WAAO,KAAK,KAAK,WAAW,QAAQ,SAAS,KAAK;AAAA,EACpD,CAAC;AAED,QAAM,aAAaA,IAAAA,SAAS,MAAM;AAChC,YAAQ,YAAY,QAAQ,KAAK,SAAS;AAAA,EAC5C,CAAC;AAED,QAAM,WAAWA,IAAAA,SAAS,MAAM;AAC9B,WAAO,KAAK,IAAI,WAAW,QAAQ,SAAS,QAAQ,GAAG,WAAW,QAAQ,CAAC;AAAA,EAC7E,CAAC;AAED,QAAM,iBAAiBA,IAAAA,SAAS,MAAM;AACpC,UAAM,QAAQ,WAAW;AACzB,UAAM,MAAM,QAAQ,SAAS;AAC7B,WAAO,SAAS,MAAM,MAAM,OAAO,GAAG;AAAA,EACxC,CAAC;AAED,QAAM,cAAcA,IAAAA,SAAS,MAAM,YAAY,QAAQ,CAAC;AACxD,QAAM,UAAUA,IAAAA,SAAS,MAAM,YAAY,QAAQ,WAAW,KAAK;AAGnEF,YAAM,YAAY,CAAC,kBAAkB;AACnC,QAAI,YAAY,QAAQ,eAAe;AACrC,kBAAY,QAAQ,KAAK,IAAI,GAAG,aAAa;AAAA,IAC/C;AAAA,EACF,CAAC;AAED,QAAM,WAAW,CAAC,SAAiB;AACjC,UAAM,YAAY,KAAK,IAAI,GAAG,KAAK,IAAI,MAAM,WAAW,KAAK,CAAC;AAC9D,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,WAAW,MAAM;AACrB,QAAI,QAAQ,OAAO;AACjB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,eAAe,MAAM;AACzB,QAAI,YAAY,OAAO;AACrB,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM,YAAY,MAAM;AACtB,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,WAAW,MAAM;AACrB,gBAAY,QAAQ,WAAW;AAAA,EACjC;AAEA,QAAM,cAAc,CAAC,SAAiB;AACpC,aAAS,QAAQ;AACjB,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,QAAQ,MAAM;AAClB,gBAAY,QAAQ;AACpB,aAAS,QAAQ;AAAA,EACnB;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;;;"}
|