cisse-vue-ui 0.7.7 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js → Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js} +126 -39
  2. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js.map +1 -0
  3. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs → Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs} +125 -38
  4. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs.map +1 -0
  5. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs → PageHero.vue_vue_type_script_setup_true_lang-Bi97ypMD.cjs} +3 -3
  6. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs.map → PageHero.vue_vue_type_script_setup_true_lang-Bi97ypMD.cjs.map} +1 -1
  7. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js → PageHero.vue_vue_type_script_setup_true_lang-DQQGYAw0.js} +3 -3
  8. package/dist/{PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js.map → PageHero.vue_vue_type_script_setup_true_lang-DQQGYAw0.js.map} +1 -1
  9. package/dist/components/core/MenuItem.stories.d.ts +6 -0
  10. package/dist/components/core/MenuItem.vue.d.ts +24 -2
  11. package/dist/components/core/index.cjs +1 -1
  12. package/dist/components/core/index.js +1 -1
  13. package/dist/components/form/CheckboxGroup.stories.d.ts +15 -0
  14. package/dist/components/form/TextArea.stories.d.ts +13 -0
  15. package/dist/components/index.cjs +2 -2
  16. package/dist/components/index.js +2 -2
  17. package/dist/components/layout/BaseLayout.stories.d.ts +1 -0
  18. package/dist/components/layout/index.cjs +1 -1
  19. package/dist/components/layout/index.js +1 -1
  20. package/dist/{index-CtUcdTUz.cjs → index-DwqCXgDx.cjs} +3 -3
  21. package/dist/{index-CtUcdTUz.cjs.map → index-DwqCXgDx.cjs.map} +1 -1
  22. package/dist/{index-DvkgM40a.js → index-rBD1MYh-.js} +3 -3
  23. package/dist/index-rBD1MYh-.js.map +1 -0
  24. package/dist/index.cjs +3 -3
  25. package/dist/index.js +3 -3
  26. package/dist/style.css +1 -1
  27. package/dist/types/components.d.ts +2 -0
  28. package/package.json +1 -1
  29. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map +0 -1
  30. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js.map +0 -1
  31. package/dist/index-DvkgM40a.js.map +0 -1
@@ -1,22 +1,35 @@
1
- import { defineComponent, computed, resolveComponent, createBlock, openBlock, resolveDynamicComponent, mergeProps, withCtx, createElementVNode, createVNode, createElementBlock, createCommentVNode, unref, normalizeClass, Transition, toDisplayString, ref, renderSlot, createTextVNode, Teleport, normalizeStyle, Fragment, renderList } from "vue";
1
+ import { defineComponent, useSlots, ref, computed, resolveComponent, createElementBlock, openBlock, createBlock, createVNode, resolveDynamicComponent, mergeProps, withCtx, createElementVNode, createCommentVNode, unref, normalizeClass, Transition, toDisplayString, renderSlot, Fragment, renderList, createTextVNode, Teleport, normalizeStyle } from "vue";
2
2
  import { Icon } from "@iconify/vue";
3
3
  import { u as useDropdown } from "./useDropdown-iVu14E6s.js";
4
4
  import { u as useId } from "./useId-xeHj7rkg.js";
