cisse-vue-ui 0.5.17 → 0.5.22
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 -666
- package/dist/Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js +236 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js.map +1 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs +235 -0
- package/dist/Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs.map +1 -0
- package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-y3zIxWfI.js → Combobox.vue_vue_type_script_setup_true_lang-DhcLb6DX.js} +408 -185
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-DhcLb6DX.js.map +1 -0
- package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-Cv1OwT9S.cjs → Combobox.vue_vue_type_script_setup_true_lang-FdUrjmSG.cjs} +435 -212
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-FdUrjmSG.cjs.map +1 -0
- package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-Bech-H58.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-CNucAMQg.js} +226 -248
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CNucAMQg.js.map +1 -0
- package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-CHoagJ0-.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-DXb9wQQv.cjs} +225 -247
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DXb9wQQv.cjs.map +1 -0
- package/dist/{Timeline.vue_vue_type_script_setup_true_lang-CuPF4MPe.js → DarkModeToggle.vue_vue_type_script_setup_true_lang-43fxlbro.js} +209 -415
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-43fxlbro.js.map +1 -0
- package/dist/{Timeline.vue_vue_type_script_setup_true_lang-CqeiZOID.cjs → DarkModeToggle.vue_vue_type_script_setup_true_lang-BoB48313.cjs} +234 -440
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-BoB48313.cjs.map +1 -0
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-C3pr8BwC.js.map +1 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DKxcVBKu.cjs.map +1 -1
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-D22uNeS1.cjs.map +1 -1
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js.map +1 -1
- package/dist/cisse-vue-ui.css +51 -51
- package/dist/components/core/AccordionItem.stories.d.ts +10 -0
- package/dist/components/core/Avatar.vue.d.ts +1 -1
- package/dist/components/core/Button.vue.d.ts +1 -1
- package/dist/components/core/CardComponent.stories.d.ts +3 -0
- package/dist/components/core/CardComponent.vue.d.ts +15 -2
- package/dist/components/core/DarkModeToggle.stories.d.ts +15 -0
- package/dist/components/core/DarkModeToggle.test.d.ts +1 -0
- package/dist/components/core/DarkModeToggle.vue.d.ts +21 -0
- package/dist/components/core/MobileList.stories.d.ts +13 -0
- package/dist/components/core/MobileList.vue.d.ts +6 -0
- package/dist/components/core/ResponsiveList.stories.d.ts +15 -0
- package/dist/components/core/ResponsiveList.vue.d.ts +6 -0
- package/dist/components/core/TabPanel.stories.d.ts +8 -0
- package/dist/components/core/TableAction.stories.d.ts +14 -0
- package/dist/components/core/TableComponent.stories.d.ts +2 -0
- package/dist/components/core/TableComponent.vue.d.ts +6 -0
- package/dist/components/core/index.cjs +22 -20
- package/dist/components/core/index.cjs.map +1 -1
- package/dist/components/core/index.d.ts +2 -0
- package/dist/components/core/index.js +16 -14
- package/dist/components/core/index.js.map +1 -1
- package/dist/components/feedback/CardSkeleton.stories.d.ts +11 -0
- package/dist/components/feedback/CardSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/CardSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/ConfirmDialog.stories.d.ts +12 -0
- package/dist/components/feedback/ConfirmDialog.test.d.ts +1 -0
- package/dist/components/feedback/ConfirmDialog.vue.d.ts +53 -0
- package/dist/components/feedback/ListSkeleton.stories.d.ts +12 -0
- package/dist/components/feedback/ListSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/ListSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/Modal.vue.d.ts +11 -2
- package/dist/components/feedback/NotificationComponent.stories.d.ts +14 -0
- package/dist/components/feedback/NotificationList.stories.d.ts +11 -0
- package/dist/components/feedback/Progress.vue.d.ts +1 -1
- package/dist/components/feedback/Skeleton.vue.d.ts +1 -1
- package/dist/components/feedback/TableSkeleton.stories.d.ts +12 -0
- package/dist/components/feedback/TableSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/TableSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/ToastContainer.stories.d.ts +15 -0
- package/dist/components/feedback/index.cjs +17 -15
- package/dist/components/feedback/index.cjs.map +1 -1
- package/dist/components/feedback/index.d.ts +2 -0
- package/dist/components/feedback/index.js +6 -4
- package/dist/components/feedback/index.js.map +1 -1
- package/dist/components/form/ColorPicker.vue.d.ts +3 -0
- package/dist/components/form/Combobox.stories.d.ts +15 -0
- package/dist/components/form/Combobox.test.d.ts +1 -0
- package/dist/components/form/Combobox.vue.d.ts +46 -0
- package/dist/components/form/FileUpload.vue.d.ts +1 -1
- package/dist/components/form/FormHelp.stories.d.ts +11 -0
- package/dist/components/form/FormLabel.stories.d.ts +12 -0
- package/dist/components/form/FormSelect.stories.d.ts +2 -0
- package/dist/components/form/index.cjs +17 -16
- package/dist/components/form/index.cjs.map +1 -1
- package/dist/components/form/index.d.ts +2 -0
- package/dist/components/form/index.js +3 -2
- package/dist/components/index.cjs +55 -51
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +36 -32
- package/dist/components/index.js.map +1 -1
- package/dist/composables/index.cjs +3 -2
- package/dist/composables/index.cjs.map +1 -1
- package/dist/composables/index.js +9 -8
- package/dist/composables/index.js.map +1 -1
- package/dist/index-D7HVSFi2.cjs +337 -0
- package/dist/index-D7HVSFi2.cjs.map +1 -0
- package/dist/index-DZYqrXV0.js +75 -0
- package/dist/index-DZYqrXV0.js.map +1 -0
- package/dist/index-Dghdw1yo.js +338 -0
- package/dist/index-Dghdw1yo.js.map +1 -0
- package/dist/index-DjEv91o4.cjs +74 -0
- package/dist/index-DjEv91o4.cjs.map +1 -0
- package/dist/index.cjs +59 -54
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +46 -41
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/useDarkMode-Cl5QWTlC.js +53 -0
- package/dist/useDarkMode-Cl5QWTlC.js.map +1 -0
- package/dist/useDarkMode-DLZcJEUQ.cjs +52 -0
- package/dist/useDarkMode-DLZcJEUQ.cjs.map +1 -0
- package/dist/useDropdown-DHFnd259.cjs.map +1 -1
- package/dist/useDropdown-iVu14E6s.js.map +1 -1
- package/dist/{useToast-CRh_sG82.cjs → useToast-Bk60GArg.cjs} +1 -50
- package/dist/useToast-Bk60GArg.cjs.map +1 -0
- package/dist/{useToast-DwFOkewC.js → useToast-ina5g3mj.js} +6 -55
- package/dist/useToast-ina5g3mj.js.map +1 -0
- package/package.json +168 -168
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js +0 -54
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js.map +0 -1
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs +0 -53
- package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bech-H58.js.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-CHoagJ0-.cjs.map +0 -1
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-Cv1OwT9S.cjs.map +0 -1
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-y3zIxWfI.js.map +0 -1
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-CqeiZOID.cjs.map +0 -1
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-CuPF4MPe.js.map +0 -1
- package/dist/index-5Ru0o5KY.js +0 -71
- package/dist/index-5Ru0o5KY.js.map +0 -1
- package/dist/index-CnDEGRt-.cjs +0 -70
- package/dist/index-CnDEGRt-.cjs.map +0 -1
- package/dist/useToast-CRh_sG82.cjs.map +0 -1
- package/dist/useToast-DwFOkewC.js.map +0 -1
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import { defineComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, Fragment, renderList, normalizeStyle, computed, resolveComponent, createBlock, resolveDynamicComponent, mergeProps, withCtx, renderSlot, unref, normalizeClass } from "vue";
|
|
2
|
+
import { Icon } from "@iconify/vue";
|
|
3
|
+
const _hoisted_1$2 = { class: "bg-white dark:bg-gray-900 rounded-lg shadow-md p-4 space-y-4" };
|
|
4
|
+
const _hoisted_2$2 = {
|
|
5
|
+
key: 0,
|
|
6
|
+
class: "flex items-center gap-3"
|
|
7
|
+
};
|
|
8
|
+
const _hoisted_3$1 = { class: "space-y-2" };
|
|
9
|
+
const _hoisted_4$1 = {
|
|
10
|
+
key: 1,
|
|
11
|
+
class: "flex justify-end gap-2 pt-2"
|
|
12
|
+
};
|
|
13
|
+
const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
14
|
+
__name: "CardSkeleton",
|
|
15
|
+
props: {
|
|
16
|
+
showAvatar: { type: Boolean, default: false },
|
|
17
|
+
lines: { default: 3 },
|
|
18
|
+
showActions: { type: Boolean, default: false }
|
|
19
|
+
},
|
|
20
|
+
setup(__props) {
|
|
21
|
+
return (_ctx, _cache) => {
|
|
22
|
+
return openBlock(), createElementBlock("div", _hoisted_1$2, [
|
|
23
|
+
__props.showAvatar ? (openBlock(), createElementBlock("div", _hoisted_2$2, [..._cache[0] || (_cache[0] = [
|
|
24
|
+
createElementVNode("div", { class: "w-10 h-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse" }, null, -1),
|
|
25
|
+
createElementVNode("div", { class: "flex-1 space-y-2" }, [
|
|
26
|
+
createElementVNode("div", { class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/2" }),
|
|
27
|
+
createElementVNode("div", { class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/3" })
|
|
28
|
+
], -1)
|
|
29
|
+
])])) : createCommentVNode("", true),
|
|
30
|
+
createElementVNode("div", _hoisted_3$1, [
|
|
31
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.lines, (line) => {
|
|
32
|
+
return openBlock(), createElementBlock("div", {
|
|
33
|
+
key: line,
|
|
34
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
35
|
+
style: normalizeStyle({ width: line === __props.lines ? "60%" : "100%" })
|
|
36
|
+
}, null, 4);
|
|
37
|
+
}), 128))
|
|
38
|
+
]),
|
|
39
|
+
__props.showActions ? (openBlock(), createElementBlock("div", _hoisted_4$1, [..._cache[1] || (_cache[1] = [
|
|
40
|
+
createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1),
|
|
41
|
+
createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1)
|
|
42
|
+
])])) : createCommentVNode("", true)
|
|
43
|
+
]);
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
const _hoisted_1$1 = { class: "w-full" };
|
|
48
|
+
const _hoisted_2$1 = {
|
|
49
|
+
key: 0,
|
|
50
|
+
class: "flex gap-4 px-4 py-3 border-b border-gray-200 dark:border-gray-700"
|
|
51
|
+
};
|
|
52
|
+
const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
53
|
+
__name: "TableSkeleton",
|
|
54
|
+
props: {
|
|
55
|
+
rows: { default: 5 },
|
|
56
|
+
columns: { default: 4 },
|
|
57
|
+
showHeader: { type: Boolean, default: true }
|
|
58
|
+
},
|
|
59
|
+
setup(__props) {
|
|
60
|
+
return (_ctx, _cache) => {
|
|
61
|
+
return openBlock(), createElementBlock("div", _hoisted_1$1, [
|
|
62
|
+
__props.showHeader ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
|
|
63
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
|
|
64
|
+
return openBlock(), createElementBlock("div", {
|
|
65
|
+
key: `header-${col}`,
|
|
66
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
67
|
+
style: normalizeStyle({ maxWidth: col === 1 ? "30%" : "20%" })
|
|
68
|
+
}, null, 4);
|
|
69
|
+
}), 128))
|
|
70
|
+
])) : createCommentVNode("", true),
|
|
71
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row) => {
|
|
72
|
+
return openBlock(), createElementBlock("div", {
|
|
73
|
+
key: `row-${row}`,
|
|
74
|
+
class: "flex items-center gap-4 px-4 py-4 border-b border-gray-100 dark:border-gray-800"
|
|
75
|
+
}, [
|
|
76
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
|
|
77
|
+
return openBlock(), createElementBlock("div", {
|
|
78
|
+
key: `cell-${row}-${col}`,
|
|
79
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
80
|
+
style: normalizeStyle({
|
|
81
|
+
maxWidth: col === 1 ? "40%" : col === __props.columns ? "15%" : "25%",
|
|
82
|
+
opacity: 1 - row * 0.1
|
|
83
|
+
})
|
|
84
|
+
}, null, 4);
|
|
85
|
+
}), 128))
|
|
86
|
+
]);
|
|
87
|
+
}), 128))
|
|
88
|
+
]);
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
const _hoisted_1 = { class: "divide-y divide-gray-200 dark:divide-gray-700" };
|
|
93
|
+
const _hoisted_2 = {
|
|
94
|
+
key: 0,
|
|
95
|
+
class: "flex-shrink-0 w-10 h-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
96
|
+
};
|
|
97
|
+
const _hoisted_3 = { class: "flex-1 min-w-0 space-y-2" };
|
|
98
|
+
const _hoisted_4 = {
|
|
99
|
+
key: 1,
|
|
100
|
+
class: "flex-shrink-0 w-8 h-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
101
|
+
};
|
|
102
|
+
const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
103
|
+
__name: "ListSkeleton",
|
|
104
|
+
props: {
|
|
105
|
+
items: { default: 5 },
|
|
106
|
+
showAvatar: { type: Boolean, default: true },
|
|
107
|
+
showSecondary: { type: Boolean, default: true },
|
|
108
|
+
showAction: { type: Boolean, default: false }
|
|
109
|
+
},
|
|
110
|
+
setup(__props) {
|
|
111
|
+
return (_ctx, _cache) => {
|
|
112
|
+
return openBlock(), createElementBlock("div", _hoisted_1, [
|
|
113
|
+
(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
|
|
114
|
+
return openBlock(), createElementBlock("div", {
|
|
115
|
+
key: item,
|
|
116
|
+
class: "flex items-center gap-4 py-4 px-4"
|
|
117
|
+
}, [
|
|
118
|
+
__props.showAvatar ? (openBlock(), createElementBlock("div", _hoisted_2)) : createCommentVNode("", true),
|
|
119
|
+
createElementVNode("div", _hoisted_3, [
|
|
120
|
+
createElementVNode("div", {
|
|
121
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
122
|
+
style: normalizeStyle({ width: `${60 + Math.random() * 30}%` })
|
|
123
|
+
}, null, 4),
|
|
124
|
+
__props.showSecondary ? (openBlock(), createElementBlock("div", {
|
|
125
|
+
key: 0,
|
|
126
|
+
class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
127
|
+
style: normalizeStyle({ width: `${40 + Math.random() * 20}%` })
|
|
128
|
+
}, null, 4)) : createCommentVNode("", true)
|
|
129
|
+
]),
|
|
130
|
+
__props.showAction ? (openBlock(), createElementBlock("div", _hoisted_4)) : createCommentVNode("", true)
|
|
131
|
+
]);
|
|
132
|
+
}), 128))
|
|
133
|
+
]);
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
138
|
+
__name: "Button",
|
|
139
|
+
props: {
|
|
140
|
+
variant: { default: "primary" },
|
|
141
|
+
size: { default: "md" },
|
|
142
|
+
icon: {},
|
|
143
|
+
iconRight: {},
|
|
144
|
+
loading: { type: Boolean },
|
|
145
|
+
disabled: { type: Boolean },
|
|
146
|
+
block: { type: Boolean },
|
|
147
|
+
href: {},
|
|
148
|
+
to: {},
|
|
149
|
+
type: { default: "button" }
|
|
150
|
+
},
|
|
151
|
+
emits: ["click"],
|
|
152
|
+
setup(__props, { emit: __emit }) {
|
|
153
|
+
const props = __props;
|
|
154
|
+
const emit = __emit;
|
|
155
|
+
const variantClasses = {
|
|
156
|
+
primary: "bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary",
|
|
157
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/90 focus:ring-secondary",
|
|
158
|
+
outline: "border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-primary dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800",
|
|
159
|
+
ghost: "bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-primary dark:text-gray-300 dark:hover:bg-gray-800",
|
|
160
|
+
danger: "bg-red-500 text-white hover:bg-red-600 focus:ring-red-500",
|
|
161
|
+
success: "bg-green-500 text-white hover:bg-green-600 focus:ring-green-500"
|
|
162
|
+
};
|
|
163
|
+
const sizeClasses = {
|
|
164
|
+
xs: "px-2 py-1 text-xs gap-1",
|
|
165
|
+
sm: "px-3 py-1.5 text-sm gap-1.5",
|
|
166
|
+
md: "px-4 py-2 text-sm gap-2",
|
|
167
|
+
lg: "px-5 py-2.5 text-base gap-2",
|
|
168
|
+
xl: "px-6 py-3 text-lg gap-2.5"
|
|
169
|
+
};
|
|
170
|
+
const iconSizeClasses = {
|
|
171
|
+
xs: "size-3",
|
|
172
|
+
sm: "size-4",
|
|
173
|
+
md: "size-4",
|
|
174
|
+
lg: "size-5",
|
|
175
|
+
xl: "size-6"
|
|
176
|
+
};
|
|
177
|
+
const classes = computed(() => [
|
|
178
|
+
"inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
179
|
+
variantClasses[props.variant],
|
|
180
|
+
sizeClasses[props.size],
|
|
181
|
+
props.block && "w-full"
|
|
182
|
+
]);
|
|
183
|
+
const component = computed(() => {
|
|
184
|
+
if (props.to) {
|
|
185
|
+
try {
|
|
186
|
+
const RouterLink = resolveComponent("RouterLink");
|
|
187
|
+
if (typeof RouterLink !== "string") return RouterLink;
|
|
188
|
+
} catch {
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (props.href) return "a";
|
|
192
|
+
return "button";
|
|
193
|
+
});
|
|
194
|
+
const componentProps = computed(() => {
|
|
195
|
+
if (props.to) return { to: props.to };
|
|
196
|
+
if (props.href) return { href: props.href };
|
|
197
|
+
return { type: props.type, disabled: props.disabled || props.loading };
|
|
198
|
+
});
|
|
199
|
+
const handleClick = (event) => {
|
|
200
|
+
if (props.disabled || props.loading) return;
|
|
201
|
+
emit("click", event);
|
|
202
|
+
};
|
|
203
|
+
return (_ctx, _cache) => {
|
|
204
|
+
return openBlock(), createBlock(resolveDynamicComponent(component.value), mergeProps(componentProps.value, {
|
|
205
|
+
class: classes.value,
|
|
206
|
+
onClick: handleClick
|
|
207
|
+
}), {
|
|
208
|
+
default: withCtx(() => [
|
|
209
|
+
__props.loading ? (openBlock(), createBlock(unref(Icon), {
|
|
210
|
+
key: 0,
|
|
211
|
+
icon: "lucide:loader-2",
|
|
212
|
+
class: normalizeClass([iconSizeClasses[__props.size], "animate-spin"])
|
|
213
|
+
}, null, 8, ["class"])) : __props.icon ? (openBlock(), createBlock(unref(Icon), {
|
|
214
|
+
key: 1,
|
|
215
|
+
icon: __props.icon,
|
|
216
|
+
class: normalizeClass(iconSizeClasses[__props.size])
|
|
217
|
+
}, null, 8, ["icon", "class"])) : createCommentVNode("", true),
|
|
218
|
+
renderSlot(_ctx.$slots, "default"),
|
|
219
|
+
__props.iconRight && !__props.loading ? (openBlock(), createBlock(unref(Icon), {
|
|
220
|
+
key: 2,
|
|
221
|
+
icon: __props.iconRight,
|
|
222
|
+
class: normalizeClass(iconSizeClasses[__props.size])
|
|
223
|
+
}, null, 8, ["icon", "class"])) : createCommentVNode("", true)
|
|
224
|
+
]),
|
|
225
|
+
_: 3
|
|
226
|
+
}, 16, ["class"]);
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
export {
|
|
231
|
+
_sfc_main as _,
|
|
232
|
+
_sfc_main$2 as a,
|
|
233
|
+
_sfc_main$3 as b,
|
|
234
|
+
_sfc_main$1 as c
|
|
235
|
+
};
|
|
236
|
+
//# sourceMappingURL=Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js","sources":["../src/components/feedback/CardSkeleton.vue","../src/components/feedback/TableSkeleton.vue","../src/components/feedback/ListSkeleton.vue","../src/components/core/Button.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\">\r\n <!-- Header with avatar -->\r\n <div v-if=\"showAvatar\" class=\"flex items-center gap-3\">\r\n <div class=\"w-10 h-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\">\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\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\">\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=\"flex-shrink-0 w-10 h-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=\"flex-shrink-0 w-8 h-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success'\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst props = withDefaults(\n defineProps<{\n /** Button variant */\n variant?: ButtonVariant\n /** Button size */\n size?: ButtonSize\n /** Icon to show (left side) */\n icon?: string\n /** Icon on right side */\n iconRight?: string\n /** Loading state */\n loading?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Full width */\n block?: boolean\n /** Link href (renders as <a>) */\n href?: string\n /** Router link (renders as RouterLink) */\n to?: string\n /** Button type */\n type?: 'button' | 'submit' | 'reset'\n }>(),\n {\n variant: 'primary',\n size: 'md',\n type: 'button',\n },\n)\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/90 focus:ring-secondary',\n outline: 'border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-primary dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800',\n ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-primary dark:text-gray-300 dark:hover:bg-gray-800',\n danger: 'bg-red-500 text-white hover:bg-red-600 focus:ring-red-500',\n success: 'bg-green-500 text-white hover:bg-green-600 focus:ring-green-500',\n}\n\nconst sizeClasses: Record<ButtonSize, string> = {\n xs: 'px-2 py-1 text-xs gap-1',\n sm: 'px-3 py-1.5 text-sm gap-1.5',\n md: 'px-4 py-2 text-sm gap-2',\n lg: 'px-5 py-2.5 text-base gap-2',\n xl: 'px-6 py-3 text-lg gap-2.5',\n}\n\nconst iconSizeClasses: Record<ButtonSize, string> = {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-6',\n}\n\nconst classes = computed(() => [\n 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed',\n variantClasses[props.variant],\n sizeClasses[props.size],\n props.block && 'w-full',\n])\n\nconst component = computed(() => {\n if (props.to) {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') return RouterLink\n } catch {\n // RouterLink not available\n }\n }\n if (props.href) return 'a'\n return 'button'\n})\n\nconst componentProps = computed(() => {\n if (props.to) return { to: props.to }\n if (props.href) return { href: props.href }\n return { type: props.type, disabled: props.disabled || props.loading }\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (props.disabled || props.loading) return\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-bind=\"componentProps\"\n :class=\"classes\"\n @click=\"handleClick\"\n >\n <Icon\n v-if=\"loading\"\n icon=\"lucide:loader-2\"\n :class=\"[iconSizeClasses[size], 'animate-spin']\"\n />\n <Icon\n v-else-if=\"icon\"\n :icon=\"icon\"\n :class=\"iconSizeClasses[size]\"\n />\n <slot />\n <Icon\n v-if=\"iconRight && !loading\"\n :icon=\"iconRight\"\n :class=\"iconSizeClasses[size]\"\n />\n </component>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_renderList","_normalizeStyle","_hoisted_4","_createBlock","_resolveDynamicComponent","_mergeProps","_unref","_normalizeClass","_renderSlot"],"mappings":"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"}
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
const vue = require("vue");
|
|
3
|
+
const vue$1 = require("@iconify/vue");
|
|
4
|
+
const _hoisted_1$2 = { class: "bg-white dark:bg-gray-900 rounded-lg shadow-md p-4 space-y-4" };
|
|
5
|
+
const _hoisted_2$2 = {
|
|
6
|
+
key: 0,
|
|
7
|
+
class: "flex items-center gap-3"
|
|
8
|
+
};
|
|
9
|
+
const _hoisted_3$1 = { class: "space-y-2" };
|
|
10
|
+
const _hoisted_4$1 = {
|
|
11
|
+
key: 1,
|
|
12
|
+
class: "flex justify-end gap-2 pt-2"
|
|
13
|
+
};
|
|
14
|
+
const _sfc_main$3 = /* @__PURE__ */ vue.defineComponent({
|
|
15
|
+
__name: "CardSkeleton",
|
|
16
|
+
props: {
|
|
17
|
+
showAvatar: { type: Boolean, default: false },
|
|
18
|
+
lines: { default: 3 },
|
|
19
|
+
showActions: { type: Boolean, default: false }
|
|
20
|
+
},
|
|
21
|
+
setup(__props) {
|
|
22
|
+
return (_ctx, _cache) => {
|
|
23
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$2, [
|
|
24
|
+
__props.showAvatar ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$2, [..._cache[0] || (_cache[0] = [
|
|
25
|
+
vue.createElementVNode("div", { class: "w-10 h-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse" }, null, -1),
|
|
26
|
+
vue.createElementVNode("div", { class: "flex-1 space-y-2" }, [
|
|
27
|
+
vue.createElementVNode("div", { class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/2" }),
|
|
28
|
+
vue.createElementVNode("div", { class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse w-1/3" })
|
|
29
|
+
], -1)
|
|
30
|
+
])])) : vue.createCommentVNode("", true),
|
|
31
|
+
vue.createElementVNode("div", _hoisted_3$1, [
|
|
32
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.lines, (line) => {
|
|
33
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
34
|
+
key: line,
|
|
35
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
36
|
+
style: vue.normalizeStyle({ width: line === __props.lines ? "60%" : "100%" })
|
|
37
|
+
}, null, 4);
|
|
38
|
+
}), 128))
|
|
39
|
+
]),
|
|
40
|
+
__props.showActions ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [..._cache[1] || (_cache[1] = [
|
|
41
|
+
vue.createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1),
|
|
42
|
+
vue.createElementVNode("div", { class: "h-8 w-20 bg-gray-200 dark:bg-gray-700 rounded animate-pulse" }, null, -1)
|
|
43
|
+
])])) : vue.createCommentVNode("", true)
|
|
44
|
+
]);
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
const _hoisted_1$1 = { class: "w-full" };
|
|
49
|
+
const _hoisted_2$1 = {
|
|
50
|
+
key: 0,
|
|
51
|
+
class: "flex gap-4 px-4 py-3 border-b border-gray-200 dark:border-gray-700"
|
|
52
|
+
};
|
|
53
|
+
const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
|
|
54
|
+
__name: "TableSkeleton",
|
|
55
|
+
props: {
|
|
56
|
+
rows: { default: 5 },
|
|
57
|
+
columns: { default: 4 },
|
|
58
|
+
showHeader: { type: Boolean, default: true }
|
|
59
|
+
},
|
|
60
|
+
setup(__props) {
|
|
61
|
+
return (_ctx, _cache) => {
|
|
62
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
|
|
63
|
+
__props.showHeader ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$1, [
|
|
64
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (col) => {
|
|
65
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
66
|
+
key: `header-${col}`,
|
|
67
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
68
|
+
style: vue.normalizeStyle({ maxWidth: col === 1 ? "30%" : "20%" })
|
|
69
|
+
}, null, 4);
|
|
70
|
+
}), 128))
|
|
71
|
+
])) : vue.createCommentVNode("", true),
|
|
72
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.rows, (row) => {
|
|
73
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
74
|
+
key: `row-${row}`,
|
|
75
|
+
class: "flex items-center gap-4 px-4 py-4 border-b border-gray-100 dark:border-gray-800"
|
|
76
|
+
}, [
|
|
77
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.columns, (col) => {
|
|
78
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
79
|
+
key: `cell-${row}-${col}`,
|
|
80
|
+
class: "flex-1 h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
81
|
+
style: vue.normalizeStyle({
|
|
82
|
+
maxWidth: col === 1 ? "40%" : col === __props.columns ? "15%" : "25%",
|
|
83
|
+
opacity: 1 - row * 0.1
|
|
84
|
+
})
|
|
85
|
+
}, null, 4);
|
|
86
|
+
}), 128))
|
|
87
|
+
]);
|
|
88
|
+
}), 128))
|
|
89
|
+
]);
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
const _hoisted_1 = { class: "divide-y divide-gray-200 dark:divide-gray-700" };
|
|
94
|
+
const _hoisted_2 = {
|
|
95
|
+
key: 0,
|
|
96
|
+
class: "flex-shrink-0 w-10 h-10 rounded-full bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
97
|
+
};
|
|
98
|
+
const _hoisted_3 = { class: "flex-1 min-w-0 space-y-2" };
|
|
99
|
+
const _hoisted_4 = {
|
|
100
|
+
key: 1,
|
|
101
|
+
class: "flex-shrink-0 w-8 h-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse"
|
|
102
|
+
};
|
|
103
|
+
const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
104
|
+
__name: "ListSkeleton",
|
|
105
|
+
props: {
|
|
106
|
+
items: { default: 5 },
|
|
107
|
+
showAvatar: { type: Boolean, default: true },
|
|
108
|
+
showSecondary: { type: Boolean, default: true },
|
|
109
|
+
showAction: { type: Boolean, default: false }
|
|
110
|
+
},
|
|
111
|
+
setup(__props) {
|
|
112
|
+
return (_ctx, _cache) => {
|
|
113
|
+
return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
|
|
114
|
+
(vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
|
|
115
|
+
return vue.openBlock(), vue.createElementBlock("div", {
|
|
116
|
+
key: item,
|
|
117
|
+
class: "flex items-center gap-4 py-4 px-4"
|
|
118
|
+
}, [
|
|
119
|
+
__props.showAvatar ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2)) : vue.createCommentVNode("", true),
|
|
120
|
+
vue.createElementVNode("div", _hoisted_3, [
|
|
121
|
+
vue.createElementVNode("div", {
|
|
122
|
+
class: "h-4 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
123
|
+
style: vue.normalizeStyle({ width: `${60 + Math.random() * 30}%` })
|
|
124
|
+
}, null, 4),
|
|
125
|
+
__props.showSecondary ? (vue.openBlock(), vue.createElementBlock("div", {
|
|
126
|
+
key: 0,
|
|
127
|
+
class: "h-3 bg-gray-200 dark:bg-gray-700 rounded animate-pulse",
|
|
128
|
+
style: vue.normalizeStyle({ width: `${40 + Math.random() * 20}%` })
|
|
129
|
+
}, null, 4)) : vue.createCommentVNode("", true)
|
|
130
|
+
]),
|
|
131
|
+
__props.showAction ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4)) : vue.createCommentVNode("", true)
|
|
132
|
+
]);
|
|
133
|
+
}), 128))
|
|
134
|
+
]);
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
});
|
|
138
|
+
const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
139
|
+
__name: "Button",
|
|
140
|
+
props: {
|
|
141
|
+
variant: { default: "primary" },
|
|
142
|
+
size: { default: "md" },
|
|
143
|
+
icon: {},
|
|
144
|
+
iconRight: {},
|
|
145
|
+
loading: { type: Boolean },
|
|
146
|
+
disabled: { type: Boolean },
|
|
147
|
+
block: { type: Boolean },
|
|
148
|
+
href: {},
|
|
149
|
+
to: {},
|
|
150
|
+
type: { default: "button" }
|
|
151
|
+
},
|
|
152
|
+
emits: ["click"],
|
|
153
|
+
setup(__props, { emit: __emit }) {
|
|
154
|
+
const props = __props;
|
|
155
|
+
const emit = __emit;
|
|
156
|
+
const variantClasses = {
|
|
157
|
+
primary: "bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary",
|
|
158
|
+
secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/90 focus:ring-secondary",
|
|
159
|
+
outline: "border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-primary dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800",
|
|
160
|
+
ghost: "bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-primary dark:text-gray-300 dark:hover:bg-gray-800",
|
|
161
|
+
danger: "bg-red-500 text-white hover:bg-red-600 focus:ring-red-500",
|
|
162
|
+
success: "bg-green-500 text-white hover:bg-green-600 focus:ring-green-500"
|
|
163
|
+
};
|
|
164
|
+
const sizeClasses = {
|
|
165
|
+
xs: "px-2 py-1 text-xs gap-1",
|
|
166
|
+
sm: "px-3 py-1.5 text-sm gap-1.5",
|
|
167
|
+
md: "px-4 py-2 text-sm gap-2",
|
|
168
|
+
lg: "px-5 py-2.5 text-base gap-2",
|
|
169
|
+
xl: "px-6 py-3 text-lg gap-2.5"
|
|
170
|
+
};
|
|
171
|
+
const iconSizeClasses = {
|
|
172
|
+
xs: "size-3",
|
|
173
|
+
sm: "size-4",
|
|
174
|
+
md: "size-4",
|
|
175
|
+
lg: "size-5",
|
|
176
|
+
xl: "size-6"
|
|
177
|
+
};
|
|
178
|
+
const classes = vue.computed(() => [
|
|
179
|
+
"inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed",
|
|
180
|
+
variantClasses[props.variant],
|
|
181
|
+
sizeClasses[props.size],
|
|
182
|
+
props.block && "w-full"
|
|
183
|
+
]);
|
|
184
|
+
const component = vue.computed(() => {
|
|
185
|
+
if (props.to) {
|
|
186
|
+
try {
|
|
187
|
+
const RouterLink = vue.resolveComponent("RouterLink");
|
|
188
|
+
if (typeof RouterLink !== "string") return RouterLink;
|
|
189
|
+
} catch {
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (props.href) return "a";
|
|
193
|
+
return "button";
|
|
194
|
+
});
|
|
195
|
+
const componentProps = vue.computed(() => {
|
|
196
|
+
if (props.to) return { to: props.to };
|
|
197
|
+
if (props.href) return { href: props.href };
|
|
198
|
+
return { type: props.type, disabled: props.disabled || props.loading };
|
|
199
|
+
});
|
|
200
|
+
const handleClick = (event) => {
|
|
201
|
+
if (props.disabled || props.loading) return;
|
|
202
|
+
emit("click", event);
|
|
203
|
+
};
|
|
204
|
+
return (_ctx, _cache) => {
|
|
205
|
+
return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(component.value), vue.mergeProps(componentProps.value, {
|
|
206
|
+
class: classes.value,
|
|
207
|
+
onClick: handleClick
|
|
208
|
+
}), {
|
|
209
|
+
default: vue.withCtx(() => [
|
|
210
|
+
__props.loading ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
211
|
+
key: 0,
|
|
212
|
+
icon: "lucide:loader-2",
|
|
213
|
+
class: vue.normalizeClass([iconSizeClasses[__props.size], "animate-spin"])
|
|
214
|
+
}, null, 8, ["class"])) : __props.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
215
|
+
key: 1,
|
|
216
|
+
icon: __props.icon,
|
|
217
|
+
class: vue.normalizeClass(iconSizeClasses[__props.size])
|
|
218
|
+
}, null, 8, ["icon", "class"])) : vue.createCommentVNode("", true),
|
|
219
|
+
vue.renderSlot(_ctx.$slots, "default"),
|
|
220
|
+
__props.iconRight && !__props.loading ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
|
|
221
|
+
key: 2,
|
|
222
|
+
icon: __props.iconRight,
|
|
223
|
+
class: vue.normalizeClass(iconSizeClasses[__props.size])
|
|
224
|
+
}, null, 8, ["icon", "class"])) : vue.createCommentVNode("", true)
|
|
225
|
+
]),
|
|
226
|
+
_: 3
|
|
227
|
+
}, 16, ["class"]);
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
exports._sfc_main = _sfc_main;
|
|
232
|
+
exports._sfc_main$1 = _sfc_main$2;
|
|
233
|
+
exports._sfc_main$2 = _sfc_main$3;
|
|
234
|
+
exports._sfc_main$3 = _sfc_main$1;
|
|
235
|
+
//# sourceMappingURL=Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs","sources":["../src/components/feedback/CardSkeleton.vue","../src/components/feedback/TableSkeleton.vue","../src/components/feedback/ListSkeleton.vue","../src/components/core/Button.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\">\r\n <!-- Header with avatar -->\r\n <div v-if=\"showAvatar\" class=\"flex items-center gap-3\">\r\n <div class=\"w-10 h-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\">\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\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\">\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=\"flex-shrink-0 w-10 h-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=\"flex-shrink-0 w-8 h-8 rounded bg-gray-200 dark:bg-gray-700 animate-pulse\"\r\n />\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success'\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst props = withDefaults(\n defineProps<{\n /** Button variant */\n variant?: ButtonVariant\n /** Button size */\n size?: ButtonSize\n /** Icon to show (left side) */\n icon?: string\n /** Icon on right side */\n iconRight?: string\n /** Loading state */\n loading?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Full width */\n block?: boolean\n /** Link href (renders as <a>) */\n href?: string\n /** Router link (renders as RouterLink) */\n to?: string\n /** Button type */\n type?: 'button' | 'submit' | 'reset'\n }>(),\n {\n variant: 'primary',\n size: 'md',\n type: 'button',\n },\n)\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/90 focus:ring-secondary',\n outline: 'border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-primary dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800',\n ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-primary dark:text-gray-300 dark:hover:bg-gray-800',\n danger: 'bg-red-500 text-white hover:bg-red-600 focus:ring-red-500',\n success: 'bg-green-500 text-white hover:bg-green-600 focus:ring-green-500',\n}\n\nconst sizeClasses: Record<ButtonSize, string> = {\n xs: 'px-2 py-1 text-xs gap-1',\n sm: 'px-3 py-1.5 text-sm gap-1.5',\n md: 'px-4 py-2 text-sm gap-2',\n lg: 'px-5 py-2.5 text-base gap-2',\n xl: 'px-6 py-3 text-lg gap-2.5',\n}\n\nconst iconSizeClasses: Record<ButtonSize, string> = {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-6',\n}\n\nconst classes = computed(() => [\n 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed',\n variantClasses[props.variant],\n sizeClasses[props.size],\n props.block && 'w-full',\n])\n\nconst component = computed(() => {\n if (props.to) {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') return RouterLink\n } catch {\n // RouterLink not available\n }\n }\n if (props.href) return 'a'\n return 'button'\n})\n\nconst componentProps = computed(() => {\n if (props.to) return { to: props.to }\n if (props.href) return { href: props.href }\n return { type: props.type, disabled: props.disabled || props.loading }\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (props.disabled || props.loading) return\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-bind=\"componentProps\"\n :class=\"classes\"\n @click=\"handleClick\"\n >\n <Icon\n v-if=\"loading\"\n icon=\"lucide:loader-2\"\n :class=\"[iconSizeClasses[size], 'animate-spin']\"\n />\n <Icon\n v-else-if=\"icon\"\n :icon=\"icon\"\n :class=\"iconSizeClasses[size]\"\n />\n <slot />\n <Icon\n v-if=\"iconRight && !loading\"\n :icon=\"iconRight\"\n :class=\"iconSizeClasses[size]\"\n />\n </component>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_renderList","_normalizeStyle","_hoisted_4","computed","resolveComponent","_createBlock","_resolveDynamicComponent","_mergeProps","_unref","Icon","_normalizeClass","_renderSlot"],"mappings":"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"}
|