cisse-vue-ui 0.1.0 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/README.md +435 -6
  2. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs +621 -0
  3. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs.map +1 -0
  4. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js +622 -0
  5. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js.map +1 -0
  6. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D2MeLTRV.cjs +1133 -0
  7. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-D2MeLTRV.cjs.map +1 -0
  8. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Ixih38V0.js +1134 -0
  9. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Ixih38V0.js.map +1 -0
  10. package/dist/{NotificationList.vue_vue_type_script_setup_true_lang-B2hjbMm4.js → EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js} +163 -44
  11. package/dist/EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js.map +1 -0
  12. package/dist/{NotificationList.vue_vue_type_script_setup_true_lang-Ci3zIvrv.cjs → EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs} +163 -44
  13. package/dist/EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs.map +1 -0
  14. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs +86 -0
  15. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs.map +1 -0
  16. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js +87 -0
  17. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js.map +1 -0
  18. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-DTlUENg3.js +265 -0
  19. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-DTlUENg3.js.map +1 -0
  20. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-IcouTz4C.cjs +264 -0
  21. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-IcouTz4C.cjs.map +1 -0
  22. package/dist/components/core/AutocompleteComponent.vue.d.ts +7 -1
  23. package/dist/components/core/Avatar.vue.d.ts +20 -0
  24. package/dist/components/core/Button.vue.d.ts +49 -0
  25. package/dist/components/core/CollapsibleCard.vue.d.ts +28 -0
  26. package/dist/components/core/Dropdown.vue.d.ts +52 -0
  27. package/dist/components/core/MenuItem.vue.d.ts +11 -1
  28. package/dist/components/core/Stepper.vue.d.ts +22 -0
  29. package/dist/components/core/TabPanel.vue.d.ts +21 -0
  30. package/dist/components/core/Tabs.vue.d.ts +39 -0
  31. package/dist/components/core/index.cjs +14 -6
  32. package/dist/components/core/index.cjs.map +1 -1
  33. package/dist/components/core/index.d.ts +12 -0
  34. package/dist/components/core/index.js +14 -6
  35. package/dist/components/core/index.js.map +1 -1
  36. package/dist/components/feedback/Alert.vue.d.ts +34 -0
  37. package/dist/components/feedback/EmptyState.vue.d.ts +29 -0
  38. package/dist/components/feedback/index.cjs +8 -6
  39. package/dist/components/feedback/index.cjs.map +1 -1
  40. package/dist/components/feedback/index.d.ts +3 -0
  41. package/dist/components/feedback/index.js +3 -1
  42. package/dist/components/form/Checkbox.vue.d.ts +20 -0
  43. package/dist/components/form/FormSelect.vue.d.ts +35 -6
  44. package/dist/components/form/Switch.vue.d.ts +21 -0
  45. package/dist/components/form/index.cjs +9 -7
  46. package/dist/components/form/index.cjs.map +1 -1
  47. package/dist/components/form/index.d.ts +2 -0
  48. package/dist/components/form/index.js +4 -2
  49. package/dist/components/index.cjs +34 -19
  50. package/dist/components/index.cjs.map +1 -1
  51. package/dist/components/index.d.ts +1 -0
  52. package/dist/components/index.js +26 -11
  53. package/dist/components/index.js.map +1 -1
  54. package/dist/components/layout/BaseLayout.vue.d.ts +58 -0
  55. package/dist/components/layout/PageLayout.vue.d.ts +37 -0
  56. package/dist/components/layout/index.cjs +6 -0
  57. package/dist/components/layout/index.cjs.map +1 -0
  58. package/dist/components/layout/index.d.ts +3 -0
  59. package/dist/components/layout/index.js +6 -0
  60. package/dist/components/layout/index.js.map +1 -0
  61. package/dist/index-Bt9enqyq.cjs +47 -0
  62. package/dist/index-Bt9enqyq.cjs.map +1 -0
  63. package/dist/index-CxPY8Qb7.js +48 -0
  64. package/dist/index-CxPY8Qb7.js.map +1 -0
  65. package/dist/index.cjs +35 -20
  66. package/dist/index.cjs.map +1 -1
  67. package/dist/index.js +29 -14
  68. package/dist/index.js.map +1 -1
  69. package/dist/style.css +2 -0
  70. package/dist/types/components.d.ts +7 -0
  71. package/package.json +12 -3
  72. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-B2hjbMm4.js.map +0 -1
  73. package/dist/NotificationList.vue_vue_type_script_setup_true_lang-Ci3zIvrv.cjs.map +0 -1
  74. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-Be73hShP.cjs +0 -234
  75. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-Be73hShP.cjs.map +0 -1
  76. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-DjT2qdcp.js +0 -235
  77. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-DjT2qdcp.js.map +0 -1
  78. package/dist/TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js +0 -540
  79. package/dist/TableAction.vue_vue_type_script_setup_true_lang-BHskhVhK.js.map +0 -1
  80. package/dist/TableAction.vue_vue_type_script_setup_true_lang-CojbKn7E.cjs +0 -539
  81. package/dist/TableAction.vue_vue_type_script_setup_true_lang-CojbKn7E.cjs.map +0 -1
  82. package/dist/index-BoCtJCg0.cjs +0 -32
  83. package/dist/index-BoCtJCg0.cjs.map +0 -1
  84. package/dist/index-CGhDI10m.js +0 -33
  85. package/dist/index-CGhDI10m.js.map +0 -1
