cisse-vue-ui 0.11.0 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/DataList.vue_vue_type_script_setup_true_lang-MshUshzx.cjs.map +1 -1
- package/dist/DataList.vue_vue_type_script_setup_true_lang-e5XO82_b.js.map +1 -1
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs → Dropdown.vue_vue_type_script_setup_true_lang-BeCEo4vl.cjs} +30 -12
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BeCEo4vl.cjs.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js → Dropdown.vue_vue_type_script_setup_true_lang-DIzyh_AZ.js} +31 -13
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DIzyh_AZ.js.map +1 -0
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs → PageHero.vue_vue_type_script_setup_true_lang-8fMdvVcY.cjs} +2 -2
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-BqwBJlv0.cjs.map → PageHero.vue_vue_type_script_setup_true_lang-8fMdvVcY.cjs.map} +1 -1
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js → PageHero.vue_vue_type_script_setup_true_lang-CeNM9vr4.js} +2 -2
- package/dist/{PageHero.vue_vue_type_script_setup_true_lang-by-P5wIB.js.map → PageHero.vue_vue_type_script_setup_true_lang-CeNM9vr4.js.map} +1 -1
- package/dist/components/core/MenuItem.vue.d.ts +12 -0
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/index.cjs +2 -2
- package/dist/components/index.js +2 -2
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/{index-CO3nD8zb.js → index-BNqdYSNO.js} +3 -3
- package/dist/{index-CO3nD8zb.js.map → index-BNqdYSNO.js.map} +1 -1
- package/dist/{index-DK_UojhF.cjs → index-DJ2WIWY-.cjs} +3 -3
- package/dist/{index-DK_UojhF.cjs.map → index-DJ2WIWY-.cjs.map} +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.js +3 -3
- package/dist/types/components.d.ts +10 -0
- package/package.json +1 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BAKGRZIb.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-GLCX7E3C.js.map +0 -1
|
@@ -20,10 +20,18 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
20
20
|
expanded: { type: Boolean, default: true },
|
|
21
21
|
active: { type: Boolean, default: void 0 },
|
|
22
22
|
currentPath: { default: void 0 },
|
|
23
|
-
depth: { default: 0 }
|
|
23
|
+
depth: { default: 0 },
|
|
24
|
+
labelClass: { default: void 0 },
|
|
25
|
+
iconClass: { default: void 0 },
|
|
26
|
+
itemClass: { default: void 0 },
|
|
27
|
+
activeClass: { default: void 0 }
|
|
24
28
|
},
|
|
25
29
|
setup(__props) {
|
|
26
30
|
const props = __props;
|
|
31
|
+
const resolvedLabelClass = vue.computed(() => props.labelClass ?? props.menuItem.labelClass);
|
|
32
|
+
const resolvedIconClass = vue.computed(() => props.iconClass ?? props.menuItem.iconClass);
|
|
33
|
+
const resolvedItemClass = vue.computed(() => props.itemClass ?? props.menuItem.itemClass);
|
|
34
|
+
const resolvedActiveClass = vue.computed(() => props.activeClass ?? props.menuItem.activeClass);
|
|
27
35
|
const slots = vue.useSlots();
|
|
28
36
|
const submenuOpen = vue.ref(false);
|
|
29
37
|
const triggerRef = vue.ref();
|
|
@@ -142,7 +150,10 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
142
150
|
ref_key: "triggerRef",
|
|
143
151
|
ref: triggerRef
|
|
144
152
|
}, linkProps.value, {
|
|
145
|
-
class: [
|
|
153
|
+
class: [[
|
|
154
|
+
__props.expanded ? "flex-row" : "flex-col",
|
|
155
|
+
resolvedItemClass.value
|
|
156
|
+
], "group relative flex w-full items-center justify-center gap-2 pr-5 py-2"],
|
|
146
157
|
style: __props.expanded ? { paddingLeft: paddingLeft.value } : void 0,
|
|
147
158
|
onClick: toggleSubmenu
|
|
148
159
|
}), {
|
|
@@ -150,7 +161,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
150
161
|
vue.createElementVNode("div", _hoisted_1$1, [
|
|
151
162
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
152
163
|
class: vue.normalizeClass([[
|
|
153
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
164
|
+
resolvedIconClass.value ? resolvedIconClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
154
165
|
__props.expanded ? "size-5" : "size-8"
|
|
155
166
|
], "transition-all duration-300"]),
|
|
156
167
|
icon: __props.menuItem.icon
|
|
@@ -169,7 +180,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
169
180
|
__props.expanded ? (vue.openBlock(), vue.createElementBlock("span", {
|
|
170
181
|
key: 0,
|
|
171
182
|
class: vue.normalizeClass([
|
|
172
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
183
|
+
resolvedLabelClass.value ? resolvedLabelClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
173
184
|
"flex-1 text-left text-sm font-semibold whitespace-nowrap"
|
|
174
185
|
])
|
|
175
186
|
}, vue.toDisplayString(__props.menuItem.label), 3)) : vue.createCommentVNode("", true)
|
|
@@ -180,7 +191,7 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
180
191
|
key: 0,
|
|
181
192
|
class: vue.normalizeClass([[
|
|
182
193
|
submenuOpen.value ? "rotate-90" : "",
|
|
183
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
|
|
194
|
+
resolvedIconClass.value ? resolvedIconClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
|
|
184
195
|
], "size-4 transition-transform duration-200"]),
|
|
185
196
|
icon: "lucide:chevron-right"
|
|
186
197
|
}, null, 8, ["class"])) : vue.createCommentVNode("", true)
|
|
@@ -208,8 +219,12 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
208
219
|
"menu-item": child,
|
|
209
220
|
expanded: __props.expanded,
|
|
210
221
|
"current-path": __props.currentPath,
|
|
211
|
-
depth: __props.depth + 1
|
|
212
|
-
|
|
222
|
+
depth: __props.depth + 1,
|
|
223
|
+
"label-class": __props.labelClass,
|
|
224
|
+
"icon-class": __props.iconClass,
|
|
225
|
+
"item-class": __props.itemClass,
|
|
226
|
+
"active-class": __props.activeClass
|
|
227
|
+
}, null, 8, ["menu-item", "expanded", "current-path", "depth", "label-class", "icon-class", "item-class", "active-class"]);
|
|
213
228
|
}), 128))
|
|
214
229
|
])) : vue.createCommentVNode("", true)
|
|
215
230
|
]),
|
|
@@ -244,16 +259,19 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
|
|
|
244
259
|
return vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(childLinkComponent(child)), vue.mergeProps({ key: index }, { ref_for: true }, childLinkProps(child), {
|
|
245
260
|
class: [
|
|
246
261
|
"flex items-center gap-3 px-4 py-2 text-sm transition-colors",
|
|
247
|
-
|
|
262
|
+
child.itemClass ?? __props.itemClass,
|
|
263
|
+
isChildRouteActive(child) ? child.activeClass ?? __props.activeClass ?? "bg-primary-50 text-primary-700 dark:bg-primary-900/20 dark:text-primary-400" : "text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"
|
|
248
264
|
],
|
|
249
265
|
onClick: _cache[0] || (_cache[0] = ($event) => vue.unref(closeFlyout)())
|
|
250
266
|
}), {
|
|
251
267
|
default: vue.withCtx(() => [
|
|
252
268
|
vue.createVNode(vue.unref(vue$1.Icon), {
|
|
253
269
|
icon: child.icon,
|
|
254
|
-
class: "size-4"
|
|
255
|
-
}, null, 8, ["icon"]),
|
|
256
|
-
vue.createElementVNode("span",
|
|
270
|
+
class: vue.normalizeClass(child.iconClass ?? __props.iconClass ?? "size-4")
|
|
271
|
+
}, null, 8, ["icon", "class"]),
|
|
272
|
+
vue.createElementVNode("span", {
|
|
273
|
+
class: vue.normalizeClass(child.labelClass ?? __props.labelClass)
|
|
274
|
+
}, vue.toDisplayString(child.label), 3)
|
|
257
275
|
]),
|
|
258
276
|
_: 2
|
|
259
277
|
}, 1040, ["class"]);
|
|
@@ -408,4 +426,4 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
|
|
|
408
426
|
});
|
|
409
427
|
exports._sfc_main = _sfc_main$1;
|
|
410
428
|
exports._sfc_main$1 = _sfc_main;
|
|
411
|
-
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-
|
|
429
|
+
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-BeCEo4vl.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-BeCEo4vl.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nimport { computed, resolveComponent, ref, useSlots } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\nimport type { MenuItemProps } from '@/types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n menuItem: MenuItemProps\r\n /** Whether sidebar is expanded (shows labels) */\r\n expanded?: boolean\r\n /** Override active state directly */\r\n active?: boolean\r\n /** Current route path (pass from parent using useRoute().path) */\r\n currentPath?: string\r\n /** Nesting depth level (used internally for indentation) */\r\n depth?: number\r\n /** Custom class for the label element (overrides menuItem.labelClass) */\r\n labelClass?: string\r\n /** Custom class for the icon element (overrides menuItem.iconClass) */\r\n iconClass?: string\r\n /** Custom class for the menu item wrapper/link (overrides menuItem.itemClass) */\r\n itemClass?: string\r\n /** Custom class applied when item is active (overrides menuItem.activeClass) */\r\n activeClass?: string\r\n }>(),\r\n {\r\n expanded: true,\r\n active: undefined,\r\n currentPath: undefined,\r\n depth: 0,\r\n labelClass: undefined,\r\n iconClass: undefined,\r\n itemClass: undefined,\r\n activeClass: undefined,\r\n },\r\n)\r\n\r\n// Resolved classes (props take precedence over menuItem)\r\nconst resolvedLabelClass = computed(() => props.labelClass ?? props.menuItem.labelClass)\r\nconst resolvedIconClass = computed(() => props.iconClass ?? props.menuItem.iconClass)\r\nconst resolvedItemClass = computed(() => props.itemClass ?? props.menuItem.itemClass)\r\nconst resolvedActiveClass = computed(() => props.activeClass ?? props.menuItem.activeClass)\r\n\r\nconst slots = useSlots() as { submenu?: () => unknown }\r\nconst submenuOpen = ref(false)\r\n\r\n// Flyout popover for compacted mode\r\nconst triggerRef = ref<HTMLElement>()\r\nconst flyoutRef = ref<HTMLElement>()\r\nconst { isOpen: flyoutOpen, dropdownStyle, open: openFlyout, close: closeFlyout } = useDropdown(\r\n triggerRef,\r\n flyoutRef,\r\n {\r\n teleport: true,\r\n gap: 8,\r\n placement: 'right-start',\r\n },\r\n)\r\n\r\nconst hasSlotContent = computed(() => !!slots.submenu)\r\n\r\nconst hasChildren = computed(() => {\r\n return props.menuItem.children && props.menuItem.children.length > 0\r\n})\r\n\r\nconst hasSubmenu = computed(() => hasChildren.value || hasSlotContent.value)\r\n\r\nconst isRouteActive = computed(() => {\r\n // If active prop is explicitly set, use it\r\n if (props.active !== undefined) {\r\n return props.active\r\n }\r\n\r\n // Use currentPath prop if provided, otherwise fall back to window.location\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n\r\n if (props.menuItem.link === '/') {\r\n return path === '/'\r\n }\r\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\r\n})\r\n\r\n// Check if any child is active (to highlight parent)\r\nconst isChildActive = computed(() => {\r\n if (!hasChildren.value) return false\r\n\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n\r\n const checkActive = (items: MenuItemProps[]): boolean => {\r\n return items.some((item) => {\r\n if (item.link === path || path.startsWith(item.link + '/')) {\r\n return true\r\n }\r\n if (item.children) {\r\n return checkActive(item.children)\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return checkActive(props.menuItem.children!)\r\n})\r\n\r\n// Try to resolve RouterLink, fallback to 'a' tag\r\nconst linkComponent = computed(() => {\r\n if (hasSubmenu.value) {\r\n return 'button'\r\n }\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n})\r\n\r\nconst linkProps = computed(() => {\r\n if (hasSubmenu.value) {\r\n return { type: 'button' as const }\r\n }\r\n if (linkComponent.value === 'a') {\r\n return { href: props.menuItem.link }\r\n }\r\n return { to: props.menuItem.link }\r\n})\r\n\r\nconst toggleSubmenu = () => {\r\n if (hasSubmenu.value) {\r\n submenuOpen.value = !submenuOpen.value\r\n }\r\n}\r\n\r\nconst paddingLeft = computed(() => {\r\n if (!props.expanded) return undefined\r\n const basePadding = 20 // px-5 = 20px\r\n const indentPerLevel = 16 // 16px per nesting level\r\n return `${basePadding + props.depth * indentPerLevel}px`\r\n})\r\n\r\n// Helper functions for flyout child items\r\nconst childLinkComponent = (child: MenuItemProps) => {\r\n if (child.children && child.children.length > 0) {\r\n return 'button'\r\n }\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n}\r\n\r\nconst childLinkProps = (child: MenuItemProps) => {\r\n if (child.children && child.children.length > 0) {\r\n return { type: 'button' as const }\r\n }\r\n const component = childLinkComponent(child)\r\n if (component === 'a') {\r\n return { href: child.link }\r\n }\r\n return { to: child.link }\r\n}\r\n\r\nconst isChildRouteActive = (child: MenuItemProps) => {\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n if (child.link === '/') {\r\n return path === '/'\r\n }\r\n return path === child.link || path.startsWith(child.link + '/')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"w-full\"\r\n @mouseenter=\"!expanded && hasSubmenu && openFlyout()\"\r\n @mouseleave=\"!expanded && hasSubmenu && closeFlyout()\"\r\n >\r\n <component\r\n :is=\"linkComponent\"\r\n ref=\"triggerRef\"\r\n v-bind=\"linkProps\"\r\n :class=\"[\r\n expanded ? 'flex-row' : 'flex-col',\r\n resolvedItemClass,\r\n ]\"\r\n :style=\"expanded ? { paddingLeft } : undefined\"\r\n class=\"group relative flex w-full items-center justify-center gap-2 pr-5 py-2\"\r\n @click=\"toggleSubmenu\"\r\n >\r\n <div class=\"relative\">\r\n <Icon\r\n :class=\"[\r\n resolvedIconClass\r\n ? resolvedIconClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\r\n expanded ? 'size-5' : 'size-8',\r\n ]\"\r\n class=\"transition-all duration-300\"\r\n :icon=\"menuItem.icon\"\r\n />\r\n\r\n <span\r\n v-if=\"menuItem.notification\"\r\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\r\n />\r\n </div>\r\n\r\n <Transition\r\n enter-active-class=\"transition-all duration-300 ease-out\"\r\n enter-from-class=\"opacity-0 -translate-x-2\"\r\n enter-to-class=\"opacity-100 translate-x-0\"\r\n leave-active-class=\"transition-all duration-200 ease-in\"\r\n leave-from-class=\"opacity-100 translate-x-0\"\r\n leave-to-class=\"opacity-0 -translate-x-2\"\r\n >\r\n <span\r\n v-if=\"expanded\"\r\n :class=\"\r\n resolvedLabelClass\r\n ? resolvedLabelClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\r\n \"\r\n class=\"flex-1 text-left text-sm font-semibold whitespace-nowrap\"\r\n >{{ menuItem.label }}</span>\r\n </Transition>\r\n\r\n <!-- Chevron for submenu -->\r\n <Icon\r\n v-if=\"hasSubmenu && expanded\"\r\n :class=\"[\r\n submenuOpen ? 'rotate-90' : '',\r\n resolvedIconClass\r\n ? resolvedIconClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\r\n ]\"\r\n class=\"size-4 transition-transform duration-200\"\r\n icon=\"lucide:chevron-right\"\r\n />\r\n </component>\r\n\r\n <!-- Submenu content (expanded mode - inline) -->\r\n <Transition\r\n enter-active-class=\"transition-all duration-300 ease-out\"\r\n enter-from-class=\"opacity-0 max-h-0\"\r\n enter-to-class=\"opacity-100 max-h-96\"\r\n leave-active-class=\"transition-all duration-200 ease-in\"\r\n leave-from-class=\"opacity-100 max-h-96\"\r\n leave-to-class=\"opacity-0 max-h-0\"\r\n >\r\n <div\r\n v-if=\"hasSubmenu && submenuOpen && expanded\"\r\n class=\"overflow-hidden\"\r\n >\r\n <!-- Slot for custom submenu content -->\r\n <slot\r\n name=\"submenu\"\r\n :depth=\"depth + 1\"\r\n :expanded=\"expanded\"\r\n :current-path=\"currentPath\"\r\n />\r\n\r\n <!-- Default children from prop -->\r\n <MenuItem\r\n v-for=\"(child, index) in menuItem.children\"\r\n :key=\"index\"\r\n :menu-item=\"child\"\r\n :expanded=\"expanded\"\r\n :current-path=\"currentPath\"\r\n :depth=\"depth + 1\"\r\n :label-class=\"labelClass\"\r\n :icon-class=\"iconClass\"\r\n :item-class=\"itemClass\"\r\n :active-class=\"activeClass\"\r\n />\r\n </div>\r\n </Transition>\r\n\r\n <!-- Flyout submenu (compacted mode - popover) -->\r\n <Teleport to=\"body\">\r\n <Transition\r\n enter-active-class=\"transition duration-150 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-100 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"hasSubmenu && flyoutOpen && !expanded\"\r\n ref=\"flyoutRef\"\r\n :style=\"dropdownStyle\"\r\n class=\"z-9999 min-w-48 rounded-lg border border-gray-200 bg-white py-2 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\r\n @mouseenter=\"openFlyout()\"\r\n @mouseleave=\"closeFlyout()\"\r\n >\r\n <!-- Label header -->\r\n <div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase dark:text-gray-400\">\r\n {{ menuItem.label }}\r\n </div>\r\n\r\n <!-- Slot for custom submenu content -->\r\n <slot\r\n name=\"submenu\"\r\n :depth=\"0\"\r\n :expanded=\"true\"\r\n :current-path=\"currentPath\"\r\n />\r\n\r\n <!-- Default children from prop -->\r\n <template v-if=\"menuItem.children\">\r\n <component\r\n :is=\"childLinkComponent(child)\"\r\n v-for=\"(child, index) in menuItem.children\"\r\n :key=\"index\"\r\n v-bind=\"childLinkProps(child)\"\r\n :class=\"[\r\n 'flex items-center gap-3 px-4 py-2 text-sm transition-colors',\r\n child.itemClass ?? itemClass,\r\n isChildRouteActive(child)\r\n ? (child.activeClass ?? activeClass ?? 'bg-primary-50 text-primary-700 dark:bg-primary-900/20 dark:text-primary-400')\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700',\r\n ]\"\r\n @click=\"closeFlyout()\"\r\n >\r\n <Icon\r\n :icon=\"child.icon\"\r\n :class=\"child.iconClass ?? iconClass ?? 'size-4'\"\r\n />\r\n <span :class=\"child.labelClass ?? labelClass\">{{ child.label }}</span>\r\n </component>\r\n </template>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\nimport { useId } from '@/composables/useId'\r\n\r\nexport interface DropdownItem {\r\n key: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n danger?: boolean\r\n divider?: boolean\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Dropdown items (optional if using default slot) */\r\n items?: DropdownItem[]\r\n /** Align dropdown */\r\n align?: 'left' | 'right'\r\n /** Dropdown width */\r\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\r\n /** Use teleport to body to avoid overflow clipping */\r\n teleport?: boolean\r\n /** Custom ID for accessibility */\r\n id?: string\r\n }>(),\r\n {\r\n items: () => [],\r\n align: 'left',\r\n width: 'auto',\r\n teleport: true,\r\n },\r\n)\r\n\r\n// Generate unique IDs for accessibility\r\nconst { related } = useId({ prefix: 'dropdown', id: props.id })\r\nconst triggerId = computed(() => related('trigger'))\r\nconst menuId = computed(() => related('menu'))\r\n\r\nconst emit = defineEmits<{\r\n select: [item: DropdownItem]\r\n}>()\r\n\r\nconst triggerRef = ref<HTMLElement>()\r\nconst menuRef = ref<HTMLElement>()\r\n\r\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, menuRef, {\r\n teleport: props.teleport,\r\n align: props.align,\r\n})\r\n\r\nconst selectItem = (item: DropdownItem) => {\r\n if (item.disabled || item.divider) return\r\n emit('select', item)\r\n close()\r\n}\r\n\r\nconst widthClasses = {\r\n auto: 'w-auto min-w-40',\r\n full: 'w-full',\r\n sm: 'w-32',\r\n md: 'w-48',\r\n lg: 'w-64',\r\n}\r\n\r\nconst computedDropdownStyle = computed(() => {\r\n if (!props.teleport) return {}\r\n const { width: _, ...rest } = dropdownStyle.value\r\n return rest\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative inline-block\">\r\n <div\r\n ref=\"triggerRef\"\r\n @click=\"toggle\"\r\n >\r\n <slot name=\"trigger\">\r\n <button\r\n :id=\"triggerId\"\r\n type=\"button\"\r\n :aria-expanded=\"isOpen\"\r\n aria-haspopup=\"menu\"\r\n :aria-controls=\"menuId\"\r\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\"\r\n >\r\n <slot name=\"trigger-label\">\r\n Options\r\n </slot>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n </slot>\r\n </div>\r\n\r\n <Teleport\r\n to=\"body\"\r\n :disabled=\"!teleport\"\r\n >\r\n <Transition\r\n enter-active-class=\"transition ease-out duration-100\"\r\n enter-from-class=\"transform opacity-0 scale-95\"\r\n enter-to-class=\"transform opacity-100 scale-100\"\r\n leave-active-class=\"transition ease-in duration-75\"\r\n leave-from-class=\"transform opacity-100 scale-100\"\r\n leave-to-class=\"transform opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n :id=\"menuId\"\r\n ref=\"menuRef\"\r\n role=\"menu\"\r\n :aria-labelledby=\"triggerId\"\r\n :style=\"computedDropdownStyle\"\r\n :class=\"[\r\n 'z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\r\n widthClasses[width],\r\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\r\n ]\"\r\n >\r\n <!-- Custom content via default slot -->\r\n <slot :close=\"close\">\r\n <!-- Default items rendering -->\r\n <template\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n >\r\n <div\r\n v-if=\"item.divider\"\r\n role=\"separator\"\r\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\r\n />\r\n <button\r\n v-else\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :disabled=\"item.disabled\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\r\n item.disabled\r\n ? 'cursor-not-allowed opacity-50'\r\n : item.danger\r\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\r\n ]\"\r\n @click=\"selectItem(item)\"\r\n >\r\n <Icon\r\n v-if=\"item.icon\"\r\n :icon=\"item.icon\"\r\n class=\"size-4\"\r\n aria-hidden=\"true\"\r\n />\r\n {{ item.label }}\r\n </button>\r\n </template>\r\n </slot>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n"],"names":["computed","useSlots","ref","useDropdown","resolveComponent","_createElementBlock","_unref","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","Icon","_normalizeClass","_openBlock","_hoisted_2","_Transition","_toDisplayString","_hoisted_3","_renderSlot","_Fragment","_Teleport","_hoisted_4","useId","_renderList"],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { defineComponent, useSlots, ref,
|
|
1
|
+
import { defineComponent, computed, useSlots, ref, resolveComponent, createElementBlock, openBlock, unref, createBlock, createVNode, resolveDynamicComponent, mergeProps, withCtx, createElementVNode, createCommentVNode, normalizeClass, Transition, toDisplayString, renderSlot, Fragment, renderList, Teleport, normalizeStyle, createTextVNode } from "vue";
|
|
2
2
|
import { Icon } from "@iconify/vue";
|
|
3
3
|
import { u as useDropdown } from "./useDropdown-XITCE_SM.js";
|
|
4
4
|
import { u as useId } from "./useId-xeHj7rkg.js";
|
|
@@ -19,10 +19,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
19
19
|
expanded: { type: Boolean, default: true },
|
|
20
20
|
active: { type: Boolean, default: void 0 },
|
|
21
21
|
currentPath: { default: void 0 },
|
|
22
|
-
depth: { default: 0 }
|
|
22
|
+
depth: { default: 0 },
|
|
23
|
+
labelClass: { default: void 0 },
|
|
24
|
+
iconClass: { default: void 0 },
|
|
25
|
+
itemClass: { default: void 0 },
|
|
26
|
+
activeClass: { default: void 0 }
|
|
23
27
|
},
|
|
24
28
|
setup(__props) {
|
|
25
29
|
const props = __props;
|
|
30
|
+
const resolvedLabelClass = computed(() => props.labelClass ?? props.menuItem.labelClass);
|
|
31
|
+
const resolvedIconClass = computed(() => props.iconClass ?? props.menuItem.iconClass);
|
|
32
|
+
const resolvedItemClass = computed(() => props.itemClass ?? props.menuItem.itemClass);
|
|
33
|
+
const resolvedActiveClass = computed(() => props.activeClass ?? props.menuItem.activeClass);
|
|
26
34
|
const slots = useSlots();
|
|
27
35
|
const submenuOpen = ref(false);
|
|
28
36
|
const triggerRef = ref();
|
|
@@ -141,7 +149,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
141
149
|
ref_key: "triggerRef",
|
|
142
150
|
ref: triggerRef
|
|
143
151
|
}, linkProps.value, {
|
|
144
|
-
class: [
|
|
152
|
+
class: [[
|
|
153
|
+
__props.expanded ? "flex-row" : "flex-col",
|
|
154
|
+
resolvedItemClass.value
|
|
155
|
+
], "group relative flex w-full items-center justify-center gap-2 pr-5 py-2"],
|
|
145
156
|
style: __props.expanded ? { paddingLeft: paddingLeft.value } : void 0,
|
|
146
157
|
onClick: toggleSubmenu
|
|
147
158
|
}), {
|
|
@@ -149,7 +160,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
149
160
|
createElementVNode("div", _hoisted_1$1, [
|
|
150
161
|
createVNode(unref(Icon), {
|
|
151
162
|
class: normalizeClass([[
|
|
152
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
163
|
+
resolvedIconClass.value ? resolvedIconClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
153
164
|
__props.expanded ? "size-5" : "size-8"
|
|
154
165
|
], "transition-all duration-300"]),
|
|
155
166
|
icon: __props.menuItem.icon
|
|
@@ -168,7 +179,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
168
179
|
__props.expanded ? (openBlock(), createElementBlock("span", {
|
|
169
180
|
key: 0,
|
|
170
181
|
class: normalizeClass([
|
|
171
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
182
|
+
resolvedLabelClass.value ? resolvedLabelClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500",
|
|
172
183
|
"flex-1 text-left text-sm font-semibold whitespace-nowrap"
|
|
173
184
|
])
|
|
174
185
|
}, toDisplayString(__props.menuItem.label), 3)) : createCommentVNode("", true)
|
|
@@ -179,7 +190,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
179
190
|
key: 0,
|
|
180
191
|
class: normalizeClass([[
|
|
181
192
|
submenuOpen.value ? "rotate-90" : "",
|
|
182
|
-
isRouteActive.value || isChildActive.value ? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
|
|
193
|
+
resolvedIconClass.value ? resolvedIconClass.value : isRouteActive.value || isChildActive.value ? resolvedActiveClass.value ?? "text-white" : "text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500"
|
|
183
194
|
], "size-4 transition-transform duration-200"]),
|
|
184
195
|
icon: "lucide:chevron-right"
|
|
185
196
|
}, null, 8, ["class"])) : createCommentVNode("", true)
|
|
@@ -207,8 +218,12 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
207
218
|
"menu-item": child,
|
|
208
219
|
expanded: __props.expanded,
|
|
209
220
|
"current-path": __props.currentPath,
|
|
210
|
-
depth: __props.depth + 1
|
|
211
|
-
|
|
221
|
+
depth: __props.depth + 1,
|
|
222
|
+
"label-class": __props.labelClass,
|
|
223
|
+
"icon-class": __props.iconClass,
|
|
224
|
+
"item-class": __props.itemClass,
|
|
225
|
+
"active-class": __props.activeClass
|
|
226
|
+
}, null, 8, ["menu-item", "expanded", "current-path", "depth", "label-class", "icon-class", "item-class", "active-class"]);
|
|
212
227
|
}), 128))
|
|
213
228
|
])) : createCommentVNode("", true)
|
|
214
229
|
]),
|
|
@@ -243,16 +258,19 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
243
258
|
return openBlock(), createBlock(resolveDynamicComponent(childLinkComponent(child)), mergeProps({ key: index }, { ref_for: true }, childLinkProps(child), {
|
|
244
259
|
class: [
|
|
245
260
|
"flex items-center gap-3 px-4 py-2 text-sm transition-colors",
|
|
246
|
-
|
|
261
|
+
child.itemClass ?? __props.itemClass,
|
|
262
|
+
isChildRouteActive(child) ? child.activeClass ?? __props.activeClass ?? "bg-primary-50 text-primary-700 dark:bg-primary-900/20 dark:text-primary-400" : "text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700"
|
|
247
263
|
],
|
|
248
264
|
onClick: _cache[0] || (_cache[0] = ($event) => unref(closeFlyout)())
|
|
249
265
|
}), {
|
|
250
266
|
default: withCtx(() => [
|
|
251
267
|
createVNode(unref(Icon), {
|
|
252
268
|
icon: child.icon,
|
|
253
|
-
class: "size-4"
|
|
254
|
-
}, null, 8, ["icon"]),
|
|
255
|
-
createElementVNode("span",
|
|
269
|
+
class: normalizeClass(child.iconClass ?? __props.iconClass ?? "size-4")
|
|
270
|
+
}, null, 8, ["icon", "class"]),
|
|
271
|
+
createElementVNode("span", {
|
|
272
|
+
class: normalizeClass(child.labelClass ?? __props.labelClass)
|
|
273
|
+
}, toDisplayString(child.label), 3)
|
|
256
274
|
]),
|
|
257
275
|
_: 2
|
|
258
276
|
}, 1040, ["class"]);
|
|
@@ -409,4 +427,4 @@ export {
|
|
|
409
427
|
_sfc_main$1 as _,
|
|
410
428
|
_sfc_main as a
|
|
411
429
|
};
|
|
412
|
-
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-
|
|
430
|
+
//# sourceMappingURL=Dropdown.vue_vue_type_script_setup_true_lang-DIzyh_AZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-DIzyh_AZ.js","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nimport { computed, resolveComponent, ref, useSlots } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\nimport type { MenuItemProps } from '@/types'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n menuItem: MenuItemProps\r\n /** Whether sidebar is expanded (shows labels) */\r\n expanded?: boolean\r\n /** Override active state directly */\r\n active?: boolean\r\n /** Current route path (pass from parent using useRoute().path) */\r\n currentPath?: string\r\n /** Nesting depth level (used internally for indentation) */\r\n depth?: number\r\n /** Custom class for the label element (overrides menuItem.labelClass) */\r\n labelClass?: string\r\n /** Custom class for the icon element (overrides menuItem.iconClass) */\r\n iconClass?: string\r\n /** Custom class for the menu item wrapper/link (overrides menuItem.itemClass) */\r\n itemClass?: string\r\n /** Custom class applied when item is active (overrides menuItem.activeClass) */\r\n activeClass?: string\r\n }>(),\r\n {\r\n expanded: true,\r\n active: undefined,\r\n currentPath: undefined,\r\n depth: 0,\r\n labelClass: undefined,\r\n iconClass: undefined,\r\n itemClass: undefined,\r\n activeClass: undefined,\r\n },\r\n)\r\n\r\n// Resolved classes (props take precedence over menuItem)\r\nconst resolvedLabelClass = computed(() => props.labelClass ?? props.menuItem.labelClass)\r\nconst resolvedIconClass = computed(() => props.iconClass ?? props.menuItem.iconClass)\r\nconst resolvedItemClass = computed(() => props.itemClass ?? props.menuItem.itemClass)\r\nconst resolvedActiveClass = computed(() => props.activeClass ?? props.menuItem.activeClass)\r\n\r\nconst slots = useSlots() as { submenu?: () => unknown }\r\nconst submenuOpen = ref(false)\r\n\r\n// Flyout popover for compacted mode\r\nconst triggerRef = ref<HTMLElement>()\r\nconst flyoutRef = ref<HTMLElement>()\r\nconst { isOpen: flyoutOpen, dropdownStyle, open: openFlyout, close: closeFlyout } = useDropdown(\r\n triggerRef,\r\n flyoutRef,\r\n {\r\n teleport: true,\r\n gap: 8,\r\n placement: 'right-start',\r\n },\r\n)\r\n\r\nconst hasSlotContent = computed(() => !!slots.submenu)\r\n\r\nconst hasChildren = computed(() => {\r\n return props.menuItem.children && props.menuItem.children.length > 0\r\n})\r\n\r\nconst hasSubmenu = computed(() => hasChildren.value || hasSlotContent.value)\r\n\r\nconst isRouteActive = computed(() => {\r\n // If active prop is explicitly set, use it\r\n if (props.active !== undefined) {\r\n return props.active\r\n }\r\n\r\n // Use currentPath prop if provided, otherwise fall back to window.location\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n\r\n if (props.menuItem.link === '/') {\r\n return path === '/'\r\n }\r\n return path === props.menuItem.link || path.startsWith(props.menuItem.link + '/')\r\n})\r\n\r\n// Check if any child is active (to highlight parent)\r\nconst isChildActive = computed(() => {\r\n if (!hasChildren.value) return false\r\n\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n\r\n const checkActive = (items: MenuItemProps[]): boolean => {\r\n return items.some((item) => {\r\n if (item.link === path || path.startsWith(item.link + '/')) {\r\n return true\r\n }\r\n if (item.children) {\r\n return checkActive(item.children)\r\n }\r\n return false\r\n })\r\n }\r\n\r\n return checkActive(props.menuItem.children!)\r\n})\r\n\r\n// Try to resolve RouterLink, fallback to 'a' tag\r\nconst linkComponent = computed(() => {\r\n if (hasSubmenu.value) {\r\n return 'button'\r\n }\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n})\r\n\r\nconst linkProps = computed(() => {\r\n if (hasSubmenu.value) {\r\n return { type: 'button' as const }\r\n }\r\n if (linkComponent.value === 'a') {\r\n return { href: props.menuItem.link }\r\n }\r\n return { to: props.menuItem.link }\r\n})\r\n\r\nconst toggleSubmenu = () => {\r\n if (hasSubmenu.value) {\r\n submenuOpen.value = !submenuOpen.value\r\n }\r\n}\r\n\r\nconst paddingLeft = computed(() => {\r\n if (!props.expanded) return undefined\r\n const basePadding = 20 // px-5 = 20px\r\n const indentPerLevel = 16 // 16px per nesting level\r\n return `${basePadding + props.depth * indentPerLevel}px`\r\n})\r\n\r\n// Helper functions for flyout child items\r\nconst childLinkComponent = (child: MenuItemProps) => {\r\n if (child.children && child.children.length > 0) {\r\n return 'button'\r\n }\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n}\r\n\r\nconst childLinkProps = (child: MenuItemProps) => {\r\n if (child.children && child.children.length > 0) {\r\n return { type: 'button' as const }\r\n }\r\n const component = childLinkComponent(child)\r\n if (component === 'a') {\r\n return { href: child.link }\r\n }\r\n return { to: child.link }\r\n}\r\n\r\nconst isChildRouteActive = (child: MenuItemProps) => {\r\n const path = props.currentPath ?? (typeof window !== 'undefined' ? window.location.pathname : '/')\r\n if (child.link === '/') {\r\n return path === '/'\r\n }\r\n return path === child.link || path.startsWith(child.link + '/')\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n class=\"w-full\"\r\n @mouseenter=\"!expanded && hasSubmenu && openFlyout()\"\r\n @mouseleave=\"!expanded && hasSubmenu && closeFlyout()\"\r\n >\r\n <component\r\n :is=\"linkComponent\"\r\n ref=\"triggerRef\"\r\n v-bind=\"linkProps\"\r\n :class=\"[\r\n expanded ? 'flex-row' : 'flex-col',\r\n resolvedItemClass,\r\n ]\"\r\n :style=\"expanded ? { paddingLeft } : undefined\"\r\n class=\"group relative flex w-full items-center justify-center gap-2 pr-5 py-2\"\r\n @click=\"toggleSubmenu\"\r\n >\r\n <div class=\"relative\">\r\n <Icon\r\n :class=\"[\r\n resolvedIconClass\r\n ? resolvedIconClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\r\n expanded ? 'size-5' : 'size-8',\r\n ]\"\r\n class=\"transition-all duration-300\"\r\n :icon=\"menuItem.icon\"\r\n />\r\n\r\n <span\r\n v-if=\"menuItem.notification\"\r\n class=\"absolute top-0.25 right-0.25 size-1.5 rounded-full bg-red-600\"\r\n />\r\n </div>\r\n\r\n <Transition\r\n enter-active-class=\"transition-all duration-300 ease-out\"\r\n enter-from-class=\"opacity-0 -translate-x-2\"\r\n enter-to-class=\"opacity-100 translate-x-0\"\r\n leave-active-class=\"transition-all duration-200 ease-in\"\r\n leave-from-class=\"opacity-100 translate-x-0\"\r\n leave-to-class=\"opacity-0 -translate-x-2\"\r\n >\r\n <span\r\n v-if=\"expanded\"\r\n :class=\"\r\n resolvedLabelClass\r\n ? resolvedLabelClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500'\r\n \"\r\n class=\"flex-1 text-left text-sm font-semibold whitespace-nowrap\"\r\n >{{ menuItem.label }}</span>\r\n </Transition>\r\n\r\n <!-- Chevron for submenu -->\r\n <Icon\r\n v-if=\"hasSubmenu && expanded\"\r\n :class=\"[\r\n submenuOpen ? 'rotate-90' : '',\r\n resolvedIconClass\r\n ? resolvedIconClass\r\n : isRouteActive || isChildActive\r\n ? (resolvedActiveClass ?? 'text-white')\r\n : 'text-white/50 group-hover:text-white/80 dark:text-gray-700 dark:group-hover:text-gray-500',\r\n ]\"\r\n class=\"size-4 transition-transform duration-200\"\r\n icon=\"lucide:chevron-right\"\r\n />\r\n </component>\r\n\r\n <!-- Submenu content (expanded mode - inline) -->\r\n <Transition\r\n enter-active-class=\"transition-all duration-300 ease-out\"\r\n enter-from-class=\"opacity-0 max-h-0\"\r\n enter-to-class=\"opacity-100 max-h-96\"\r\n leave-active-class=\"transition-all duration-200 ease-in\"\r\n leave-from-class=\"opacity-100 max-h-96\"\r\n leave-to-class=\"opacity-0 max-h-0\"\r\n >\r\n <div\r\n v-if=\"hasSubmenu && submenuOpen && expanded\"\r\n class=\"overflow-hidden\"\r\n >\r\n <!-- Slot for custom submenu content -->\r\n <slot\r\n name=\"submenu\"\r\n :depth=\"depth + 1\"\r\n :expanded=\"expanded\"\r\n :current-path=\"currentPath\"\r\n />\r\n\r\n <!-- Default children from prop -->\r\n <MenuItem\r\n v-for=\"(child, index) in menuItem.children\"\r\n :key=\"index\"\r\n :menu-item=\"child\"\r\n :expanded=\"expanded\"\r\n :current-path=\"currentPath\"\r\n :depth=\"depth + 1\"\r\n :label-class=\"labelClass\"\r\n :icon-class=\"iconClass\"\r\n :item-class=\"itemClass\"\r\n :active-class=\"activeClass\"\r\n />\r\n </div>\r\n </Transition>\r\n\r\n <!-- Flyout submenu (compacted mode - popover) -->\r\n <Teleport to=\"body\">\r\n <Transition\r\n enter-active-class=\"transition duration-150 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-100 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"hasSubmenu && flyoutOpen && !expanded\"\r\n ref=\"flyoutRef\"\r\n :style=\"dropdownStyle\"\r\n class=\"z-9999 min-w-48 rounded-lg border border-gray-200 bg-white py-2 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\r\n @mouseenter=\"openFlyout()\"\r\n @mouseleave=\"closeFlyout()\"\r\n >\r\n <!-- Label header -->\r\n <div class=\"px-4 py-2 text-xs font-semibold text-gray-500 uppercase dark:text-gray-400\">\r\n {{ menuItem.label }}\r\n </div>\r\n\r\n <!-- Slot for custom submenu content -->\r\n <slot\r\n name=\"submenu\"\r\n :depth=\"0\"\r\n :expanded=\"true\"\r\n :current-path=\"currentPath\"\r\n />\r\n\r\n <!-- Default children from prop -->\r\n <template v-if=\"menuItem.children\">\r\n <component\r\n :is=\"childLinkComponent(child)\"\r\n v-for=\"(child, index) in menuItem.children\"\r\n :key=\"index\"\r\n v-bind=\"childLinkProps(child)\"\r\n :class=\"[\r\n 'flex items-center gap-3 px-4 py-2 text-sm transition-colors',\r\n child.itemClass ?? itemClass,\r\n isChildRouteActive(child)\r\n ? (child.activeClass ?? activeClass ?? 'bg-primary-50 text-primary-700 dark:bg-primary-900/20 dark:text-primary-400')\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-700',\r\n ]\"\r\n @click=\"closeFlyout()\"\r\n >\r\n <Icon\r\n :icon=\"child.icon\"\r\n :class=\"child.iconClass ?? iconClass ?? 'size-4'\"\r\n />\r\n <span :class=\"child.labelClass ?? labelClass\">{{ child.label }}</span>\r\n </component>\r\n </template>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\nimport { useId } from '@/composables/useId'\r\n\r\nexport interface DropdownItem {\r\n key: string\r\n label: string\r\n icon?: string\r\n disabled?: boolean\r\n danger?: boolean\r\n divider?: boolean\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Dropdown items (optional if using default slot) */\r\n items?: DropdownItem[]\r\n /** Align dropdown */\r\n align?: 'left' | 'right'\r\n /** Dropdown width */\r\n width?: 'auto' | 'full' | 'sm' | 'md' | 'lg'\r\n /** Use teleport to body to avoid overflow clipping */\r\n teleport?: boolean\r\n /** Custom ID for accessibility */\r\n id?: string\r\n }>(),\r\n {\r\n items: () => [],\r\n align: 'left',\r\n width: 'auto',\r\n teleport: true,\r\n },\r\n)\r\n\r\n// Generate unique IDs for accessibility\r\nconst { related } = useId({ prefix: 'dropdown', id: props.id })\r\nconst triggerId = computed(() => related('trigger'))\r\nconst menuId = computed(() => related('menu'))\r\n\r\nconst emit = defineEmits<{\r\n select: [item: DropdownItem]\r\n}>()\r\n\r\nconst triggerRef = ref<HTMLElement>()\r\nconst menuRef = ref<HTMLElement>()\r\n\r\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, menuRef, {\r\n teleport: props.teleport,\r\n align: props.align,\r\n})\r\n\r\nconst selectItem = (item: DropdownItem) => {\r\n if (item.disabled || item.divider) return\r\n emit('select', item)\r\n close()\r\n}\r\n\r\nconst widthClasses = {\r\n auto: 'w-auto min-w-40',\r\n full: 'w-full',\r\n sm: 'w-32',\r\n md: 'w-48',\r\n lg: 'w-64',\r\n}\r\n\r\nconst computedDropdownStyle = computed(() => {\r\n if (!props.teleport) return {}\r\n const { width: _, ...rest } = dropdownStyle.value\r\n return rest\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative inline-block\">\r\n <div\r\n ref=\"triggerRef\"\r\n @click=\"toggle\"\r\n >\r\n <slot name=\"trigger\">\r\n <button\r\n :id=\"triggerId\"\r\n type=\"button\"\r\n :aria-expanded=\"isOpen\"\r\n aria-haspopup=\"menu\"\r\n :aria-controls=\"menuId\"\r\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\"\r\n >\r\n <slot name=\"trigger-label\">\r\n Options\r\n </slot>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"['size-4 transition-transform', isOpen && 'rotate-180']\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n </slot>\r\n </div>\r\n\r\n <Teleport\r\n to=\"body\"\r\n :disabled=\"!teleport\"\r\n >\r\n <Transition\r\n enter-active-class=\"transition ease-out duration-100\"\r\n enter-from-class=\"transform opacity-0 scale-95\"\r\n enter-to-class=\"transform opacity-100 scale-100\"\r\n leave-active-class=\"transition ease-in duration-75\"\r\n leave-from-class=\"transform opacity-100 scale-100\"\r\n leave-to-class=\"transform opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n :id=\"menuId\"\r\n ref=\"menuRef\"\r\n role=\"menu\"\r\n :aria-labelledby=\"triggerId\"\r\n :style=\"computedDropdownStyle\"\r\n :class=\"[\r\n 'z-9999 rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-800',\r\n widthClasses[width],\r\n !teleport && (align === 'right' ? 'absolute mt-2 right-0' : 'absolute mt-2 left-0'),\r\n ]\"\r\n >\r\n <!-- Custom content via default slot -->\r\n <slot :close=\"close\">\r\n <!-- Default items rendering -->\r\n <template\r\n v-for=\"item in items\"\r\n :key=\"item.key\"\r\n >\r\n <div\r\n v-if=\"item.divider\"\r\n role=\"separator\"\r\n class=\"my-1 border-t border-gray-200 dark:border-gray-700\"\r\n />\r\n <button\r\n v-else\r\n type=\"button\"\r\n role=\"menuitem\"\r\n :disabled=\"item.disabled\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition-colors',\r\n item.disabled\r\n ? 'cursor-not-allowed opacity-50'\r\n : item.danger\r\n ? 'text-red-600 hover:bg-red-50 dark:text-red-400 dark:hover:bg-red-900/20'\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-200 dark:hover:bg-gray-700',\r\n ]\"\r\n @click=\"selectItem(item)\"\r\n >\r\n <Icon\r\n v-if=\"item.icon\"\r\n :icon=\"item.icon\"\r\n class=\"size-4\"\r\n aria-hidden=\"true\"\r\n />\r\n {{ item.label }}\r\n </button>\r\n </template>\r\n </slot>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_unref","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_normalizeClass","_openBlock","_hoisted_2","_Transition","_toDisplayString","_hoisted_3","_renderSlot","_Fragment","_Teleport","_hoisted_4","_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-
|
|
4
|
+
const Dropdown_vue_vue_type_script_setup_true_lang = require("./Dropdown.vue_vue_type_script_setup_true_lang-BeCEo4vl.cjs");
|
|
5
5
|
const _hoisted_1$3 = { class: "flex min-h-screen" };
|
|
6
6
|
const _hoisted_2$3 = {
|
|
7
7
|
key: 0,
|
|
@@ -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-
|
|
764
|
+
//# sourceMappingURL=PageHero.vue_vue_type_script_setup_true_lang-8fMdvVcY.cjs.map
|