5
- const _hoisted_1$1 = { class: "relative" };
6
- const _hoisted_2$1 = {
5
+ const _hoisted_1$1 = { class: "w-full" };
6
+ const _hoisted_2$1 = { class: "relative" };
7
+ const _hoisted_3$1 = {
7
8
  key: 0,
8
9
  class: "absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600"
9
10
  };
11
+ const _hoisted_4$1 = {
12
+ key: 0,
13
+ class: "overflow-hidden"
14
+ };
10
15
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
11
16
  __name: "MenuItem",
12
17
  props: {
13
18
  menuItem: {},
14
19
  expanded: { type: Boolean, default: true },
15
20
  active: { type: Boolean, default: void 0 },
16
- currentPath: { default: void 0 }
21
+ currentPath: { default: void 0 },
22
+ depth: { default: 0 }
17
23
  },
18
24
  setup(__props) {
19
25
  const props = __props;
26
+ const slots = useSlots();
27
+ const submenuOpen = ref(false);
28
+ const hasSlotContent = computed(() => !!slots.submenu);
29
+ const hasChildren = computed(() => {
30
+ return props.menuItem.children && props.menuItem.children.length > 0;
31
+ });
32
+ const hasSubmenu = computed(() => hasChildren.value || hasSlotContent.value);
20
33
  const isRouteActive = computed(() => {
21
34
  if (props.active !== void 0) {
22
35
  return props.active;
@@ -27,7 +40,26 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
27
40
  }
28
41
  return path === props.menuItem.link || path.startsWith(props.menuItem.link + "/");
29
42
  });
43
+ const isChildActive = computed(() => {
44
+ if (!hasChildren.value) return false;
45
+ const path = props.currentPath ?? (typeof window !== "undefined" ? window.location.pathname : "/");
46
+ const checkActive = (items) => {
47
+ return items.some((item) => {
48
+ if (item.link === path || path.startsWith(item.link + "/")) {
49
+ return true;
50
+ }
51
+ if (item.children) {
52
+ return checkActive(item.children);
53
+ }
54
+ return false;
55
+ });
56
+ };
57
+ return checkActive(props.menuItem.children);
58
+ });
30
59
  const linkComponent = computed(() => {
60
+ if (hasSubmenu.value) {
61
+ return "button";
62
+ }
31
63
  try {
32
64
  const RouterLink = resolveComponent("RouterLink");
33
65
  if (typeof RouterLink !== "string") {
@@ -38,48 +70,103 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
38
70
  return "a";
39
71
  });
40
72
  const linkProps = computed(() => {
73
+ if (hasSubmenu.value) {
74
+ return { type: "button" };
75
+ }
41
76
  if (linkComponent.value === "a") {
42
77
  return { href: props.menuItem.link };
43
78
  }
44
79
  return { to: props.menuItem.link };
45
80
  });
81
+ const toggleSubmenu = () => {
82
+ if (hasSubmenu.value) {
83
+ submenuOpen.value = !submenuOpen.value;
84
+ }
85
+ };
86
+ const paddingLeft = computed(() => {
87
+ if (!props.expanded) return void 0;
88
+ const basePadding = 20;
89
+ const indentPerLevel = 16;
90
+ return `${basePadding + props.depth * indentPerLevel}px`;
91
+ });
46
92
  return (_ctx, _cache) => {
47
- return openBlock(), createBlock(resolveDynamicComponent(linkComponent.value), mergeProps(linkProps.value, {
48
- class: [__props.expanded ? "flex-row" : "flex-col", "group relative flex items-center justify-center gap-2 px-5"]
49
- }), {
50
- default: withCtx(() => [
51
- createElementVNode("div", _hoisted_1$1, [
52
- createVNode(unref(Icon), {
93
+ const _component_MenuItem = resolveComponent("MenuItem", true);
94
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
95
+ (openBlock(), createBlock(resolveDynamicComponent(linkComponent.value), mergeProps(linkProps.value, {
96
+ class: [__props.expanded ? "flex-row" : "flex-col", "group relative flex w-full items-center justify-center gap-2 pr-5 py-2"],
97
+ style: __props.expanded ? { paddingLeft: paddingLeft.value } : void 0,
98
+ onClick: toggleSubmenu
99
+ }), {
100
+ default: withCtx(() => [
101
+ createElementVNode("div", _hoisted_2$1, [
102
+ createVNode(unref(Icon), {
103
+ class: normalizeClass([[
104
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
105
+ __props.expanded ? "size-5" : "size-8"
106
+ ], "transition-all duration-300"]),
107
+ icon: __props.menuItem.icon
108
+ }, null, 8, ["class", "icon"]),
109
+ __props.menuItem.notification ? (openBlock(), createElementBlock("span", _hoisted_3$1)) : createCommentVNode("", true)
110
+ ]),
111
+ createVNode(Transition, {
112
+ "enter-active-class": "transition-all duration-300 ease-out",
113
+ "enter-from-class": "opacity-0 -translate-x-2",
114
+ "enter-to-class": "opacity-100 translate-x-0",
115
+ "leave-active-class": "transition-all duration-200 ease-in",
116
+ "leave-from-class": "opacity-100 translate-x-0",
117
+ "leave-to-class": "opacity-0 -translate-x-2"
118
+ }, {
119
+ default: withCtx(() => [
120
+ __props.expanded ? (openBlock(), createElementBlock("span", {
121
+ key: 0,
122
+ class: normalizeClass([
123
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
124
+ "flex-1 text-left text-sm font-semibold whitespace-nowrap"
125
+ ])
126
+ }, toDisplayString(__props.menuItem.label), 3)) : createCommentVNode("", true)
127
+ ]),
128
+ _: 1
129
+ }),
130
+ hasSubmenu.value && __props.expanded ? (openBlock(), createBlock(unref(Icon), {
131
+ key: 0,
53
132
  class: normalizeClass([[
54
- isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
55
- __props.expanded ? "size-6" : "size-8"
56
- ], "transition-all duration-300"]),
57
- icon: __props.menuItem.icon
58
- }, null, 8, ["class", "icon"]),
59
- __props.menuItem.notification ? (openBlock(), createElementBlock("span", _hoisted_2$1)) : createCommentVNode("", true)
133
+ submenuOpen.value ? "rotate-90" : "",
134
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
135
+ ], "size-4 transition-transform duration-200"]),
136
+ icon: "lucide:chevron-right"
137
+ }, null, 8, ["class"])) : createCommentVNode("", true)
60
138
  ]),
61
- createVNode(Transition, {
62
- "enter-active-class": "transition-all duration-300 ease-out",
63
- "enter-from-class": "opacity-0 -translate-x-2",
64
- "enter-to-class": "opacity-100 translate-x-0",
65
- "leave-active-class": "transition-all duration-200 ease-in",
66
- "leave-from-class": "opacity-100 translate-x-0",
67
- "leave-to-class": "opacity-0 -translate-x-2"
68
- }, {
69
- default: withCtx(() => [
70
- __props.expanded ? (openBlock(), createElementBlock("span", {
71
- key: 0,
72
- class: normalizeClass([
73
- isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
74
- "text-sm font-semibold whitespace-nowrap"
75
- ])
76
- }, toDisplayString(__props.menuItem.label), 3)) : createCommentVNode("", true)
77
- ]),
78
- _: 1
79
- })
80
- ]),
81
- _: 1
82
- }, 16, ["class"]);
139
+ _: 1
140
+ }, 16, ["class", "style"])),
141
+ createVNode(Transition, {
142
+ "enter-active-class": "transition-all duration-300 ease-out",
143
+ "enter-from-class": "opacity-0 max-h-0",
144
+ "enter-to-class": "opacity-100 max-h-96",
145
+ "leave-active-class": "transition-all duration-200 ease-in",
146
+ "leave-from-class": "opacity-100 max-h-96",
147
+ "leave-to-class": "opacity-0 max-h-0"
148
+ }, {
149
+ default: withCtx(() => [
150
+ hasSubmenu.value && submenuOpen.value && __props.expanded ? (openBlock(), createElementBlock("div", _hoisted_4$1, [
151
+ renderSlot(_ctx.$slots, "submenu", {
152
+ depth: __props.depth + 1,
153
+ expanded: __props.expanded,
154
+ currentPath: __props.currentPath
155
+ }),
156
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.menuItem.children, (child, index) => {
157
+ return openBlock(), createBlock(_component_MenuItem, {
158
+ key: index,
159
+ "menu-item": child,
160
+ expanded: __props.expanded,
161
+ "current-path": __props.currentPath,
162
+ depth: __props.depth + 1
163
+ }, null, 8, ["menu-item", "expanded", "current-path", "depth"]);
164
+ }), 128))
165
+ ])) : createCommentVNode("", true)
166
+ ]),
167
+ _: 3
168
+ })
169
+ ]);
83
170
  };
