cisse-vue-ui 0.1.6 → 0.1.8

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 (38) hide show
  1. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-d-hCuKqk.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs} +49 -219
  2. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs.map +1 -0
  3. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-BgTcOxdR.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js} +56 -226
  4. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js.map +1 -0
  5. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs +258 -0
  6. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs.map +1 -0
  7. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js +259 -0
  8. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js.map +1 -0
  9. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js → PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js} +78 -9
  10. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js.map +1 -0
  11. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-Cy0-c7YG.cjs → PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs} +78 -9
  12. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs.map +1 -0
  13. package/dist/components/core/Dropdown.vue.d.ts +6 -2
  14. package/dist/components/core/index.cjs +6 -6
  15. package/dist/components/core/index.js +5 -5
  16. package/dist/components/index.cjs +7 -7
  17. package/dist/components/index.js +13 -13
  18. package/dist/components/layout/BaseLayout.vue.d.ts +15 -0
  19. package/dist/components/layout/index.cjs +1 -1
  20. package/dist/components/layout/index.js +1 -1
  21. package/dist/{index-BYgO4V_2.js → index-3tIGVZX9.js} +4 -4
  22. package/dist/index-3tIGVZX9.js.map +1 -0
  23. package/dist/{index-DaNF3_pD.cjs → index-CjRzry8D.cjs} +8 -8
  24. package/dist/index-CjRzry8D.cjs.map +1 -0
  25. package/dist/index.cjs +8 -8
  26. package/dist/index.js +16 -16
  27. package/dist/style.css +1 -1
  28. package/package.json +8 -8
  29. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-BgTcOxdR.js.map +0 -1
  30. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-d-hCuKqk.cjs.map +0 -1
  31. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs +0 -86
  32. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs.map +0 -1
  33. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js +0 -87
  34. package/dist/MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js.map +0 -1
  35. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js.map +0 -1
  36. package/dist/PageLayout.vue_vue_type_script_setup_true_lang-Cy0-c7YG.cjs.map +0 -1
  37. package/dist/index-BYgO4V_2.js.map +0 -1
  38. package/dist/index-DaNF3_pD.cjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import { defineComponent, ref, computed, resolveComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, normalizeClass, renderSlot, createVNode, unref, toDisplayString, Fragment, renderList, createBlock, resolveDynamicComponent, mergeProps, withCtx, createTextVNode } from "vue";
1
+ import { defineComponent, ref, computed, resolveComponent, createElementBlock, openBlock, createCommentVNode, createElementVNode, normalizeClass, renderSlot, createVNode, unref, toDisplayString, Fragment, renderList, createBlock, withCtx, resolveDynamicComponent, mergeProps, createTextVNode } from "vue";
2
2
  import { Icon } from "@iconify/vue";
3
- import { _ as _sfc_main$2 } from "./MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js";
3
+ import { _ as _sfc_main$2, a as _sfc_main$3 } from "./Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js";
4
4
  const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
5
5
  const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
6
6
  const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
@@ -10,8 +10,12 @@ const _hoisted_6$1 = { class: "flex flex-1 flex-col" };
10
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
11
  const _hoisted_8$1 = { class: "flex-1" };
12
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" };
13
+ const _hoisted_10$1 = { class: "flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800" };
14
+ const _hoisted_11 = { class: "flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white" };
15
+ const _hoisted_12 = { class: "hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block" };
16
+ const _hoisted_13 = { class: "min-w-48 py-1" };
17
+ const _hoisted_14 = { class: "flex flex-1 flex-col overflow-y-auto" };
18
+ const _hoisted_15 = { class: "container mx-auto flex flex-1 flex-col gap-5 p-5" };
15
19
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
16
20
  __name: "BaseLayout",
17
21
  props: {
@@ -22,7 +26,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
22
26
  dark: { type: Boolean, default: false },
23
27
  showDarkToggle: { type: Boolean, default: true },
24
28
  sidebarClass: { default: "bg-[#172b4c] dark:bg-slate-950" },
25
- currentPath: { default: void 0 }
29
+ currentPath: { default: void 0 },
30
+ userName: { default: void 0 },
31
+ userAvatar: { default: void 0 },
32
+ userMenuItems: { default: () => [] }
26
33
  },
27
34
  emits: ["update:sidebarOpen", "update:dark"],
28
35
  setup(__props, { emit: __emit }) {
@@ -60,6 +67,27 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
60
67
  }
61
68
  return null;
62
69
  });