@@ -0,0 +1,265 @@
1
+ import { defineComponent, ref, computed, resolveComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, normalizeClass, renderSlot, createVNode, unref, toDisplayString, Fragment, renderList, createBlock, resolveDynamicComponent, mergeProps, withCtx, createTextVNode } from "vue";
2
+ import { Icon } from "@iconify/vue";
3
+ import { _ as _sfc_main$2 } from "./MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js";
4
+ const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
5
+ const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
6
+ const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
7
+ const _hoisted_4$1 = { class: "bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20" };
8
+ const _hoisted_5$1 = { class: "flex flex-col gap-3 px-3 pb-3" };
9
+ const _hoisted_6$1 = { class: "flex flex-1 flex-col" };
10
+ const _hoisted_7$1 = { class: "flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950" };
11
+ const _hoisted_8$1 = { class: "flex-1" };
12
+ const _hoisted_9$1 = { class: "flex items-center gap-3" };
13
+ const _hoisted_10$1 = { class: "flex flex-1 flex-col overflow-y-auto" };
14
+ const _hoisted_11 = { class: "container mx-auto flex flex-1 flex-col gap-5 p-5" };
15
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
16
+ __name: "BaseLayout",
17
+ props: {
18
+ menuItems: { default: () => [] },
19
+ appName: { default: "App" },
20
+ appIcon: { default: "lucide:box" },
21
+ sidebarOpen: { type: Boolean, default: true },
22
+ dark: { type: Boolean, default: false },
23
+ showDarkToggle: { type: Boolean, default: true },
24
+ sidebarClass: { default: "bg-[#172b4c] dark:bg-slate-950" },
25
+ currentPath: { default: void 0 }
26
+ },
27
+ emits: ["update:sidebarOpen", "update:dark"],
28
+ setup(__props, { emit: __emit }) {
29
+ const props = __props;
30
+ const emit = __emit;
31
+ const internalSidebarOpen = ref(props.sidebarOpen);
32
+ const internalDark = ref(props.dark);
33
+ const sidebarOpenModel = computed({
34
+ get: () => props.sidebarOpen ?? internalSidebarOpen.value,
35
+ set: (value) => {
36
+ internalSidebarOpen.value = value;
37
+ emit("update:sidebarOpen", value);
38
+ }
39
+ });
40
+ const darkModel = computed({
41
+ get: () => props.dark ?? internalDark.value,
42
+ set: (value) => {
43
+ internalDark.value = value;
44
+ emit("update:dark", value);
45
+ }
46
+ });
47
+ const toggleSidebar = () => {
48
+ sidebarOpenModel.value = !sidebarOpenModel.value;
49
+ };
50
+ const toggleDark = () => {
51
+ darkModel.value = !darkModel.value;
52
+ };
53
+ const routerViewComponent = computed(() => {
54
+ try {
55
+ const RouterView = resolveComponent("RouterView");
56
+ if (typeof RouterView !== "string") {
57
+ return RouterView;
58
+ }
59
+ } catch {
60
+ }
61
+ return null;
62
+ });
63
+ return (_ctx, _cache) => {
64
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
65
+ sidebarOpenModel.value ? (openBlock(), createElementBlock("div", {
66
+ key: 0,
67
+ class: "absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20",
68
+ onClick: _cache[0] || (_cache[0] = ($event) => sidebarOpenModel.value = false)
69
+ })) : createCommentVNode("", true),
70
+ createElementVNode("aside", {
71
+ class: normalizeClass([[
72
+ sidebarOpenModel.value ? "lg:w-60" : "-translate-x-76 lg:w-16 lg:translate-x-0",
73
+ __props.sidebarClass
74
+ ], "@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative"])
75
+ }, [
76
+ createElementVNode("div", _hoisted_2$1, [
77
+ createElementVNode("div", _hoisted_3$1, [
78
+ renderSlot(_ctx.$slots, "logo", {}, () => [
79
+ createElementVNode("div", _hoisted_4$1, [
80
+ createVNode(unref(Icon), {
81
+ class: "size-5 text-white",
82
+ icon: __props.appIcon
83
+ }, null, 8, ["icon"])
84
+ ]),
85
+ createElementVNode("span", {
86
+ class: normalizeClass([sidebarOpenModel.value ? "block" : "hidden", "font-outfit flex-1 text-lg font-semibold text-white"])
87
+ }, toDisplayString(__props.appName), 3)
88
+ ])
89
+ ]),
90
+ createElementVNode("button", {
91
+ class: "rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden",
92
+ onClick: toggleSidebar
93
+ }, [
94
+ createVNode(unref(Icon), {
95
+ class: "size-6 text-white",
96
+ icon: "lucide:menu"
97
+ })
98
+ ])
99
+ ]),
100
+ createElementVNode("div", {
101
+ class: normalizeClass([sidebarOpenModel.value ? "items-start" : "items-center", "flex flex-1 flex-col gap-8 px-2 lg:justify-center"])
102
+ }, [
103
+ renderSlot(_ctx.$slots, "menu", { currentPath: __props.currentPath }, () => [
104
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.menuItems, (item, index) => {
105
+ return openBlock(), createBlock(_sfc_main$2, {
106
+ key: index,
107
+ "menu-item": item,
108
+ expanded: sidebarOpenModel.value,
109
+ "current-path": __props.currentPath
110
+ }, null, 8, ["menu-item", "expanded", "current-path"]);
111
+ }), 128))
112
+ ])
113
+ ], 2),
114
+ createElementVNode("div", _hoisted_5$1, [
115
+ renderSlot(_ctx.$slots, "sidebar-footer")
116
+ ])
117
+ ], 2),
118
+ createElementVNode("div", _hoisted_6$1, [
119
+ createElementVNode("header", _hoisted_7$1, [
120
+ createElementVNode("div", null, [
121
+ createElementVNode("button", {
122
+ class: "rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800",
123
+ onClick: toggleSidebar
124
+ }, [
125
+ createVNode(unref(Icon), {
126
+ class: "size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100",
127
+ icon: "lucide:menu"
128
+ })
129
+ ])
130
+ ]),
131
+ createElementVNode("div", _hoisted_8$1, [
132
+ renderSlot(_ctx.$slots, "header-center")
133
+ ]),
134
+ createElementVNode("div", _hoisted_9$1, [
135
+ renderSlot(_ctx.$slots, "header-actions"),
136
+ __props.showDarkToggle ? (openBlock(), createElementBlock("button", {
137
+ key: 0,
138
+ class: "flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800",
139
+ onClick: toggleDark
140
+ }, [
141
+ createVNode(unref(Icon), {
142
+ icon: darkModel.value ? "lucide:sun" : "lucide:moon",
143
+ class: "size-5 text-gray-900 dark:text-gray-100"
144
+ }, null, 8, ["icon"])
145
+ ])) : createCommentVNode("", true)
146
+ ])
147
+ ]),
148
+ createElementVNode("div", _hoisted_10$1, [
149
+ createElementVNode("main", _hoisted_11, [
150
+ renderSlot(_ctx.$slots, "default", {}, () => [
151
+ routerViewComponent.value ? (openBlock(), createBlock(resolveDynamicComponent(routerViewComponent.value), { key: 0 })) : createCommentVNode("", true)
152
+ ])
153
+ ])
154
+ ])
155
+ ])
156
+ ]);
157
+ };
158
+ }
159
+ });
160
+ const _hoisted_1 = { class: "flex flex-col gap-4" };
161
+ const _hoisted_2 = {
162
+ key: 0,
163
+ "aria-label": "Breadcrumb"
164
+ };
165
+ const _hoisted_3 = { class: "flex items-center" };
166
+ const _hoisted_4 = {
167
+ key: 0,
168
+ class: "mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600"
169
+ };
170
+ const _hoisted_5 = { class: "flex flex-col justify-between gap-4 lg:flex-row lg:items-center" };
171
+ const _hoisted_6 = { class: "flex flex-col gap-1" };
172
+ const _hoisted_7 = {
173
+ key: 0,
174
+ class: "text-2xl font-bold text-gray-900 dark:text-gray-100"
175
+ };
176
+ const _hoisted_8 = {
177
+ key: 1,
178
+ class: "text-sm text-gray-600 dark:text-gray-400"
179
+ };
180
+ const _hoisted_9 = { class: "flex items-center gap-2" };
181
+ const _hoisted_10 = { class: "flex-1" };
182
+ const _sfc_main = /* @__PURE__ */ defineComponent({
183
+ __name: "PageLayout",
184
+ props: {
185
+ title: {},
186
+ description: {},
187
+ breadcrumbs: {}
188
+ },
189
+ setup(__props) {
190
+ const linkComponent = computed(() => {
191
+ try {
192
+ const RouterLink = resolveComponent("RouterLink");
193
+ if (typeof RouterLink !== "string") {
194
+ return RouterLink;
195
+ }
196
+ } catch {
197
+ }
198
+ return "a";
199
+ });
200
+ const getLinkProps = (link) => {
201
+ if (linkComponent.value === "a") {
202
+ return { href: link };
203
+ }
204
+ return { to: link };
205
+ };
206
+ return (_ctx, _cache) => {
207
+ return openBlock(), createElementBlock("div", _hoisted_1, [
208
+ __props.breadcrumbs && __props.breadcrumbs.length > 0 ? (openBlock(), createElementBlock("nav", _hoisted_2, [
209
+ createElementVNode("ol", _hoisted_3, [
210
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.breadcrumbs, (breadcrumb, index) => {
211
+ return openBlock(), createElementBlock("li", {
212
+ key: index,
213
+ class: "flex items-center"
214
+ }, [
215
+ index > 0 ? (openBlock(), createElementBlock("span", _hoisted_4, " / ")) : createCommentVNode("", true),
216
+ renderSlot(_ctx.$slots, "breadcrumb", {
217
+ breadcrumb,
218
+ index,
219
+ isLast: index === __props.breadcrumbs.length - 1
220
+ }, () => [
221
+ (openBlock(), createBlock(resolveDynamicComponent(linkComponent.value), mergeProps({ ref_for: true }, getLinkProps(breadcrumb.link), {
222
+ class: [
223
+ "text-sm transition-colors",
224
+ index < __props.breadcrumbs.length - 1 ? "font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100" : "text-gray-400 dark:text-gray-600"
225
+ ]
226
+ }), {
227
+ default: withCtx(() => [
228
+ createTextVNode(toDisplayString(breadcrumb.label), 1)
229
+ ]),
230
+ _: 2
231
+ }, 1040, ["class"]))
232
+ ])
233
+ ]);
234
+ }), 128))
235
+ ])
236
+ ])) : createCommentVNode("", true),
237
+ createElementVNode("div", _hoisted_5, [
238
+ createElementVNode("div", _hoisted_6, [
239
+ __props.title ? (openBlock(), createElementBlock("h1", _hoisted_7, [
240
+ renderSlot(_ctx.$slots, "title", {}, () => [
241
+ createTextVNode(toDisplayString(__props.title), 1)
242
+ ])
243
+ ])) : createCommentVNode("", true),
244
+ __props.description ? (openBlock(), createElementBlock("p", _hoisted_8, [
245
+ renderSlot(_ctx.$slots, "description", {}, () => [
246
+ createTextVNode(toDisplayString(__props.description), 1)
247
+ ])
248
+ ])) : createCommentVNode("", true)
249
+ ]),
250
+ createElementVNode("div", _hoisted_9, [
251
+ renderSlot(_ctx.$slots, "actions")
252
+ ])
253
+ ]),
254
+ createElementVNode("div", _hoisted_10, [
255
+ renderSlot(_ctx.$slots, "default")
256
+ ])
257
+ ]);
258
+ };
259
+ }
260
+ });
261
+ export {
262
+ _sfc_main$1 as _,
263
+ _sfc_main as a
264
+ };
265
+ //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-DTlUENg3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-DTlUENg3.js","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col justify-between gap-4 lg:flex-row lg:items-center\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_resolveDynamicComponent","_mergeProps","_createTextVNode","_toDisplayString"],"mappings":"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"}
@@ -0,0 +1,264 @@
1
+ "use strict";
2
+ const vue = require("vue");
3
+ const vue$1 = require("@iconify/vue");
4
+ const MenuItem_vue_vue_type_script_setup_true_lang = require("./MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs");
5
+ const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
6
+ const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
7
+ const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
8
+ const _hoisted_4$1 = { class: "bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20" };
9
+ const _hoisted_5$1 = { class: "flex flex-col gap-3 px-3 pb-3" };
10
+ const _hoisted_6$1 = { class: "flex flex-1 flex-col" };
11
+ const _hoisted_7$1 = { class: "flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950" };
12
+ const _hoisted_8$1 = { class: "flex-1" };
13
+ const _hoisted_9$1 = { class: "flex items-center gap-3" };
14
+ const _hoisted_10$1 = { class: "flex flex-1 flex-col overflow-y-auto" };
15
+ const _hoisted_11 = { class: "container mx-auto flex flex-1 flex-col gap-5 p-5" };
16
+ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
17
+ __name: "BaseLayout",
18
+ props: {
19
+ menuItems: { default: () => [] },
20
+ appName: { default: "App" },
21
+ appIcon: { default: "lucide:box" },
22
+ sidebarOpen: { type: Boolean, default: true },
23
+ dark: { type: Boolean, default: false },
24
+ showDarkToggle: { type: Boolean, default: true },
25
+ sidebarClass: { default: "bg-[#172b4c] dark:bg-slate-950" },
26
+ currentPath: { default: void 0 }
27
+ },
28
+ emits: ["update:sidebarOpen", "update:dark"],
29
+ setup(__props, { emit: __emit }) {
30
+ const props = __props;
31
+ const emit = __emit;
32
+ const internalSidebarOpen = vue.ref(props.sidebarOpen);
33
+ const internalDark = vue.ref(props.dark);
34
+ const sidebarOpenModel = vue.computed({
35
+ get: () => props.sidebarOpen ?? internalSidebarOpen.value,
36
+ set: (value) => {
37
+ internalSidebarOpen.value = value;
38
+ emit("update:sidebarOpen", value);
39
+ }
40
+ });
41
+ const darkModel = vue.computed({
42
+ get: () => props.dark ?? internalDark.value,
43
+ set: (value) => {
44
+ internalDark.value = value;
45
+ emit("update:dark", value);
46
+ }
47
+ });
48
+ const toggleSidebar = () => {
49
+ sidebarOpenModel.value = !sidebarOpenModel.value;
50
+ };
51
+ const toggleDark = () => {
52
+ darkModel.value = !darkModel.value;
53
+ };
54
+ const routerViewComponent = vue.computed(() => {
55
+ try {
56
+ const RouterView = vue.resolveComponent("RouterView");
57
+ if (typeof RouterView !== "string") {
58
+ return RouterView;
59
+ }
60
+ } catch {
61
+ }
62
+ return null;
63
+ });
64
+ return (_ctx, _cache) => {
65
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
66
+ sidebarOpenModel.value ? (vue.openBlock(), vue.createElementBlock("div", {
67
+ key: 0,
68
+ class: "absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20",
69
+ onClick: _cache[0] || (_cache[0] = ($event) => sidebarOpenModel.value = false)
70
+ })) : vue.createCommentVNode("", true),
71
+ vue.createElementVNode("aside", {
72
+ class: vue.normalizeClass([[
73
+ sidebarOpenModel.value ? "lg:w-60" : "-translate-x-76 lg:w-16 lg:translate-x-0",
74
+ __props.sidebarClass
75
+ ], "@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative"])
76
+ }, [
77
+ vue.createElementVNode("div", _hoisted_2$1, [
78
+ vue.createElementVNode("div", _hoisted_3$1, [
79
+ vue.renderSlot(_ctx.$slots, "logo", {}, () => [
80
+ vue.createElementVNode("div", _hoisted_4$1, [
81
+ vue.createVNode(vue.unref(vue$1.Icon), {
82
+ class: "size-5 text-white",
83
+ icon: __props.appIcon
84
+ }, null, 8, ["icon"])
85
+ ]),
86
+ vue.createElementVNode("span", {
87
+ class: vue.normalizeClass([sidebarOpenModel.value ? "block" : "hidden", "font-outfit flex-1 text-lg font-semibold text-white"])
88
+ }, vue.toDisplayString(__props.appName), 3)
89
+ ])
90
+ ]),
91
+ vue.createElementVNode("button", {
92
+ class: "rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden",
93
+ onClick: toggleSidebar
94
+ }, [
95
+ vue.createVNode(vue.unref(vue$1.Icon), {
96
+ class: "size-6 text-white",
97
+ icon: "lucide:menu"
98
+ })
99
+ ])
100
+ ]),
101
+ vue.createElementVNode("div", {
102
+ class: vue.normalizeClass([sidebarOpenModel.value ? "items-start" : "items-center", "flex flex-1 flex-col gap-8 px-2 lg:justify-center"])
103
+ }, [
104
+ vue.renderSlot(_ctx.$slots, "menu", { currentPath: __props.currentPath }, () => [
105
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.menuItems, (item, index) => {
106
+ return vue.openBlock(), vue.createBlock(MenuItem_vue_vue_type_script_setup_true_lang._sfc_main, {
107
+ key: index,
108
+ "menu-item": item,
109
+ expanded: sidebarOpenModel.value,
110
+ "current-path": __props.currentPath
111
+ }, null, 8, ["menu-item", "expanded", "current-path"]);
112
+ }), 128))
113
+ ])
114
+ ], 2),
115
+ vue.createElementVNode("div", _hoisted_5$1, [
116
+ vue.renderSlot(_ctx.$slots, "sidebar-footer")
117
+ ])
118
+ ], 2),
119
+ vue.createElementVNode("div", _hoisted_6$1, [
120
+ vue.createElementVNode("header", _hoisted_7$1, [
121
+ vue.createElementVNode("div", null, [
122
+ vue.createElementVNode("button", {
123
+ class: "rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800",
124
+ onClick: toggleSidebar
125
+ }, [
126
+ vue.createVNode(vue.unref(vue$1.Icon), {
127
+ class: "size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100",
128
+ icon: "lucide:menu"
129
+ })
130
+ ])
131
+ ]),
132
+ vue.createElementVNode("div", _hoisted_8$1, [
133
+ vue.renderSlot(_ctx.$slots, "header-center")
134
+ ]),
135
+ vue.createElementVNode("div", _hoisted_9$1, [
136
+ vue.renderSlot(_ctx.$slots, "header-actions"),
137
+ __props.showDarkToggle ? (vue.openBlock(), vue.createElementBlock("button", {
138
+ key: 0,
139
+ class: "flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800",
140
+ onClick: toggleDark
141
+ }, [
142
+ vue.createVNode(vue.unref(vue$1.Icon), {
143
+ icon: darkModel.value ? "lucide:sun" : "lucide:moon",
144
+ class: "size-5 text-gray-900 dark:text-gray-100"
145
+ }, null, 8, ["icon"])
146
+ ])) : vue.createCommentVNode("", true)
147
+ ])
148
+ ]),
149
+ vue.createElementVNode("div", _hoisted_10$1, [
150
+ vue.createElementVNode("main", _hoisted_11, [
151
+ vue.renderSlot(_ctx.$slots, "default", {}, () => [
152
+ routerViewComponent.value ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(routerViewComponent.value), { key: 0 })) : vue.createCommentVNode("", true)
153
+ ])
154
+ ])
155
+ ])
156
+ ])
157
+ ]);
158
+ };
159
+ }
160
+ });
161
+ const _hoisted_1 = { class: "flex flex-col gap-4" };
162
+ const _hoisted_2 = {
163
+ key: 0,
164
+ "aria-label": "Breadcrumb"
165
+ };
166
+ const _hoisted_3 = { class: "flex items-center" };
167
+ const _hoisted_4 = {
168
+ key: 0,
169
+ class: "mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600"
170
+ };
171
+ const _hoisted_5 = { class: "flex flex-col justify-between gap-4 lg:flex-row lg:items-center" };
172
+ const _hoisted_6 = { class: "flex flex-col gap-1" };
173
+ const _hoisted_7 = {
174
+ key: 0,
175
+ class: "text-2xl font-bold text-gray-900 dark:text-gray-100"
176
+ };
177
+ const _hoisted_8 = {
178
+ key: 1,
179
+ class: "text-sm text-gray-600 dark:text-gray-400"
180
+ };
181
+ const _hoisted_9 = { class: "flex items-center gap-2" };
182
+ const _hoisted_10 = { class: "flex-1" };
183
+ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
184
+ __name: "PageLayout",
185
+ props: {
186
+ title: {},
187
+ description: {},
188
+ breadcrumbs: {}
189
+ },
190
+ setup(__props) {
191
+ const linkComponent = vue.computed(() => {
192
+ try {
193
+ const RouterLink = vue.resolveComponent("RouterLink");
194
+ if (typeof RouterLink !== "string") {
195
+ return RouterLink;
196
+ }
197
+ } catch {
198
+ }
199
+ return "a";
200
+ });
201
+ const getLinkProps = (link) => {
202
+ if (linkComponent.value === "a") {
203
+ return { href: link };
204
+ }
205
+ return { to: link };
206
+ };
207
+ return (_ctx, _cache) => {
208
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
209
+ __props.breadcrumbs && __props.breadcrumbs.length > 0 ? (vue.openBlock(), vue.createElementBlock("nav", _hoisted_2, [
210
+ vue.createElementVNode("ol", _hoisted_3, [
211
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.breadcrumbs, (breadcrumb, index) => {
212
+ return vue.openBlock(), vue.createElementBlock("li", {
213
+ key: index,
214
+ class: "flex items-center"
215
+ }, [
216
+ index > 0 ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4, " / ")) : vue.createCommentVNode("", true),
217
+ vue.renderSlot(_ctx.$slots, "breadcrumb", {
218
+ breadcrumb,
219
+ index,
220
+ isLast: index === __props.breadcrumbs.length - 1
221
+ }, () => [
222
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(linkComponent.value), vue.mergeProps({ ref_for: true }, getLinkProps(breadcrumb.link), {
223
+ class: [
224
+ "text-sm transition-colors",
225
+ index < __props.breadcrumbs.length - 1 ? "font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100" : "text-gray-400 dark:text-gray-600"
226
+ ]
227
+ }), {
228
+ default: vue.withCtx(() => [
229
+ vue.createTextVNode(vue.toDisplayString(breadcrumb.label), 1)
230
+ ]),
231
+ _: 2
232
+ }, 1040, ["class"]))
233
+ ])
234
+ ]);
235
+ }), 128))
236
+ ])
237
+ ])) : vue.createCommentVNode("", true),
238
+ vue.createElementVNode("div", _hoisted_5, [
239
+ vue.createElementVNode("div", _hoisted_6, [
240
+ __props.title ? (vue.openBlock(), vue.createElementBlock("h1", _hoisted_7, [
241
+ vue.renderSlot(_ctx.$slots, "title", {}, () => [
242
+ vue.createTextVNode(vue.toDisplayString(__props.title), 1)
243
+ ])
244
+ ])) : vue.createCommentVNode("", true),
245
+ __props.description ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_8, [
246
+ vue.renderSlot(_ctx.$slots, "description", {}, () => [
247
+ vue.createTextVNode(vue.toDisplayString(__props.description), 1)
248
+ ])
249
+ ])) : vue.createCommentVNode("", true)
250
+ ]),
251
+ vue.createElementVNode("div", _hoisted_9, [
252
+ vue.renderSlot(_ctx.$slots, "actions")
253
+ ])
254
+ ]),
255
+ vue.createElementVNode("div", _hoisted_10, [
256
+ vue.renderSlot(_ctx.$slots, "default")
257
+ ])
258
+ ]);
259
+ };
260
+ }
261
+ });
262
+ exports._sfc_main = _sfc_main$1;
263
+ exports._sfc_main$1 = _sfc_main;
264
+ //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-IcouTz4C.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-IcouTz4C.cjs","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n ></div>\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon class=\"size-5 text-white\" :icon=\"appIcon\" />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon class=\"size-6 text-white\" icon=\"lucide:menu\" />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\n >\n <slot name=\"menu\" :current-path=\"currentPath\">\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5\">\n <slot>\n <component :is=\"routerViewComponent\" v-if=\"routerViewComponent\" />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface Breadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: Breadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav v-if=\"breadcrumbs && breadcrumbs.length > 0\" aria-label=\"Breadcrumb\">\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot name=\"breadcrumb\" :breadcrumb=\"breadcrumb\" :index=\"index\" :isLast=\"index === breadcrumbs.length - 1\">\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col justify-between gap-4 lg:flex-row lg:items-center\">\n <div class=\"flex flex-col gap-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">{{ description }}</slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n"],"names":["ref","computed","resolveComponent","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","Icon","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","_hoisted_10","_resolveDynamicComponent","_mergeProps","_createTextVNode","_toDisplayString"],"mappings":"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"}
@@ -7,12 +7,18 @@ type __VLS_Props = {
7
7
  label?: string;
8
8
  error?: string;
9
9
  noResultsText?: string;
10
+ /** Use teleport to body to avoid overflow clipping */
11
+ teleport?: boolean;
10
12
  };
11
13
  declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
12
14
  "update:modelValue": (value: string | null) => any;
13
15
  }, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
14
16
  "onUpdate:modelValue"?: ((value: string | null) => any) | undefined;
15
- }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
17
+ }>, {
18
+ teleport: boolean;
19
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
20
+ containerRef: HTMLDivElement;
21
+ inputWrapperRef: HTMLDivElement;
16
22
  inputRef: HTMLInputElement;
17
23
  dropdownRef: HTMLDivElement;
18
24
  }, HTMLDivElement>;
@@ -0,0 +1,20 @@
1
+ export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl';
2
+ type __VLS_Props = {
3
+ /** Image source URL */
4
+ src?: string;
5
+ /** Alt text for image */
6
+ alt?: string;
7
+ /** Fallback name (shows initials) */
8
+ name?: string;
9
+ /** Size variant */
10
+ size?: AvatarSize;
11
+ /** Show online status indicator */
12
+ status?: 'online' | 'offline' | 'away' | 'busy';
13
+ /** Rounded style */
14
+ rounded?: 'full' | 'lg' | 'md';
15
+ };
16
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
17
+ size: AvatarSize;
18
+ rounded: "full" | "lg" | "md";
19
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
20
+ export default _default;