84
171
  }
85
172
  });
@@ -226,4 +313,4 @@ export {
226
313
  _sfc_main$1 as _,
227
314
  _sfc_main as a
228
315
  };
229
- //# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js.map
316
+ //# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, ref, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n /** Nesting depth level (used internally for indentation) */\n depth?: number\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n depth: 0,\n },\n)\n\nconst slots = useSlots()\nconst submenuOpen = ref(false)\n\nconst hasSlotContent = computed(() => !!slots.submenu)\n\nconst hasChildren = computed(() => {\n return props.menuItem.children && props.menuItem.children.length > 0\n})\n\nconst hasSubmenu = computed(() => hasChildren.value || hasSlotContent.value)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Check if any child is active (to highlight parent)\nconst isChildActive = computed(() => {\n if (!hasChildren.value) return false\n\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n const checkActive = (items: MenuItemProps[]): boolean => {\n return items.some((item) => {\n if (item.link === path || path.startsWith(item.link + '/')) {\n return true\n }\n if (item.children) {\n return checkActive(item.children)\n }\n return false\n })\n }\n\n return checkActive(props.menuItem.children!)\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n if (hasSubmenu.value) {\n return 'button'\n }\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 linkProps = computed(() => {\n if (hasSubmenu.value) {\n return { type: 'button' as const }\n }\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n\nconst toggleSubmenu = () => {\n if (hasSubmenu.value) {\n submenuOpen.value = !submenuOpen.value\n }\n}\n\nconst paddingLeft = computed(() => {\n if (!props.expanded) return undefined\n const basePadding = 20 // px-5 = 20px\n const indentPerLevel = 16 // 16px per nesting level\n return `${basePadding + props.depth * indentPerLevel}px`\n})\n</script>\n\n<template>\n <div class=\"w-full\">\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n :style=\"expanded ? { paddingLeft } : undefined\"\n class=\"group relative flex w-full items-center justify-center gap-2 pr-5 py-2\"\n @click=\"toggleSubmenu\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-5' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n />\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"flex-1 text-left text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span>\n </Transition>\n\n <!-- Chevron for submenu -->\n <Icon\n v-if=\"hasSubmenu && expanded\"\n :class=\"[\n submenuOpen ? 'rotate-90' : '',\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n ]\"\n class=\"size-4 transition-transform duration-200\"\n icon=\"lucide:chevron-right\"\n />\n </component>\n\n <!-- Submenu content -->\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 max-h-0\"\n enter-to-class=\"opacity-100 max-h-96\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 max-h-96\"\n leave-to-class=\"opacity-0 max-h-0\"\n >\n <div\n v-if=\"hasSubmenu && submenuOpen && expanded\"\n class=\"overflow-hidden\"\n >\n <!-- Slot for custom submenu content -->\n <slot\n name=\"submenu\"\n :depth=\"depth + 1\"\n :expanded=\"expanded\"\n :current-path=\"currentPath\"\n />\n\n <!-- Default children from prop -->\n <MenuItem\n v-for=\"(child, index) in menuItem.children\"\n :key=\"index\"\n :menu-item=\"child\"\n :expanded=\"expanded\"\n :current-path=\"currentPath\"\n :depth=\"depth + 1\"\n />\n </div>\n </Transition>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useDropdown } from '@/composables/useDropdown'\nimport { useId } from '@/composables/useId'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Custom ID for accessibility */\n id?: string\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\n// Generate unique IDs for accessibility\nconst { related } = useId({ prefix: 'dropdown', id: props.id })\nconst triggerId = computed(() => related('trigger'))\nconst menuId = computed(() => related('menu'))\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\n\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, menuRef, {\n teleport: props.teleport,\n align: props.align,\n})\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst widthClasses = {\n auto: 'w-auto min-w-40',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst computedDropdownStyle = computed(() => {\n if (!props.teleport) return {}\n const { width: _, ...rest } = dropdownStyle.value\n return rest\n})\n</script>\n\n<template>\n <div class=\"relative inline-block\">\n <div\n ref=\"triggerRef\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\">\n <button\n :id=\"triggerId\"\n type=\"button\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"menu\"\n :aria-controls=\"menuId\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">\n Options\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n aria-hidden=\"true\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n :id=\"menuId\"\n ref=\"menuRef\"\n role=\"menu\"\n :aria-labelledby=\"triggerId\"\n :style=\"computedDropdownStyle\"\n :class=\"[\n 'z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template\n v-for=\"item in items\"\n :key=\"item.key\"\n >\n <div\n v-if=\"item.divider\"\n role=\"separator\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n role=\"menuitem\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_2","_createVNode","_unref","_normalizeClass","_hoisted_3","_Transition","_toDisplayString","_hoisted_4","_renderSlot","_Fragment","_Teleport","_renderList"],"mappings":"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"}
@@ -3,21 +3,34 @@ const vue = require("vue");
3
3
  const vue$1 = require("@iconify/vue");