70
+ const routerLinkComponent = computed(() => {
71
+ try {
72
+ const RouterLink = resolveComponent("RouterLink");
73
+ if (typeof RouterLink !== "string") {
74
+ return RouterLink;
75
+ }
76
+ } catch {
77
+ }
78
+ return "a";
79
+ });
80
+ const getLinkProps = (link) => {
81
+ if (routerLinkComponent.value === "a") {
82
+ return { href: link };
83
+ }
84
+ return { to: link };
85
+ };
86
+ const handleUserMenuClick = (item) => {
87
+ if (item.action) {
88
+ item.action();
89
+ }
90
+ };
63
91
  return (_ctx, _cache) => {
64
92
  return openBlock(), createElementBlock("div", _hoisted_1$1, [
65
93
  sidebarOpenModel.value ? (openBlock(), createElementBlock("div", {
@@ -142,11 +170,52 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
142
170
  icon: darkModel.value ? "lucide:sun" : "lucide:moon",
143
171
  class: "size-5 text-gray-900 dark:text-gray-100"
144
172
  }, null, 8, ["icon"])
145
- ])) : createCommentVNode("", true)
173
+ ])) : createCommentVNode("", true),
174
+ __props.userName || __props.userAvatar ? (openBlock(), createBlock(_sfc_main$3, {
175
+ key: 1,
176
+ align: "right"
177
+ }, {
178
+ trigger: withCtx(() => [
179
+ createElementVNode("button", _hoisted_10$1, [
180
+ createElementVNode("div", _hoisted_11, toDisplayString(__props.userAvatar || "?"), 1),
181
+ createElementVNode("span", _hoisted_12, toDisplayString(__props.userName), 1),
182
+ createVNode(unref(Icon), {
183
+ icon: "lucide:chevron-down",
184
+ class: "size-4 text-gray-500"
185
+ })
186
+ ])
187
+ ]),
188
+ default: withCtx(({ close }) => [
189
+ createElementVNode("div", _hoisted_13, [
190
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.userMenuItems, (item) => {
191
+ return openBlock(), createBlock(resolveDynamicComponent(item.link ? routerLinkComponent.value : "button"), mergeProps({
192
+ key: item.label
193
+ }, { ref_for: true }, item.link ? getLinkProps(item.link) : {}, {
194
+ class: "flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800",
195
+ onClick: ($event) => {
196
+ handleUserMenuClick(item);
197
+ close();
198
+ }
199
+ }), {
200
+ default: withCtx(() => [
201
+ item.icon ? (openBlock(), createBlock(unref(Icon), {
202
+ key: 0,
203
+ icon: item.icon,
204
+ class: "size-4"
205
+ }, null, 8, ["icon"])) : createCommentVNode("", true),
206
+ createTextVNode(" " + toDisplayString(item.label), 1)
207
+ ]),
208
+ _: 2
209
+ }, 1040, ["onClick"]);
210
+ }), 128))
211
+ ])
212
+ ]),
213
+ _: 1
214
+ })) : createCommentVNode("", true)
146
215
  ])
147
216
  ]),
