cisse-vue-ui 0.7.8 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +879 -879
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-hHJdvUYS.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-BPALlche.js} +3 -3
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BPALlche.js.map +1 -0
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-DJbuHoDj.cjs → CheckboxGroup.vue_vue_type_script_setup_true_lang-CYnPpiRd.cjs} +3 -3
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-CYnPpiRd.cjs.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs} +58 -9
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js} +58 -9
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js → Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js} +126 -39
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs → Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs} +125 -38
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs.map +1 -0
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-Bj3I5Sn7.cjs.map +1 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-DzLwUVCW.js.map +1 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +1 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +1 -1
- 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
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-Bi97ypMD.cjs.map +1 -0
- 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
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-DQQGYAw0.js.map +1 -0
- package/dist/cisse-vue-ui.css +57 -57
- package/dist/components/core/MenuItem.stories.d.ts +6 -0
- package/dist/components/core/MenuItem.vue.d.ts +24 -2
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/feedback/PaginationControls.stories.d.ts +5 -0
- package/dist/components/feedback/PaginationControls.vue.d.ts +2 -0
- package/dist/components/feedback/index.cjs +1 -1
- package/dist/components/feedback/index.js +1 -1
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +4 -4
- package/dist/components/index.js +4 -4
- package/dist/components/layout/BaseLayout.stories.d.ts +1 -0
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/{index-DvkgM40a.js → index-CE90-_mh.js} +5 -5
- package/dist/index-CE90-_mh.js.map +1 -0
- package/dist/{index-CtUcdTUz.cjs → index-QKwLtDJE.cjs} +5 -5
- package/dist/{index-CtUcdTUz.cjs.map → index-QKwLtDJE.cjs.map} +1 -1
- package/dist/index.cjs +5 -5
- package/dist/index.js +5 -5
- package/dist/style.css +1 -1
- package/dist/types/components.d.ts +2 -0
- package/dist/useDropdown-DHFnd259.cjs.map +1 -1
- package/dist/useDropdown-iVu14E6s.js.map +1 -1
- package/dist/useFocusTrap-AnlJsihM.js.map +1 -1
- package/dist/useFocusTrap-kcxO8AeU.cjs.map +1 -1
- package/dist/useId-nxrBaIC9.cjs.map +1 -1
- package/dist/useId-xeHj7rkg.js.map +1 -1
- package/dist/useToast-Bk60GArg.cjs.map +1 -1
- package/dist/useToast-ina5g3mj.js.map +1 -1
- package/package.json +169 -169
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-DJbuHoDj.cjs.map +0 -1
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-hHJdvUYS.js.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js.map +0 -1
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js.map +0 -1
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs.map +0 -1
- package/dist/index-DvkgM40a.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs","sources":["../src/components/feedback/LoadingSpinner.vue","../src/components/feedback/Modal.vue","../src/components/feedback/PaginationControls.vue","../src/components/feedback/NotificationComponent.vue","../src/components/feedback/NotificationList.vue","../src/components/feedback/Alert.vue","../src/components/feedback/EmptyState.vue","../src/components/feedback/Toast.vue","../src/components/feedback/ToastContainer.vue","../src/components/feedback/Progress.vue","../src/components/feedback/Skeleton.vue","../src/components/feedback/ConfirmDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { SpinnerSize } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n text?: string\n size?: SpinnerSize\n /** Accessible label for screen readers (defaults to 'Loading' or text prop) */\n ariaLabel?: string\n }>(),\n {\n size: 'md',\n ariaLabel: 'Loading',\n },\n)\n\nconst sizeClasses: Record<SpinnerSize, string> = {\n sm: 'size-8',\n md: 'size-12',\n lg: 'size-16',\n}\n\nconst accessibleLabel = computed(() => props.text || props.ariaLabel)\n</script>\n\n<template>\n <div\n class=\"flex items-center justify-center py-12\"\n role=\"status\"\n aria-live=\"polite\"\n :aria-label=\"accessibleLabel\"\n >\n <div class=\"text-center\">\n <div\n :class=\"sizeClasses[size]\"\n class=\"border-primary inline-block animate-spin rounded-full border-4 border-solid border-r-transparent\"\n aria-hidden=\"true\"\n />\n <p\n v-if=\"text\"\n class=\"mt-4 text-gray-600 dark:text-gray-400\"\n >\n {{ text }}\n </p>\n <span v-else class=\"sr-only\">{{ accessibleLabel }}</span>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport { onMounted, onUnmounted, computed, ref } from 'vue'\nimport type { ModalSize } from '@/types'\nimport { useId } from '@/composables/useId'\nimport { useFocusTrap } from '@/composables/useFocusTrap'\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n size?: ModalSize\n closeOnBackdrop?: boolean\n closeOnEscape?: boolean\n closeButtonLabel?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n /** Custom ID for the modal (auto-generated if not provided) */\n id?: string\n }>(),\n {\n title: '',\n size: 'default',\n closeOnBackdrop: true,\n closeOnEscape: true,\n closeButtonLabel: 'Close',\n teleport: 'body',\n },\n)\n\nconst {\n title,\n size,\n closeOnBackdrop,\n closeOnEscape,\n closeButtonLabel,\n} = props\n\nconst teleportDisabled = computed(() => props.teleport === false)\nconst teleportTarget = computed(() => props.teleport === false ? 'body' : props.teleport)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\n// Generate unique IDs for ARIA relationships\nconst { id: modalId, related } = useId({ prefix: 'modal', id: props.id })\nconst titleId = computed(() => related('title'))\n\n// Focus trap\nconst isActive = ref(true)\nconst { containerRef: dialogRef } = useFocusTrap({\n active: isActive,\n focusFirst: true,\n restoreFocus: true,\n})\n\n// Check if modal has a title (for aria-labelledby)\nconst hasTitle = computed(() => Boolean(props.title))\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-md',\n default: 'max-w-3xl',\n lg: 'max-w-5xl',\n xl: 'max-w-7xl',\n full: 'max-w-full mx-4',\n}\n\nconst handleBackdropClick = () => {\n if (closeOnBackdrop) {\n emit('close')\n }\n}\n\nconst handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && closeOnEscape) {\n emit('close')\n }\n}\n\nonMounted(() => {\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <Teleport :to=\"teleportTarget\" :disabled=\"teleportDisabled\">\n <div\n class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n @click.self=\"handleBackdropClick\"\n >\n <div\n ref=\"dialogRef\"\n :id=\"modalId\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"hasTitle ? titleId : undefined\"\n :class=\"sizeClasses[size]\"\n class=\"flex max-h-[90vh] w-full flex-col rounded-lg bg-white shadow-xl dark:bg-gray-900\"\n >\n <!-- Header -->\n <div\n v-if=\"title || $slots.header || $slots.title\"\n class=\"flex items-center justify-between border-b border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <h3\n :id=\"titleId\"\n class=\"text-xl font-semibold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"header\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </slot>\n </h3>\n <button\n class=\"rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n type=\"button\"\n aria-label=\"Close dialog\"\n @click=\"emit('close')\"\n >\n <Icon\n class=\"size-5\"\n icon=\"lucide:x\"\n aria-hidden=\"true\"\n />\n <span class=\"sr-only\">{{ closeButtonLabel }}</span>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-y-auto px-6 py-4\">\n <slot />\n </div>\n\n <!-- Footer -->\n <div\n v-if=\"$slots.footer\"\n class=\"flex items-center justify-end gap-3 border-t border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n currentPage,\n totalPages,\n loading = false,\n pageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n showPageSize = true,\n pageLabel = 'Page',\n ofLabel = 'of',\n itemsPerPageLabel = 'Items per page:',\n previousLabel = 'Previous',\n nextLabel = 'Next',\n} = defineProps<{\n currentPage: number\n totalPages: number\n loading?: boolean\n pageSize?: number\n pageSizeOptions?: number[]\n showPageSize?: boolean\n pageLabel?: string\n ofLabel?: string\n itemsPerPageLabel?: string\n previousLabel?: string\n nextLabel?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:page': [page: number]\n 'update:pageSize': [size: number]\n}>()\n\nconst changePage = (page: number) => {\n if (page >= 1 && page <= totalPages && !loading) {\n emit('update:page', page)\n }\n}\n\nconst changePageSize = (event: Event) => {\n const target = event.target as HTMLSelectElement\n emit('update:pageSize', Number(target.value))\n}\n</script>\n\n<template>\n <div\n v-if=\"totalPages > 1\"\n class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700\"\n >\n <!-- Info and page size -->\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4\">\n <div class=\"text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left\">\n {{ pageLabel }} {{ currentPage }} {{ ofLabel }} {{ totalPages }}\n </div>\n <div\n v-if=\"showPageSize\"\n class=\"flex items-center justify-center sm:justify-start gap-2\"\n >\n <label\n class=\"text-sm text-gray-600 dark:text-gray-400 hidden sm:inline\"\n for=\"page-size\"\n >\n {{ itemsPerPageLabel }}\n </label>\n <select\n id=\"page-size\"\n :value=\"pageSize\"\n class=\"focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n @change=\"changePageSize\"\n >\n <option\n v-for=\"size in pageSizeOptions\"\n :key=\"size\"\n :value=\"size\"\n >\n {{ size }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Navigation buttons -->\n <div class=\"flex justify-center sm:justify-end gap-2\">\n <button\n :disabled=\"currentPage === 1 || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage - 1)\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-left\"\n />\n <span class=\"hidden sm:inline\">{{ previousLabel }}</span>\n </button>\n <button\n :disabled=\"currentPage === totalPages || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage + 1)\"\n >\n <span class=\"hidden sm:inline\">{{ nextLabel }}</span>\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-right\"\n />\n </button>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Notification } from '@/types'\nimport { computed, onMounted } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nconst props = defineProps<{\n notification: Notification\n autoDismiss?: boolean\n duration?: number\n}>()\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst iconName = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'lucide:check-circle'\n case 'info':\n return 'lucide:info'\n case 'warning':\n return 'lucide:alert-triangle'\n case 'error':\n return 'lucide:x-circle'\n default:\n return 'lucide:bell'\n }\n})\n\nconst iconColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'text-green-600 dark:text-green-400'\n case 'info':\n return 'text-blue-600 dark:text-blue-400'\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400'\n case 'error':\n return 'text-red-600 dark:text-red-400'\n default:\n return 'text-gray-600 dark:text-gray-400'\n }\n})\n\nconst bgColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'bg-green-50 dark:bg-green-950'\n case 'info':\n return 'bg-blue-50 dark:bg-blue-950'\n case 'warning':\n return 'bg-yellow-50 dark:bg-yellow-950'\n case 'error':\n return 'bg-red-50 dark:bg-red-950'\n default:\n return 'bg-gray-50 dark:bg-gray-950'\n }\n})\n\nconst handleDismiss = () => {\n if (props.notification.id) {\n emit('dismiss', props.notification.id)\n }\n}\n\nonMounted(() => {\n const duration = props.notification.duration ?? props.duration ?? 5000\n if (props.autoDismiss !== false && duration > 0) {\n setTimeout(() => {\n handleDismiss()\n }, duration)\n }\n})\n</script>\n\n<template>\n <div\n class=\"flex max-w-md items-start space-x-3 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-800 dark:bg-black\"\n >\n <div :class=\"[bgColor, 'flex items-center justify-center rounded-full p-2']\">\n <Icon\n :class=\"iconColor\"\n :icon=\"iconName\"\n class=\"size-5\"\n />\n </div>\n\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <h4\n v-if=\"notification.title\"\n class=\"text-sm font-semibold text-gray-900 dark:text-gray-100\"\n >\n {{ notification.title }}\n </h4>\n <p\n v-if=\"notification.message\"\n class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\"\n >\n {{ notification.message }}\n </p>\n </div>\n\n <button\n class=\"shrink-0 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-600 dark:hover:text-gray-400\"\n @click=\"handleDismiss\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:x\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { Notification } from '@/types'\nimport NotificationComponent from './NotificationComponent.vue'\n\nconst props = withDefaults(\n defineProps<{\n notifications: Notification[]\n autoDismiss?: boolean\n duration?: number\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'top-5 right-5',\n 'top-left': 'top-5 left-5',\n 'bottom-right': 'bottom-5 right-5',\n 'bottom-left': 'bottom-5 left-5',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value || !props.topOffset) return {}\n return { top: props.topOffset }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-50 flex flex-col gap-3 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <NotificationComponent\n v-for=\"notification in notifications\"\n :key=\"notification.id\"\n :notification=\"notification\"\n :auto-dismiss=\"autoDismiss\"\n :duration=\"duration\"\n @dismiss=\"emit('dismiss', $event)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Alert variant */\n variant?: AlertVariant\n /** Title text */\n title?: string\n /** Show close button */\n dismissible?: boolean\n /** Custom icon */\n icon?: string\n }>(),\n {\n variant: 'info',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: []\n}>()\n\nconst variantStyles: Record<AlertVariant, { bg: string; border: string; icon: string; iconColor: string }> = {\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20',\n border: 'border-blue-200 dark:border-blue-800',\n icon: 'lucide:info',\n iconColor: 'text-blue-500',\n },\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20',\n border: 'border-green-200 dark:border-green-800',\n icon: 'lucide:check-circle',\n iconColor: 'text-green-500',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20',\n border: 'border-yellow-200 dark:border-yellow-800',\n icon: 'lucide:alert-triangle',\n iconColor: 'text-yellow-500',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20',\n border: 'border-red-200 dark:border-red-800',\n icon: 'lucide:alert-circle',\n iconColor: 'text-red-500',\n },\n}\n\nconst styles = variantStyles[props.variant]\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex gap-3 rounded-lg border p-4',\n styles.bg,\n styles.border,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"icon || styles.icon\"\n :class=\"['size-5 shrink-0', styles.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1\">\n <h4\n v-if=\"title\"\n class=\"mb-1 font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h4>\n <div class=\"text-sm text-gray-700 dark:text-gray-300\">\n <slot />\n </div>\n </div>\n <button\n v-if=\"dismissible\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss alert\"\n @click=\"emit('dismiss')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nwithDefaults(\n defineProps<{\n /** Message to display */\n message?: string\n /** Icon name (iconify format) */\n icon?: string\n /** Title text */\n title?: string\n }>(),\n {\n message: 'No results found',\n icon: 'lucide:inbox',\n },\n)\n</script>\n\n<template>\n <div class=\"py-12 text-center\">\n <Icon\n v-if=\"icon\"\n :icon=\"icon\"\n class=\"mx-auto mb-4 size-12 text-gray-400 dark:text-gray-500\"\n />\n <h3\n v-if=\"title\"\n class=\"mb-2 text-lg font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h3>\n <p class=\"text-gray-500 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n <div\n v-if=\"$slots.action\"\n class=\"mt-4\"\n >\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info'\n\nconst props = withDefaults(\n defineProps<{\n /** Toast message */\n message: string\n /** Toast type */\n type?: ToastType\n /** Title (optional) */\n title?: string\n /** Show close button */\n closable?: boolean\n /** Duration in ms (0 = no auto-close) */\n duration?: number\n }>(),\n {\n type: 'info',\n closable: true,\n duration: 5000,\n },\n)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\nconst typeConfig: Record<ToastType, { icon: string; bg: string; iconColor: string }> = {\n success: {\n icon: 'lucide:check-circle',\n bg: 'bg-green-50 border-green-200 dark:bg-green-950 dark:border-green-800',\n iconColor: 'text-green-500',\n },\n error: {\n icon: 'lucide:x-circle',\n bg: 'bg-red-50 border-red-200 dark:bg-red-950 dark:border-red-800',\n iconColor: 'text-red-500',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n bg: 'bg-yellow-50 border-yellow-200 dark:bg-yellow-950 dark:border-yellow-800',\n iconColor: 'text-yellow-500',\n },\n info: {\n icon: 'lucide:info',\n bg: 'bg-blue-50 border-blue-200 dark:bg-blue-950 dark:border-blue-800',\n iconColor: 'text-blue-500',\n },\n}\n\nconst config = typeConfig[props.type]\n\n// Auto-close\nif (props.duration > 0) {\n setTimeout(() => {\n emit('close')\n }, props.duration)\n}\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n config.bg,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"config.icon\"\n :class=\"['size-5 shrink-0', config.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1 min-w-0\">\n <p\n v-if=\"title\"\n class=\"font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </p>\n <p class=\"text-sm text-gray-700 dark:text-gray-300\">\n {{ message }}\n </p>\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss notification\"\n @click=\"emit('close')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport Toast from './Toast.vue'\nimport type { ToastType } from './Toast.vue'\n\nexport interface ToastItem {\n id: string\n message: string\n type?: ToastType\n title?: string\n duration?: number\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Array of toast items */\n toasts: ToastItem[]\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n close: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'right-4',\n 'top-left': 'left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value) return {}\n return { top: props.topOffset || '1rem' }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-9999 flex flex-col gap-2 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <Toast\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :message=\"toast.message\"\n :type=\"toast.type\"\n :title=\"toast.title\"\n :duration=\"toast.duration\"\n @close=\"emit('close', toast.id)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressVariant = 'default' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Current value (0-100) */\n value: number\n /** Maximum value */\n max?: number\n /** Size variant */\n size?: ProgressSize\n /** Color variant */\n variant?: ProgressVariant\n /** Show percentage label */\n showLabel?: boolean\n /** Striped animation */\n striped?: boolean\n /** Animated stripes */\n animated?: boolean\n /** Indeterminate state (loading) */\n indeterminate?: boolean\n }>(),\n {\n max: 100,\n size: 'md',\n variant: 'default',\n showLabel: false,\n striped: false,\n animated: false,\n indeterminate: false,\n },\n)\n\nconst percentage = computed(() => {\n if (props.indeterminate) return 100\n return Math.min(Math.max((props.value / props.max) * 100, 0), 100)\n})\n\nconst sizeClasses: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-4',\n}\n\nconst variantClasses: Record<ProgressVariant, string> = {\n default: 'bg-primary',\n success: 'bg-green-500',\n warning: 'bg-yellow-500',\n error: 'bg-red-500',\n}\n</script>\n\n<template>\n <div class=\"w-full\">\n <div\n v-if=\"showLabel && !indeterminate\"\n class=\"mb-1 flex justify-between text-sm\"\n >\n <span class=\"text-gray-600 dark:text-gray-400\">Progress</span>\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ Math.round(percentage) }}%</span>\n </div>\n <div\n :class=\"[\n 'w-full overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700',\n sizeClasses[size],\n ]\"\n role=\"progressbar\"\n :aria-valuenow=\"indeterminate ? undefined : value\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"max\"\n >\n <div\n :class=\"[\n 'h-full rounded-full transition-all duration-300',\n variantClasses[variant],\n striped && 'bg-stripes',\n animated && 'animate-stripes',\n indeterminate && 'animate-indeterminate',\n ]\"\n :style=\"{ width: indeterminate ? '30%' : `${percentage}%` }\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.bg-stripes {\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n}\n\n.animate-stripes {\n animation: stripes 1s linear infinite;\n}\n\n@keyframes stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.animate-indeterminate {\n animation: indeterminate 1.5s ease-in-out infinite;\n}\n\n@keyframes indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular' | 'rounded'\n\nwithDefaults(\n defineProps<{\n /** Variant style */\n variant?: SkeletonVariant\n /** Width (CSS value) */\n width?: string\n /** Height (CSS value) */\n height?: string\n /** Number of lines (for text variant) */\n lines?: number\n /** Animate the skeleton */\n animate?: boolean\n }>(),\n {\n variant: 'text',\n animate: true,\n lines: 1,\n },\n)\n\nconst variantClasses: Record<SkeletonVariant, string> = {\n text: 'h-4 rounded',\n circular: 'rounded-full',\n rectangular: '',\n rounded: 'rounded-lg',\n}\n</script>\n\n<template>\n <div\n v-if=\"variant === 'text' && lines > 1\"\n class=\"space-y-2\"\n aria-hidden=\"true\"\n >\n <div\n v-for=\"i in lines\"\n :key=\"i\"\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: i === lines ? '75%' : width || '100%',\n height: height,\n }\"\n />\n </div>\n <div\n v-else\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: width || (variant === 'circular' ? '3rem' : '100%'),\n height: height || (variant === 'circular' ? '3rem' : variant === 'text' ? '1rem' : '6rem'),\n }\"\n aria-hidden=\"true\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport Modal from './Modal.vue'\nimport Button from '@/components/core/Button.vue'\n\nexport type ConfirmDialogVariant = 'info' | 'warning' | 'danger' | 'success'\n\nconst props = withDefaults(\n defineProps<{\n /** Whether the dialog is open */\n open?: boolean\n /** Dialog title */\n title?: string\n /** Dialog message */\n message?: string\n /** Confirm button text */\n confirmText?: string\n /** Cancel button text */\n cancelText?: string\n /** Dialog variant (affects icon and confirm button color) */\n variant?: ConfirmDialogVariant\n /** Show loading state on confirm button */\n loading?: boolean\n /** Icon to display */\n icon?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n }>(),\n {\n open: false,\n title: 'Confirm',\n message: 'Are you sure you want to proceed?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'info',\n loading: false,\n teleport: 'body',\n },\n)\n\nconst emit = defineEmits<{\n confirm: []\n cancel: []\n}>()\n\nconst variantConfig: Record<ConfirmDialogVariant, { icon: string; iconClass: string; buttonVariant: 'primary' | 'danger' | 'success' }> = {\n info: {\n icon: 'lucide:info',\n iconClass: 'text-blue-500',\n buttonVariant: 'primary',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n iconClass: 'text-yellow-500',\n buttonVariant: 'primary',\n },\n danger: {\n icon: 'lucide:alert-circle',\n iconClass: 'text-red-500',\n buttonVariant: 'danger',\n },\n success: {\n icon: 'lucide:check-circle',\n iconClass: 'text-green-500',\n buttonVariant: 'success',\n },\n}\n\nconst config = variantConfig[props.variant]\n</script>\n\n<template>\n <Modal\n v-if=\"open\"\n size=\"sm\"\n :close-on-backdrop=\"!loading\"\n :close-on-escape=\"!loading\"\n :teleport=\"teleport\"\n @close=\"emit('cancel')\"\n >\n <div class=\"text-center\">\n <!-- Icon -->\n <div class=\"mx-auto mb-4 flex size-14 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800\">\n <Icon\n :icon=\"icon || config.icon\"\n :class=\"[config.iconClass, 'size-8']\"\n />\n </div>\n\n <!-- Title -->\n <h3 class=\"mb-2 text-lg font-semibold text-gray-900 dark:text-gray-100\">\n {{ title }}\n </h3>\n\n <!-- Message -->\n <p class=\"mb-6 text-gray-600 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n\n <!-- Actions -->\n <div class=\"flex justify-center gap-3\">\n <Button\n variant=\"outline\"\n :disabled=\"loading\"\n @click=\"emit('cancel')\"\n >\n {{ cancelText }}\n </Button>\n <Button\n :variant=\"config.buttonVariant\"\n :loading=\"loading\"\n @click=\"emit('confirm')\"\n >\n {{ confirmText }}\n </Button>\n </div>\n </div>\n </Modal>\n</template>\n"],"names":["computed","_createElementBlock","_createElementVNode","_hoisted_2","_normalizeClass","_hoisted_3","_toDisplayString","_hoisted_4","useId","ref","useFocusTrap","onMounted","onUnmounted","_createBlock","_Teleport","_unref","$slots","_openBlock","_renderSlot","_createVNode","Icon","_hoisted_5","_hoisted_6","_hoisted_1","_Fragment","_renderList","_TransitionGroup","NotificationComponent","Toast","_normalizeStyle","Modal","Button"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js","sources":["../src/components/feedback/LoadingSpinner.vue","../src/components/feedback/Modal.vue","../src/components/feedback/PaginationControls.vue","../src/components/feedback/NotificationComponent.vue","../src/components/feedback/NotificationList.vue","../src/components/feedback/Alert.vue","../src/components/feedback/EmptyState.vue","../src/components/feedback/Toast.vue","../src/components/feedback/ToastContainer.vue","../src/components/feedback/Progress.vue","../src/components/feedback/Skeleton.vue","../src/components/feedback/ConfirmDialog.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { SpinnerSize } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n text?: string\n size?: SpinnerSize\n /** Accessible label for screen readers (defaults to 'Loading' or text prop) */\n ariaLabel?: string\n }>(),\n {\n size: 'md',\n ariaLabel: 'Loading',\n },\n)\n\nconst sizeClasses: Record<SpinnerSize, string> = {\n sm: 'size-8',\n md: 'size-12',\n lg: 'size-16',\n}\n\nconst accessibleLabel = computed(() => props.text || props.ariaLabel)\n</script>\n\n<template>\n <div\n class=\"flex items-center justify-center py-12\"\n role=\"status\"\n aria-live=\"polite\"\n :aria-label=\"accessibleLabel\"\n >\n <div class=\"text-center\">\n <div\n :class=\"sizeClasses[size]\"\n class=\"border-primary inline-block animate-spin rounded-full border-4 border-solid border-r-transparent\"\n aria-hidden=\"true\"\n />\n <p\n v-if=\"text\"\n class=\"mt-4 text-gray-600 dark:text-gray-400\"\n >\n {{ text }}\n </p>\n <span v-else class=\"sr-only\">{{ accessibleLabel }}</span>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport { onMounted, onUnmounted, computed, ref } from 'vue'\nimport type { ModalSize } from '@/types'\nimport { useId } from '@/composables/useId'\nimport { useFocusTrap } from '@/composables/useFocusTrap'\n\nconst props = withDefaults(\n defineProps<{\n title?: string\n size?: ModalSize\n closeOnBackdrop?: boolean\n closeOnEscape?: boolean\n closeButtonLabel?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n /** Custom ID for the modal (auto-generated if not provided) */\n id?: string\n }>(),\n {\n title: '',\n size: 'default',\n closeOnBackdrop: true,\n closeOnEscape: true,\n closeButtonLabel: 'Close',\n teleport: 'body',\n },\n)\n\nconst {\n title,\n size,\n closeOnBackdrop,\n closeOnEscape,\n closeButtonLabel,\n} = props\n\nconst teleportDisabled = computed(() => props.teleport === false)\nconst teleportTarget = computed(() => props.teleport === false ? 'body' : props.teleport)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\n// Generate unique IDs for ARIA relationships\nconst { id: modalId, related } = useId({ prefix: 'modal', id: props.id })\nconst titleId = computed(() => related('title'))\n\n// Focus trap\nconst isActive = ref(true)\nconst { containerRef: dialogRef } = useFocusTrap({\n active: isActive,\n focusFirst: true,\n restoreFocus: true,\n})\n\n// Check if modal has a title (for aria-labelledby)\nconst hasTitle = computed(() => Boolean(props.title))\n\nconst sizeClasses: Record<ModalSize, string> = {\n sm: 'max-w-md',\n default: 'max-w-3xl',\n lg: 'max-w-5xl',\n xl: 'max-w-7xl',\n full: 'max-w-full mx-4',\n}\n\nconst handleBackdropClick = () => {\n if (closeOnBackdrop) {\n emit('close')\n }\n}\n\nconst handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && closeOnEscape) {\n emit('close')\n }\n}\n\nonMounted(() => {\n document.addEventListener('keydown', handleEscape)\n document.body.style.overflow = 'hidden'\n})\n\nonUnmounted(() => {\n document.removeEventListener('keydown', handleEscape)\n document.body.style.overflow = ''\n})\n</script>\n\n<template>\n <Teleport :to=\"teleportTarget\" :disabled=\"teleportDisabled\">\n <div\n class=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50 p-4\"\n @click.self=\"handleBackdropClick\"\n >\n <div\n ref=\"dialogRef\"\n :id=\"modalId\"\n role=\"dialog\"\n aria-modal=\"true\"\n :aria-labelledby=\"hasTitle ? titleId : undefined\"\n :class=\"sizeClasses[size]\"\n class=\"flex max-h-[90vh] w-full flex-col rounded-lg bg-white shadow-xl dark:bg-gray-900\"\n >\n <!-- Header -->\n <div\n v-if=\"title || $slots.header || $slots.title\"\n class=\"flex items-center justify-between border-b border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <h3\n :id=\"titleId\"\n class=\"text-xl font-semibold text-gray-900 dark:text-gray-100\"\n >\n <slot name=\"header\">\n <slot name=\"title\">\n {{ title }}\n </slot>\n </slot>\n </h3>\n <button\n class=\"rounded-lg p-1.5 text-gray-400 hover:bg-gray-100 hover:text-gray-900 dark:hover:bg-gray-800 dark:hover:text-gray-100\"\n type=\"button\"\n aria-label=\"Close dialog\"\n @click=\"emit('close')\"\n >\n <Icon\n class=\"size-5\"\n icon=\"lucide:x\"\n aria-hidden=\"true\"\n />\n <span class=\"sr-only\">{{ closeButtonLabel }}</span>\n </button>\n </div>\n\n <!-- Body -->\n <div class=\"flex-1 overflow-y-auto px-6 py-4\">\n <slot />\n </div>\n\n <!-- Footer -->\n <div\n v-if=\"$slots.footer\"\n class=\"flex items-center justify-end gap-3 border-t border-gray-200 px-6 py-4 dark:border-gray-700\"\n >\n <slot name=\"footer\" />\n </div>\n </div>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n currentPage,\n totalPages,\n loading = false,\n pageSize = 10,\n pageSizeOptions = [10, 20, 50, 100],\n showPageSize = true,\n pageLabel = 'Page',\n ofLabel = 'of',\n itemsPerPageLabel = 'Items per page:',\n previousLabel = 'Previous',\n nextLabel = 'Next',\n} = defineProps<{\n currentPage: number\n totalPages: number\n loading?: boolean\n pageSize?: number\n pageSizeOptions?: number[]\n showPageSize?: boolean\n pageLabel?: string\n ofLabel?: string\n itemsPerPageLabel?: string\n previousLabel?: string\n nextLabel?: string\n}>()\n\nconst emit = defineEmits<{\n 'update:page': [page: number]\n 'update:pageSize': [size: number]\n}>()\n\nconst changePage = (page: number) => {\n if (page >= 1 && page <= totalPages && !loading) {\n emit('update:page', page)\n }\n}\n\nconst changePageSize = (event: Event) => {\n const target = event.target as HTMLSelectElement\n emit('update:pageSize', Number(target.value))\n}\n</script>\n\n<template>\n <div\n v-if=\"totalPages > 1\"\n class=\"flex flex-col sm:flex-row sm:items-center sm:justify-between gap-3 border-t border-gray-200 px-4 sm:px-6 py-4 dark:border-gray-700\"\n >\n <!-- Info and page size -->\n <div class=\"flex flex-col sm:flex-row sm:items-center gap-3 sm:gap-4\">\n <div class=\"text-sm text-gray-700 dark:text-gray-300 text-center sm:text-left\">\n {{ pageLabel }} {{ currentPage }} {{ ofLabel }} {{ totalPages }}\n </div>\n <div\n v-if=\"showPageSize\"\n class=\"flex items-center justify-center sm:justify-start gap-2\"\n >\n <label\n class=\"text-sm text-gray-600 dark:text-gray-400 hidden sm:inline\"\n for=\"page-size\"\n >\n {{ itemsPerPageLabel }}\n </label>\n <select\n id=\"page-size\"\n :value=\"pageSize\"\n class=\"focus:border-primary focus:ring-primary rounded border border-gray-300 bg-white px-2 py-1 text-sm text-gray-900 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100\"\n @change=\"changePageSize\"\n >\n <option\n v-for=\"size in pageSizeOptions\"\n :key=\"size\"\n :value=\"size\"\n >\n {{ size }}\n </option>\n </select>\n </div>\n </div>\n\n <!-- Navigation buttons -->\n <div class=\"flex justify-center sm:justify-end gap-2\">\n <button\n :disabled=\"currentPage === 1 || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage - 1)\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-left\"\n />\n <span class=\"hidden sm:inline\">{{ previousLabel }}</span>\n </button>\n <button\n :disabled=\"currentPage === totalPages || loading\"\n class=\"focus:ring-primary inline-flex items-center gap-1 rounded-lg border border-gray-300 bg-white px-3 sm:px-4 py-2 text-sm font-medium text-gray-700 hover:bg-gray-50 disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-200 dark:hover:bg-gray-700\"\n @click=\"changePage(currentPage + 1)\"\n >\n <span class=\"hidden sm:inline\">{{ nextLabel }}</span>\n <Icon\n class=\"size-4\"\n icon=\"lucide:chevron-right\"\n />\n </button>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Notification } from '@/types'\nimport { computed, onMounted } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nconst props = defineProps<{\n notification: Notification\n autoDismiss?: boolean\n duration?: number\n}>()\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst iconName = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'lucide:check-circle'\n case 'info':\n return 'lucide:info'\n case 'warning':\n return 'lucide:alert-triangle'\n case 'error':\n return 'lucide:x-circle'\n default:\n return 'lucide:bell'\n }\n})\n\nconst iconColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'text-green-600 dark:text-green-400'\n case 'info':\n return 'text-blue-600 dark:text-blue-400'\n case 'warning':\n return 'text-yellow-600 dark:text-yellow-400'\n case 'error':\n return 'text-red-600 dark:text-red-400'\n default:\n return 'text-gray-600 dark:text-gray-400'\n }\n})\n\nconst bgColor = computed(() => {\n switch (props.notification.type) {\n case 'success':\n return 'bg-green-50 dark:bg-green-950'\n case 'info':\n return 'bg-blue-50 dark:bg-blue-950'\n case 'warning':\n return 'bg-yellow-50 dark:bg-yellow-950'\n case 'error':\n return 'bg-red-50 dark:bg-red-950'\n default:\n return 'bg-gray-50 dark:bg-gray-950'\n }\n})\n\nconst handleDismiss = () => {\n if (props.notification.id) {\n emit('dismiss', props.notification.id)\n }\n}\n\nonMounted(() => {\n const duration = props.notification.duration ?? props.duration ?? 5000\n if (props.autoDismiss !== false && duration > 0) {\n setTimeout(() => {\n handleDismiss()\n }, duration)\n }\n})\n</script>\n\n<template>\n <div\n class=\"flex max-w-md items-start space-x-3 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-800 dark:bg-black\"\n >\n <div :class=\"[bgColor, 'flex items-center justify-center rounded-full p-2']\">\n <Icon\n :class=\"iconColor\"\n :icon=\"iconName\"\n class=\"size-5\"\n />\n </div>\n\n <div class=\"flex min-w-0 flex-1 flex-col\">\n <h4\n v-if=\"notification.title\"\n class=\"text-sm font-semibold text-gray-900 dark:text-gray-100\"\n >\n {{ notification.title }}\n </h4>\n <p\n v-if=\"notification.message\"\n class=\"mt-1 text-sm text-gray-600 dark:text-gray-400\"\n >\n {{ notification.message }}\n </p>\n </div>\n\n <button\n class=\"shrink-0 text-gray-400 transition-colors hover:text-gray-600 dark:text-gray-600 dark:hover:text-gray-400\"\n @click=\"handleDismiss\"\n >\n <Icon\n class=\"size-4\"\n icon=\"lucide:x\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { Notification } from '@/types'\nimport NotificationComponent from './NotificationComponent.vue'\n\nconst props = withDefaults(\n defineProps<{\n notifications: Notification[]\n autoDismiss?: boolean\n duration?: number\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'top-5 right-5',\n 'top-left': 'top-5 left-5',\n 'bottom-right': 'bottom-5 right-5',\n 'bottom-left': 'bottom-5 left-5',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value || !props.topOffset) return {}\n return { top: props.topOffset }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-50 flex flex-col gap-3 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <NotificationComponent\n v-for=\"notification in notifications\"\n :key=\"notification.id\"\n :notification=\"notification\"\n :auto-dismiss=\"autoDismiss\"\n :duration=\"duration\"\n @dismiss=\"emit('dismiss', $event)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type AlertVariant = 'info' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Alert variant */\n variant?: AlertVariant\n /** Title text */\n title?: string\n /** Show close button */\n dismissible?: boolean\n /** Custom icon */\n icon?: string\n }>(),\n {\n variant: 'info',\n },\n)\n\nconst emit = defineEmits<{\n dismiss: []\n}>()\n\nconst variantStyles: Record<AlertVariant, { bg: string; border: string; icon: string; iconColor: string }> = {\n info: {\n bg: 'bg-blue-50 dark:bg-blue-900/20',\n border: 'border-blue-200 dark:border-blue-800',\n icon: 'lucide:info',\n iconColor: 'text-blue-500',\n },\n success: {\n bg: 'bg-green-50 dark:bg-green-900/20',\n border: 'border-green-200 dark:border-green-800',\n icon: 'lucide:check-circle',\n iconColor: 'text-green-500',\n },\n warning: {\n bg: 'bg-yellow-50 dark:bg-yellow-900/20',\n border: 'border-yellow-200 dark:border-yellow-800',\n icon: 'lucide:alert-triangle',\n iconColor: 'text-yellow-500',\n },\n error: {\n bg: 'bg-red-50 dark:bg-red-900/20',\n border: 'border-red-200 dark:border-red-800',\n icon: 'lucide:alert-circle',\n iconColor: 'text-red-500',\n },\n}\n\nconst styles = variantStyles[props.variant]\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex gap-3 rounded-lg border p-4',\n styles.bg,\n styles.border,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"icon || styles.icon\"\n :class=\"['size-5 shrink-0', styles.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1\">\n <h4\n v-if=\"title\"\n class=\"mb-1 font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h4>\n <div class=\"text-sm text-gray-700 dark:text-gray-300\">\n <slot />\n </div>\n </div>\n <button\n v-if=\"dismissible\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss alert\"\n @click=\"emit('dismiss')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nwithDefaults(\n defineProps<{\n /** Message to display */\n message?: string\n /** Icon name (iconify format) */\n icon?: string\n /** Title text */\n title?: string\n }>(),\n {\n message: 'No results found',\n icon: 'lucide:inbox',\n },\n)\n</script>\n\n<template>\n <div class=\"py-12 text-center\">\n <Icon\n v-if=\"icon\"\n :icon=\"icon\"\n class=\"mx-auto mb-4 size-12 text-gray-400 dark:text-gray-500\"\n />\n <h3\n v-if=\"title\"\n class=\"mb-2 text-lg font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </h3>\n <p class=\"text-gray-500 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n <div\n v-if=\"$slots.action\"\n class=\"mt-4\"\n >\n <slot name=\"action\" />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport type ToastType = 'success' | 'error' | 'warning' | 'info'\n\nconst props = withDefaults(\n defineProps<{\n /** Toast message */\n message: string\n /** Toast type */\n type?: ToastType\n /** Title (optional) */\n title?: string\n /** Show close button */\n closable?: boolean\n /** Duration in ms (0 = no auto-close) */\n duration?: number\n }>(),\n {\n type: 'info',\n closable: true,\n duration: 5000,\n },\n)\n\nconst emit = defineEmits<{\n close: []\n}>()\n\nconst typeConfig: Record<ToastType, { icon: string; bg: string; iconColor: string }> = {\n success: {\n icon: 'lucide:check-circle',\n bg: 'bg-green-50 border-green-200 dark:bg-green-950 dark:border-green-800',\n iconColor: 'text-green-500',\n },\n error: {\n icon: 'lucide:x-circle',\n bg: 'bg-red-50 border-red-200 dark:bg-red-950 dark:border-red-800',\n iconColor: 'text-red-500',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n bg: 'bg-yellow-50 border-yellow-200 dark:bg-yellow-950 dark:border-yellow-800',\n iconColor: 'text-yellow-500',\n },\n info: {\n icon: 'lucide:info',\n bg: 'bg-blue-50 border-blue-200 dark:bg-blue-950 dark:border-blue-800',\n iconColor: 'text-blue-500',\n },\n}\n\nconst config = typeConfig[props.type]\n\n// Auto-close\nif (props.duration > 0) {\n setTimeout(() => {\n emit('close')\n }, props.duration)\n}\n</script>\n\n<template>\n <div\n :class=\"[\n 'flex items-start gap-3 rounded-lg border p-4 shadow-lg',\n config.bg,\n ]\"\n role=\"alert\"\n >\n <Icon\n :icon=\"config.icon\"\n :class=\"['size-5 shrink-0', config.iconColor]\"\n aria-hidden=\"true\"\n />\n <div class=\"flex-1 min-w-0\">\n <p\n v-if=\"title\"\n class=\"font-medium text-gray-900 dark:text-white\"\n >\n {{ title }}\n </p>\n <p class=\"text-sm text-gray-700 dark:text-gray-300\">\n {{ message }}\n </p>\n </div>\n <button\n v-if=\"closable\"\n type=\"button\"\n class=\"shrink-0 rounded p-1 text-gray-400 hover:bg-gray-200 hover:text-gray-600 dark:hover:bg-gray-700 dark:hover:text-gray-300\"\n aria-label=\"Dismiss notification\"\n @click=\"emit('close')\"\n >\n <Icon\n icon=\"lucide:x\"\n class=\"size-4\"\n aria-hidden=\"true\"\n />\n </button>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport Toast from './Toast.vue'\nimport type { ToastType } from './Toast.vue'\n\nexport interface ToastItem {\n id: string\n message: string\n type?: ToastType\n title?: string\n duration?: number\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Array of toast items */\n toasts: ToastItem[]\n /** Position of the container */\n position?: 'top-right' | 'top-left' | 'bottom-right' | 'bottom-left' | 'top-center' | 'bottom-center'\n /** Custom top offset (e.g., '80px', '5rem') to account for fixed headers */\n topOffset?: string\n }>(),\n {\n position: 'top-right',\n },\n)\n\nconst emit = defineEmits<{\n close: [id: string]\n}>()\n\nconst positionClasses: Record<string, string> = {\n 'top-right': 'right-4',\n 'top-left': 'left-4',\n 'bottom-right': 'bottom-4 right-4',\n 'bottom-left': 'bottom-4 left-4',\n 'top-center': 'left-1/2 -translate-x-1/2',\n 'bottom-center': 'bottom-4 left-1/2 -translate-x-1/2',\n}\n\nconst isTopPosition = computed(() => props.position?.startsWith('top'))\n\nconst topStyle = computed(() => {\n if (!isTopPosition.value) return {}\n return { top: props.topOffset || '1rem' }\n})\n</script>\n\n<template>\n <Teleport to=\"body\">\n <div\n :class=\"['fixed z-9999 flex flex-col gap-2 w-full max-w-sm', positionClasses[position]]\"\n :style=\"topStyle\"\n aria-live=\"polite\"\n aria-atomic=\"false\"\n >\n <TransitionGroup\n enter-active-class=\"transition duration-300 ease-out\"\n enter-from-class=\"opacity-0 translate-x-4\"\n enter-to-class=\"opacity-100 translate-x-0\"\n leave-active-class=\"transition duration-200 ease-in\"\n leave-from-class=\"opacity-100 translate-x-0\"\n leave-to-class=\"opacity-0 translate-x-4\"\n >\n <Toast\n v-for=\"toast in toasts\"\n :key=\"toast.id\"\n :message=\"toast.message\"\n :type=\"toast.type\"\n :title=\"toast.title\"\n :duration=\"toast.duration\"\n @close=\"emit('close', toast.id)\"\n />\n </TransitionGroup>\n </div>\n </Teleport>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\n\nexport type ProgressSize = 'sm' | 'md' | 'lg'\nexport type ProgressVariant = 'default' | 'success' | 'warning' | 'error'\n\nconst props = withDefaults(\n defineProps<{\n /** Current value (0-100) */\n value: number\n /** Maximum value */\n max?: number\n /** Size variant */\n size?: ProgressSize\n /** Color variant */\n variant?: ProgressVariant\n /** Show percentage label */\n showLabel?: boolean\n /** Striped animation */\n striped?: boolean\n /** Animated stripes */\n animated?: boolean\n /** Indeterminate state (loading) */\n indeterminate?: boolean\n }>(),\n {\n max: 100,\n size: 'md',\n variant: 'default',\n showLabel: false,\n striped: false,\n animated: false,\n indeterminate: false,\n },\n)\n\nconst percentage = computed(() => {\n if (props.indeterminate) return 100\n return Math.min(Math.max((props.value / props.max) * 100, 0), 100)\n})\n\nconst sizeClasses: Record<ProgressSize, string> = {\n sm: 'h-1',\n md: 'h-2',\n lg: 'h-4',\n}\n\nconst variantClasses: Record<ProgressVariant, string> = {\n default: 'bg-primary',\n success: 'bg-green-500',\n warning: 'bg-yellow-500',\n error: 'bg-red-500',\n}\n</script>\n\n<template>\n <div class=\"w-full\">\n <div\n v-if=\"showLabel && !indeterminate\"\n class=\"mb-1 flex justify-between text-sm\"\n >\n <span class=\"text-gray-600 dark:text-gray-400\">Progress</span>\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ Math.round(percentage) }}%</span>\n </div>\n <div\n :class=\"[\n 'w-full overflow-hidden rounded-full bg-gray-200 dark:bg-gray-700',\n sizeClasses[size],\n ]\"\n role=\"progressbar\"\n :aria-valuenow=\"indeterminate ? undefined : value\"\n :aria-valuemin=\"0\"\n :aria-valuemax=\"max\"\n >\n <div\n :class=\"[\n 'h-full rounded-full transition-all duration-300',\n variantClasses[variant],\n striped && 'bg-stripes',\n animated && 'animate-stripes',\n indeterminate && 'animate-indeterminate',\n ]\"\n :style=\"{ width: indeterminate ? '30%' : `${percentage}%` }\"\n />\n </div>\n </div>\n</template>\n\n<style scoped>\n.bg-stripes {\n background-image: linear-gradient(\n 45deg,\n rgba(255, 255, 255, 0.15) 25%,\n transparent 25%,\n transparent 50%,\n rgba(255, 255, 255, 0.15) 50%,\n rgba(255, 255, 255, 0.15) 75%,\n transparent 75%,\n transparent\n );\n background-size: 1rem 1rem;\n}\n\n.animate-stripes {\n animation: stripes 1s linear infinite;\n}\n\n@keyframes stripes {\n from {\n background-position: 1rem 0;\n }\n to {\n background-position: 0 0;\n }\n}\n\n.animate-indeterminate {\n animation: indeterminate 1.5s ease-in-out infinite;\n}\n\n@keyframes indeterminate {\n 0% {\n transform: translateX(-100%);\n }\n 100% {\n transform: translateX(400%);\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nexport type SkeletonVariant = 'text' | 'circular' | 'rectangular' | 'rounded'\n\nwithDefaults(\n defineProps<{\n /** Variant style */\n variant?: SkeletonVariant\n /** Width (CSS value) */\n width?: string\n /** Height (CSS value) */\n height?: string\n /** Number of lines (for text variant) */\n lines?: number\n /** Animate the skeleton */\n animate?: boolean\n }>(),\n {\n variant: 'text',\n animate: true,\n lines: 1,\n },\n)\n\nconst variantClasses: Record<SkeletonVariant, string> = {\n text: 'h-4 rounded',\n circular: 'rounded-full',\n rectangular: '',\n rounded: 'rounded-lg',\n}\n</script>\n\n<template>\n <div\n v-if=\"variant === 'text' && lines > 1\"\n class=\"space-y-2\"\n aria-hidden=\"true\"\n >\n <div\n v-for=\"i in lines\"\n :key=\"i\"\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: i === lines ? '75%' : width || '100%',\n height: height,\n }\"\n />\n </div>\n <div\n v-else\n :class=\"[\n 'bg-gray-200 dark:bg-gray-700',\n variantClasses[variant],\n animate && 'animate-pulse',\n ]\"\n :style=\"{\n width: width || (variant === 'circular' ? '3rem' : '100%'),\n height: height || (variant === 'circular' ? '3rem' : variant === 'text' ? '1rem' : '6rem'),\n }\"\n aria-hidden=\"true\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport Modal from './Modal.vue'\nimport Button from '@/components/core/Button.vue'\n\nexport type ConfirmDialogVariant = 'info' | 'warning' | 'danger' | 'success'\n\nconst props = withDefaults(\n defineProps<{\n /** Whether the dialog is open */\n open?: boolean\n /** Dialog title */\n title?: string\n /** Dialog message */\n message?: string\n /** Confirm button text */\n confirmText?: string\n /** Cancel button text */\n cancelText?: string\n /** Dialog variant (affects icon and confirm button color) */\n variant?: ConfirmDialogVariant\n /** Show loading state on confirm button */\n loading?: boolean\n /** Icon to display */\n icon?: string\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\n teleport?: string | false\n }>(),\n {\n open: false,\n title: 'Confirm',\n message: 'Are you sure you want to proceed?',\n confirmText: 'Confirm',\n cancelText: 'Cancel',\n variant: 'info',\n loading: false,\n teleport: 'body',\n },\n)\n\nconst emit = defineEmits<{\n confirm: []\n cancel: []\n}>()\n\nconst variantConfig: Record<ConfirmDialogVariant, { icon: string; iconClass: string; buttonVariant: 'primary' | 'danger' | 'success' }> = {\n info: {\n icon: 'lucide:info',\n iconClass: 'text-blue-500',\n buttonVariant: 'primary',\n },\n warning: {\n icon: 'lucide:alert-triangle',\n iconClass: 'text-yellow-500',\n buttonVariant: 'primary',\n },\n danger: {\n icon: 'lucide:alert-circle',\n iconClass: 'text-red-500',\n buttonVariant: 'danger',\n },\n success: {\n icon: 'lucide:check-circle',\n iconClass: 'text-green-500',\n buttonVariant: 'success',\n },\n}\n\nconst config = variantConfig[props.variant]\n</script>\n\n<template>\n <Modal\n v-if=\"open\"\n size=\"sm\"\n :close-on-backdrop=\"!loading\"\n :close-on-escape=\"!loading\"\n :teleport=\"teleport\"\n @close=\"emit('cancel')\"\n >\n <div class=\"text-center\">\n <!-- Icon -->\n <div class=\"mx-auto mb-4 flex size-14 items-center justify-center rounded-full bg-gray-100 dark:bg-gray-800\">\n <Icon\n :icon=\"icon || config.icon\"\n :class=\"[config.iconClass, 'size-8']\"\n />\n </div>\n\n <!-- Title -->\n <h3 class=\"mb-2 text-lg font-semibold text-gray-900 dark:text-gray-100\">\n {{ title }}\n </h3>\n\n <!-- Message -->\n <p class=\"mb-6 text-gray-600 dark:text-gray-400\">\n <slot>{{ message }}</slot>\n </p>\n\n <!-- Actions -->\n <div class=\"flex justify-center gap-3\">\n <Button\n variant=\"outline\"\n :disabled=\"loading\"\n @click=\"emit('cancel')\"\n >\n {{ cancelText }}\n </Button>\n <Button\n :variant=\"config.buttonVariant\"\n :loading=\"loading\"\n @click=\"emit('confirm')\"\n >\n {{ confirmText }}\n </Button>\n </div>\n </div>\n </Modal>\n</template>\n"],"names":["_createElementBlock","_createElementVNode","_hoisted_2","_normalizeClass","_hoisted_3","_toDisplayString","_hoisted_4","_createBlock","_Teleport","_unref","$slots","_openBlock","_renderSlot","_createVNode","_hoisted_5","_hoisted_6","_hoisted_1","_Fragment","_renderList","_TransitionGroup","NotificationComponent","Toast","_normalizeStyle","Modal","Button"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } 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 }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\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// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\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-6' : '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\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=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span>\n </Transition>\n </component>\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":["computed","resolveComponent","_openBlock","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","Icon","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","useId","ref","useDropdown","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js","sources":["../src/components/core/MenuItem.vue","../src/components/core/Dropdown.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent } 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 }>(),\n {\n expanded: true,\n active: undefined,\n currentPath: undefined,\n },\n)\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// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (linkComponent.value === 'a') {\n return { href: props.menuItem.link }\n }\n return { to: props.menuItem.link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"expanded ? 'flex-row' : 'flex-col'\"\n class=\"group relative flex items-center justify-center gap-2 px-5\"\n >\n <div class=\"relative\">\n <Icon\n :class=\"[\n isRouteActive\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-6' : '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\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=\"text-sm font-semibold whitespace-nowrap\"\n >{{ menuItem.label }}</span>\n </Transition>\n </component>\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","_createBlock","_resolveDynamicComponent","_mergeProps","_createElementVNode","_hoisted_1","_createVNode","_unref","_normalizeClass","_createElementBlock","_hoisted_2","_Transition","_toDisplayString","_renderSlot","_Teleport","_Fragment","_renderList"],"mappings":";;;;;;;;;;;;;;;;;;AAKA,UAAM,QAAQ;AAiBd,UAAM,gBAAgB,SAAS,MAAM;AAEnC,UAAI,MAAM,WAAW,QAAW;AAC9B,eAAO,MAAM;AAAA,MACf;AAGA,YAAM,OAAO,MAAM,gBAAgB,OAAO,WAAW,cAAc,OAAO,SAAS,WAAW;AAE9F,UAAI,MAAM,SAAS,SAAS,KAAK;AAC/B,eAAO,SAAS;AAAA,MAClB;AACA,aAAO,SAAS,MAAM,SAAS,QAAQ,KAAK,WAAW,MAAM,SAAS,OAAO,GAAG;AAAA,IAClF,CAAC;AAGD,UAAM,gBAAgB,SAAS,MAAM;AACnC,UAAI;AACF,cAAM,aAAa,iBAAiB,YAAY;AAChD,YAAI,OAAO,eAAe,UAAU;AAClC,iBAAO;AAAA,QACT;AAAA,MACF,QAAQ;AAAA,MAER;AACA,aAAO;AAAA,IACT,CAAC;AAED,UAAM,YAAY,SAAS,MAAM;AAC/B,UAAI,cAAc,UAAU,KAAK;AAC/B,eAAO,EAAE,MAAM,MAAM,SAAS,KAAA;AAAA,MAChC;AACA,aAAO,EAAE,IAAI,MAAM,SAAS,KAAA;AAAA,IAC9B,CAAC;;AAIC,aAAAA,UAAA,GAAAC,YA0CYC,wBAzCL,cAAA,KAAa,GADpBC,WAEU,UAwCE,OAxCO;AAAA,QAChB,OAAK,CAAE,QAAA,WAAQ,aAAA,YACV,4DAA4D;AAAA,MAAA;yBAElE,MAgBM;AAAA,UAhBNC,mBAgBM,OAhBNC,cAgBM;AAAA,YAfJC,YASEC,MAAA,IAAA,GAAA;AAAA,cARC,OAAKC,eAAA,CAAA;AAAA,gBAAc,cAAA;gBAA8J,QAAA,WAAQ,WAAA;AAAA,cAAA,GAMpL,6BAA6B,CAAA;AAAA,cAClC,MAAM,QAAA,SAAS;AAAA,YAAA;YAIV,QAAA,SAAS,gBADjBR,aAAAS,mBAGE,QAHFC,YAGE;;UAGJJ,YAiBaK,YAAA;AAAA,YAhBX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;6BAEf,MAQ4B;AAAA,cAPpB,QAAA,yBADRF,mBAQ4B,QAAA;AAAA;gBANzB,OAAKD,eAAA;AAAA,kBAAa,cAAA;kBAKb;AAAA,gBAAA,CAAyC;AAAA,cAAA,GAC7CI,gBAAA,QAAA,SAAS,KAAK,GAAA,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpFxB,UAAM,QAAQ;AAsBd,UAAM,EAAE,YAAY,MAAM,EAAE,QAAQ,YAAY,IAAI,MAAM,IAAI;AAC9D,UAAM,YAAY,SAAS,MAAM,QAAQ,SAAS,CAAC;AACnD,UAAM,SAAS,SAAS,MAAM,QAAQ,MAAM,CAAC;AAE7C,UAAM,OAAO;AAIb,UAAM,aAAa,IAAA;AACnB,UAAM,UAAU,IAAA;AAEhB,UAAM,EAAE,QAAQ,eAAe,QAAQ,UAAU,YAAY,YAAY,SAAS;AAAA,MAChF,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,IAAA,CACd;AAED,UAAM,aAAa,CAAC,SAAuB;AACzC,UAAI,KAAK,YAAY,KAAK,QAAS;AACnC,WAAK,UAAU,IAAI;AACnB,YAAA;AAAA,IACF;AAEA,UAAM,eAAe;AAAA,MACnB,MAAM;AAAA,MACN,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,IAAI;AAAA,MACJ,IAAI;AAAA,IAAA;AAGN,UAAM,wBAAwB,SAAS,MAAM;AAC3C,UAAI,CAAC,MAAM,SAAU,QAAO,CAAA;AAC5B,YAAM,EAAE,OAAO,GAAG,GAAG,KAAA,IAAS,cAAc;AAC5C,aAAO;AAAA,IACT,CAAC;;AAIC,aAAAZ,UAAA,GAAAS,mBA2FM,OA3FN,YA2FM;AAAA,QA1FJL,mBAuBM,OAAA;AAAA,mBAtBA;AAAA,UAAJ,KAAI;AAAA,UACH,SAAK,OAAA,CAAA,MAAA,OAAA,CAAA;AAAA,uBAAEG,MAAA,MAAA,KAAAA,MAAA,MAAA,EAAA,GAAA,IAAA;AAAA,QAAA;UAERM,WAkBO,4BAlBP,MAkBO;AAAA,YAjBLT,mBAgBS,UAAA;AAAA,cAfN,IAAI,UAAA;AAAA,cACL,MAAK;AAAA,cACJ,iBAAeG,MAAA,MAAA;AAAA,cAChB,iBAAc;AAAA,cACb,iBAAe,OAAA;AAAA,cAChB,OAAM;AAAA,YAAA;cAENM,WAEO,kCAFP,MAEO;AAAA,0DAFoB,aAE3B,EAAA;AAAA,cAAA;cACAP,YAIEC,MAAA,IAAA,GAAA;AAAA,gBAHA,MAAK;AAAA,gBACJ,sDAAuCA,MAAA,MAAA,KAAM,YAAA,CAAA;AAAA,gBAC9C,eAAY;AAAA,cAAA;;;;sBAMpBN,YAgEWa,UAAA;AAAA,UA/DT,IAAG;AAAA,UACF,WAAW,QAAA;AAAA,QAAA;UAEZR,YA2DaK,YAAA;AAAA,YA1DX,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,YACf,sBAAmB;AAAA,YACnB,oBAAiB;AAAA,YACjB,kBAAe;AAAA,UAAA;6BAEf,MAkDM;AAAA,cAjDEJ,MAAA,MAAA,kBADRE,mBAkDM,OAAA;AAAA;gBAhDH,IAAI,OAAA;AAAA,yBACD;AAAA,gBAAJ,KAAI;AAAA,gBACJ,MAAK;AAAA,gBACJ,mBAAiB,UAAA;AAAA,gBACjB,sBAAO,sBAAA,KAAqB;AAAA,gBAC5B,OAAKD,eAAA;AAAA;kBAAsI,aAAa,QAAA,KAAK;AAAA,kBAAgB,CAAA,QAAA,aAAa,QAAA,UAAK,UAAA,0BAAA;AAAA,gBAAA;;gBAOhMK,WAmCO,KAAA,QAAA,WAAA,EAnCA,OAAON,MAAA,KAAA,EAAA,GAAd,MAmCO;AAAA,oCAjCLE,mBAgCWM,UAAA,MAAAC,WA/BM,QAAA,OAAK,CAAb,SAAI;;sBACL,KAAA,KAAK;AAAA,oBAAA;sBAGH,KAAK,WADbhB,UAAA,GAAAS,mBAIE,OAJF,UAIE,mBACFA,mBAsBS,UAAA;AAAA;wBApBP,MAAK;AAAA,wBACL,MAAK;AAAA,wBACJ,UAAU,KAAK;AAAA,wBACf,OAAKD,eAAA;AAAA;0BAAwH,KAAK,6CAAqF,KAAK;;wBAQ5N,SAAK,CAAA,WAAE,WAAW,IAAI;AAAA,sBAAA;wBAGf,KAAK,qBADbP,YAKEM,MAAA,IAAA,GAAA;AAAA;0BAHC,MAAM,KAAK;AAAA,0BACZ,OAAM;AAAA,0BACN,eAAY;AAAA,wBAAA;wCACZ,MACFK,gBAAG,KAAK,KAAK,GAAA,CAAA;AAAA,sBAAA;;;;;;;;;;;;;"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageHero.vue_vue_type_script_setup_true_lang-BYx595-2.js","sources":["../src/components/layout/AuthLayout.vue","../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue","../src/components/layout/PageHero.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\n\n/**\n * Feature item for the branding panel\n */\nexport interface AuthFeature {\n /** Iconify icon name */\n icon: string\n /** Feature text */\n text: string\n}\n\nconst props = withDefaults(defineProps<{\n /** App/brand name (used in default logo slots) */\n appName?: string\n /** App icon - Iconify icon name (used in default logo slots) */\n appIcon?: string\n /** Headline text (first line) */\n headline?: string\n /** Sub-headline text (second line, with optional underline) */\n subHeadline?: string\n /** Description paragraph below headlines */\n description?: string\n /** List of features to display in branding panel */\n features?: AuthFeature[]\n /** Primary gradient from color (Tailwind class) */\n gradientFrom?: string\n /** Primary gradient via color (Tailwind class, optional) */\n gradientVia?: string\n /** Primary gradient to color (Tailwind class) */\n gradientTo?: string\n /** Show decorative floating shapes and blurs */\n showDecorations?: boolean\n /** Show dot pattern overlay on branding panel */\n showPattern?: boolean\n /** Underline accent color for sub-headline (CSS color value) */\n underlineColor?: string\n /** Form panel title */\n formTitle?: string\n /** Form panel subtitle */\n formSubtitle?: string\n /** Home link URL (used for mobile logo link) */\n homeLink?: string\n /** CSS animation class for branding content entry */\n brandingAnimation?: string\n /** CSS animation class for form panel entry */\n formAnimation?: string\n}>(), {\n appName: '',\n appIcon: 'lucide:box',\n headline: '',\n subHeadline: '',\n description: '',\n features: () => [],\n gradientFrom: 'from-primary-700',\n gradientVia: '',\n gradientTo: 'to-primary-800',\n showDecorations: true,\n showPattern: true,\n underlineColor: 'rgba(165, 180, 252, 0.5)',\n formTitle: '',\n formSubtitle: '',\n homeLink: '/',\n brandingAnimation: '',\n formAnimation: '',\n})\n\nconst slots = useSlots()\n\n// Check if branding panel has any content\nconst hasBrandingContent = computed(() => {\n return props.headline ||\n props.subHeadline ||\n props.description ||\n props.features.length > 0 ||\n slots['branding-logo'] ||\n slots['branding-headline'] ||\n slots['branding-content'] ||\n props.appName\n})\n\n// Try to resolve RouterLink (works with Vue Router)\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst gradientClasses = computed(() => {\n const classes = [props.gradientFrom, props.gradientTo]\n if (props.gradientVia) {\n classes.splice(1, 0, props.gradientVia)\n }\n return classes.filter(Boolean)\n})\n</script>\n\n<template>\n <div class=\"flex min-h-screen\">\n <!-- Left Panel - Branding (hidden on mobile) -->\n <div\n v-if=\"hasBrandingContent || $slots['branding-panel']\"\n :class=\"[\n 'hidden lg:flex lg:w-1/2 relative overflow-hidden bg-gradient-to-br',\n ...gradientClasses,\n ]\"\n >\n <!-- Allow complete customization of branding panel -->\n <slot name=\"branding-panel\">\n <!-- Decorative floating blurs -->\n <div\n v-if=\"showDecorations\"\n class=\"absolute inset-0 overflow-hidden pointer-events-none\"\n >\n <div class=\"absolute -top-20 -left-20 size-80 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute top-1/3 right-10 size-60 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute bottom-20 left-1/4 size-72 bg-white/5 rounded-full blur-3xl\" />\n </div>\n\n <!-- Dot pattern -->\n <div\n v-if=\"showPattern\"\n class=\"absolute inset-0 opacity-20 pointer-events-none\"\n style=\"background-image: radial-gradient(circle, rgba(255,255,255,0.4) 1px, transparent 1px); background-size: 24px 24px;\"\n />\n\n <!-- Floating decorative shapes -->\n <template v-if=\"showDecorations\">\n <div class=\"absolute top-20 right-20 size-16 border-2 border-white/20 rounded-2xl rotate-12 pointer-events-none\" />\n <div class=\"absolute bottom-32 left-16 size-12 border-2 border-white/20 rounded-full pointer-events-none\" />\n <div class=\"absolute top-1/2 left-10 size-8 bg-white/10 rounded-lg rotate-45 pointer-events-none\" />\n </template>\n\n <!-- Content -->\n <div class=\"relative z-10 flex flex-col justify-center px-16 py-12 text-white w-full\">\n <div :class=\"brandingAnimation\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3 mb-12\">\n <slot name=\"branding-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-14 bg-white/20 backdrop-blur-sm rounded-2xl flex items-center justify-center\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-8 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-3xl font-bold\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </div>\n\n <!-- Headlines -->\n <slot name=\"branding-headline\">\n <h1\n v-if=\"headline || subHeadline\"\n class=\"text-4xl xl:text-5xl font-bold leading-tight mb-6\"\n >\n <template v-if=\"headline\">\n {{ headline }}<br>\n </template>\n <span\n v-if=\"subHeadline\"\n class=\"relative inline-block\"\n >\n <span class=\"relative z-10\">{{ subHeadline }}</span>\n <svg\n class=\"absolute -bottom-2 left-0 w-full\"\n viewBox=\"0 0 280 12\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M2 10C45 4 90 2 140 6C190 10 235 4 278 8\"\n :stroke=\"underlineColor\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n </h1>\n </slot>\n\n <!-- Description -->\n <p\n v-if=\"description\"\n class=\"text-lg text-white/80 max-w-md mb-10\"\n >\n {{ description }}\n </p>\n\n <!-- Features list -->\n <slot name=\"branding-features\">\n <div\n v-if=\"features.length > 0\"\n class=\"space-y-4\"\n >\n <div\n v-for=\"(feature, index) in features\"\n :key=\"index\"\n class=\"flex items-center gap-3 text-white/90\"\n >\n <div class=\"size-10 rounded-xl bg-white/10 backdrop-blur-sm flex items-center justify-center shrink-0\">\n <Icon\n :icon=\"feature.icon\"\n class=\"size-5\"\n />\n </div>\n <span>{{ feature.text }}</span>\n </div>\n </div>\n </slot>\n\n <!-- Additional branding content -->\n <slot name=\"branding-content\" />\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Right Panel - Form -->\n <div class=\"flex-1 flex items-center justify-center p-6 sm:p-12 bg-gradient-to-br from-gray-50 to-gray-100 dark:from-slate-900 dark:to-slate-800\">\n <div\n :class=\"['w-full max-w-md', formAnimation]\"\n >\n <!-- Mobile Logo -->\n <div class=\"lg:hidden text-center mb-8\">\n <component\n :is=\"routerLinkComponent\"\n v-bind=\"getLinkProps(homeLink)\"\n class=\"inline-flex items-center gap-3\"\n >\n <slot name=\"mobile-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-12 bg-primary-600 rounded-xl flex items-center justify-center shadow-lg shadow-primary-200 dark:shadow-primary-900/30\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-6 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-2xl font-bold text-gray-900 dark:text-white\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </component>\n </div>\n\n <!-- Form Header (title/subtitle) -->\n <slot name=\"form-header\">\n <div\n v-if=\"formTitle || formSubtitle\"\n class=\"text-center lg:text-left mb-8\"\n >\n <h2\n v-if=\"formTitle\"\n class=\"text-2xl sm:text-3xl font-bold text-gray-900 dark:text-white mb-2\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formSubtitle\"\n class=\"text-gray-600 dark:text-gray-400\"\n >\n {{ formSubtitle }}\n </p>\n </div>\n </slot>\n\n <!-- Form Card -->\n <div class=\"bg-white dark:bg-slate-800/80 rounded-3xl shadow-xl shadow-gray-200/50 dark:shadow-none p-8\">\n <slot />\n </div>\n\n <!-- Form Footer -->\n <slot name=\"form-footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nexport type MenuPosition = 'top' | 'center' | 'bottom'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n /** Menu vertical position in sidebar: 'top', 'center', or 'bottom' */\n menuPosition?: MenuPosition\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n menuPosition: 'top',\n },\n)\n\nconst menuPositionClass = computed(() => {\n switch (props.menuPosition) {\n case 'center':\n return 'lg:justify-center'\n case 'bottom':\n return 'lg:justify-end'\n case 'top':\n default:\n return 'lg:justify-start'\n }\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh overflow-hidden bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n />\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : 'max-lg:-translate-x-76 lg:w-16',\n sidebarClass,\n ]\"\n class=\"@container max-lg:absolute max-lg:z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon\n class=\"size-5 text-white\"\n :icon=\"appIcon\"\n />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-white\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"[sidebarOpenModel ? 'items-start' : 'items-center', menuPositionClass]\"\n class=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto overflow-x-hidden px-2\"\n >\n <slot\n name=\"menu\"\n :current-path=\"currentPath\"\n >\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col min-w-0\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown\n v-if=\"userName || userAvatar\"\n align=\"right\"\n >\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon\n icon=\"lucide:chevron-down\"\n class=\"size-4 text-gray-500\"\n />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full\">\n <slot>\n <component\n :is=\"routerViewComponent\"\n v-if=\"routerViewComponent\"\n />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface PageBreadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: PageBreadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n aria-label=\"Breadcrumb\"\n >\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot\n name=\"breadcrumb\"\n :breadcrumb=\"breadcrumb\"\n :index=\"index\"\n :is-last=\"index === breadcrumbs.length - 1\"\n >\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 truncate\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2 flex-wrap shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface PageHeroStat {\n label: string\n value: string | number\n icon?: string\n}\n\nexport type PageHeroColorScheme = 'primary' | 'cyan' | 'violet' | 'emerald' | 'rose' | 'amber' | 'blue' | 'teal'\n\nconst props = withDefaults(\n defineProps<{\n /** Main title */\n title: string\n /** Subtitle/description */\n subtitle?: string\n /** Badge text (shown above title) */\n badge?: string\n /** Badge icon */\n badgeIcon?: string\n /** Show animated background blobs */\n showBlobs?: boolean\n /** Show wave decoration at bottom */\n showWave?: boolean\n /** Stats to display in grid */\n stats?: PageHeroStat[]\n /** Gradient direction: 'br' (bottom-right), 'r' (right), 'b' (bottom) */\n gradientDirection?: 'br' | 'r' | 'b'\n /** Decorative icons (shown faded in background) */\n decorativeIcons?: string[]\n /** Color scheme for gradient and accents */\n colorScheme?: PageHeroColorScheme\n }>(),\n {\n showBlobs: true,\n showWave: true,\n gradientDirection: 'br',\n colorScheme: 'primary',\n }\n)\n\n// Color scheme mappings\nconst colorClasses = computed(() => {\n const schemes: Record<PageHeroColorScheme, { gradient: string; subtitle: string }> = {\n primary: {\n gradient: 'from-primary-600 via-primary-500 to-primary-400',\n subtitle: 'text-primary-100',\n },\n cyan: {\n gradient: 'from-cyan-600 via-cyan-500 to-teal-500',\n subtitle: 'text-cyan-100',\n },\n violet: {\n gradient: 'from-violet-600 via-violet-500 to-purple-500',\n subtitle: 'text-violet-100',\n },\n emerald: {\n gradient: 'from-emerald-600 via-emerald-500 to-teal-500',\n subtitle: 'text-emerald-100',\n },\n rose: {\n gradient: 'from-rose-600 via-rose-500 to-pink-500',\n subtitle: 'text-rose-100',\n },\n amber: {\n gradient: 'from-amber-600 via-amber-500 to-orange-500',\n subtitle: 'text-amber-100',\n },\n blue: {\n gradient: 'from-blue-600 via-blue-500 to-indigo-500',\n subtitle: 'text-blue-100',\n },\n teal: {\n gradient: 'from-teal-600 via-teal-500 to-cyan-500',\n subtitle: 'text-teal-100',\n },\n }\n return schemes[props.colorScheme]\n})\n</script>\n\n<template>\n <div class=\"relative overflow-hidden bg-linear-to-br\" :class=\"colorClasses.gradient\">\n <!-- Animated background blobs -->\n <div v-if=\"showBlobs\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div\n class=\"absolute -top-20 -right-20 w-72 h-72 bg-white/10 rounded-full blur-3xl animate-float\"\n />\n <div\n class=\"absolute -bottom-32 -left-32 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-float [animation-delay:1s]\"\n />\n </div>\n\n <!-- Decorative icons -->\n <div v-if=\"decorativeIcons?.length\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <Icon\n v-if=\"decorativeIcons[0]\"\n :icon=\"decorativeIcons[0]\"\n class=\"absolute top-12 right-8 w-24 h-24 text-white/5 rotate-12\"\n />\n <Icon\n v-if=\"decorativeIcons[1]\"\n :icon=\"decorativeIcons[1]\"\n class=\"absolute bottom-8 left-12 w-20 h-20 text-white/5 -rotate-12\"\n />\n </div>\n\n <!-- Custom background slot -->\n <slot name=\"background\" />\n\n <div class=\"relative px-4 pt-8 pb-10 sm:px-6 lg:px-8 max-w-5xl mx-auto\">\n <!-- Header content -->\n <div class=\"text-center mb-8 animate-fade-in-up\">\n <!-- Badge -->\n <div\n v-if=\"badge || badgeIcon || $slots.badge\"\n class=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/15 backdrop-blur-sm border border-white/20 mb-4\"\n >\n <slot name=\"badge\">\n <Icon v-if=\"badgeIcon\" :icon=\"badgeIcon\" class=\"w-5 h-5 text-white\" />\n <span v-if=\"badge\" class=\"text-sm font-medium text-white\">{{ badge }}</span>\n </slot>\n </div>\n\n <!-- Title -->\n <h1 class=\"text-2xl sm:text-3xl font-bold text-white mb-2\">\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <!-- Subtitle -->\n <p v-if=\"subtitle || $slots.subtitle\" class=\"text-sm sm:text-base\" :class=\"colorClasses.subtitle\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </p>\n </div>\n\n <!-- Stats Grid -->\n <div\n v-if=\"stats?.length || $slots.stats\"\n class=\"animate-fade-in-up [animation-delay:0.1s]\"\n >\n <slot name=\"stats\">\n <div\n class=\"grid gap-3 sm:gap-4\"\n :class=\"[\n stats?.length === 2 ? 'grid-cols-2' : '',\n stats?.length === 3 ? 'grid-cols-3' : '',\n stats?.length === 4 ? 'grid-cols-2 sm:grid-cols-4' : '',\n stats && stats.length > 4 ? 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4' : '',\n ]\"\n >\n <div\n v-for=\"(stat, index) in stats\"\n :key=\"index\"\n class=\"bg-white/15 backdrop-blur-sm rounded-2xl p-4 border border-white/20 text-center\"\n >\n <div\n v-if=\"stat.icon\"\n class=\"w-10 h-10 mx-auto mb-2 rounded-xl bg-white/20 flex items-center justify-center\"\n >\n <Icon :icon=\"stat.icon\" class=\"w-5 h-5 text-white\" />\n </div>\n <div class=\"text-2xl sm:text-3xl font-bold text-white\">{{ stat.value }}</div>\n <div class=\"text-xs sm:text-sm\" :class=\"colorClasses.subtitle\">{{ stat.label }}</div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Additional content -->\n <slot name=\"content\" />\n </div>\n\n <!-- Wave decoration -->\n <div v-if=\"showWave\" class=\"absolute bottom-0 left-0 right-0\">\n <svg\n viewBox=\"0 0 1440 80\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-full h-auto\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M0 80L60 74.7C120 69 240 59 360 53.3C480 48 600 48 720 53.3C840 59 960 69 1080 69.3C1200 69 1320 59 1380 53.3L1440 48V80H1380C1320 80 1200 80 1080 80C960 80 840 80 720 80C600 80 480 80 360 80C240 80 120 80 60 80H0Z\"\n class=\"fill-gray-50 dark:fill-slate-900\"\n />\n </svg>\n </div>\n </div>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","$slots","_normalizeClass","_renderSlot","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_hoisted_4","_hoisted_5","_hoisted_6","_createVNode","_unref","_hoisted_7","_toDisplayString","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_renderList","_hoisted_15","_createBlock","_resolveDynamicComponent","_mergeProps","MenuItem","Dropdown","_withCtx","_createTextVNode","_a","_b"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"PageHero.vue_vue_type_script_setup_true_lang-CZ-TibKk.cjs","sources":["../src/components/layout/AuthLayout.vue","../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue","../src/components/layout/PageHero.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { computed, resolveComponent, useSlots } from 'vue'\nimport { Icon } from '@iconify/vue'\n\n/**\n * Feature item for the branding panel\n */\nexport interface AuthFeature {\n /** Iconify icon name */\n icon: string\n /** Feature text */\n text: string\n}\n\nconst props = withDefaults(defineProps<{\n /** App/brand name (used in default logo slots) */\n appName?: string\n /** App icon - Iconify icon name (used in default logo slots) */\n appIcon?: string\n /** Headline text (first line) */\n headline?: string\n /** Sub-headline text (second line, with optional underline) */\n subHeadline?: string\n /** Description paragraph below headlines */\n description?: string\n /** List of features to display in branding panel */\n features?: AuthFeature[]\n /** Primary gradient from color (Tailwind class) */\n gradientFrom?: string\n /** Primary gradient via color (Tailwind class, optional) */\n gradientVia?: string\n /** Primary gradient to color (Tailwind class) */\n gradientTo?: string\n /** Show decorative floating shapes and blurs */\n showDecorations?: boolean\n /** Show dot pattern overlay on branding panel */\n showPattern?: boolean\n /** Underline accent color for sub-headline (CSS color value) */\n underlineColor?: string\n /** Form panel title */\n formTitle?: string\n /** Form panel subtitle */\n formSubtitle?: string\n /** Home link URL (used for mobile logo link) */\n homeLink?: string\n /** CSS animation class for branding content entry */\n brandingAnimation?: string\n /** CSS animation class for form panel entry */\n formAnimation?: string\n}>(), {\n appName: '',\n appIcon: 'lucide:box',\n headline: '',\n subHeadline: '',\n description: '',\n features: () => [],\n gradientFrom: 'from-primary-700',\n gradientVia: '',\n gradientTo: 'to-primary-800',\n showDecorations: true,\n showPattern: true,\n underlineColor: 'rgba(165, 180, 252, 0.5)',\n formTitle: '',\n formSubtitle: '',\n homeLink: '/',\n brandingAnimation: '',\n formAnimation: '',\n})\n\nconst slots = useSlots()\n\n// Check if branding panel has any content\nconst hasBrandingContent = computed(() => {\n return props.headline ||\n props.subHeadline ||\n props.description ||\n props.features.length > 0 ||\n slots['branding-logo'] ||\n slots['branding-headline'] ||\n slots['branding-content'] ||\n props.appName\n})\n\n// Try to resolve RouterLink (works with Vue Router)\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst gradientClasses = computed(() => {\n const classes = [props.gradientFrom, props.gradientTo]\n if (props.gradientVia) {\n classes.splice(1, 0, props.gradientVia)\n }\n return classes.filter(Boolean)\n})\n</script>\n\n<template>\n <div class=\"flex min-h-screen\">\n <!-- Left Panel - Branding (hidden on mobile) -->\n <div\n v-if=\"hasBrandingContent || $slots['branding-panel']\"\n :class=\"[\n 'hidden lg:flex lg:w-1/2 relative overflow-hidden bg-gradient-to-br',\n ...gradientClasses,\n ]\"\n >\n <!-- Allow complete customization of branding panel -->\n <slot name=\"branding-panel\">\n <!-- Decorative floating blurs -->\n <div\n v-if=\"showDecorations\"\n class=\"absolute inset-0 overflow-hidden pointer-events-none\"\n >\n <div class=\"absolute -top-20 -left-20 size-80 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute top-1/3 right-10 size-60 bg-white/5 rounded-full blur-3xl\" />\n <div class=\"absolute bottom-20 left-1/4 size-72 bg-white/5 rounded-full blur-3xl\" />\n </div>\n\n <!-- Dot pattern -->\n <div\n v-if=\"showPattern\"\n class=\"absolute inset-0 opacity-20 pointer-events-none\"\n style=\"background-image: radial-gradient(circle, rgba(255,255,255,0.4) 1px, transparent 1px); background-size: 24px 24px;\"\n />\n\n <!-- Floating decorative shapes -->\n <template v-if=\"showDecorations\">\n <div class=\"absolute top-20 right-20 size-16 border-2 border-white/20 rounded-2xl rotate-12 pointer-events-none\" />\n <div class=\"absolute bottom-32 left-16 size-12 border-2 border-white/20 rounded-full pointer-events-none\" />\n <div class=\"absolute top-1/2 left-10 size-8 bg-white/10 rounded-lg rotate-45 pointer-events-none\" />\n </template>\n\n <!-- Content -->\n <div class=\"relative z-10 flex flex-col justify-center px-16 py-12 text-white w-full\">\n <div :class=\"brandingAnimation\">\n <!-- Logo -->\n <div class=\"flex items-center gap-3 mb-12\">\n <slot name=\"branding-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-14 bg-white/20 backdrop-blur-sm rounded-2xl flex items-center justify-center\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-8 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-3xl font-bold\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </div>\n\n <!-- Headlines -->\n <slot name=\"branding-headline\">\n <h1\n v-if=\"headline || subHeadline\"\n class=\"text-4xl xl:text-5xl font-bold leading-tight mb-6\"\n >\n <template v-if=\"headline\">\n {{ headline }}<br>\n </template>\n <span\n v-if=\"subHeadline\"\n class=\"relative inline-block\"\n >\n <span class=\"relative z-10\">{{ subHeadline }}</span>\n <svg\n class=\"absolute -bottom-2 left-0 w-full\"\n viewBox=\"0 0 280 12\"\n fill=\"none\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M2 10C45 4 90 2 140 6C190 10 235 4 278 8\"\n :stroke=\"underlineColor\"\n stroke-width=\"4\"\n stroke-linecap=\"round\"\n />\n </svg>\n </span>\n </h1>\n </slot>\n\n <!-- Description -->\n <p\n v-if=\"description\"\n class=\"text-lg text-white/80 max-w-md mb-10\"\n >\n {{ description }}\n </p>\n\n <!-- Features list -->\n <slot name=\"branding-features\">\n <div\n v-if=\"features.length > 0\"\n class=\"space-y-4\"\n >\n <div\n v-for=\"(feature, index) in features\"\n :key=\"index\"\n class=\"flex items-center gap-3 text-white/90\"\n >\n <div class=\"size-10 rounded-xl bg-white/10 backdrop-blur-sm flex items-center justify-center shrink-0\">\n <Icon\n :icon=\"feature.icon\"\n class=\"size-5\"\n />\n </div>\n <span>{{ feature.text }}</span>\n </div>\n </div>\n </slot>\n\n <!-- Additional branding content -->\n <slot name=\"branding-content\" />\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Right Panel - Form -->\n <div class=\"flex-1 flex items-center justify-center p-6 sm:p-12 bg-gradient-to-br from-gray-50 to-gray-100 dark:from-slate-900 dark:to-slate-800\">\n <div\n :class=\"['w-full max-w-md', formAnimation]\"\n >\n <!-- Mobile Logo -->\n <div class=\"lg:hidden text-center mb-8\">\n <component\n :is=\"routerLinkComponent\"\n v-bind=\"getLinkProps(homeLink)\"\n class=\"inline-flex items-center gap-3\"\n >\n <slot name=\"mobile-logo\">\n <template v-if=\"appName || appIcon\">\n <div class=\"size-12 bg-primary-600 rounded-xl flex items-center justify-center shadow-lg shadow-primary-200 dark:shadow-primary-900/30\">\n <Icon\n :icon=\"appIcon\"\n class=\"size-6 text-white\"\n />\n </div>\n <span\n v-if=\"appName\"\n class=\"text-2xl font-bold text-gray-900 dark:text-white\"\n >\n {{ appName }}\n </span>\n </template>\n </slot>\n </component>\n </div>\n\n <!-- Form Header (title/subtitle) -->\n <slot name=\"form-header\">\n <div\n v-if=\"formTitle || formSubtitle\"\n class=\"text-center lg:text-left mb-8\"\n >\n <h2\n v-if=\"formTitle\"\n class=\"text-2xl sm:text-3xl font-bold text-gray-900 dark:text-white mb-2\"\n >\n {{ formTitle }}\n </h2>\n <p\n v-if=\"formSubtitle\"\n class=\"text-gray-600 dark:text-gray-400\"\n >\n {{ formSubtitle }}\n </p>\n </div>\n </slot>\n\n <!-- Form Card -->\n <div class=\"bg-white dark:bg-slate-800/80 rounded-3xl shadow-xl shadow-gray-200/50 dark:shadow-none p-8\">\n <slot />\n </div>\n\n <!-- Form Footer -->\n <slot name=\"form-footer\" />\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nexport type MenuPosition = 'top' | 'center' | 'bottom'\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n /** Menu vertical position in sidebar: 'top', 'center', or 'bottom' */\n menuPosition?: MenuPosition\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n menuPosition: 'top',\n },\n)\n\nconst menuPositionClass = computed(() => {\n switch (props.menuPosition) {\n case 'center':\n return 'lg:justify-center'\n case 'bottom':\n return 'lg:justify-end'\n case 'top':\n default:\n return 'lg:justify-start'\n }\n})\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh overflow-hidden bg-gray-100 dark:bg-slate-900\">\n <!-- Backdrop for mobile -->\n <div\n v-if=\"sidebarOpenModel\"\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\n @click=\"sidebarOpenModel = false\"\n />\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n sidebarOpenModel ? 'lg:w-60' : 'max-lg:-translate-x-76 lg:w-16',\n sidebarClass,\n ]\"\n class=\"@container max-lg:absolute max-lg:z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon\n class=\"size-5 text-white\"\n :icon=\"appIcon\"\n />\n </div>\n <span\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\n >\n {{ appName }}\n </span>\n </slot>\n </div>\n\n <button\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-white\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <!-- Menu Items -->\n <div\n :class=\"[sidebarOpenModel ? 'items-start' : 'items-center', menuPositionClass]\"\n class=\"flex min-h-0 flex-1 flex-col gap-8 overflow-y-auto overflow-x-hidden px-2\"\n >\n <slot\n name=\"menu\"\n :current-path=\"currentPath\"\n >\n <MenuItem\n v-for=\"(item, index) in menuItems\"\n :key=\"index\"\n :menu-item=\"item\"\n :expanded=\"sidebarOpenModel\"\n :current-path=\"currentPath\"\n />\n </slot>\n </div>\n\n <!-- Sidebar Footer -->\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\n <slot name=\"sidebar-footer\" />\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex flex-1 flex-col min-w-0\">\n <!-- Header -->\n <header\n class=\"flex h-16 items-center justify-between border-b border-slate-200 bg-white px-4 dark:border-slate-800 dark:bg-slate-950\"\n >\n <div>\n <button\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleSidebar\"\n >\n <Icon\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\n icon=\"lucide:menu\"\n />\n </button>\n </div>\n\n <div class=\"flex-1\">\n <slot name=\"header-center\" />\n </div>\n\n <div class=\"flex items-center gap-3\">\n <slot name=\"header-actions\" />\n\n <button\n v-if=\"showDarkToggle\"\n class=\"flex items-center justify-center rounded-lg bg-gray-100 p-2 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\n @click=\"toggleDark\"\n >\n <Icon\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\n class=\"size-5 text-gray-900 dark:text-gray-100\"\n />\n </button>\n\n <!-- User Menu -->\n <Dropdown\n v-if=\"userName || userAvatar\"\n align=\"right\"\n >\n <template #trigger>\n <button\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\n >\n <div\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\n >\n {{ userAvatar || '?' }}\n </div>\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\n {{ userName }}\n </span>\n <Icon\n icon=\"lucide:chevron-down\"\n class=\"size-4 text-gray-500\"\n />\n </button>\n </template>\n\n <template #default=\"{ close }\">\n <div class=\"min-w-48 py-1\">\n <component\n :is=\"item.link ? routerLinkComponent : 'button'\"\n v-for=\"item in userMenuItems\"\n :key=\"item.label\"\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800\"\n @click=\"handleUserMenuClick(item); close()\"\n >\n <Icon\n v-if=\"item.icon\"\n :icon=\"item.icon\"\n class=\"size-4\"\n />\n {{ item.label }}\n </component>\n </div>\n </template>\n </Dropdown>\n </div>\n </header>\n\n <!-- Page Content -->\n <div class=\"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\">\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full\">\n <slot>\n <component\n :is=\"routerViewComponent\"\n v-if=\"routerViewComponent\"\n />\n </slot>\n </main>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\n\nexport interface PageBreadcrumb {\n label: string\n link: string\n}\n\ndefineProps<{\n /** Page title */\n title?: string\n /** Page description */\n description?: string\n /** Breadcrumb navigation items */\n breadcrumbs?: PageBreadcrumb[]\n}>()\n\n// Try to resolve RouterLink\nconst linkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n</script>\n\n<template>\n <div class=\"flex flex-col gap-4\">\n <!-- Breadcrumbs -->\n <nav\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\n aria-label=\"Breadcrumb\"\n >\n <ol class=\"flex items-center\">\n <li\n v-for=\"(breadcrumb, index) in breadcrumbs\"\n :key=\"index\"\n class=\"flex items-center\"\n >\n <span\n v-if=\"index > 0\"\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\n >\n /\n </span>\n\n <slot\n name=\"breadcrumb\"\n :breadcrumb=\"breadcrumb\"\n :index=\"index\"\n :is-last=\"index === breadcrumbs.length - 1\"\n >\n <component\n :is=\"linkComponent\"\n v-bind=\"getLinkProps(breadcrumb.link)\"\n :class=\"[\n 'text-sm transition-colors',\n index < breadcrumbs.length - 1\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\n : 'text-gray-400 dark:text-gray-600',\n ]\"\n >\n {{ breadcrumb.label }}\n </component>\n </slot>\n </li>\n </ol>\n </nav>\n\n <!-- Page Header -->\n <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\n <h1\n v-if=\"title\"\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 truncate\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </h1>\n\n <p\n v-if=\"description\"\n class=\"text-sm text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </p>\n </div>\n\n <div class=\"flex items-center gap-2 flex-wrap shrink-0\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <!-- Page Content -->\n <div class=\"flex-1\">\n <slot />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport interface PageHeroStat {\n label: string\n value: string | number\n icon?: string\n}\n\nexport type PageHeroColorScheme = 'primary' | 'cyan' | 'violet' | 'emerald' | 'rose' | 'amber' | 'blue' | 'teal'\n\nconst props = withDefaults(\n defineProps<{\n /** Main title */\n title: string\n /** Subtitle/description */\n subtitle?: string\n /** Badge text (shown above title) */\n badge?: string\n /** Badge icon */\n badgeIcon?: string\n /** Show animated background blobs */\n showBlobs?: boolean\n /** Show wave decoration at bottom */\n showWave?: boolean\n /** Stats to display in grid */\n stats?: PageHeroStat[]\n /** Gradient direction: 'br' (bottom-right), 'r' (right), 'b' (bottom) */\n gradientDirection?: 'br' | 'r' | 'b'\n /** Decorative icons (shown faded in background) */\n decorativeIcons?: string[]\n /** Color scheme for gradient and accents */\n colorScheme?: PageHeroColorScheme\n }>(),\n {\n showBlobs: true,\n showWave: true,\n gradientDirection: 'br',\n colorScheme: 'primary',\n }\n)\n\n// Color scheme mappings\nconst colorClasses = computed(() => {\n const schemes: Record<PageHeroColorScheme, { gradient: string; subtitle: string }> = {\n primary: {\n gradient: 'from-primary-600 via-primary-500 to-primary-400',\n subtitle: 'text-primary-100',\n },\n cyan: {\n gradient: 'from-cyan-600 via-cyan-500 to-teal-500',\n subtitle: 'text-cyan-100',\n },\n violet: {\n gradient: 'from-violet-600 via-violet-500 to-purple-500',\n subtitle: 'text-violet-100',\n },\n emerald: {\n gradient: 'from-emerald-600 via-emerald-500 to-teal-500',\n subtitle: 'text-emerald-100',\n },\n rose: {\n gradient: 'from-rose-600 via-rose-500 to-pink-500',\n subtitle: 'text-rose-100',\n },\n amber: {\n gradient: 'from-amber-600 via-amber-500 to-orange-500',\n subtitle: 'text-amber-100',\n },\n blue: {\n gradient: 'from-blue-600 via-blue-500 to-indigo-500',\n subtitle: 'text-blue-100',\n },\n teal: {\n gradient: 'from-teal-600 via-teal-500 to-cyan-500',\n subtitle: 'text-teal-100',\n },\n }\n return schemes[props.colorScheme]\n})\n</script>\n\n<template>\n <div class=\"relative overflow-hidden bg-linear-to-br\" :class=\"colorClasses.gradient\">\n <!-- Animated background blobs -->\n <div v-if=\"showBlobs\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <div\n class=\"absolute -top-20 -right-20 w-72 h-72 bg-white/10 rounded-full blur-3xl animate-float\"\n />\n <div\n class=\"absolute -bottom-32 -left-32 w-96 h-96 bg-white/5 rounded-full blur-3xl animate-float [animation-delay:1s]\"\n />\n </div>\n\n <!-- Decorative icons -->\n <div v-if=\"decorativeIcons?.length\" class=\"absolute inset-0 overflow-hidden pointer-events-none\">\n <Icon\n v-if=\"decorativeIcons[0]\"\n :icon=\"decorativeIcons[0]\"\n class=\"absolute top-12 right-8 w-24 h-24 text-white/5 rotate-12\"\n />\n <Icon\n v-if=\"decorativeIcons[1]\"\n :icon=\"decorativeIcons[1]\"\n class=\"absolute bottom-8 left-12 w-20 h-20 text-white/5 -rotate-12\"\n />\n </div>\n\n <!-- Custom background slot -->\n <slot name=\"background\" />\n\n <div class=\"relative px-4 pt-8 pb-10 sm:px-6 lg:px-8 max-w-5xl mx-auto\">\n <!-- Header content -->\n <div class=\"text-center mb-8 animate-fade-in-up\">\n <!-- Badge -->\n <div\n v-if=\"badge || badgeIcon || $slots.badge\"\n class=\"inline-flex items-center gap-2 px-4 py-2 rounded-full bg-white/15 backdrop-blur-sm border border-white/20 mb-4\"\n >\n <slot name=\"badge\">\n <Icon v-if=\"badgeIcon\" :icon=\"badgeIcon\" class=\"w-5 h-5 text-white\" />\n <span v-if=\"badge\" class=\"text-sm font-medium text-white\">{{ badge }}</span>\n </slot>\n </div>\n\n <!-- Title -->\n <h1 class=\"text-2xl sm:text-3xl font-bold text-white mb-2\">\n <slot name=\"title\">{{ title }}</slot>\n </h1>\n\n <!-- Subtitle -->\n <p v-if=\"subtitle || $slots.subtitle\" class=\"text-sm sm:text-base\" :class=\"colorClasses.subtitle\">\n <slot name=\"subtitle\">{{ subtitle }}</slot>\n </p>\n </div>\n\n <!-- Stats Grid -->\n <div\n v-if=\"stats?.length || $slots.stats\"\n class=\"animate-fade-in-up [animation-delay:0.1s]\"\n >\n <slot name=\"stats\">\n <div\n class=\"grid gap-3 sm:gap-4\"\n :class=\"[\n stats?.length === 2 ? 'grid-cols-2' : '',\n stats?.length === 3 ? 'grid-cols-3' : '',\n stats?.length === 4 ? 'grid-cols-2 sm:grid-cols-4' : '',\n stats && stats.length > 4 ? 'grid-cols-2 sm:grid-cols-3 lg:grid-cols-4' : '',\n ]\"\n >\n <div\n v-for=\"(stat, index) in stats\"\n :key=\"index\"\n class=\"bg-white/15 backdrop-blur-sm rounded-2xl p-4 border border-white/20 text-center\"\n >\n <div\n v-if=\"stat.icon\"\n class=\"w-10 h-10 mx-auto mb-2 rounded-xl bg-white/20 flex items-center justify-center\"\n >\n <Icon :icon=\"stat.icon\" class=\"w-5 h-5 text-white\" />\n </div>\n <div class=\"text-2xl sm:text-3xl font-bold text-white\">{{ stat.value }}</div>\n <div class=\"text-xs sm:text-sm\" :class=\"colorClasses.subtitle\">{{ stat.label }}</div>\n </div>\n </div>\n </slot>\n </div>\n\n <!-- Additional content -->\n <slot name=\"content\" />\n </div>\n\n <!-- Wave decoration -->\n <div v-if=\"showWave\" class=\"absolute bottom-0 left-0 right-0\">\n <svg\n viewBox=\"0 0 1440 80\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"w-full h-auto\"\n preserveAspectRatio=\"none\"\n >\n <path\n d=\"M0 80L60 74.7C120 69 240 59 360 53.3C480 48 600 48 720 53.3C840 59 960 69 1080 69.3C1200 69 1320 59 1380 53.3L1440 48V80H1380C1320 80 1200 80 1080 80C960 80 840 80 720 80C600 80 480 80 360 80C240 80 120 80 60 80H0Z\"\n class=\"fill-gray-50 dark:fill-slate-900\"\n />\n </svg>\n </div>\n </div>\n</template>\n"],"names":["useSlots","computed","resolveComponent","_openBlock","_createElementBlock","_hoisted_1","$slots","_normalizeClass","_renderSlot","_hoisted_2","_createElementVNode","_hoisted_3","_Fragment","_hoisted_4","_hoisted_5","_hoisted_6","_createVNode","_unref","Icon","_hoisted_7","_toDisplayString","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","_hoisted_13","_hoisted_14","_renderList","_hoisted_15","_createBlock","_resolveDynamicComponent","_mergeProps","ref","MenuItem","Dropdown","_withCtx","_createTextVNode","_a","_b"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DvkgM40a.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|