4
4
  const useDropdown = require("./useDropdown-DHFnd259.cjs");
5
5
  const useId = require("./useId-nxrBaIC9.cjs");
6
- const _hoisted_1$1 = { class: "relative" };
7
- const _hoisted_2$1 = {
6
+ const _hoisted_1$1 = { class: "w-full" };
7
+ const _hoisted_2$1 = { class: "relative" };
8
+ const _hoisted_3$1 = {
8
9
  key: 0,
9
10
  class: "absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600"
10
11
  };
12
+ const _hoisted_4$1 = {
13
+ key: 0,
14
+ class: "overflow-hidden"
15
+ };
11
16
  const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
12
17
  __name: "MenuItem",
13
18
  props: {
14
19
  menuItem: {},
15
20
  expanded: { type: Boolean, default: true },
16
21
  active: { type: Boolean, default: void 0 },
17
- currentPath: { default: void 0 }
22
+ currentPath: { default: void 0 },
23
+ depth: { default: 0 }
18
24
  },
19
25
  setup(__props) {
20
26
  const props = __props;
27
+ const slots = vue.useSlots();
28
+ const submenuOpen = vue.ref(false);
29
+ const hasSlotContent = vue.computed(() => !!slots.submenu);
30
+ const hasChildren = vue.computed(() => {
31
+ return props.menuItem.children && props.menuItem.children.length > 0;
32
+ });
33
+ const hasSubmenu = vue.computed(() => hasChildren.value || hasSlotContent.value);
21
34
  const isRouteActive = vue.computed(() => {
22
35
  if (props.active !== void 0) {
23
36
  return props.active;
@@ -28,7 +41,26 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
28
41
  }
29
42
  return path === props.menuItem.link || path.startsWith(props.menuItem.link + "/");
30
43
  });
44
+ const isChildActive = vue.computed(() => {
45
+ if (!hasChildren.value) return false;
46
+ const path = props.currentPath ?? (typeof window !== "undefined" ? window.location.pathname : "/");
47
+ const checkActive = (items) => {
48
+ return items.some((item) => {
49
+ if (item.link === path || path.startsWith(item.link + "/")) {
50
+ return true;
51
+ }
52
+ if (item.children) {
53
+ return checkActive(item.children);
54
+ }
55
+ return false;
56
+ });
57
+ };
58
+ return checkActive(props.menuItem.children);
59
+ });
31
60
  const linkComponent = vue.computed(() => {
61
+ if (hasSubmenu.value) {
62
+ return "button";
63
+ }
32
64
  try {
33
65
  const RouterLink = vue.resolveComponent("RouterLink");
34
66
  if (typeof RouterLink !== "string") {
@@ -39,48 +71,103 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
39
71
  return "a";
40
72
  });
41
73
  const linkProps = vue.computed(() => {
74
+ if (hasSubmenu.value) {
75
+ return { type: "button" };
76
+ }
42
77
  if (linkComponent.value === "a") {
43
78
  return { href: props.menuItem.link };
44
79
  }
45
80
  return { to: props.menuItem.link };
46
81
  });
82
+ const toggleSubmenu = () => {
83
+ if (hasSubmenu.value) {
84
+ submenuOpen.value = !submenuOpen.value;
85
+ }
86
+ };
87
+ const paddingLeft = vue.computed(() => {
88
+ if (!props.expanded) return void 0;
89
+ const basePadding = 20;
90
+ const indentPerLevel = 16;
91
+ return `${basePadding + props.depth * indentPerLevel}px`;
92
+ });
47
93
  return (_ctx, _cache) => {
48
- return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(linkComponent.value), vue.mergeProps(linkProps.value, {
49
- class: [__props.expanded ? "flex-row" : "flex-col", "group relative flex items-center justify-center gap-2 px-5"]
50
- }), {
51
- default: vue.withCtx(() => [
52
- vue.createElementVNode("div", _hoisted_1$1, [
53
- vue.createVNode(vue.unref(vue$1.Icon), {
94
+ const _component_MenuItem = vue.resolveComponent("MenuItem", true);
95
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$1, [
96
+ (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(linkComponent.value), vue.mergeProps(linkProps.value, {
97
+ class: [__props.expanded ? "flex-row" : "flex-col", "group relative flex w-full items-center justify-center gap-2 pr-5 py-2"],
98
+ style: __props.expanded ? { paddingLeft: paddingLeft.value } : void 0,
99
+ onClick: toggleSubmenu
100
+ }), {
101
+ default: vue.withCtx(() => [
102
+ vue.createElementVNode("div", _hoisted_2$1, [
103
+ vue.createVNode(vue.unref(vue$1.Icon), {
104
+ class: vue.normalizeClass([[
105
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
106
+ __props.expanded ? "size-5" : "size-8"
107
+ ], "transition-all duration-300"]),
108
+ icon: __props.menuItem.icon
109
+ }, null, 8, ["class", "icon"]),
110
+ __props.menuItem.notification ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$1)) : vue.createCommentVNode("", true)
111
+ ]),
112
+ vue.createVNode(vue.Transition, {
113
+ "enter-active-class": "transition-all duration-300 ease-out",
114
+ "enter-from-class": "opacity-0 -translate-x-2",
115
+ "enter-to-class": "opacity-100 translate-x-0",
116
+ "leave-active-class": "transition-all duration-200 ease-in",
117
+ "leave-from-class": "opacity-100 translate-x-0",
118
+ "leave-to-class": "opacity-0 -translate-x-2"
119
+ }, {
120
+ default: vue.withCtx(() => [
121
+ __props.expanded ? (vue.openBlock(), vue.createElementBlock("span", {
122
+ key: 0,
123
+ class: vue.normalizeClass([
124
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
125
+ "flex-1 text-left text-sm font-semibold whitespace-nowrap"
126
+ ])
127
+ }, vue.toDisplayString(__props.menuItem.label), 3)) : vue.createCommentVNode("", true)
128
+ ]),
129
+ _: 1
130
+ }),
131
+ hasSubmenu.value && __props.expanded ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
132
+ key: 0,
54
133
  class: vue.normalizeClass([[
55
- isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
56
- __props.expanded ? "size-6" : "size-8"
57
- ], "transition-all duration-300"]),
58
- icon: __props.menuItem.icon
59
- }, null, 8, ["class", "icon"]),
60
- __props.menuItem.notification ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_2$1)) : vue.createCommentVNode("", true)
134
+ submenuOpen.value ? "rotate-90" : "",
135
+ isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
136
+ ], "size-4 transition-transform duration-200"]),
137
+ icon: "lucide:chevron-right"
138
+ }, null, 8, ["class"])) : vue.createCommentVNode("", true)
61
139
  ]),
62
- vue.createVNode(vue.Transition, {
63
- "enter-active-class": "transition-all duration-300 ease-out",
64
- "enter-from-class": "opacity-0 -translate-x-2",
65
- "enter-to-class": "opacity-100 translate-x-0",
66
- "leave-active-class": "transition-all duration-200 ease-in",
67
- "leave-from-class": "opacity-100 translate-x-0",
68
- "leave-to-class": "opacity-0 -translate-x-2"
69
- }, {
70
- default: vue.withCtx(() => [
71
- __props.expanded ? (vue.openBlock(), vue.createElementBlock("span", {
72
- key: 0,
73
- class: vue.normalizeClass([
74
- isRouteActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
75
- "text-sm font-semibold whitespace-nowrap"
76
- ])
77
- }, vue.toDisplayString(__props.menuItem.label), 3)) : vue.createCommentVNode("", true)
78
- ]),
79
- _: 1
80
- })
81
- ]),
82
- _: 1
83
- }, 16, ["class"]);
140
+ _: 1
141
+ }, 16, ["class", "style"])),
142
+ vue.createVNode(vue.Transition, {
143
+ "enter-active-class": "transition-all duration-300 ease-out",
144
+ "enter-from-class": "opacity-0 max-h-0",
145
+ "enter-to-class": "opacity-100 max-h-96",
146
+ "leave-active-class": "transition-all duration-200 ease-in",
147
+ "leave-from-class": "opacity-100 max-h-96",
148
+ "leave-to-class": "opacity-0 max-h-0"
149
+ }, {
150
+ default: vue.withCtx(() => [
151
+ hasSubmenu.value && submenuOpen.value && __props.expanded ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$1, [
152
+ vue.renderSlot(_ctx.$slots, "submenu", {
153
+ depth: __props.depth + 1,
154
+ expanded: __props.expanded,
155
+ currentPath: __props.currentPath
156
+ }),
157
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.menuItem.children, (child, index) => {
158
+ return vue.openBlock(), vue.createBlock(_component_MenuItem, {
159
+ key: index,
160
+ "menu-item": child,
161
+ expanded: __props.expanded,
162
+ "current-path": __props.currentPath,
163
+ depth: __props.depth + 1
164
+ }, null, 8, ["menu-item", "expanded", "current-path", "depth"]);
165
+ }), 128))
166
+ ])) : vue.createCommentVNode("", true)
167
+ ]),
168
+ _: 3
169
+ })
170
+ ]);
84
171
  };