148
- createElementVNode("div", _hoisted_10$1, [
149
- createElementVNode("main", _hoisted_11, [
217
+ createElementVNode("div", _hoisted_14, [
218
+ createElementVNode("main", _hoisted_15, [
150
219
  renderSlot(_ctx.$slots, "default", {}, () => [
151
220
  routerViewComponent.value ? (openBlock(), createBlock(resolveDynamicComponent(routerViewComponent.value), { key: 0 })) : createCommentVNode("", true)
152
221
  ])
@@ -262,4 +331,4 @@ export {
262
331
  _sfc_main$1 as _,
263
332
  _sfc_main as a
264
333
  };
265
- //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js.map
334
+ //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.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 Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\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 /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\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 userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\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\n// Try to resolve RouterLink\nconst routerLinkComponent = 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 (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\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\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\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 gap-4 md:flex-row md:items-center md:justify-between\">\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","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
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");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs");
5
5
  const _hoisted_1$1 = { class: "font-inter relative flex h-dvh bg-gray-100 dark:bg-slate-900" };
6
6
  const _hoisted_2$1 = { class: "flex h-16 items-center px-3" };
7
7
  const _hoisted_3$1 = { class: "flex flex-1 items-center justify-center gap-3" };
@@ -11,8 +11,12 @@ const _hoisted_6$1 = { class: "flex flex-1 flex-col" };
11
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
12
  const _hoisted_8$1 = { class: "flex-1" };
13
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" };
14
+ const _hoisted_10$1 = { class: "flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800" };
15
+ const _hoisted_11 = { class: "flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white" };
16
+ const _hoisted_12 = { class: "hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block" };
17
+ const _hoisted_13 = { class: "min-w-48 py-1" };
18
+ const _hoisted_14 = { class: "flex flex-1 flex-col overflow-y-auto" };
19
+ const _hoisted_15 = { class: "container mx-auto flex flex-1 flex-col gap-5 p-5" };
16
20
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
17
21
  __name: "BaseLayout",
18
22
  props: {
@@ -23,7 +27,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
23
27
  dark: { type: Boolean, default: false },
24
28
  showDarkToggle: { type: Boolean, default: true },
25
29
  sidebarClass: { default: "bg-[#172b4c] dark:bg-slate-950" },
26
- currentPath: { default: void 0 }
30
+ currentPath: { default: void 0 },
31
+ userName: { default: void 0 },
32
+ userAvatar: { default: void 0 },
33
+ userMenuItems: { default: () => [] }
27
34
  },
28
35
  emits: ["update:sidebarOpen", "update:dark"],
29
36
  setup(__props, { emit: __emit }) {
@@ -61,6 +68,27 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
61
68
  }
62
69
  return null;
63
70
  });
71
+ const routerLinkComponent = vue.computed(() => {
72
+ try {
73
+ const RouterLink = vue.resolveComponent("RouterLink");
74
+ if (typeof RouterLink !== "string") {
75
+ return RouterLink;
76
+ }
77
+ } catch {
78
+ }
79
+ return "a";
80
+ });
81
+ const getLinkProps = (link) => {
82
+ if (routerLinkComponent.value === "a") {
83
+ return { href: link };
84
+ }
85
+ return { to: link };
86
+ };
87
+ const handleUserMenuClick = (item) => {
88
+ if (item.action) {
89
+ item.action();
90
+ }
91
+ };
64
92
  return (_ctx, _cache) => {
65
93
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
66
94
  sidebarOpenModel.value ? (vue.openBlock(), vue.createElementBlock("div", {
@@ -103,7 +131,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
103
131
  }, [
104
132
  vue.renderSlot(_ctx.$slots, "menu", { currentPath: __props.currentPath }, () => [
105
133
  (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, {
134
+ return vue.openBlock(), vue.createBlock(Dropdown_vue_vue_type_script_setup_true_lang._sfc_main, {
107
135
  key: index,
108
136
  "menu-item": item,
109
137
  expanded: sidebarOpenModel.value,
@@ -143,11 +171,52 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
143
171
  icon: darkModel.value ? "lucide:sun" : "lucide:moon",
144
172
  class: "size-5 text-gray-900 dark:text-gray-100"
145
173
  }, null, 8, ["icon"])
146
- ])) : vue.createCommentVNode("", true)
174
+ ])) : vue.createCommentVNode("", true),
175
+ __props.userName || __props.userAvatar ? (vue.openBlock(), vue.createBlock(Dropdown_vue_vue_type_script_setup_true_lang._sfc_main$1, {
176
+ key: 1,
177
+ align: "right"
178
+ }, {
179
+ trigger: vue.withCtx(() => [
180
+ vue.createElementVNode("button", _hoisted_10$1, [
181
+ vue.createElementVNode("div", _hoisted_11, vue.toDisplayString(__props.userAvatar || "?"), 1),
182
+ vue.createElementVNode("span", _hoisted_12, vue.toDisplayString(__props.userName), 1),
183
+ vue.createVNode(vue.unref(vue$1.Icon), {
184
+ icon: "lucide:chevron-down",
185
+ class: "size-4 text-gray-500"
186
+ })
187
+ ])
188
+ ]),
189
+ default: vue.withCtx(({ close }) => [
190
+ vue.createElementVNode("div", _hoisted_13, [
191
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.userMenuItems, (item) => {
192
+ return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(item.link ? routerLinkComponent.value : "button"), vue.mergeProps({
193
+ key: item.label
194
+ }, { ref_for: true }, item.link ? getLinkProps(item.link) : {}, {
195
+ class: "flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800",
196
+ onClick: ($event) => {
197
+ handleUserMenuClick(item);
198
+ close();
199
+ }
200
+ }), {
201
+ default: vue.withCtx(() => [
202
+ item.icon ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
203
+ key: 0,
204
+ icon: item.icon,
205
+ class: "size-4"
206
+ }, null, 8, ["icon"])) : vue.createCommentVNode("", true),
207
+ vue.createTextVNode(" " + vue.toDisplayString(item.label), 1)
208
+ ]),
209
+ _: 2
210
+ }, 1040, ["onClick"]);
211
+ }), 128))
212
+ ])
213
+ ]),
214
+ _: 1
215
+ })) : vue.createCommentVNode("", true)
147
216
  ])
148
217
  ]),
149
- vue.createElementVNode("div", _hoisted_10$1, [
150
- vue.createElementVNode("main", _hoisted_11, [
218
+ vue.createElementVNode("div", _hoisted_14, [
219
+ vue.createElementVNode("main", _hoisted_15, [
151
220
  vue.renderSlot(_ctx.$slots, "default", {}, () => [
152
221
  routerViewComponent.value ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(routerViewComponent.value), { key: 0 })) : vue.createCommentVNode("", true)
153
222
  ])
@@ -261,4 +330,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
261
330
  });
262
331
  exports._sfc_main = _sfc_main$1;
263
332
  exports._sfc_main$1 = _sfc_main;
264
- //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-Cy0-c7YG.cjs.map
333
+ //# sourceMappingURL=PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.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 Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\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 /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\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 userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\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\n// Try to resolve RouterLink\nconst routerLinkComponent = 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 (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\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\n <!-- User Menu -->\n <Dropdown v-if=\"userName || userAvatar\" align=\"right\">\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-500\" />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon v-if=\"item.icon\" :icon=\"item.icon\" class=\"size-4\" />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\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 gap-4 md:flex-row md:items-center md:justify-between\">\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","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,UAAM,QAAQ;AAwCd,UAAM,OAAO;AAKb,UAAM,sBAAsBA,IAAAA,IAAI,MAAM,WAAW;AACjD,UAAM,eAAeA,IAAAA,IAAI,MAAM,IAAI;AAEnC,UAAM,mBAAmBC,IAAAA,SAAS;AAAA,MAChC,KAAK,MAAM,MAAM,eAAe,oBAAoB;AAAA,MACpD,KAAK,CAAC,UAAmB;AACvB,4BAAoB,QAAQ;AAC5B,aAAK,sBAAsB,KAAK;AAAA,MAClC;AAAA,IAAA,CACD;AAED,UAAM,YAAYA,IAAAA,SAAS;AAAA,MACzB,KAAK,MAAM,MAAM,QAAQ,aAAa;AAAA,MACtC,KAAK,CAAC,UAAmB;AACvB,qBAAa,QAAQ;AACrB,aAAK,eAAe,KAAK;AAAA,MAC3B;AAAA,IAAA,CACD;AAED,UAAM,gBAAgB,MAAM;AAC1B,uBAAiB,QAAQ,CAAC,iBAAiB;AAAA,IAC7C;AAEA,UAAM,aAAa,MAAM;AACvB,gBAAU,QAAQ,CAAC,UAAU;AAAA,IAC/B;AAGA,UAAM,sBAAsBA,IAAAA,SAAS,MAAM;AACzC,UAAI;AACF,cAAM,aAAaC,IAAAA,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAGD,UAAM,sBAAsBD,IAAAA,SAAS,MAAM;AACzC,UAAI;AACF,cAAM,aAAaC,IAAAA,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,eAAe,CAAC,SAAiB;AACrC,UAAI,oBAAoB,UAAU,KAAK;AACrC,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AACA,aAAO,EAAE,IAAI,KAAA;AAAA,IACf;AAEA,UAAM,sBAAsB,CAAC,SAAuB;AAClD,UAAI,KAAK,QAAQ;AACf,aAAK,OAAA;AAAA,MACP;AAAA,IACF;;AAIE,aAAAC,cAAA,GAAAC,uBAkJM,OAlJNC,cAkJM;AAAA,QA/II,iBAAA,0BADRD,IAAAA,mBAIO,OAAA;AAAA;UAFL,OAAM;AAAA,UACL,+CAAO,iBAAA,QAAgB;AAAA,QAAA;QAI1BE,IAAAA,mBAqDQ,SAAA;AAAA,UApDL,OAAKC,IAAAA,eAAA,CAAA;AAAA,YAAY,iBAAA,QAAgB,YAAA;AAAA,YAAmE,QAAA;AAAA,UAAA,GAI/F,gIAAgI,CAAA;AAAA,QAAA;UAGtID,IAAAA,mBAuBM,OAvBNE,cAuBM;AAAA,YAtBJF,IAAAA,mBAcM,OAdNG,cAcM;AAAA,cAbJC,IAAAA,WAYO,yBAZP,MAYO;AAAA,gBAXLJ,IAAAA,mBAIM,OAJNK,cAIM;AAAA,kBADJC,gBAAkDC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,oBAA5C,OAAM;AAAA,oBAAqB,MAAM,QAAA;AAAA,kBAAA;;gBAEzCR,IAAAA,mBAKO,QAAA;AAAA,kBAJJ,OAAKC,IAAAA,eAAA,CAAE,iBAAA,QAAgB,UAAA,UAClB,qDAAqD,CAAA;AAAA,gBAAA,uBAExD,QAAA,OAAO,GAAA,CAAA;AAAA,cAAA;;YAKhBD,IAAAA,mBAKS,UAAA;AAAA,cAJP,OAAM;AAAA,cACL,SAAO;AAAA,YAAA;cAERM,gBAAqDC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,gBAA/C,OAAM;AAAA,gBAAoB,MAAK;AAAA,cAAA;;;UAKzCR,IAAAA,mBAaM,OAAA;AAAA,YAZH,OAAKC,IAAAA,eAAA,CAAE,iBAAA,QAAgB,gBAAA,gBAClB,mDAAmD,CAAA;AAAA,UAAA;YAEzDG,eAQO,KAAA,QAAA,QAAA,EARY,aAAc,QAAA,YAAA,GAAjC,MAQO;AAAA,eAPLP,IAAAA,UAAA,IAAA,GAAAC,IAAAA,mBAMEW,cAAA,MAAAC,IAAAA,WALwB,QAAA,WAAS,CAAzB,MAAM,UAAK;wCADrBC,IAAAA,YAMEC,wDAAA;AAAA,kBAJC,KAAK;AAAA,kBACL,aAAW;AAAA,kBACX,UAAU,iBAAA;AAAA,kBACV,gBAAc,QAAA;AAAA,gBAAA;;;;UAMrBZ,IAAAA,mBAEM,OAFNa,cAEM;AAAA,YADJT,eAA8B,KAAA,QAAA,gBAAA;AAAA,UAAA;;QAKlCJ,IAAAA,mBAgFM,OAhFNc,cAgFM;AAAA,UA9EJd,IAAAA,mBAoES,UApETe,cAoES;AAAA,YAjEPf,IAAAA,mBAUM,OAAA,MAAA;AAAA,cATJA,IAAAA,mBAQS,UAAA;AAAA,gBAPP,OAAM;AAAA,gBACL,SAAO;AAAA,cAAA;gBAERM,gBAGEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,kBAFA,OAAM;AAAA,kBACN,MAAK;AAAA,gBAAA;;;YAKXR,IAAAA,mBAEM,OAFNgB,cAEM;AAAA,cADJZ,eAA6B,KAAA,QAAA,eAAA;AAAA,YAAA;YAG/BJ,IAAAA,mBAgDM,OAhDNiB,cAgDM;AAAA,cA/CJb,eAA8B,KAAA,QAAA,gBAAA;AAAA,cAGtB,QAAA,mCADRN,IAAAA,mBASS,UAAA;AAAA;gBAPP,OAAM;AAAA,gBACL,SAAO;AAAA,cAAA;gBAERQ,gBAGEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,kBAFC,MAAM,UAAA,QAAS,eAAA;AAAA,kBAChB,OAAM;AAAA,gBAAA;;cAKM,QAAA,YAAY,QAAA,+BAA5BG,IAAAA,YAgCWO,0DAAA;AAAA;gBAhC6B,OAAM;AAAA,cAAA;gBACjC,qBACT,MAYS;AAAA,kBAZTlB,IAAAA,mBAYS,UAZTmB,eAYS;AAAA,oBATPnB,uBAIM,OAJN,aAIMoB,IAAAA,gBADD,QAAA,cAAU,GAAA,GAAA,CAAA;AAAA,oBAEfpB,IAAAA,mBAEO,QAFP,aAEOoB,IAAAA,gBADF,QAAA,QAAQ,GAAA,CAAA;AAAA,oBAEbd,gBAAgEC,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA,sBAA1D,MAAK;AAAA,sBAAsB,OAAM;AAAA,oBAAA;;;gBAIhC,SAAOa,IAAAA,QAChB,CAYM,EAbc,YAAK;AAAA,kBACzBrB,IAAAA,mBAYM,OAZN,aAYM;AAAA,0CAXJF,IAAAA,mBAUYW,IAAAA,UAAA,MAAAC,IAAAA,WARK,QAAA,eAAa,CAArB,SAAI;AAFb,6BAAAb,cAAA,GAAAc,gBAUYW,IAAAA,wBATL,KAAK,OAAO,oBAAA,mBADnBC,eAUY;AAAA,wBAPT,KAAK,KAAK;AAAA,sBAAA,GACH,EAAA,SAAA,KAAA,GAAA,KAAK,OAAO,aAAa,KAAK,IAAI,IAAA,IAAA;AAAA,wBAC1C,OAAM;AAAA,wBACL,SAAK,CAAA,WAAA;AAAE,8CAAoB,IAAI;AAAG,gCAAA;AAAA,wBAAK;AAAA,sBAAA;6CAExC,MAA0D;AAAA,0BAA9C,KAAK,yBAAjBZ,IAAAA,YAA0DJ,IAAAA,MAAAC,MAAAA,IAAA,GAAA;AAAA;4BAAlC,MAAM,KAAK;AAAA,4BAAM,OAAM;AAAA,0BAAA;8CAAW,MAC1DY,IAAAA,gBAAG,KAAK,KAAK,GAAA,CAAA;AAAA,wBAAA;;;;;;;;;;UASzBpB,IAAAA,mBAMM,OANN,aAMM;AAAA,YALJA,IAAAA,mBAIO,QAJP,aAIO;AAAA,cAHLI,IAAAA,WAEO,4BAFP,MAEO;AAAA,gBADsC,oBAAA,SAA3CP,IAAAA,UAAA,GAAAc,IAAAA,YAAkEW,IAAAA,wBAAlD,oBAAA,KAAmB,GAAA,EAAA,KAAA,EAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1P/C,UAAM,gBAAgB3B,IAAAA,SAAS,MAAM;AACnC,UAAI;AACF,cAAM,aAAaC,IAAAA,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,eAAe,CAAC,SAAiB;AACrC,UAAI,cAAc,UAAU,KAAK;AAC/B,eAAO,EAAE,MAAM,KAAA;AAAA,MACjB;AACA,aAAO,EAAE,IAAI,KAAA;AAAA,IACf;;AAIE,aAAAC,cAAA,GAAAC,uBA6DM,OA7DN,YA6DM;AAAA,QA3DO,QAAA,eAAe,QAAA,YAAY,SAAM,KAA5CD,IAAAA,aAAAC,IAAAA,mBA8BM,OA9BN,YA8BM;AAAA,UA7BJE,IAAAA,mBA4BK,MA5BL,YA4BK;AAAA,aA3BHH,IAAAA,UAAA,IAAA,GAAAC,IAAAA,mBA0BKW,cAAA,MAAAC,IAAAA,WAzB2B,QAAA,aAAW,CAAjC,YAAY,UAAK;sCAD3BZ,IAAAA,mBA0BK,MAAA;AAAA,gBAxBF,KAAK;AAAA,gBACN,OAAM;AAAA,cAAA;gBAGE,QAAK,sBADbA,uBAKO,QALP,YAGC,KAED;gBAEAM,eAaO,KAAA,QAAA,cAAA;AAAA,kBAbkB;AAAA,kBAAyB;AAAA,kBAAe,QAAQ,UAAU,QAAA,YAAY,SAAM;AAAA,gBAAA,GAArG,MAaO;AAAA,oCAZLO,IAAAA,YAWYW,IAAAA,wBAVL,mBAAa,GADpBC,IAAAA,WAWY,mBATF,aAAa,WAAW,IAAI,GAAA;AAAA,oBACnC,OAAK;AAAA;sBAAiE,QAAQ,QAAA,YAAY,SAAM;;;yCAOjG,MAAsB;AAAA,sBAAnBC,IAAAA,gBAAAJ,IAAAA,gBAAA,WAAW,KAAK,GAAA,CAAA;AAAA,oBAAA;;;;;;;;QAQ7BpB,IAAAA,mBAoBM,OApBN,YAoBM;AAAA,UAnBJA,IAAAA,mBAcM,OAdN,YAcM;AAAA,YAZI,QAAA,SADRH,IAAAA,UAAA,GAAAC,IAAAA,mBAKK,MALL,YAKK;AAAA,cADHM,IAAAA,WAAqC,0BAArC,MAAqC;AAAA,wDAAf,QAAA,KAAK,GAAA,CAAA;AAAA,cAAA;;YAIrB,QAAA,eADRP,IAAAA,UAAA,GAAAC,IAAAA,mBAKI,KALJ,YAKI;AAAA,cADFM,IAAAA,WAAiD,gCAAjD,MAAiD;AAAA,wDAArB,QAAA,WAAW,GAAA,CAAA;AAAA,cAAA;;;UAI3CJ,IAAAA,mBAEM,OAFN,YAEM;AAAA,YADJI,eAAuB,KAAA,QAAA,SAAA;AAAA,UAAA;;QAK3BJ,IAAAA,mBAEM,OAFN,aAEM;AAAA,UADJI,eAAQ,KAAA,QAAA,SAAA;AAAA,QAAA;;;;;;;"}
@@ -7,8 +7,8 @@ export interface DropdownItem {
7
7
  divider?: boolean;
8
8
  }
9
9
  type __VLS_Props = {
10
- /** Dropdown items */
11
- items: DropdownItem[];
10
+ /** Dropdown items (optional if using default slot) */
11
+ items?: DropdownItem[];
12
12
  /** Align dropdown */
13
13
  align?: 'left' | 'right';
14
14
  /** Dropdown width */
@@ -21,6 +21,9 @@ declare function __VLS_template(): {
21
21
  slots: {
22
22
  trigger?(_: {}): any;
23
23
  'trigger-label'?(_: {}): any;
24
+ default?(_: {
25
+ close: () => void;
26
+ }): any;
24
27
  };
25
28
  refs: {
26
29
  dropdownRef: HTMLDivElement;
@@ -36,6 +39,7 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
36
39
  onSelect?: ((item: DropdownItem) => any) | undefined;
37
40
  }>, {
38
41
  width: "auto" | "full" | "sm" | "md" | "lg";
42
+ items: DropdownItem[];
39
43
  align: "left" | "right";
40
44
  teleport: boolean;
41
45
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
@@ -1,19 +1,19 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../../CollapsibleCard.vue_vue_type_script_setup_true_lang-d-hCuKqk.cjs");
4
- const MenuItem_vue_vue_type_script_setup_true_lang = require("../../MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs");
3
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../../CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("../../Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("../../BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
6
6
  exports.AutocompleteComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$2;
7
7
  exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$5;
8
8
  exports.Button = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$4;
9
9
  exports.CardComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main;
10
- exports.CollapsibleCard = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$10;
11
- exports.Dropdown = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$8;
12
- exports.Stepper = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$9;
10
+ exports.CollapsibleCard = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$9;
11
+ exports.Stepper = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$8;
13
12
  exports.TabPanel = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$7;
14
13
  exports.TableAction = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$3;
15
14
  exports.TableComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$1;
16
15
  exports.Tabs = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$6;
17
- exports.MenuItem = MenuItem_vue_vue_type_script_setup_true_lang._sfc_main;
16
+ exports.Dropdown = Dropdown_vue_vue_type_script_setup_true_lang._sfc_main$1;
17
+ exports.MenuItem = Dropdown_vue_vue_type_script_setup_true_lang._sfc_main;
18
18
  exports.StatusBadge = BadgeType_vue_vue_type_script_setup_true_lang._sfc_main;
19
19
  //# sourceMappingURL=index.cjs.map
@@ -1,16 +1,16 @@
1
- import { b, e, d, _, j, h, i, g, c, a, f } from "../../CollapsibleCard.vue_vue_type_script_setup_true_lang-BgTcOxdR.js";
2
- import { _ as _2 } from "../../MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js";
1
+ import { b, e, d, _, i, h, g, c, a, f } from "../../CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
2
+ import { a as a2, _ as _2 } from "../../Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js";
3
3
  import { _ as _3 } from "../../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
4
  export {
5
5
  b as AutocompleteComponent,
6
6
  e as Avatar,
7
7
  d as Button,
8
8
  _ as CardComponent,
9
- j as CollapsibleCard,
10
- h as Dropdown,
9
+ i as CollapsibleCard,
10
+ a2 as Dropdown,
11
11
  _2 as MenuItem,
12
12
  _3 as StatusBadge,
13
- i as Stepper,
13
+ h as Stepper,
14
14
  g as TabPanel,
15
15
  c as TableAction,
16
16
  a as TableComponent,
@@ -1,23 +1,23 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../CollapsibleCard.vue_vue_type_script_setup_true_lang-d-hCuKqk.cjs");
4
- const MenuItem_vue_vue_type_script_setup_true_lang = require("../MenuItem.vue_vue_type_script_setup_true_lang-BWz86k7c.cjs");
3
+ const CollapsibleCard_vue_vue_type_script_setup_true_lang = require("../CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("../Dropdown.vue_vue_type_script_setup_true_lang-CZQ5Ci8K.cjs");
5
5
  const BadgeType_vue_vue_type_script_setup_true_lang = require("../BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs");
6
6
  const Checkbox_vue_vue_type_script_setup_true_lang = require("../Checkbox.vue_vue_type_script_setup_true_lang-DQD2I1Wk.cjs");
7
7
  const EmptyState_vue_vue_type_script_setup_true_lang = require("../EmptyState.vue_vue_type_script_setup_true_lang-mlqLBP5W.cjs");
8
- const PageLayout_vue_vue_type_script_setup_true_lang = require("../PageLayout.vue_vue_type_script_setup_true_lang-Cy0-c7YG.cjs");
8
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("../PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs");
9
9
  exports.AutocompleteComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$2;
10
10
  exports.Avatar = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$5;
11
11
  exports.Button = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$4;
12
12
  exports.CardComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main;
13
- exports.CollapsibleCard = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$10;
14
- exports.Dropdown = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$8;
15
- exports.Stepper = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$9;
13
+ exports.CollapsibleCard = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$9;
14
+ exports.Stepper = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$8;
16
15
  exports.TabPanel = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$7;
17
16
  exports.TableAction = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$3;
18
17
  exports.TableComponent = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$1;
19
18
  exports.Tabs = CollapsibleCard_vue_vue_type_script_setup_true_lang._sfc_main$6;
20
- exports.MenuItem = MenuItem_vue_vue_type_script_setup_true_lang._sfc_main;
19
+ exports.Dropdown = Dropdown_vue_vue_type_script_setup_true_lang._sfc_main$1;
20
+ exports.MenuItem = Dropdown_vue_vue_type_script_setup_true_lang._sfc_main;
21
21
  exports.BadgeType = BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$5;
22
22
  exports.BooleanType = BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$4;
23
23
  exports.DateType = BadgeType_vue_vue_type_script_setup_true_lang._sfc_main$3;
@@ -1,9 +1,9 @@
1
- import { b, e, d, _, j, h, i, g, c, a, f } from "../CollapsibleCard.vue_vue_type_script_setup_true_lang-BgTcOxdR.js";
2
- import { _ as _2 } from "../MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js";
3
- import { e as e2, d as d2, c as c2, b as b2, _ as _3, a as a2 } from "../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
- import { g as g2, d as d3, a as a3, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js";
5
- import { e as e4, f as f3, _ as _5, a as a4, c as c4, d as d4, b as b4 } from "../EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
6
- import { _ as _6, a as a5 } from "../PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js";
1
+ import { b, e, d, _, i, h, g, c, a, f } from "../CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
2
+ import { a as a2, _ as _2 } from "../Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js";
3
+ import { e as e2, d as d2, c as c2, b as b2, _ as _3, a as a3 } from "../BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
+ import { g as g2, d as d3, a as a4, b as b3, _ as _4, c as c3, e as e3, f as f2 } from "../Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js";
5
+ import { e as e4, f as f3, _ as _5, a as a5, c as c4, d as d4, b as b4 } from "../EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
6
+ import { _ as _6, a as a6 } from "../PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js";
7
7
  export {
8
8
  e4 as Alert,
9
9
  b as AutocompleteComponent,
@@ -14,31 +14,31 @@ export {
14
14
  d as Button,
15
15
  _ as CardComponent,
16
16
  g2 as Checkbox,
17
- j as CollapsibleCard,
17
+ i as CollapsibleCard,
18
18
  c2 as DateType,
19
- h as Dropdown,
19
+ a2 as Dropdown,
20
20
  f3 as EmptyState,
21
21
  d3 as FormGroup,
22
- a3 as FormHelp,
22
+ a4 as FormHelp,
23
23
  b3 as FormInput,
24
24
  _4 as FormLabel,
25
25
  c3 as FormSelect,
26
26
  _5 as LoadingSpinner,
27
27
  _2 as MenuItem,
28
- a4 as Modal,
28
+ a5 as Modal,
29
29
  c4 as NotificationComponent,
30
30
  d4 as NotificationList,
31
31
  b2 as NumberType,
32
- a5 as PageLayout,
32
+ a6 as PageLayout,
33
33
  b4 as PaginationControls,
34
34
  e3 as SearchInput,
35
35
  _3 as StatusBadge,
36
- i as Stepper,
36
+ h as Stepper,
37
37
  f2 as Switch,
38
38
  g as TabPanel,
39
39
  c as TableAction,
40
40
  a as TableComponent,
41
41
  f as Tabs,
42
- a2 as TextType
42
+ a3 as TextType
43
43
  };
44
44
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,10 @@
1
1
  import { MenuItemProps } from '../../types';
2
+ export interface UserMenuItem {
3
+ label: string;
4
+ icon?: string;
5
+ link?: string;
6
+ action?: () => void;
7
+ }
2
8
  type __VLS_Props = {
3
9
  /** Menu items for the sidebar */
4
10
  menuItems?: MenuItemProps[];
@@ -16,6 +22,12 @@ type __VLS_Props = {
16
22
  sidebarClass?: string;
17
23
  /** Current route path for menu active state (pass useRoute().path) */
18
24
  currentPath?: string;
25
+ /** User display name */
26
+ userName?: string;
27
+ /** User avatar (initials or image URL) */
28
+ userAvatar?: string;
29
+ /** User menu items (dropdown) */
30
+ userMenuItems?: UserMenuItem[];
19
31
  };
20
32
  declare function __VLS_template(): {
21
33
  attrs: Partial<{}>;
@@ -48,6 +60,9 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_Props, {}, {}
48
60
  dark: boolean;
49
61
  showDarkToggle: boolean;
50
62
  sidebarClass: string;
63
+ userName: string;
64
+ userAvatar: string;
65
+ userMenuItems: UserMenuItem[];
51
66
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
52
67
  declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
53
68
  export default _default;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const PageLayout_vue_vue_type_script_setup_true_lang = require("../../PageLayout.vue_vue_type_script_setup_true_lang-Cy0-c7YG.cjs");
3
+ const PageLayout_vue_vue_type_script_setup_true_lang = require("../../PageLayout.vue_vue_type_script_setup_true_lang-HxuODTiQ.cjs");
4
4
  exports.BaseLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main;
5
5
  exports.PageLayout = PageLayout_vue_vue_type_script_setup_true_lang._sfc_main$1;
6
6
  //# sourceMappingURL=index.cjs.map
@@ -1,4 +1,4 @@
1
- import { _, a } from "../../PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js";
1
+ import { _, a } from "../../PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js";
2
2
  export {
3
3
  _ as BaseLayout,
4
4
  a as PageLayout
@@ -1,9 +1,9 @@
1
- import { b as _sfc_main$1, e as _sfc_main$2, d as _sfc_main$6, _ as _sfc_main$7, j as _sfc_main$9, h as _sfc_main$b, i as _sfc_main$s, g as _sfc_main$u, c as _sfc_main$v, a as _sfc_main$w, f as _sfc_main$x } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-BgTcOxdR.js";
2
- import { _ as _sfc_main$j } from "./MenuItem.vue_vue_type_script_setup_true_lang-emN2qlfR.js";
1
+ import { b as _sfc_main$1, e as _sfc_main$2, d as _sfc_main$6, _ as _sfc_main$7, i as _sfc_main$9, h as _sfc_main$s, g as _sfc_main$u, c as _sfc_main$v, a as _sfc_main$w, f as _sfc_main$x } from "./CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js";
2
+ import { a as _sfc_main$b, _ as _sfc_main$j } from "./Dropdown.vue_vue_type_script_setup_true_lang-CfyqlT_n.js";
3
3
  import { e as _sfc_main$3, d as _sfc_main$5, c as _sfc_main$a, b as _sfc_main$n, _ as _sfc_main$r, a as _sfc_main$y } from "./BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js";
4
4
  import { g as _sfc_main$8, d as _sfc_main$d, a as _sfc_main$e, b as _sfc_main$f, _ as _sfc_main$g, c as _sfc_main$h, e as _sfc_main$q, f as _sfc_main$t } from "./Checkbox.vue_vue_type_script_setup_true_lang-DVkcMcSN.js";
5
5
  import { e as _sfc_main, f as _sfc_main$c, _ as _sfc_main$i, a as _sfc_main$k, c as _sfc_main$l, d as _sfc_main$m, b as _sfc_main$p } from "./EmptyState.vue_vue_type_script_setup_true_lang-CrVvFwXA.js";
6
- import { _ as _sfc_main$4, a as _sfc_main$o } from "./PageLayout.vue_vue_type_script_setup_true_lang-CQ7jdAeN.js";
6
+ import { _ as _sfc_main$4, a as _sfc_main$o } from "./PageLayout.vue_vue_type_script_setup_true_lang-BoFiqN42.js";
7
7
  const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
8
8
  __proto__: null,
9
9
  Alert: _sfc_main,
@@ -45,4 +45,4 @@ const components = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePr
45
45
  export {
46
46
  components as c
47
47
  };
48
- //# sourceMappingURL=index-BYgO4V_2.js.map
48
+ //# sourceMappingURL=index-3tIGVZX9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-3tIGVZX9.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}