85
172
  }
86
173
  });
@@ -225,4 +312,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
225
312
  });
226
313
  exports._sfc_main = _sfc_main$1;
227
314
  exports._sfc_main$1 = _sfc_main;
228
- //# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map
315
+ //# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, ref, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { MenuItemProps } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n menuItem: MenuItemProps\n /** Whether sidebar is expanded (shows labels) */\n expanded?: boolean\n /** Override active state directly */\n active?: boolean\n /** Current route path (pass from parent using useRoute().path) */\n currentPath?: string\n /** Nesting depth level (used internally for indentation) */\n depth?: number\n }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n depth: 0,\n },\n)\n\nconst slots = useSlots()\nconst submenuOpen = ref(false)\n\nconst hasSlotContent = computed(() => !!slots.submenu)\n\nconst hasChildren = computed(() => {\n return props.menuItem.children && props.menuItem.children.length > 0\n})\n\nconst hasSubmenu = computed(() => hasChildren.value || hasSlotContent.value)\n\nconst isRouteActive = computed(() => {\n // If active prop is explicitly set, use it\n if (props.active !== undefined) {\n return props.active\n }\n\n // Use currentPath prop if provided, otherwise fall back to window.location\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n if (props.menuItem.link === '/') {\n return path === '/'\n }\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\n})\n\n// Check if any child is active (to highlight parent)\nconst isChildActive = computed(() => {\n if (!hasChildren.value) return false\n\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\n\n const checkActive = (items: MenuItemProps[]): boolean => {\n return items.some((item) => {\n if (item.link === path || path.startsWith(item.link + '/')) {\n return true\n }\n if (item.children) {\n return checkActive(item.children)\n }\n return false\n })\n }\n\n return checkActive(props.menuItem.children!)\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n if (hasSubmenu.value) {\n return 'button'\n }\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 linkProps = computed(() => {\n if (hasSubmenu.value) {\n return { type: 'button' as const }\n }\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n\nconst toggleSubmenu = () => {\n if (hasSubmenu.value) {\n submenuOpen.value = !submenuOpen.value\n }\n}\n\nconst paddingLeft = computed(() => {\n if (!props.expanded) return undefined\n const basePadding = 20 // px-5 = 20px\n const indentPerLevel = 16 // 16px per nesting level\n return `${basePadding + props.depth * indentPerLevel}px`\n})\n</script>\n\n<template>\n <div class=\"w-full\">\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n :style=\"expanded ? { paddingLeft } : undefined\"\n class=\"group relative flex w-full items-center justify-center gap-2 pr-5 py-2\"\n @click=\"toggleSubmenu\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n expanded ? 'size-5' : 'size-8',\n ]\"\n class=\"transition-all duration-300\"\n :icon=\"menuItem.icon\"\n />\n\n <span\n v-if=\"menuItem.notification\"\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\n />\n </div>\n\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 -translate-x-2\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 -translate-x-2\"\n >\n <span\n v-if=\"expanded\"\n :class=\"\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\n \"\n class=\"flex-1 text-left text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span>\n </Transition>\n\n <!-- Chevron for submenu -->\n <Icon\n v-if=\"hasSubmenu && expanded\"\n :class=\"[\n submenuOpen ? 'rotate-90' : '',\n isRouteActive || isChildActive\n ? 'text-white'\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\n ]\"\n class=\"size-4 transition-transform duration-200\"\n icon=\"lucide:chevron-right\"\n />\n </component>\n\n <!-- Submenu content -->\n <Transition\n enter-active-class=\"transition-all duration-300 ease-out\"\n enter-from-class=\"opacity-0 max-h-0\"\n enter-to-class=\"opacity-100 max-h-96\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 max-h-96\"\n leave-to-class=\"opacity-0 max-h-0\"\n >\n <div\n v-if=\"hasSubmenu && submenuOpen && expanded\"\n class=\"overflow-hidden\"\n >\n <!-- Slot for custom submenu content -->\n <slot\n name=\"submenu\"\n :depth=\"depth + 1\"\n :expanded=\"expanded\"\n :current-path=\"currentPath\"\n />\n\n <!-- Default children from prop -->\n <MenuItem\n v-for=\"(child, index) in menuItem.children\"\n :key=\"index\"\n :menu-item=\"child\"\n :expanded=\"expanded\"\n :current-path=\"currentPath\"\n :depth=\"depth + 1\"\n />\n </div>\n </Transition>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport { useDropdown } from '@/composables/useDropdown'\nimport { useId } from '@/composables/useId'\n\nexport interface DropdownItem {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n danger?: boolean\n divider?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Dropdown items (optional if using default slot) */\n items?: DropdownItem[]\n /** Align dropdown */\n align?: 'left' | 'right'\n /** Dropdown width */\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Custom ID for accessibility */\n id?: string\n }>(),\n {\n items: () => [],\n align: 'left',\n width: 'auto',\n teleport: true,\n },\n)\n\n// Generate unique IDs for accessibility\nconst { related } = useId({ prefix: 'dropdown', id: props.id })\nconst triggerId = computed(() => related('trigger'))\nconst menuId = computed(() => related('menu'))\n\nconst emit = defineEmits<{\n select: [item: DropdownItem]\n}>()\n\nconst triggerRef = ref<HTMLElement>()\nconst menuRef = ref<HTMLElement>()\n\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, menuRef, {\n teleport: props.teleport,\n align: props.align,\n})\n\nconst selectItem = (item: DropdownItem) => {\n if (item.disabled || item.divider) return\n emit('select', item)\n close()\n}\n\nconst widthClasses = {\n auto: 'w-auto min-w-40',\n full: 'w-full',\n sm: 'w-32',\n md: 'w-48',\n lg: 'w-64',\n}\n\nconst computedDropdownStyle = computed(() => {\n if (!props.teleport) return {}\n const { width: _, ...rest } = dropdownStyle.value\n return rest\n})\n</script>\n\n<template>\n <div class=\"relative inline-block\">\n <div\n ref=\"triggerRef\"\n @click=\"toggle\"\n >\n <slot name=\"trigger\">\n <button\n :id=\"triggerId\"\n type=\"button\"\n :aria-expanded=\"isOpen\"\n aria-haspopup=\"menu\"\n :aria-controls=\"menuId\"\n class=\"inline-flex items-center gap-2 rounded-lg border border-gray-300 bg-white px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n >\n <slot name=\"trigger-label\">\n Options\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\n aria-hidden=\"true\"\n />\n </button>\n </slot>\n </div>\n\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\n <Transition\n enter-active-class=\"transition ease-out duration-100\"\n enter-from-class=\"transform opacity-0 scale-95\"\n enter-to-class=\"transform opacity-100 scale-100\"\n leave-active-class=\"transition ease-in duration-75\"\n leave-from-class=\"transform opacity-100 scale-100\"\n leave-to-class=\"transform opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n :id=\"menuId\"\n ref=\"menuRef\"\n role=\"menu\"\n :aria-labelledby=\"triggerId\"\n :style=\"computedDropdownStyle\"\n :class=\"[\n 'z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\n widthClasses[width],\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\n ]\"\n >\n <!-- Custom content via default slot -->\n <slot :close=\"close\">\n <!-- Default items rendering -->\n <template\n v-for=\"item in items\"\n :key=\"item.key\"\n >\n <div\n v-if=\"item.divider\"\n role=\"separator\"\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\n />\n <button\n v-else\n type=\"button\"\n role=\"menuitem\"\n :disabled=\"item.disabled\"\n :class=\"[\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\n item.disabled\n ? 'cursor-not-allowed opacity-50'\n : item.danger\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\n ]\"\n @click=\"selectItem(item)\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n {{ item.label }}\n </button>\n </template>\n </slot>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n"],"names":["useSlots","ref","computed","resolveComponent","_openBlock","_createElementBlock","_hoisted_1","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_2","_createVNode","_unref","Icon","_normalizeClass","_hoisted_3","_Transition","_toDisplayString","_hoisted_4","_renderSlot","_Fragment","useId","useDropdown","_Teleport","_renderList"],"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 Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs");
4
+ const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs");
5
5
  const _hoisted_1$3 = { class: "flex min-h-screen" };
6
6
  const _hoisted_2$3 = {
7
7
  key: 0,
@@ -370,7 +370,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
370
370
  ])
371
371
  ]),
372
372
  vue.createElementVNode("div", {
373
- class: vue.normalizeClass([[sidebarOpenModel.value ? "items-start" : "items-center", menuPositionClass.value], "flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto overflow-x-hidden px-2"])
373
+ class: vue.normalizeClass([[sidebarOpenModel.value ? "items-start" : "items-center gap-4", menuPositionClass.value], "flex min-h-0 flex-1 flex-col overflow-y-auto overflow-x-hidden px-2"])
374
374
  }, [
375
375
  vue.renderSlot(_ctx.$slots, "menu", { currentPath: __props.currentPath }, () => [
376
376
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.menuItems, (item, index) => {
@@ -761,4 +761,4 @@ exports._sfc_main = _sfc_main$3;
761
761
  exports._sfc_main$1 = _sfc_main$2;
762
762
  exports._sfc_main$2 = _sfc_main$1;
763
763
  exports._sfc_main$3 = _sfc_main;
764
- //# sourceMappingURL=PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs.map
764
+ //# sourceMappingURL=PageHero.vue_vue_type_script_setup_true_lang-Bi97ypMD.cjs.map