cisse-vue-ui 0.5.17 → 0.5.21
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 +666 -666
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-C3pr8BwC.js.map +1 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DKxcVBKu.cjs.map +1 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-CrEu33_J.cjs +140 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-CrEu33_J.cjs.map +1 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-D3_Oddwt.js +141 -0
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-D3_Oddwt.js.map +1 -0
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-D22uNeS1.cjs.map +1 -1
- package/dist/PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js.map +1 -1
- package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-y3zIxWfI.js → RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js} +2 -2
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js.map +1 -0
- package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-Cv1OwT9S.cjs → RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs} +2 -2
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs.map +1 -0
- package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-CHoagJ0-.cjs → Skeleton.vue_vue_type_script_setup_true_lang-CsDMGhaT.cjs} +87 -224
- package/dist/Skeleton.vue_vue_type_script_setup_true_lang-CsDMGhaT.cjs.map +1 -0
- package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-Bech-H58.js → Skeleton.vue_vue_type_script_setup_true_lang-Q4PcIELi.js} +87 -224
- package/dist/Skeleton.vue_vue_type_script_setup_true_lang-Q4PcIELi.js.map +1 -0
- package/dist/{Timeline.vue_vue_type_script_setup_true_lang-CqeiZOID.cjs → Timeline.vue_vue_type_script_setup_true_lang-C5SKEGPG.cjs} +98 -56
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-C5SKEGPG.cjs.map +1 -0
- package/dist/{Timeline.vue_vue_type_script_setup_true_lang-CuPF4MPe.js → Timeline.vue_vue_type_script_setup_true_lang-ykGksWXN.js} +109 -67
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-ykGksWXN.js.map +1 -0
- package/dist/cisse-vue-ui.css +51 -51
- package/dist/components/core/AccordionItem.stories.d.ts +10 -0
- package/dist/components/core/Avatar.vue.d.ts +1 -1
- package/dist/components/core/Button.vue.d.ts +1 -1
- package/dist/components/core/CardComponent.stories.d.ts +3 -0
- package/dist/components/core/CardComponent.vue.d.ts +15 -2
- package/dist/components/core/MobileList.stories.d.ts +13 -0
- package/dist/components/core/MobileList.vue.d.ts +6 -0
- package/dist/components/core/ResponsiveList.stories.d.ts +15 -0
- package/dist/components/core/ResponsiveList.vue.d.ts +6 -0
- package/dist/components/core/TabPanel.stories.d.ts +8 -0
- package/dist/components/core/TableAction.stories.d.ts +14 -0
- package/dist/components/core/TableComponent.stories.d.ts +2 -0
- package/dist/components/core/TableComponent.vue.d.ts +6 -0
- package/dist/components/core/index.cjs +1 -1
- package/dist/components/core/index.js +1 -1
- package/dist/components/feedback/CardSkeleton.stories.d.ts +11 -0
- package/dist/components/feedback/CardSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/CardSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/ListSkeleton.stories.d.ts +12 -0
- package/dist/components/feedback/ListSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/ListSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/NotificationComponent.stories.d.ts +14 -0
- package/dist/components/feedback/NotificationList.stories.d.ts +11 -0
- package/dist/components/feedback/Skeleton.vue.d.ts +1 -1
- package/dist/components/feedback/TableSkeleton.stories.d.ts +12 -0
- package/dist/components/feedback/TableSkeleton.test.d.ts +1 -0
- package/dist/components/feedback/TableSkeleton.vue.d.ts +1 -1
- package/dist/components/feedback/ToastContainer.stories.d.ts +15 -0
- package/dist/components/feedback/index.cjs +16 -15
- package/dist/components/feedback/index.cjs.map +1 -1
- package/dist/components/feedback/index.js +5 -4
- package/dist/components/feedback/index.js.map +1 -1
- package/dist/components/form/FileUpload.vue.d.ts +1 -1
- package/dist/components/form/FormHelp.stories.d.ts +11 -0
- package/dist/components/form/FormLabel.stories.d.ts +12 -0
- package/dist/components/form/FormSelect.stories.d.ts +2 -0
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +18 -17
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.js +10 -9
- package/dist/components/index.js.map +1 -1
- package/dist/{index-5Ru0o5KY.js → index-C3NAM2ds.js} +5 -4
- package/dist/index-C3NAM2ds.js.map +1 -0
- package/dist/{index-CnDEGRt-.cjs → index-Ti1RIOEG.cjs} +19 -18
- package/dist/index-Ti1RIOEG.cjs.map +1 -0
- package/dist/index.cjs +19 -18
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +14 -13
- package/dist/index.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/useDropdown-DHFnd259.cjs.map +1 -1
- package/dist/useDropdown-iVu14E6s.js.map +1 -1
- package/dist/useToast-CRh_sG82.cjs.map +1 -1
- package/dist/useToast-DwFOkewC.js.map +1 -1
- package/package.json +168 -168
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-Bech-H58.js.map +0 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-CHoagJ0-.cjs.map +0 -1
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-Cv1OwT9S.cjs.map +0 -1
- package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-y3zIxWfI.js.map +0 -1
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-CqeiZOID.cjs.map +0 -1
- package/dist/Timeline.vue_vue_type_script_setup_true_lang-CuPF4MPe.js.map +0 -1
- package/dist/index-5Ru0o5KY.js.map +0 -1
- package/dist/index-CnDEGRt-.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\nimport { ref, computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport MenuItem from '@/components/core/MenuItem.vue'\nimport Dropdown from '@/components/core/Dropdown.vue'\nimport type { MenuItemProps } from '@/types'\n\nexport interface UserMenuItem {\n label: string\n icon?: string\n link?: string\n action?: () => void\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Menu items for the sidebar */\n menuItems?: MenuItemProps[]\n /** App/brand name displayed in sidebar */\n appName?: string\n /** App icon (iconify icon name) */\n appIcon?: string\n /** Whether sidebar is open (v-model:sidebarOpen) */\n sidebarOpen?: boolean\n /** Whether dark mode is enabled (v-model:dark) */\n dark?: boolean\n /** Show dark mode toggle in header */\n showDarkToggle?: boolean\n /** Primary color class for sidebar background */\n sidebarClass?: string\n /** Current route path for menu active state (pass useRoute().path) */\n currentPath?: string\n /** User display name */\n userName?: string\n /** User avatar (initials or image URL) */\n userAvatar?: string\n /** User menu items (dropdown) */\n userMenuItems?: UserMenuItem[]\n }>(),\n {\n menuItems: () => [],\n appName: 'App',\n appIcon: 'lucide:box',\n sidebarOpen: true,\n dark: false,\n showDarkToggle: true,\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\n currentPath: undefined,\n userName: undefined,\n userAvatar: undefined,\n userMenuItems: () => [],\n },\n)\n\nconst emit = defineEmits<{\n 'update:sidebarOpen': [value: boolean]\n 'update:dark': [value: boolean]\n}>()\n\nconst internalSidebarOpen = ref(props.sidebarOpen)\nconst internalDark = ref(props.dark)\n\nconst sidebarOpenModel = computed({\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\n set: (value: boolean) => {\n internalSidebarOpen.value = value\n emit('update:sidebarOpen', value)\n },\n})\n\nconst darkModel = computed({\n get: () => props.dark ?? internalDark.value,\n set: (value: boolean) => {\n internalDark.value = value\n emit('update:dark', value)\n },\n})\n\nconst toggleSidebar = () => {\n sidebarOpenModel.value = !sidebarOpenModel.value\n}\n\nconst toggleDark = () => {\n darkModel.value = !darkModel.value\n}\n\n// Try to resolve RouterView\nconst routerViewComponent = computed(() => {\n try {\n const RouterView = resolveComponent('RouterView')\n if (typeof RouterView !== 'string') {\n return RouterView\n }\n } catch {\n // RouterView not available\n }\n return null\n})\n\n// Try to resolve RouterLink\nconst routerLinkComponent = computed(() => {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst getLinkProps = (link: string) => {\n if (routerLinkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n}\n\nconst handleUserMenuClick = (item: UserMenuItem) => {\n if (item.action) {\n item.action()\n }\n}\n</script>\n\n<template>\n <div class=\"font-inter relative flex h-dvh 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' : '-translate-x-76 lg:w-16 lg:translate-x-0',\n sidebarClass,\n ]\"\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\n >\n <!-- Sidebar Header -->\n <div class=\"flex h-16 items-center px-3\">\n <div class=\"flex flex-1 items-center justify-center gap-3\">\n <slot name=\"logo\">\n <div\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\n >\n <Icon\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'\"\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\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 flex-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"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js","sources":["../src/components/layout/BaseLayout.vue","../src/components/layout/PageLayout.vue"],"sourcesContent":["<script lang=\"ts\" setup>\r\nimport { ref, computed, resolveComponent } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport MenuItem from '@/components/core/MenuItem.vue'\r\nimport Dropdown from '@/components/core/Dropdown.vue'\r\nimport type { MenuItemProps } from '@/types'\r\n\r\nexport interface UserMenuItem {\r\n label: string\r\n icon?: string\r\n link?: string\r\n action?: () => void\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Menu items for the sidebar */\r\n menuItems?: MenuItemProps[]\r\n /** App/brand name displayed in sidebar */\r\n appName?: string\r\n /** App icon (iconify icon name) */\r\n appIcon?: string\r\n /** Whether sidebar is open (v-model:sidebarOpen) */\r\n sidebarOpen?: boolean\r\n /** Whether dark mode is enabled (v-model:dark) */\r\n dark?: boolean\r\n /** Show dark mode toggle in header */\r\n showDarkToggle?: boolean\r\n /** Primary color class for sidebar background */\r\n sidebarClass?: string\r\n /** Current route path for menu active state (pass useRoute().path) */\r\n currentPath?: string\r\n /** User display name */\r\n userName?: string\r\n /** User avatar (initials or image URL) */\r\n userAvatar?: string\r\n /** User menu items (dropdown) */\r\n userMenuItems?: UserMenuItem[]\r\n }>(),\r\n {\r\n menuItems: () => [],\r\n appName: 'App',\r\n appIcon: 'lucide:box',\r\n sidebarOpen: true,\r\n dark: false,\r\n showDarkToggle: true,\r\n sidebarClass: 'bg-[#172b4c] dark:bg-slate-950',\r\n currentPath: undefined,\r\n userName: undefined,\r\n userAvatar: undefined,\r\n userMenuItems: () => [],\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:sidebarOpen': [value: boolean]\r\n 'update:dark': [value: boolean]\r\n}>()\r\n\r\nconst internalSidebarOpen = ref(props.sidebarOpen)\r\nconst internalDark = ref(props.dark)\r\n\r\nconst sidebarOpenModel = computed({\r\n get: () => props.sidebarOpen ?? internalSidebarOpen.value,\r\n set: (value: boolean) => {\r\n internalSidebarOpen.value = value\r\n emit('update:sidebarOpen', value)\r\n },\r\n})\r\n\r\nconst darkModel = computed({\r\n get: () => props.dark ?? internalDark.value,\r\n set: (value: boolean) => {\r\n internalDark.value = value\r\n emit('update:dark', value)\r\n },\r\n})\r\n\r\nconst toggleSidebar = () => {\r\n sidebarOpenModel.value = !sidebarOpenModel.value\r\n}\r\n\r\nconst toggleDark = () => {\r\n darkModel.value = !darkModel.value\r\n}\r\n\r\n// Try to resolve RouterView\r\nconst routerViewComponent = computed(() => {\r\n try {\r\n const RouterView = resolveComponent('RouterView')\r\n if (typeof RouterView !== 'string') {\r\n return RouterView\r\n }\r\n } catch {\r\n // RouterView not available\r\n }\r\n return null\r\n})\r\n\r\n// Try to resolve RouterLink\r\nconst routerLinkComponent = computed(() => {\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n})\r\n\r\nconst getLinkProps = (link: string) => {\r\n if (routerLinkComponent.value === 'a') {\r\n return { href: link }\r\n }\r\n return { to: link }\r\n}\r\n\r\nconst handleUserMenuClick = (item: UserMenuItem) => {\r\n if (item.action) {\r\n item.action()\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"font-inter relative flex h-dvh overflow-hidden bg-gray-100 dark:bg-slate-900\">\r\n <!-- Backdrop for mobile -->\r\n <div\r\n v-if=\"sidebarOpenModel\"\r\n class=\"absolute z-40 h-full w-full bg-slate-950/20 lg:hidden dark:bg-white/20\"\r\n @click=\"sidebarOpenModel = false\"\r\n />\r\n\r\n <!-- Sidebar -->\r\n <aside\r\n :class=\"[\r\n sidebarOpenModel ? 'lg:w-60' : '-translate-x-76 lg:w-16 lg:translate-x-0',\r\n sidebarClass,\r\n ]\"\r\n class=\"@container absolute z-50 flex h-full w-76 flex-col justify-between gap-10 transition-all duration-1000 ease-in-out lg:relative\"\r\n >\r\n <!-- Sidebar Header -->\r\n <div class=\"flex h-16 items-center px-3\">\r\n <div class=\"flex flex-1 items-center justify-center gap-3\">\r\n <slot name=\"logo\">\r\n <div\r\n class=\"bg-primary text-primary-foreground flex size-8 items-center justify-center rounded-lg bg-white/20\"\r\n >\r\n <Icon\r\n class=\"size-5 text-white\"\r\n :icon=\"appIcon\"\r\n />\r\n </div>\r\n <span\r\n :class=\"sidebarOpenModel ? 'block' : 'hidden'\"\r\n class=\"font-outfit flex-1 text-lg font-semibold text-white\"\r\n >\r\n {{ appName }}\r\n </span>\r\n </slot>\r\n </div>\r\n\r\n <button\r\n class=\"rounded-lg bg-white/10 p-1 transition hover:bg-white/20 lg:hidden\"\r\n @click=\"toggleSidebar\"\r\n >\r\n <Icon\r\n class=\"size-6 text-white\"\r\n icon=\"lucide:menu\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Menu Items -->\r\n <div\r\n :class=\"sidebarOpenModel ? 'items-start' : 'items-center'\"\r\n class=\"flex flex-1 flex-col gap-8 px-2 lg:justify-center\"\r\n >\r\n <slot\r\n name=\"menu\"\r\n :current-path=\"currentPath\"\r\n >\r\n <MenuItem\r\n v-for=\"(item, index) in menuItems\"\r\n :key=\"index\"\r\n :menu-item=\"item\"\r\n :expanded=\"sidebarOpenModel\"\r\n :current-path=\"currentPath\"\r\n />\r\n </slot>\r\n </div>\r\n\r\n <!-- Sidebar Footer -->\r\n <div class=\"flex flex-col gap-3 px-3 pb-3\">\r\n <slot name=\"sidebar-footer\" />\r\n </div>\r\n </aside>\r\n\r\n <!-- Main Content Area -->\r\n <div class=\"flex flex-1 flex-col min-w-0\">\r\n <!-- Header -->\r\n <header\r\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\"\r\n >\r\n <div>\r\n <button\r\n class=\"rounded-lg bg-gray-100 p-1 transition hover:bg-gray-200 dark:bg-gray-900 dark:hover:bg-gray-800\"\r\n @click=\"toggleSidebar\"\r\n >\r\n <Icon\r\n class=\"size-6 text-gray-900 hover:text-gray-800 dark:text-gray-100\"\r\n icon=\"lucide:menu\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <div class=\"flex-1\">\r\n <slot name=\"header-center\" />\r\n </div>\r\n\r\n <div class=\"flex items-center gap-3\">\r\n <slot name=\"header-actions\" />\r\n\r\n <button\r\n v-if=\"showDarkToggle\"\r\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\"\r\n @click=\"toggleDark\"\r\n >\r\n <Icon\r\n :icon=\"darkModel ? 'lucide:sun' : 'lucide:moon'\"\r\n class=\"size-5 text-gray-900 dark:text-gray-100\"\r\n />\r\n </button>\r\n\r\n <!-- User Menu -->\r\n <Dropdown\r\n v-if=\"userName || userAvatar\"\r\n align=\"right\"\r\n >\r\n <template #trigger>\r\n <button\r\n class=\"flex items-center gap-2 rounded-lg p-1.5 transition hover:bg-gray-100 dark:hover:bg-gray-800\"\r\n >\r\n <div\r\n class=\"flex size-8 items-center justify-center rounded-full bg-primary text-sm font-medium text-white\"\r\n >\r\n {{ userAvatar || '?' }}\r\n </div>\r\n <span class=\"hidden text-sm font-medium text-gray-700 dark:text-gray-300 md:block\">\r\n {{ userName }}\r\n </span>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n class=\"size-4 text-gray-500\"\r\n />\r\n </button>\r\n </template>\r\n\r\n <template #default=\"{ close }\">\r\n <div class=\"min-w-48 py-1\">\r\n <component\r\n :is=\"item.link ? routerLinkComponent : 'button'\"\r\n v-for=\"item in userMenuItems\"\r\n :key=\"item.label\"\r\n v-bind=\"item.link ? getLinkProps(item.link) : {}\"\r\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\"\r\n @click=\"handleUserMenuClick(item); close()\"\r\n >\r\n <Icon\r\n v-if=\"item.icon\"\r\n :icon=\"item.icon\"\r\n class=\"size-4\"\r\n />\r\n {{ item.label }}\r\n </component>\r\n </div>\r\n </template>\r\n </Dropdown>\r\n </div>\r\n </header>\r\n\r\n <!-- Page Content -->\r\n <div class=\"flex flex-1 flex-col overflow-y-auto overflow-x-hidden\">\r\n <main class=\"container mx-auto flex flex-1 flex-col gap-5 p-5 max-w-full\">\r\n <slot>\r\n <component\r\n :is=\"routerViewComponent\"\r\n v-if=\"routerViewComponent\"\r\n />\r\n </slot>\r\n </main>\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, resolveComponent } from 'vue'\r\n\r\nexport interface PageBreadcrumb {\r\n label: string\r\n link: string\r\n}\r\n\r\ndefineProps<{\r\n /** Page title */\r\n title?: string\r\n /** Page description */\r\n description?: string\r\n /** Breadcrumb navigation items */\r\n breadcrumbs?: PageBreadcrumb[]\r\n}>()\r\n\r\n// Try to resolve RouterLink\r\nconst linkComponent = computed(() => {\r\n try {\r\n const RouterLink = resolveComponent('RouterLink')\r\n if (typeof RouterLink !== 'string') {\r\n return RouterLink\r\n }\r\n } catch {\r\n // RouterLink not available\r\n }\r\n return 'a'\r\n})\r\n\r\nconst getLinkProps = (link: string) => {\r\n if (linkComponent.value === 'a') {\r\n return { href: link }\r\n }\r\n return { to: link }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"flex flex-col gap-4\">\r\n <!-- Breadcrumbs -->\r\n <nav\r\n v-if=\"breadcrumbs && breadcrumbs.length > 0\"\r\n aria-label=\"Breadcrumb\"\r\n >\r\n <ol class=\"flex items-center\">\r\n <li\r\n v-for=\"(breadcrumb, index) in breadcrumbs\"\r\n :key=\"index\"\r\n class=\"flex items-center\"\r\n >\r\n <span\r\n v-if=\"index > 0\"\r\n class=\"mx-3 text-sm font-semibold text-gray-400 dark:text-gray-600\"\r\n >\r\n /\r\n </span>\r\n\r\n <slot\r\n name=\"breadcrumb\"\r\n :breadcrumb=\"breadcrumb\"\r\n :index=\"index\"\r\n :is-last=\"index === breadcrumbs.length - 1\"\r\n >\r\n <component\r\n :is=\"linkComponent\"\r\n v-bind=\"getLinkProps(breadcrumb.link)\"\r\n :class=\"[\r\n 'text-sm transition-colors',\r\n index < breadcrumbs.length - 1\r\n ? 'font-semibold text-gray-900 hover:text-primary/90 hover:underline dark:text-gray-100'\r\n : 'text-gray-400 dark:text-gray-600',\r\n ]\"\r\n >\r\n {{ breadcrumb.label }}\r\n </component>\r\n </slot>\r\n </li>\r\n </ol>\r\n </nav>\r\n\r\n <!-- Page Header -->\r\n <div class=\"flex flex-col gap-4 md:flex-row md:items-start md:justify-between\">\r\n <div class=\"flex flex-col gap-1 min-w-0 flex-1\">\r\n <h1\r\n v-if=\"title\"\r\n class=\"text-2xl font-bold text-gray-900 dark:text-gray-100 truncate\"\r\n >\r\n <slot name=\"title\">\r\n {{ title }}\r\n </slot>\r\n </h1>\r\n\r\n <p\r\n v-if=\"description\"\r\n class=\"text-sm text-gray-600 dark:text-gray-400\"\r\n >\r\n <slot name=\"description\">\r\n {{ description }}\r\n </slot>\r\n </p>\r\n </div>\r\n\r\n <div class=\"flex items-center gap-2 flex-wrap flex-shrink-0\">\r\n <slot name=\"actions\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Page Content -->\r\n <div class=\"flex-1\">\r\n <slot />\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","_createElementVNode","_normalizeClass","_hoisted_2","_hoisted_3","_renderSlot","_hoisted_4","_createVNode","_unref","_Fragment","_renderList","_createBlock","MenuItem","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_hoisted_9","Dropdown","_hoisted_10","_toDisplayString","_withCtx","_resolveDynamicComponent","_mergeProps","_createTextVNode"],"mappings":"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"}
|
|
@@ -562,7 +562,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
562
562
|
};
|
|
563
563
|
}
|
|
564
564
|
});
|
|
565
|
-
const Slider = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-
|
|
565
|
+
const Slider = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-a411f1b4"]]);
|
|
566
566
|
const _hoisted_1$4 = { class: "relative" };
|
|
567
567
|
const _hoisted_2$4 = ["disabled"];
|
|
568
568
|
const _hoisted_3$4 = { class: "flex-1 truncate" };
|
|
@@ -1427,4 +1427,4 @@ export {
|
|
|
1427
1427
|
_sfc_main$1 as j,
|
|
1428
1428
|
_sfc_main as k
|
|
1429
1429
|
};
|
|
1430
|
-
//# sourceMappingURL=RangeSlider.vue_vue_type_script_setup_true_lang-
|
|
1430
|
+
//# sourceMappingURL=RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Slider.vue","../src/components/form/DatePicker.vue","../src/components/form/FileUpload.vue","../src/components/form/Rating.vue","../src/components/form/ColorPicker.vue","../src/components/form/RangeSlider.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\r\ndefineProps<{\r\n error?: boolean\r\n text?: string\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <p\r\n :data-error=\"error\"\r\n class=\"mt-2 text-sm text-gray-400 peer-user-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\r\n >\r\n <slot>{{ text ?? '' }}</slot>\r\n </p>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport type { InputProps } from '@/types'\r\n\r\nwithDefaults(defineProps<InputProps>(), {\r\n type: 'text',\r\n})\r\n\r\nconst modelValue = defineModel<string>()\r\n</script>\r\n\r\n<template>\r\n <input\r\n :id=\"id ?? name ?? ''\"\r\n v-model=\"modelValue\"\r\n :disabled=\"disabled\"\r\n :name=\"name ?? ''\"\r\n :placeholder=\"placeholder\"\r\n :type=\"type\"\r\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm user-invalid:border-red-500 user-invalid:text-red-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:user-invalid:border-red-500 focus:user-invalid:ring-red-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\r\n v-bind=\"$attrs\"\r\n >\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, ref, watch, nextTick } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport type { SelectProps, SelectOption } from '@/types'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\n\r\nconst props = withDefaults(\r\n defineProps<\r\n SelectProps & {\r\n /** Use teleport to body to avoid overflow clipping */\r\n teleport?: boolean\r\n /** Show search input in dropdown */\r\n searchable?: boolean\r\n /** Text shown when no results match search */\r\n noResultsText?: string\r\n /** Custom class for the trigger button */\r\n triggerClass?: string\r\n }\r\n >(),\r\n {\r\n teleport: true,\r\n searchable: false,\r\n noResultsText: 'No results found',\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<string | number | boolean | null>()\r\n\r\nconst searchQuery = ref('')\r\nconst triggerRef = ref<HTMLElement>()\r\nconst dropdownRef = ref<HTMLElement>()\r\nconst searchInputRef = ref<HTMLInputElement>()\r\n\r\nconst {\r\n isOpen,\r\n highlightedIndex,\r\n dropdownStyle,\r\n open: openDropdown,\r\n close,\r\n handleKeydown: baseHandleKeydown,\r\n scrollToHighlighted,\r\n} = useDropdown(triggerRef, dropdownRef, {\r\n teleport: props.teleport,\r\n gap: 4,\r\n onClose: () => {\r\n searchQuery.value = ''\r\n },\r\n})\r\n\r\nconst visibleOptions = computed(() => {\r\n return (props.options ?? []).filter((opt) => !opt.hidden)\r\n})\r\n\r\nconst filteredOptions = computed(() => {\r\n if (!props.searchable || !searchQuery.value) {\r\n return visibleOptions.value\r\n }\r\n const query = searchQuery.value.toLowerCase()\r\n return visibleOptions.value.filter((opt) =>\r\n opt.label.toLowerCase().includes(query) ||\r\n String(opt.value).toLowerCase().includes(query)\r\n )\r\n})\r\n\r\nconst selectedOption = computed(() => {\r\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (selectedOption.value) {\r\n return selectedOption.value.label\r\n }\r\n return props.placeholder || 'Select...'\r\n})\r\n\r\nconst open = () => {\r\n if (props.disabled) return\r\n searchQuery.value = ''\r\n highlightedIndex.value = filteredOptions.value.findIndex(\r\n (opt) => opt.value === modelValue.value\r\n )\r\n openDropdown()\r\n nextTick(() => {\r\n if (props.searchable) {\r\n searchInputRef.value?.focus()\r\n }\r\n })\r\n}\r\n\r\nconst toggle = () => {\r\n if (isOpen.value) {\r\n close()\r\n } else {\r\n open()\r\n }\r\n}\r\n\r\nconst selectOption = (option: SelectOption) => {\r\n modelValue.value = option.value\r\n close()\r\n}\r\n\r\nconst handleKeydown = (event: KeyboardEvent) => {\r\n baseHandleKeydown(event, {\r\n itemCount: filteredOptions.value.length,\r\n onSelect: (index) => {\r\n if (filteredOptions.value[index]) {\r\n selectOption(filteredOptions.value[index])\r\n }\r\n },\r\n onOpen: open,\r\n handleOpenKeys: true,\r\n })\r\n if (isOpen.value) {\r\n scrollToHighlighted(dropdownRef.value ?? null)\r\n }\r\n}\r\n\r\nwatch(searchQuery, () => {\r\n highlightedIndex.value = 0\r\n})\r\n\r\nconst triggerClasses = computed(() => {\r\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\r\n const state = props.disabled\r\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\r\n : isOpen.value\r\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\r\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\r\n const text = selectedOption.value\r\n ? 'text-gray-800 dark:text-gray-200'\r\n : 'text-gray-400 dark:text-gray-500'\r\n return [base, state, text, props.triggerClass]\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <!-- Trigger -->\r\n <button\r\n :id=\"id ?? name ?? undefined\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :class=\"triggerClasses\"\r\n @click=\"toggle\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n <slot\n name=\"selected\"\n :option=\"selectedOption\"\n :placeholder=\"placeholder\"\n >\r\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\r\n </slot>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"dropdownRef\"\r\n :style=\"dropdownStyle\"\r\n :class=\"[\r\n 'z-[9999] max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800',\r\n !teleport && 'absolute mt-1 w-full',\r\n ]\"\r\n >\r\n <!-- Search input -->\r\n <div\n v-if=\"searchable\"\n class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\"\n >\r\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\r\n <Icon\n icon=\"lucide:search\"\n class=\"size-4 text-gray-400\"\n />\r\n <input\r\n ref=\"searchInputRef\"\r\n v-model=\"searchQuery\"\r\n type=\"text\"\r\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\r\n placeholder=\"Search...\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <!-- Empty state -->\r\n <div\r\n v-if=\"filteredOptions.length === 0\"\r\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\r\n >\r\n {{ noResultsText }}\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"py-1\">\r\n <button\r\n v-for=\"(option, index) in filteredOptions\"\r\n :key=\"String(option.value)\"\r\n type=\"button\"\r\n :data-index=\"index\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\r\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\r\n modelValue === option.value && 'bg-primary/10 text-primary',\r\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\r\n ]\"\r\n @click=\"selectOption(option)\"\r\n @mouseenter=\"highlightedIndex = index\"\r\n >\r\n <slot\n name=\"option\"\n :option=\"option\"\n :selected=\"modelValue === option.value\"\n :index=\"index\"\n >\r\n <Icon\r\n v-if=\"modelValue === option.value\"\r\n icon=\"lucide:check\"\r\n class=\"size-4 shrink-0 text-primary\"\r\n />\r\n <span\n v-else\n class=\"size-4 shrink-0\"\n />\r\n <span class=\"flex-1\">{{ option.label }}</span>\r\n </slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\nimport type { FormGroupProps } from '@/types'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormInput from './FormInput.vue'\r\nimport FormSelect from './FormSelect.vue'\r\nimport FormHelp from './FormHelp.vue'\r\n\r\nconst props = withDefaults(defineProps<FormGroupProps>(), {\r\n cols: 6,\r\n})\r\n\r\nconst modelValue = defineModel()\r\n\r\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\r\n\r\nconst isSelect = computed(() => props.select === true)\r\n</script>\r\n\r\n<template>\r\n <div\n :style=\"{ gridColumn: computedCols }\"\n :hidden=\"hidden\"\n >\r\n <slot>\r\n <slot name=\"label\">\r\n <FormLabel\n v-if=\"label\"\n :html-for=\"id ?? name\"\n :error=\"error\"\n >\r\n {{ label }}\r\n </FormLabel>\r\n </slot>\r\n\r\n <slot name=\"input\">\r\n <FormSelect\r\n v-if=\"isSelect\"\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n />\r\n <FormInput\r\n v-else\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n />\r\n </slot>\r\n\r\n <FormHelp\n v-if=\"error && typeof error === 'string'\"\n :error=\"true\"\n >\r\n {{ error }}\r\n </FormHelp>\r\n </slot>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon\n :icon=\"icon\"\n class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\"\n />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n >\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div\n v-if=\"label || description\"\n class=\"flex flex-col\"\n >\n <span\n v-if=\"label\"\n class=\"text-sm font-medium text-gray-900 dark:text-white\"\n >\n {{ label }}\n </span>\n <span\n v-if=\"description\"\n class=\"text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step increment */\r\n step?: number\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show value label */\r\n showValue?: boolean\r\n /** Format value for display */\r\n formatValue?: (value: number) => string\r\n }>(),\r\n {\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n disabled: false,\r\n showValue: false,\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<number>({ default: 0 })\r\n\r\nconst percentage = computed(() => {\r\n return ((modelValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (props.formatValue) {\r\n return props.formatValue(modelValue.value)\r\n }\r\n return modelValue.value.toString()\r\n})\r\n\r\nconst handleInput = (event: Event) => {\r\n const target = event.target as HTMLInputElement\r\n modelValue.value = Number(target.value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"w-full\">\r\n <div\n v-if=\"showValue\"\n class=\"mb-2 flex justify-between text-sm\"\n >\r\n <span class=\"text-gray-600 dark:text-gray-400\">{{ min }}</span>\r\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ displayValue }}</span>\r\n <span class=\"text-gray-600 dark:text-gray-400\">{{ max }}</span>\r\n </div>\r\n <div class=\"relative\">\r\n <input\r\n type=\"range\"\r\n :value=\"modelValue\"\r\n :min=\"min\"\r\n :max=\"max\"\r\n :step=\"step\"\r\n :disabled=\"disabled\"\r\n class=\"slider-input w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed disabled:opacity-50\"\r\n @input=\"handleInput\"\r\n >\r\n <div class=\"pointer-events-none absolute inset-y-0 left-0 flex items-center\">\r\n <div\r\n class=\"h-2 rounded-full bg-primary\"\r\n :style=\"{ width: `${percentage}%` }\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.slider-input {\r\n height: 0.5rem;\r\n}\r\n\r\n.slider-input::-webkit-slider-runnable-track {\r\n height: 0.5rem;\r\n border-radius: 9999px;\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.dark .slider-input::-webkit-slider-runnable-track {\r\n background-color: #374151;\r\n}\r\n\r\n.slider-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n border-radius: 9999px;\r\n background-color: var(--color-primary, #3b82f6);\r\n border: 2px solid white;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n margin-top: -0.375rem;\r\n cursor: pointer;\r\n}\r\n\r\n.slider-input::-moz-range-track {\r\n height: 0.5rem;\r\n border-radius: 9999px;\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.dark .slider-input::-moz-range-track {\r\n background-color: #374151;\r\n}\r\n\r\n.slider-input::-moz-range-thumb {\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n border-radius: 9999px;\r\n background-color: var(--color-primary, #3b82f6);\r\n border: 2px solid white;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n cursor: pointer;\r\n}\r\n\r\n.slider-input:focus::-webkit-slider-thumb {\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);\r\n}\r\n\r\n.slider-input:focus::-moz-range-thumb {\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Date format for display */\r\n format?: string\r\n /** Locale for formatting */\r\n locale?: string\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Minimum selectable date */\r\n minDate?: Date\r\n /** Maximum selectable date */\r\n maxDate?: Date\r\n /** Use teleport */\r\n teleport?: boolean\r\n }>(),\r\n {\r\n placeholder: 'Select date',\r\n format: 'short',\r\n locale: 'en-US',\r\n disabled: false,\r\n teleport: true,\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<Date | null>({ default: null })\r\n\r\nconst triggerRef = ref<HTMLElement>()\r\nconst calendarRef = ref<HTMLElement>()\r\n\r\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, calendarRef, {\r\n teleport: props.teleport,\r\n gap: 4,\r\n})\r\n\r\nconst currentMonth = ref(modelValue.value ? new Date(modelValue.value) : new Date())\r\n\r\nconst weekDays = computed(() => {\r\n const days = []\r\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' })\r\n for (let i = 0; i < 7; i++) {\r\n const date = new Date(2024, 0, i) // Jan 2024 starts on Monday\r\n days.push(formatter.format(date))\r\n }\r\n return days\r\n})\r\n\r\nconst monthYear = computed(() => {\r\n const formatter = new Intl.DateTimeFormat(props.locale, { month: 'long', year: 'numeric' })\r\n return formatter.format(currentMonth.value)\r\n})\r\n\r\nconst calendarDays = computed(() => {\r\n const year = currentMonth.value.getFullYear()\r\n const month = currentMonth.value.getMonth()\r\n\r\n const firstDay = new Date(year, month, 1)\r\n const lastDay = new Date(year, month + 1, 0)\r\n\r\n const days: Array<{ date: Date; isCurrentMonth: boolean; isToday: boolean; isSelected: boolean; isDisabled: boolean }> = []\r\n\r\n // Get the day of week for the first day (0 = Sunday)\r\n let startDay = firstDay.getDay()\r\n // Adjust for Monday start\r\n startDay = startDay === 0 ? 6 : startDay - 1\r\n\r\n // Previous month days\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(year, month, -i)\r\n days.push({\r\n date,\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isSelected: false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n // Current month days\r\n const today = new Date()\r\n for (let i = 1; i <= lastDay.getDate(); i++) {\r\n const date = new Date(year, month, i)\r\n days.push({\r\n date,\r\n isCurrentMonth: true,\r\n isToday: isSameDay(date, today),\r\n isSelected: modelValue.value ? isSameDay(date, modelValue.value) : false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n // Next month days\r\n const remainingDays = 42 - days.length\r\n for (let i = 1; i <= remainingDays; i++) {\r\n const date = new Date(year, month + 1, i)\r\n days.push({\r\n date,\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isSelected: false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n return days\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (!modelValue.value) return ''\r\n const formatter = new Intl.DateTimeFormat(props.locale, {\r\n dateStyle: props.format as 'short' | 'medium' | 'long' | 'full',\r\n })\r\n return formatter.format(modelValue.value)\r\n})\r\n\r\nconst isSameDay = (a: Date, b: Date) => {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n )\r\n}\r\n\r\nconst isDateDisabled = (date: Date) => {\r\n if (props.minDate && date < props.minDate) return true\r\n if (props.maxDate && date > props.maxDate) return true\r\n return false\r\n}\r\n\r\nconst prevMonth = () => {\r\n currentMonth.value = new Date(currentMonth.value.getFullYear(), currentMonth.value.getMonth() - 1, 1)\r\n}\r\n\r\nconst nextMonth = () => {\r\n currentMonth.value = new Date(currentMonth.value.getFullYear(), currentMonth.value.getMonth() + 1, 1)\r\n}\r\n\r\nconst selectDate = (day: typeof calendarDays.value[0]) => {\r\n if (day.isDisabled) return\r\n modelValue.value = day.date\r\n close()\r\n}\r\n\r\nconst clear = () => {\r\n modelValue.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <button\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :class=\"[\r\n 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition',\r\n disabled\r\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950'\r\n : isOpen\r\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\r\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900',\r\n modelValue ? 'text-gray-900 dark:text-white' : 'text-gray-400 dark:text-gray-500',\r\n ]\"\r\n @click=\"toggle\"\r\n >\r\n <span class=\"flex-1 truncate\">{{ displayValue || placeholder }}</span>\r\n <div class=\"flex items-center gap-1\">\r\n <button\r\n v-if=\"modelValue\"\r\n type=\"button\"\r\n class=\"rounded p-0.5 hover:bg-gray-100 dark:hover:bg-gray-800\"\r\n @click.stop=\"clear\"\r\n >\r\n <Icon\n icon=\"lucide:x\"\n class=\"size-4 text-gray-400\"\n />\r\n </button>\r\n <Icon\n icon=\"lucide:calendar\"\n class=\"size-4 text-gray-400\"\n />\r\n </div>\r\n </button>\r\n\r\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"calendarRef\"\r\n :style=\"dropdownStyle\"\r\n class=\"z-[9999] w-72 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\r\n >\r\n <!-- Header -->\r\n <div class=\"mb-4 flex items-center justify-between\">\r\n <button\r\n type=\"button\"\r\n class=\"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700\"\r\n @click=\"prevMonth\"\r\n >\r\n <Icon\n icon=\"lucide:chevron-left\"\n class=\"size-5 text-gray-600 dark:text-gray-400\"\n />\r\n </button>\r\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ monthYear }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700\"\r\n @click=\"nextMonth\"\r\n >\r\n <Icon\n icon=\"lucide:chevron-right\"\n class=\"size-5 text-gray-600 dark:text-gray-400\"\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Week days -->\r\n <div class=\"mb-2 grid grid-cols-7 gap-1\">\r\n <div\r\n v-for=\"day in weekDays\"\r\n :key=\"day\"\r\n class=\"text-center text-xs font-medium text-gray-500 dark:text-gray-400\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days grid -->\r\n <div class=\"grid grid-cols-7 gap-1\">\r\n <button\r\n v-for=\"(day, index) in calendarDays\"\r\n :key=\"index\"\r\n type=\"button\"\r\n :disabled=\"day.isDisabled\"\r\n :class=\"[\r\n 'h-8 w-8 rounded text-sm transition',\r\n day.isDisabled && 'cursor-not-allowed opacity-30',\r\n !day.isCurrentMonth && 'text-gray-400 dark:text-gray-600',\r\n day.isCurrentMonth && !day.isSelected && !day.isToday && 'text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700',\r\n day.isToday && !day.isSelected && 'bg-gray-100 font-semibold text-gray-900 dark:bg-gray-700 dark:text-white',\r\n day.isSelected && 'bg-primary text-white font-semibold',\r\n ]\"\r\n @click=\"selectDate(day)\"\r\n >\r\n {{ day.date.getDate() }}\r\n </button>\r\n </div>\r\n\r\n <!-- Today button -->\r\n <div class=\"mt-4 border-t border-gray-200 pt-3 dark:border-gray-700\">\r\n <button\r\n type=\"button\"\r\n class=\"w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10\"\r\n @click=\"selectDate({ date: new Date(), isCurrentMonth: true, isToday: true, isSelected: false, isDisabled: false })\"\r\n >\r\n Today\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport interface UploadedFile {\r\n file: File\r\n id: string\r\n progress: number\r\n status: 'pending' | 'uploading' | 'success' | 'error'\r\n error?: string\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Accepted file types (e.g., 'image/*,.pdf') */\r\n accept?: string\r\n /** Allow multiple files */\r\n multiple?: boolean\r\n /** Maximum file size in bytes */\r\n maxSize?: number\r\n /** Maximum number of files */\r\n maxFiles?: number\r\n /** Disable the upload */\r\n disabled?: boolean\r\n /** Custom label text */\r\n label?: string\r\n /** Custom description text */\r\n description?: string\r\n }>(),\r\n {\r\n multiple: false,\r\n disabled: false,\r\n label: 'Drop files here or click to upload',\r\n description: '',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'files-selected': [files: File[]]\r\n 'file-removed': [file: File]\r\n 'error': [message: string]\r\n}>()\r\n\r\nconst isDragging = ref(false)\r\nconst files = ref<UploadedFile[]>([])\r\nconst inputRef = ref<HTMLInputElement>()\r\n\r\nconst formatSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 B'\r\n const k = 1024\r\n const sizes = ['B', 'KB', 'MB', 'GB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]\r\n}\r\n\r\nconst validateFile = (file: File): string | null => {\r\n if (props.maxSize && file.size > props.maxSize) {\r\n return `File too large. Max size: ${formatSize(props.maxSize)}`\r\n }\r\n if (props.accept) {\r\n const acceptedTypes = props.accept.split(',').map((t) => t.trim())\r\n const fileType = file.type\r\n const fileExt = '.' + file.name.split('.').pop()?.toLowerCase()\r\n\r\n const isAccepted = acceptedTypes.some((type) => {\r\n if (type.startsWith('.')) {\r\n return fileExt === type.toLowerCase()\r\n }\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', '/'))\r\n }\r\n return fileType === type\r\n })\r\n\r\n if (!isAccepted) {\r\n return `File type not accepted`\r\n }\r\n }\r\n return null\r\n}\r\n\r\nconst addFiles = (newFiles: FileList | File[]) => {\r\n const fileArray = Array.from(newFiles)\r\n const validFiles: File[] = []\r\n\r\n for (const file of fileArray) {\r\n if (props.maxFiles && files.value.length + validFiles.length >= props.maxFiles) {\r\n emit('error', `Maximum ${props.maxFiles} files allowed`)\r\n break\r\n }\r\n\r\n const error = validateFile(file)\r\n if (error) {\r\n emit('error', `${file.name}: ${error}`)\r\n continue\r\n }\r\n\r\n validFiles.push(file)\r\n files.value.push({\r\n file,\r\n id: Math.random().toString(36).substring(2),\r\n progress: 0,\r\n status: 'pending',\r\n })\r\n }\r\n\r\n if (validFiles.length > 0) {\r\n emit('files-selected', validFiles)\r\n }\r\n}\r\n\r\nconst removeFile = (id: string) => {\r\n const index = files.value.findIndex((f) => f.id === id)\r\n if (index > -1) {\r\n const removed = files.value.splice(index, 1)[0]\r\n emit('file-removed', removed.file)\r\n }\r\n}\r\n\r\nconst handleDrop = (e: DragEvent) => {\r\n isDragging.value = false\r\n if (props.disabled || !e.dataTransfer?.files) return\r\n addFiles(e.dataTransfer.files)\r\n}\r\n\r\nconst handleDragOver = (e: DragEvent) => {\r\n e.preventDefault()\r\n if (!props.disabled) {\r\n isDragging.value = true\r\n }\r\n}\r\n\r\nconst handleDragLeave = () => {\r\n isDragging.value = false\r\n}\r\n\r\nconst handleClick = () => {\r\n if (!props.disabled) {\r\n inputRef.value?.click()\r\n }\r\n}\r\n\r\nconst handleInputChange = (e: Event) => {\r\n const target = e.target as HTMLInputElement\r\n if (target.files) {\r\n addFiles(target.files)\r\n target.value = ''\r\n }\r\n}\r\n\r\nconst dropzoneClasses = computed(() => {\r\n const base =\r\n 'relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors'\r\n if (props.disabled) {\r\n return `${base} border-gray-200 bg-gray-50 cursor-not-allowed dark:border-gray-700 dark:bg-gray-800`\r\n }\r\n if (isDragging.value) {\r\n return `${base} border-primary-500 bg-primary-50 dark:bg-primary-900/20`\r\n }\r\n return `${base} border-gray-300 hover:border-primary-400 hover:bg-gray-50 dark:border-gray-600 dark:hover:border-primary-500 dark:hover:bg-gray-800`\r\n})\r\n\r\nconst getFileIcon = (file: File): string => {\r\n if (file.type.startsWith('image/')) return 'heroicons:photo'\r\n if (file.type.startsWith('video/')) return 'heroicons:video-camera'\r\n if (file.type.startsWith('audio/')) return 'heroicons:musical-note'\r\n if (file.type.includes('pdf')) return 'heroicons:document-text'\r\n if (file.type.includes('zip') || file.type.includes('rar')) return 'heroicons:archive-box'\r\n return 'heroicons:document'\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-4\">\r\n <!-- Dropzone -->\r\n <div\r\n :class=\"dropzoneClasses\"\r\n @drop.prevent=\"handleDrop\"\r\n @dragover=\"handleDragOver\"\r\n @dragleave=\"handleDragLeave\"\r\n @click=\"handleClick\"\r\n >\r\n <input\r\n ref=\"inputRef\"\r\n type=\"file\"\r\n class=\"hidden\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n :disabled=\"disabled\"\r\n @change=\"handleInputChange\"\r\n />\r\n\r\n <div class=\"space-y-2\">\r\n <Icon\r\n icon=\"heroicons:cloud-arrow-up\"\r\n class=\"w-12 h-12 mx-auto text-gray-400\"\r\n :class=\"{ 'text-primary-500': isDragging }\"\r\n />\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n {{ label }}\r\n </p>\r\n <p v-if=\"description\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ description }}\r\n </p>\r\n <p v-if=\"maxSize\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n Max size: {{ formatSize(maxSize) }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- File list -->\r\n <ul v-if=\"files.length > 0\" class=\"space-y-2\">\r\n <li\r\n v-for=\"uploadedFile in files\"\r\n :key=\"uploadedFile.id\"\r\n class=\"flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg\"\r\n >\r\n <Icon :icon=\"getFileIcon(uploadedFile.file)\" class=\"w-8 h-8 text-gray-400\" />\r\n\r\n <div class=\"flex-1 min-w-0\">\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\r\n {{ uploadedFile.file.name }}\r\n </p>\r\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ formatSize(uploadedFile.file.size) }}\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"p-1 text-gray-400 hover:text-red-500 rounded\"\r\n @click.stop=\"removeFile(uploadedFile.id)\"\r\n >\r\n <Icon icon=\"heroicons:x-mark\" class=\"w-5 h-5\" />\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport type RatingSize = 'sm' | 'md' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current rating value */\r\n modelValue?: number\r\n /** Maximum rating */\r\n max?: number\r\n /** Allow half stars */\r\n allowHalf?: boolean\r\n /** Read only mode */\r\n readonly?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Size of stars */\r\n size?: RatingSize\r\n /** Icon for filled star */\r\n filledIcon?: string\r\n /** Icon for empty star */\r\n emptyIcon?: string\r\n /** Icon for half star */\r\n halfIcon?: string\r\n /** Color of filled stars */\r\n color?: string\r\n /** Show rating value */\r\n showValue?: boolean\r\n }>(),\r\n {\r\n modelValue: 0,\r\n max: 5,\r\n allowHalf: false,\r\n readonly: false,\r\n disabled: false,\r\n size: 'md',\r\n filledIcon: 'heroicons:star-solid',\r\n emptyIcon: 'heroicons:star',\r\n halfIcon: 'heroicons:star-solid',\r\n color: 'text-yellow-400',\r\n showValue: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number]\r\n}>()\r\n\r\nconst hoverValue = ref<number | null>(null)\r\n\r\nconst displayValue = computed(() => {\r\n return hoverValue.value !== null ? hoverValue.value : props.modelValue\r\n})\r\n\r\nconst sizeClasses = computed(() => {\r\n switch (props.size) {\r\n case 'sm':\r\n return 'w-4 h-4'\r\n case 'lg':\r\n return 'w-8 h-8'\r\n default:\r\n return 'w-6 h-6'\r\n }\r\n})\r\n\r\nconst getStarState = (index: number): 'full' | 'half' | 'empty' => {\r\n const value = displayValue.value\r\n if (value >= index) return 'full'\r\n if (props.allowHalf && value >= index - 0.5) return 'half'\r\n return 'empty'\r\n}\r\n\r\nconst handleClick = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst handleMouseMove = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n hoverValue.value = value\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n hoverValue.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"flex items-center\"\r\n @mouseleave=\"handleMouseLeave\"\r\n >\r\n <button\r\n v-for=\"index in max\"\r\n :key=\"index\"\r\n type=\"button\"\r\n class=\"relative focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1 rounded\"\r\n :class=\"[\r\n readonly || disabled ? 'cursor-default' : 'cursor-pointer',\r\n disabled && 'opacity-50',\r\n ]\"\r\n :disabled=\"readonly || disabled\"\r\n @click=\"handleClick(index, $event)\"\r\n @mousemove=\"handleMouseMove(index, $event)\"\r\n >\r\n <!-- Empty star (background) -->\r\n <Icon\r\n :icon=\"emptyIcon\"\r\n :class=\"[sizeClasses, 'text-gray-300 dark:text-gray-600']\"\r\n />\r\n\r\n <!-- Filled star (overlay) -->\r\n <div\r\n class=\"absolute inset-0 overflow-hidden\"\r\n :style=\"{\r\n width:\r\n getStarState(index) === 'full'\r\n ? '100%'\r\n : getStarState(index) === 'half'\r\n ? '50%'\r\n : '0%',\r\n }\"\r\n >\r\n <Icon\r\n :icon=\"filledIcon\"\r\n :class=\"[sizeClasses, color]\"\r\n />\r\n </div>\r\n </button>\r\n </div>\r\n\r\n <span\r\n v-if=\"showValue\"\r\n class=\"ml-2 text-sm font-medium text-gray-700 dark:text-gray-300\"\r\n >\r\n {{ modelValue.toFixed(allowHalf ? 1 : 0) }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current color value (hex) */\r\n modelValue?: string\r\n /** Predefined color swatches */\r\n swatches?: string[]\r\n /** Show custom color input */\r\n showInput?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Label */\r\n label?: string\r\n }>(),\r\n {\r\n modelValue: '#3b82f6',\r\n swatches: () => [\r\n '#ef4444', '#f97316', '#f59e0b', '#eab308', '#84cc16',\r\n '#22c55e', '#10b981', '#14b8a6', '#06b6d4', '#0ea5e9',\r\n '#3b82f6', '#6366f1', '#8b5cf6', '#a855f7', '#d946ef',\r\n '#ec4899', '#f43f5e', '#78716c', '#737373', '#000000',\r\n ],\r\n showInput: true,\r\n disabled: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst isOpen = ref(false)\r\nconst inputValue = ref(props.modelValue)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n inputValue.value = newValue\r\n },\r\n)\r\n\r\nconst selectColor = (color: string) => {\r\n emit('update:modelValue', color)\r\n inputValue.value = color\r\n}\r\n\r\nconst handleInputChange = () => {\r\n const color = inputValue.value\r\n // Validate hex color\r\n if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(color)) {\r\n emit('update:modelValue', color)\r\n }\r\n}\r\n\r\nconst handleNativeInput = (event: Event) => {\r\n const color = (event.target as HTMLInputElement).value\r\n emit('update:modelValue', color)\r\n inputValue.value = color\r\n}\r\n\r\nconst togglePicker = () => {\r\n if (!props.disabled) {\r\n isOpen.value = !isOpen.value\r\n }\r\n}\r\n\r\nconst closePicker = () => {\r\n isOpen.value = false\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative inline-block\">\r\n <label v-if=\"label\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {{ label }}\r\n </label>\r\n\r\n <!-- Trigger -->\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center gap-2 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\r\n :class=\"{ 'opacity-50 cursor-not-allowed': disabled }\"\r\n :disabled=\"disabled\"\r\n @click=\"togglePicker\"\r\n >\r\n <span\r\n class=\"w-6 h-6 rounded border border-gray-200 dark:border-gray-600\"\r\n :style=\"{ backgroundColor: modelValue }\"\r\n />\r\n <span class=\"text-sm font-mono text-gray-700 dark:text-gray-300\">\r\n {{ modelValue }}\r\n </span>\r\n <Icon\r\n icon=\"heroicons:chevron-down\"\r\n class=\"w-4 h-4 text-gray-400\"\r\n :class=\"{ 'rotate-180': isOpen }\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"absolute z-50 mt-2 p-3 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg\"\r\n @click.stop\r\n >\r\n <!-- Swatches -->\r\n <div class=\"grid grid-cols-5 gap-2 mb-3\">\r\n <button\r\n v-for=\"color in swatches\"\r\n :key=\"color\"\r\n type=\"button\"\r\n class=\"w-8 h-8 rounded-lg border-2 transition-transform hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1\"\r\n :class=\"[\r\n modelValue === color\r\n ? 'border-primary-500 ring-2 ring-primary-500 ring-offset-1'\r\n : 'border-transparent',\r\n ]\"\r\n :style=\"{ backgroundColor: color }\"\r\n :title=\"color\"\r\n @click=\"selectColor(color)\"\r\n >\r\n <Icon\r\n v-if=\"modelValue === color\"\r\n icon=\"heroicons:check\"\r\n class=\"w-4 h-4 mx-auto\"\r\n :class=\"[\r\n ['#ffffff', '#f9fafb', '#f3f4f6', '#e5e7eb', '#eab308', '#f59e0b'].includes(color)\r\n ? 'text-gray-800'\r\n : 'text-white',\r\n ]\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Custom input -->\r\n <div v-if=\"showInput\" class=\"flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700\">\r\n <input\r\n type=\"color\"\r\n :value=\"modelValue\"\r\n class=\"w-8 h-8 rounded cursor-pointer border-0 p-0\"\r\n @input=\"handleNativeInput\"\r\n />\r\n <input\r\n v-model=\"inputValue\"\r\n type=\"text\"\r\n class=\"flex-1 px-2 py-1 text-sm font-mono border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-white\"\r\n placeholder=\"#000000\"\r\n @change=\"handleInputChange\"\r\n @keyup.enter=\"handleInputChange\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n\r\n <!-- Click outside to close -->\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"fixed inset-0 z-40\"\r\n @click=\"closePicker\"\r\n />\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current range value [min, max] */\r\n modelValue?: [number, number]\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step increment */\r\n step?: number\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show value labels */\r\n showLabels?: boolean\r\n /** Show min/max labels */\r\n showMinMax?: boolean\r\n /** Format function for labels */\r\n formatLabel?: (value: number) => string\r\n }>(),\r\n {\r\n modelValue: () => [25, 75],\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n disabled: false,\r\n showLabels: true,\r\n showMinMax: true,\r\n formatLabel: (v: number) => v.toString(),\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: [number, number]]\r\n}>()\r\n\r\nconst sliderRef = ref<HTMLDivElement>()\r\nconst dragging = ref<'min' | 'max' | null>(null)\r\n\r\nconst minValue = computed(() => props.modelValue[0])\r\nconst maxValue = computed(() => props.modelValue[1])\r\n\r\nconst minPercent = computed(() => {\r\n return ((minValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst maxPercent = computed(() => {\r\n return ((maxValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst rangeStyle = computed(() => ({\r\n left: `${minPercent.value}%`,\r\n width: `${maxPercent.value - minPercent.value}%`,\r\n}))\r\n\r\nconst getValueFromPosition = (clientX: number): number => {\r\n if (!sliderRef.value) return props.min\r\n\r\n const rect = sliderRef.value.getBoundingClientRect()\r\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\r\n const rawValue = props.min + percent * (props.max - props.min)\r\n\r\n // Snap to step\r\n const steppedValue = Math.round(rawValue / props.step) * props.step\r\n return Math.max(props.min, Math.min(props.max, steppedValue))\r\n}\r\n\r\nconst updateValue = (handle: 'min' | 'max', newValue: number) => {\r\n const [currentMin, currentMax] = props.modelValue\r\n\r\n if (handle === 'min') {\r\n // Don't let min exceed max\r\n const clampedValue = Math.min(newValue, currentMax)\r\n emit('update:modelValue', [clampedValue, currentMax])\r\n } else {\r\n // Don't let max go below min\r\n const clampedValue = Math.max(newValue, currentMin)\r\n emit('update:modelValue', [currentMin, clampedValue])\r\n }\r\n}\r\n\r\nconst handleMouseDown = (handle: 'min' | 'max') => (event: MouseEvent) => {\r\n if (props.disabled) return\r\n event.preventDefault()\r\n dragging.value = handle\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (dragging.value) {\r\n const value = getValueFromPosition(e.clientX)\r\n updateValue(dragging.value, value)\r\n }\r\n }\r\n\r\n const handleMouseUp = () => {\r\n dragging.value = null\r\n document.removeEventListener('mousemove', handleMouseMove)\r\n document.removeEventListener('mouseup', handleMouseUp)\r\n }\r\n\r\n document.addEventListener('mousemove', handleMouseMove)\r\n document.addEventListener('mouseup', handleMouseUp)\r\n}\r\n\r\nconst handleTrackClick = (event: MouseEvent) => {\r\n if (props.disabled) return\r\n\r\n const value = getValueFromPosition(event.clientX)\r\n\r\n // Determine which handle to move based on proximity\r\n const distToMin = Math.abs(value - minValue.value)\r\n const distToMax = Math.abs(value - maxValue.value)\r\n\r\n if (distToMin <= distToMax) {\r\n updateValue('min', value)\r\n } else {\r\n updateValue('max', value)\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Labels row -->\r\n <div v-if=\"showLabels\" class=\"flex justify-between text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n <span>{{ formatLabel(minValue) }}</span>\r\n <span>{{ formatLabel(maxValue) }}</span>\r\n </div>\r\n\r\n <!-- Slider track -->\r\n <div\r\n ref=\"sliderRef\"\r\n class=\"relative h-2 rounded-full cursor-pointer\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-200 dark:bg-gray-700 cursor-not-allowed'\r\n : 'bg-gray-200 dark:bg-gray-700',\r\n ]\"\r\n @click=\"handleTrackClick\"\r\n >\r\n <!-- Active range -->\r\n <div\r\n class=\"absolute h-full rounded-full\"\r\n :class=\"[disabled ? 'bg-gray-400' : 'bg-primary-500']\"\r\n :style=\"rangeStyle\"\r\n />\r\n\r\n <!-- Min handle -->\r\n <div\r\n class=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'min' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${minPercent}%` }\"\r\n @mousedown=\"handleMouseDown('min')\"\r\n />\r\n\r\n <!-- Max handle -->\r\n <div\r\n class=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'max' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${maxPercent}%` }\"\r\n @mousedown=\"handleMouseDown('max')\"\r\n />\r\n </div>\r\n\r\n <!-- Min/Max labels -->\r\n <div v-if=\"showMinMax\" class=\"flex justify-between text-xs text-gray-500 dark:text-gray-400\">\r\n <span>{{ formatLabel(min) }}</span>\r\n <span>{{ formatLabel(max) }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_Fragment","_renderList","_hoisted_9","_hoisted_10","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2","_hoisted_8","_withModifiers","_normalizeStyle"],"mappings":"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"}
|
|
@@ -563,7 +563,7 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
|
|
|
563
563
|
};
|
|
564
564
|
}
|
|
565
565
|
});
|
|
566
|
-
const Slider = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$5, [["__scopeId", "data-v-
|
|
566
|
+
const Slider = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$5, [["__scopeId", "data-v-a411f1b4"]]);
|
|
567
567
|
const _hoisted_1$4 = { class: "relative" };
|
|
568
568
|
const _hoisted_2$4 = ["disabled"];
|
|
569
569
|
const _hoisted_3$4 = { class: "flex-1 truncate" };
|
|
@@ -1426,4 +1426,4 @@ exports._sfc_main$6 = _sfc_main$6;
|
|
|
1426
1426
|
exports._sfc_main$7 = _sfc_main$4;
|
|
1427
1427
|
exports._sfc_main$8 = _sfc_main$3;
|
|
1428
1428
|
exports._sfc_main$9 = _sfc_main$2;
|
|
1429
|
-
//# sourceMappingURL=RangeSlider.vue_vue_type_script_setup_true_lang-
|
|
1429
|
+
//# sourceMappingURL=RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Slider.vue","../src/components/form/DatePicker.vue","../src/components/form/FileUpload.vue","../src/components/form/Rating.vue","../src/components/form/ColorPicker.vue","../src/components/form/RangeSlider.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\r\ndefineProps<{\r\n error?: boolean\r\n text?: string\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <p\r\n :data-error=\"error\"\r\n class=\"mt-2 text-sm text-gray-400 peer-user-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\r\n >\r\n <slot>{{ text ?? '' }}</slot>\r\n </p>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport type { InputProps } from '@/types'\r\n\r\nwithDefaults(defineProps<InputProps>(), {\r\n type: 'text',\r\n})\r\n\r\nconst modelValue = defineModel<string>()\r\n</script>\r\n\r\n<template>\r\n <input\r\n :id=\"id ?? name ?? ''\"\r\n v-model=\"modelValue\"\r\n :disabled=\"disabled\"\r\n :name=\"name ?? ''\"\r\n :placeholder=\"placeholder\"\r\n :type=\"type\"\r\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm user-invalid:border-red-500 user-invalid:text-red-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:user-invalid:border-red-500 focus:user-invalid:ring-red-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\r\n v-bind=\"$attrs\"\r\n >\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, ref, watch, nextTick } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport type { SelectProps, SelectOption } from '@/types'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\n\r\nconst props = withDefaults(\r\n defineProps<\r\n SelectProps & {\r\n /** Use teleport to body to avoid overflow clipping */\r\n teleport?: boolean\r\n /** Show search input in dropdown */\r\n searchable?: boolean\r\n /** Text shown when no results match search */\r\n noResultsText?: string\r\n /** Custom class for the trigger button */\r\n triggerClass?: string\r\n }\r\n >(),\r\n {\r\n teleport: true,\r\n searchable: false,\r\n noResultsText: 'No results found',\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<string | number | boolean | null>()\r\n\r\nconst searchQuery = ref('')\r\nconst triggerRef = ref<HTMLElement>()\r\nconst dropdownRef = ref<HTMLElement>()\r\nconst searchInputRef = ref<HTMLInputElement>()\r\n\r\nconst {\r\n isOpen,\r\n highlightedIndex,\r\n dropdownStyle,\r\n open: openDropdown,\r\n close,\r\n handleKeydown: baseHandleKeydown,\r\n scrollToHighlighted,\r\n} = useDropdown(triggerRef, dropdownRef, {\r\n teleport: props.teleport,\r\n gap: 4,\r\n onClose: () => {\r\n searchQuery.value = ''\r\n },\r\n})\r\n\r\nconst visibleOptions = computed(() => {\r\n return (props.options ?? []).filter((opt) => !opt.hidden)\r\n})\r\n\r\nconst filteredOptions = computed(() => {\r\n if (!props.searchable || !searchQuery.value) {\r\n return visibleOptions.value\r\n }\r\n const query = searchQuery.value.toLowerCase()\r\n return visibleOptions.value.filter((opt) =>\r\n opt.label.toLowerCase().includes(query) ||\r\n String(opt.value).toLowerCase().includes(query)\r\n )\r\n})\r\n\r\nconst selectedOption = computed(() => {\r\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (selectedOption.value) {\r\n return selectedOption.value.label\r\n }\r\n return props.placeholder || 'Select...'\r\n})\r\n\r\nconst open = () => {\r\n if (props.disabled) return\r\n searchQuery.value = ''\r\n highlightedIndex.value = filteredOptions.value.findIndex(\r\n (opt) => opt.value === modelValue.value\r\n )\r\n openDropdown()\r\n nextTick(() => {\r\n if (props.searchable) {\r\n searchInputRef.value?.focus()\r\n }\r\n })\r\n}\r\n\r\nconst toggle = () => {\r\n if (isOpen.value) {\r\n close()\r\n } else {\r\n open()\r\n }\r\n}\r\n\r\nconst selectOption = (option: SelectOption) => {\r\n modelValue.value = option.value\r\n close()\r\n}\r\n\r\nconst handleKeydown = (event: KeyboardEvent) => {\r\n baseHandleKeydown(event, {\r\n itemCount: filteredOptions.value.length,\r\n onSelect: (index) => {\r\n if (filteredOptions.value[index]) {\r\n selectOption(filteredOptions.value[index])\r\n }\r\n },\r\n onOpen: open,\r\n handleOpenKeys: true,\r\n })\r\n if (isOpen.value) {\r\n scrollToHighlighted(dropdownRef.value ?? null)\r\n }\r\n}\r\n\r\nwatch(searchQuery, () => {\r\n highlightedIndex.value = 0\r\n})\r\n\r\nconst triggerClasses = computed(() => {\r\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\r\n const state = props.disabled\r\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950 dark:text-gray-500'\r\n : isOpen.value\r\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\r\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\r\n const text = selectedOption.value\r\n ? 'text-gray-800 dark:text-gray-200'\r\n : 'text-gray-400 dark:text-gray-500'\r\n return [base, state, text, props.triggerClass]\r\n})\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <!-- Trigger -->\r\n <button\r\n :id=\"id ?? name ?? undefined\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :class=\"triggerClasses\"\r\n @click=\"toggle\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n <slot\n name=\"selected\"\n :option=\"selectedOption\"\n :placeholder=\"placeholder\"\n >\r\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\r\n </slot>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"dropdownRef\"\r\n :style=\"dropdownStyle\"\r\n :class=\"[\r\n 'z-[9999] max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800',\r\n !teleport && 'absolute mt-1 w-full',\r\n ]\"\r\n >\r\n <!-- Search input -->\r\n <div\n v-if=\"searchable\"\n class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\"\n >\r\n <div class=\"flex items-center gap-2 rounded-md border border-gray-300 bg-gray-50 px-2 py-1.5 dark:border-gray-600 dark:bg-gray-900\">\r\n <Icon\n icon=\"lucide:search\"\n class=\"size-4 text-gray-400\"\n />\r\n <input\r\n ref=\"searchInputRef\"\r\n v-model=\"searchQuery\"\r\n type=\"text\"\r\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\r\n placeholder=\"Search...\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <!-- Empty state -->\r\n <div\r\n v-if=\"filteredOptions.length === 0\"\r\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\r\n >\r\n {{ noResultsText }}\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"py-1\">\r\n <button\r\n v-for=\"(option, index) in filteredOptions\"\r\n :key=\"String(option.value)\"\r\n type=\"button\"\r\n :data-index=\"index\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\r\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\r\n modelValue === option.value && 'bg-primary/10 text-primary',\r\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\r\n ]\"\r\n @click=\"selectOption(option)\"\r\n @mouseenter=\"highlightedIndex = index\"\r\n >\r\n <slot\n name=\"option\"\n :option=\"option\"\n :selected=\"modelValue === option.value\"\n :index=\"index\"\n >\r\n <Icon\r\n v-if=\"modelValue === option.value\"\r\n icon=\"lucide:check\"\r\n class=\"size-4 shrink-0 text-primary\"\r\n />\r\n <span\n v-else\n class=\"size-4 shrink-0\"\n />\r\n <span class=\"flex-1\">{{ option.label }}</span>\r\n </slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\nimport type { FormGroupProps } from '@/types'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormInput from './FormInput.vue'\r\nimport FormSelect from './FormSelect.vue'\r\nimport FormHelp from './FormHelp.vue'\r\n\r\nconst props = withDefaults(defineProps<FormGroupProps>(), {\r\n cols: 6,\r\n})\r\n\r\nconst modelValue = defineModel()\r\n\r\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\r\n\r\nconst isSelect = computed(() => props.select === true)\r\n</script>\r\n\r\n<template>\r\n <div\n :style=\"{ gridColumn: computedCols }\"\n :hidden=\"hidden\"\n >\r\n <slot>\r\n <slot name=\"label\">\r\n <FormLabel\n v-if=\"label\"\n :html-for=\"id ?? name\"\n :error=\"error\"\n >\r\n {{ label }}\r\n </FormLabel>\r\n </slot>\r\n\r\n <slot name=\"input\">\r\n <FormSelect\r\n v-if=\"isSelect\"\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n />\r\n <FormInput\r\n v-else\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n />\r\n </slot>\r\n\r\n <FormHelp\n v-if=\"error && typeof error === 'string'\"\n :error=\"true\"\n >\r\n {{ error }}\r\n </FormHelp>\r\n </slot>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon\n :icon=\"icon\"\n class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\"\n />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n >\n </div>\n</template>\n","<script lang=\"ts\" setup>\n\nconst props = withDefaults(\n defineProps<{\n /** v-model value */\n modelValue?: boolean\n /** Label text */\n label?: string\n /** Description text */\n description?: string\n /** Disabled state */\n disabled?: boolean\n /** Size variant */\n size?: 'sm' | 'md' | 'lg'\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\nconst toggle = () => {\n if (props.disabled) return\n emit('update:modelValue', !props.modelValue)\n}\n\nconst switchSizes = {\n sm: 'h-5 w-9',\n md: 'h-6 w-11',\n lg: 'h-7 w-14',\n}\n\nconst dotSizes = {\n sm: 'size-3',\n md: 'size-4',\n lg: 'size-5',\n}\n\nconst translateSizes = {\n sm: 'translate-x-5',\n md: 'translate-x-6',\n lg: 'translate-x-8',\n}\n</script>\n\n<template>\n <label\n class=\"inline-flex items-start gap-3\"\n :class=\"disabled ? 'cursor-not-allowed opacity-50' : 'cursor-pointer'\"\n >\n <button\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n />\n </button>\n <div\n v-if=\"label || description\"\n class=\"flex flex-col\"\n >\n <span\n v-if=\"label\"\n class=\"text-sm font-medium text-gray-900 dark:text-white\"\n >\n {{ label }}\n </span>\n <span\n v-if=\"description\"\n class=\"text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step increment */\r\n step?: number\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show value label */\r\n showValue?: boolean\r\n /** Format value for display */\r\n formatValue?: (value: number) => string\r\n }>(),\r\n {\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n disabled: false,\r\n showValue: false,\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<number>({ default: 0 })\r\n\r\nconst percentage = computed(() => {\r\n return ((modelValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (props.formatValue) {\r\n return props.formatValue(modelValue.value)\r\n }\r\n return modelValue.value.toString()\r\n})\r\n\r\nconst handleInput = (event: Event) => {\r\n const target = event.target as HTMLInputElement\r\n modelValue.value = Number(target.value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"w-full\">\r\n <div\n v-if=\"showValue\"\n class=\"mb-2 flex justify-between text-sm\"\n >\r\n <span class=\"text-gray-600 dark:text-gray-400\">{{ min }}</span>\r\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ displayValue }}</span>\r\n <span class=\"text-gray-600 dark:text-gray-400\">{{ max }}</span>\r\n </div>\r\n <div class=\"relative\">\r\n <input\r\n type=\"range\"\r\n :value=\"modelValue\"\r\n :min=\"min\"\r\n :max=\"max\"\r\n :step=\"step\"\r\n :disabled=\"disabled\"\r\n class=\"slider-input w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed disabled:opacity-50\"\r\n @input=\"handleInput\"\r\n >\r\n <div class=\"pointer-events-none absolute inset-y-0 left-0 flex items-center\">\r\n <div\r\n class=\"h-2 rounded-full bg-primary\"\r\n :style=\"{ width: `${percentage}%` }\"\r\n />\r\n </div>\r\n </div>\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.slider-input {\r\n height: 0.5rem;\r\n}\r\n\r\n.slider-input::-webkit-slider-runnable-track {\r\n height: 0.5rem;\r\n border-radius: 9999px;\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.dark .slider-input::-webkit-slider-runnable-track {\r\n background-color: #374151;\r\n}\r\n\r\n.slider-input::-webkit-slider-thumb {\r\n -webkit-appearance: none;\r\n appearance: none;\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n border-radius: 9999px;\r\n background-color: var(--color-primary, #3b82f6);\r\n border: 2px solid white;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n margin-top: -0.375rem;\r\n cursor: pointer;\r\n}\r\n\r\n.slider-input::-moz-range-track {\r\n height: 0.5rem;\r\n border-radius: 9999px;\r\n background-color: #e5e7eb;\r\n}\r\n\r\n.dark .slider-input::-moz-range-track {\r\n background-color: #374151;\r\n}\r\n\r\n.slider-input::-moz-range-thumb {\r\n width: 1.25rem;\r\n height: 1.25rem;\r\n border-radius: 9999px;\r\n background-color: var(--color-primary, #3b82f6);\r\n border: 2px solid white;\r\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.2);\r\n cursor: pointer;\r\n}\r\n\r\n.slider-input:focus::-webkit-slider-thumb {\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);\r\n}\r\n\r\n.slider-input:focus::-moz-range-thumb {\r\n box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.3);\r\n}\r\n</style>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Date format for display */\r\n format?: string\r\n /** Locale for formatting */\r\n locale?: string\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Minimum selectable date */\r\n minDate?: Date\r\n /** Maximum selectable date */\r\n maxDate?: Date\r\n /** Use teleport */\r\n teleport?: boolean\r\n }>(),\r\n {\r\n placeholder: 'Select date',\r\n format: 'short',\r\n locale: 'en-US',\r\n disabled: false,\r\n teleport: true,\r\n },\r\n)\r\n\r\nconst modelValue = defineModel<Date | null>({ default: null })\r\n\r\nconst triggerRef = ref<HTMLElement>()\r\nconst calendarRef = ref<HTMLElement>()\r\n\r\nconst { isOpen, dropdownStyle, toggle, close } = useDropdown(triggerRef, calendarRef, {\r\n teleport: props.teleport,\r\n gap: 4,\r\n})\r\n\r\nconst currentMonth = ref(modelValue.value ? new Date(modelValue.value) : new Date())\r\n\r\nconst weekDays = computed(() => {\r\n const days = []\r\n const formatter = new Intl.DateTimeFormat(props.locale, { weekday: 'short' })\r\n for (let i = 0; i < 7; i++) {\r\n const date = new Date(2024, 0, i) // Jan 2024 starts on Monday\r\n days.push(formatter.format(date))\r\n }\r\n return days\r\n})\r\n\r\nconst monthYear = computed(() => {\r\n const formatter = new Intl.DateTimeFormat(props.locale, { month: 'long', year: 'numeric' })\r\n return formatter.format(currentMonth.value)\r\n})\r\n\r\nconst calendarDays = computed(() => {\r\n const year = currentMonth.value.getFullYear()\r\n const month = currentMonth.value.getMonth()\r\n\r\n const firstDay = new Date(year, month, 1)\r\n const lastDay = new Date(year, month + 1, 0)\r\n\r\n const days: Array<{ date: Date; isCurrentMonth: boolean; isToday: boolean; isSelected: boolean; isDisabled: boolean }> = []\r\n\r\n // Get the day of week for the first day (0 = Sunday)\r\n let startDay = firstDay.getDay()\r\n // Adjust for Monday start\r\n startDay = startDay === 0 ? 6 : startDay - 1\r\n\r\n // Previous month days\r\n for (let i = startDay - 1; i >= 0; i--) {\r\n const date = new Date(year, month, -i)\r\n days.push({\r\n date,\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isSelected: false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n // Current month days\r\n const today = new Date()\r\n for (let i = 1; i <= lastDay.getDate(); i++) {\r\n const date = new Date(year, month, i)\r\n days.push({\r\n date,\r\n isCurrentMonth: true,\r\n isToday: isSameDay(date, today),\r\n isSelected: modelValue.value ? isSameDay(date, modelValue.value) : false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n // Next month days\r\n const remainingDays = 42 - days.length\r\n for (let i = 1; i <= remainingDays; i++) {\r\n const date = new Date(year, month + 1, i)\r\n days.push({\r\n date,\r\n isCurrentMonth: false,\r\n isToday: false,\r\n isSelected: false,\r\n isDisabled: isDateDisabled(date),\r\n })\r\n }\r\n\r\n return days\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (!modelValue.value) return ''\r\n const formatter = new Intl.DateTimeFormat(props.locale, {\r\n dateStyle: props.format as 'short' | 'medium' | 'long' | 'full',\r\n })\r\n return formatter.format(modelValue.value)\r\n})\r\n\r\nconst isSameDay = (a: Date, b: Date) => {\r\n return (\r\n a.getFullYear() === b.getFullYear() &&\r\n a.getMonth() === b.getMonth() &&\r\n a.getDate() === b.getDate()\r\n )\r\n}\r\n\r\nconst isDateDisabled = (date: Date) => {\r\n if (props.minDate && date < props.minDate) return true\r\n if (props.maxDate && date > props.maxDate) return true\r\n return false\r\n}\r\n\r\nconst prevMonth = () => {\r\n currentMonth.value = new Date(currentMonth.value.getFullYear(), currentMonth.value.getMonth() - 1, 1)\r\n}\r\n\r\nconst nextMonth = () => {\r\n currentMonth.value = new Date(currentMonth.value.getFullYear(), currentMonth.value.getMonth() + 1, 1)\r\n}\r\n\r\nconst selectDate = (day: typeof calendarDays.value[0]) => {\r\n if (day.isDisabled) return\r\n modelValue.value = day.date\r\n close()\r\n}\r\n\r\nconst clear = () => {\r\n modelValue.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <button\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :class=\"[\r\n 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition',\r\n disabled\r\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950'\r\n : isOpen\r\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\r\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900',\r\n modelValue ? 'text-gray-900 dark:text-white' : 'text-gray-400 dark:text-gray-500',\r\n ]\"\r\n @click=\"toggle\"\r\n >\r\n <span class=\"flex-1 truncate\">{{ displayValue || placeholder }}</span>\r\n <div class=\"flex items-center gap-1\">\r\n <button\r\n v-if=\"modelValue\"\r\n type=\"button\"\r\n class=\"rounded p-0.5 hover:bg-gray-100 dark:hover:bg-gray-800\"\r\n @click.stop=\"clear\"\r\n >\r\n <Icon\n icon=\"lucide:x\"\n class=\"size-4 text-gray-400\"\n />\r\n </button>\r\n <Icon\n icon=\"lucide:calendar\"\n class=\"size-4 text-gray-400\"\n />\r\n </div>\r\n </button>\r\n\r\n <Teleport\n to=\"body\"\n :disabled=\"!teleport\"\n >\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n ref=\"calendarRef\"\r\n :style=\"dropdownStyle\"\r\n class=\"z-[9999] w-72 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800\"\r\n >\r\n <!-- Header -->\r\n <div class=\"mb-4 flex items-center justify-between\">\r\n <button\r\n type=\"button\"\r\n class=\"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700\"\r\n @click=\"prevMonth\"\r\n >\r\n <Icon\n icon=\"lucide:chevron-left\"\n class=\"size-5 text-gray-600 dark:text-gray-400\"\n />\r\n </button>\r\n <span class=\"font-medium text-gray-900 dark:text-white\">{{ monthYear }}</span>\r\n <button\r\n type=\"button\"\r\n class=\"rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700\"\r\n @click=\"nextMonth\"\r\n >\r\n <Icon\n icon=\"lucide:chevron-right\"\n class=\"size-5 text-gray-600 dark:text-gray-400\"\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Week days -->\r\n <div class=\"mb-2 grid grid-cols-7 gap-1\">\r\n <div\r\n v-for=\"day in weekDays\"\r\n :key=\"day\"\r\n class=\"text-center text-xs font-medium text-gray-500 dark:text-gray-400\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days grid -->\r\n <div class=\"grid grid-cols-7 gap-1\">\r\n <button\r\n v-for=\"(day, index) in calendarDays\"\r\n :key=\"index\"\r\n type=\"button\"\r\n :disabled=\"day.isDisabled\"\r\n :class=\"[\r\n 'h-8 w-8 rounded text-sm transition',\r\n day.isDisabled && 'cursor-not-allowed opacity-30',\r\n !day.isCurrentMonth && 'text-gray-400 dark:text-gray-600',\r\n day.isCurrentMonth && !day.isSelected && !day.isToday && 'text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700',\r\n day.isToday && !day.isSelected && 'bg-gray-100 font-semibold text-gray-900 dark:bg-gray-700 dark:text-white',\r\n day.isSelected && 'bg-primary text-white font-semibold',\r\n ]\"\r\n @click=\"selectDate(day)\"\r\n >\r\n {{ day.date.getDate() }}\r\n </button>\r\n </div>\r\n\r\n <!-- Today button -->\r\n <div class=\"mt-4 border-t border-gray-200 pt-3 dark:border-gray-700\">\r\n <button\r\n type=\"button\"\r\n class=\"w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10\"\r\n @click=\"selectDate({ date: new Date(), isCurrentMonth: true, isToday: true, isSelected: false, isDisabled: false })\"\r\n >\r\n Today\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport interface UploadedFile {\r\n file: File\r\n id: string\r\n progress: number\r\n status: 'pending' | 'uploading' | 'success' | 'error'\r\n error?: string\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Accepted file types (e.g., 'image/*,.pdf') */\r\n accept?: string\r\n /** Allow multiple files */\r\n multiple?: boolean\r\n /** Maximum file size in bytes */\r\n maxSize?: number\r\n /** Maximum number of files */\r\n maxFiles?: number\r\n /** Disable the upload */\r\n disabled?: boolean\r\n /** Custom label text */\r\n label?: string\r\n /** Custom description text */\r\n description?: string\r\n }>(),\r\n {\r\n multiple: false,\r\n disabled: false,\r\n label: 'Drop files here or click to upload',\r\n description: '',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'files-selected': [files: File[]]\r\n 'file-removed': [file: File]\r\n 'error': [message: string]\r\n}>()\r\n\r\nconst isDragging = ref(false)\r\nconst files = ref<UploadedFile[]>([])\r\nconst inputRef = ref<HTMLInputElement>()\r\n\r\nconst formatSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 B'\r\n const k = 1024\r\n const sizes = ['B', 'KB', 'MB', 'GB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]\r\n}\r\n\r\nconst validateFile = (file: File): string | null => {\r\n if (props.maxSize && file.size > props.maxSize) {\r\n return `File too large. Max size: ${formatSize(props.maxSize)}`\r\n }\r\n if (props.accept) {\r\n const acceptedTypes = props.accept.split(',').map((t) => t.trim())\r\n const fileType = file.type\r\n const fileExt = '.' + file.name.split('.').pop()?.toLowerCase()\r\n\r\n const isAccepted = acceptedTypes.some((type) => {\r\n if (type.startsWith('.')) {\r\n return fileExt === type.toLowerCase()\r\n }\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', '/'))\r\n }\r\n return fileType === type\r\n })\r\n\r\n if (!isAccepted) {\r\n return `File type not accepted`\r\n }\r\n }\r\n return null\r\n}\r\n\r\nconst addFiles = (newFiles: FileList | File[]) => {\r\n const fileArray = Array.from(newFiles)\r\n const validFiles: File[] = []\r\n\r\n for (const file of fileArray) {\r\n if (props.maxFiles && files.value.length + validFiles.length >= props.maxFiles) {\r\n emit('error', `Maximum ${props.maxFiles} files allowed`)\r\n break\r\n }\r\n\r\n const error = validateFile(file)\r\n if (error) {\r\n emit('error', `${file.name}: ${error}`)\r\n continue\r\n }\r\n\r\n validFiles.push(file)\r\n files.value.push({\r\n file,\r\n id: Math.random().toString(36).substring(2),\r\n progress: 0,\r\n status: 'pending',\r\n })\r\n }\r\n\r\n if (validFiles.length > 0) {\r\n emit('files-selected', validFiles)\r\n }\r\n}\r\n\r\nconst removeFile = (id: string) => {\r\n const index = files.value.findIndex((f) => f.id === id)\r\n if (index > -1) {\r\n const removed = files.value.splice(index, 1)[0]\r\n emit('file-removed', removed.file)\r\n }\r\n}\r\n\r\nconst handleDrop = (e: DragEvent) => {\r\n isDragging.value = false\r\n if (props.disabled || !e.dataTransfer?.files) return\r\n addFiles(e.dataTransfer.files)\r\n}\r\n\r\nconst handleDragOver = (e: DragEvent) => {\r\n e.preventDefault()\r\n if (!props.disabled) {\r\n isDragging.value = true\r\n }\r\n}\r\n\r\nconst handleDragLeave = () => {\r\n isDragging.value = false\r\n}\r\n\r\nconst handleClick = () => {\r\n if (!props.disabled) {\r\n inputRef.value?.click()\r\n }\r\n}\r\n\r\nconst handleInputChange = (e: Event) => {\r\n const target = e.target as HTMLInputElement\r\n if (target.files) {\r\n addFiles(target.files)\r\n target.value = ''\r\n }\r\n}\r\n\r\nconst dropzoneClasses = computed(() => {\r\n const base =\r\n 'relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors'\r\n if (props.disabled) {\r\n return `${base} border-gray-200 bg-gray-50 cursor-not-allowed dark:border-gray-700 dark:bg-gray-800`\r\n }\r\n if (isDragging.value) {\r\n return `${base} border-primary-500 bg-primary-50 dark:bg-primary-900/20`\r\n }\r\n return `${base} border-gray-300 hover:border-primary-400 hover:bg-gray-50 dark:border-gray-600 dark:hover:border-primary-500 dark:hover:bg-gray-800`\r\n})\r\n\r\nconst getFileIcon = (file: File): string => {\r\n if (file.type.startsWith('image/')) return 'heroicons:photo'\r\n if (file.type.startsWith('video/')) return 'heroicons:video-camera'\r\n if (file.type.startsWith('audio/')) return 'heroicons:musical-note'\r\n if (file.type.includes('pdf')) return 'heroicons:document-text'\r\n if (file.type.includes('zip') || file.type.includes('rar')) return 'heroicons:archive-box'\r\n return 'heroicons:document'\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-4\">\r\n <!-- Dropzone -->\r\n <div\r\n :class=\"dropzoneClasses\"\r\n @drop.prevent=\"handleDrop\"\r\n @dragover=\"handleDragOver\"\r\n @dragleave=\"handleDragLeave\"\r\n @click=\"handleClick\"\r\n >\r\n <input\r\n ref=\"inputRef\"\r\n type=\"file\"\r\n class=\"hidden\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n :disabled=\"disabled\"\r\n @change=\"handleInputChange\"\r\n />\r\n\r\n <div class=\"space-y-2\">\r\n <Icon\r\n icon=\"heroicons:cloud-arrow-up\"\r\n class=\"w-12 h-12 mx-auto text-gray-400\"\r\n :class=\"{ 'text-primary-500': isDragging }\"\r\n />\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n {{ label }}\r\n </p>\r\n <p v-if=\"description\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ description }}\r\n </p>\r\n <p v-if=\"maxSize\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n Max size: {{ formatSize(maxSize) }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- File list -->\r\n <ul v-if=\"files.length > 0\" class=\"space-y-2\">\r\n <li\r\n v-for=\"uploadedFile in files\"\r\n :key=\"uploadedFile.id\"\r\n class=\"flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg\"\r\n >\r\n <Icon :icon=\"getFileIcon(uploadedFile.file)\" class=\"w-8 h-8 text-gray-400\" />\r\n\r\n <div class=\"flex-1 min-w-0\">\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\r\n {{ uploadedFile.file.name }}\r\n </p>\r\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ formatSize(uploadedFile.file.size) }}\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"p-1 text-gray-400 hover:text-red-500 rounded\"\r\n @click.stop=\"removeFile(uploadedFile.id)\"\r\n >\r\n <Icon icon=\"heroicons:x-mark\" class=\"w-5 h-5\" />\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport type RatingSize = 'sm' | 'md' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current rating value */\r\n modelValue?: number\r\n /** Maximum rating */\r\n max?: number\r\n /** Allow half stars */\r\n allowHalf?: boolean\r\n /** Read only mode */\r\n readonly?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Size of stars */\r\n size?: RatingSize\r\n /** Icon for filled star */\r\n filledIcon?: string\r\n /** Icon for empty star */\r\n emptyIcon?: string\r\n /** Icon for half star */\r\n halfIcon?: string\r\n /** Color of filled stars */\r\n color?: string\r\n /** Show rating value */\r\n showValue?: boolean\r\n }>(),\r\n {\r\n modelValue: 0,\r\n max: 5,\r\n allowHalf: false,\r\n readonly: false,\r\n disabled: false,\r\n size: 'md',\r\n filledIcon: 'heroicons:star-solid',\r\n emptyIcon: 'heroicons:star',\r\n halfIcon: 'heroicons:star-solid',\r\n color: 'text-yellow-400',\r\n showValue: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number]\r\n}>()\r\n\r\nconst hoverValue = ref<number | null>(null)\r\n\r\nconst displayValue = computed(() => {\r\n return hoverValue.value !== null ? hoverValue.value : props.modelValue\r\n})\r\n\r\nconst sizeClasses = computed(() => {\r\n switch (props.size) {\r\n case 'sm':\r\n return 'w-4 h-4'\r\n case 'lg':\r\n return 'w-8 h-8'\r\n default:\r\n return 'w-6 h-6'\r\n }\r\n})\r\n\r\nconst getStarState = (index: number): 'full' | 'half' | 'empty' => {\r\n const value = displayValue.value\r\n if (value >= index) return 'full'\r\n if (props.allowHalf && value >= index - 0.5) return 'half'\r\n return 'empty'\r\n}\r\n\r\nconst handleClick = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst handleMouseMove = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n hoverValue.value = value\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n hoverValue.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"flex items-center\"\r\n @mouseleave=\"handleMouseLeave\"\r\n >\r\n <button\r\n v-for=\"index in max\"\r\n :key=\"index\"\r\n type=\"button\"\r\n class=\"relative focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1 rounded\"\r\n :class=\"[\r\n readonly || disabled ? 'cursor-default' : 'cursor-pointer',\r\n disabled && 'opacity-50',\r\n ]\"\r\n :disabled=\"readonly || disabled\"\r\n @click=\"handleClick(index, $event)\"\r\n @mousemove=\"handleMouseMove(index, $event)\"\r\n >\r\n <!-- Empty star (background) -->\r\n <Icon\r\n :icon=\"emptyIcon\"\r\n :class=\"[sizeClasses, 'text-gray-300 dark:text-gray-600']\"\r\n />\r\n\r\n <!-- Filled star (overlay) -->\r\n <div\r\n class=\"absolute inset-0 overflow-hidden\"\r\n :style=\"{\r\n width:\r\n getStarState(index) === 'full'\r\n ? '100%'\r\n : getStarState(index) === 'half'\r\n ? '50%'\r\n : '0%',\r\n }\"\r\n >\r\n <Icon\r\n :icon=\"filledIcon\"\r\n :class=\"[sizeClasses, color]\"\r\n />\r\n </div>\r\n </button>\r\n </div>\r\n\r\n <span\r\n v-if=\"showValue\"\r\n class=\"ml-2 text-sm font-medium text-gray-700 dark:text-gray-300\"\r\n >\r\n {{ modelValue.toFixed(allowHalf ? 1 : 0) }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, watch } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current color value (hex) */\r\n modelValue?: string\r\n /** Predefined color swatches */\r\n swatches?: string[]\r\n /** Show custom color input */\r\n showInput?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Label */\r\n label?: string\r\n }>(),\r\n {\r\n modelValue: '#3b82f6',\r\n swatches: () => [\r\n '#ef4444', '#f97316', '#f59e0b', '#eab308', '#84cc16',\r\n '#22c55e', '#10b981', '#14b8a6', '#06b6d4', '#0ea5e9',\r\n '#3b82f6', '#6366f1', '#8b5cf6', '#a855f7', '#d946ef',\r\n '#ec4899', '#f43f5e', '#78716c', '#737373', '#000000',\r\n ],\r\n showInput: true,\r\n disabled: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst isOpen = ref(false)\r\nconst inputValue = ref(props.modelValue)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (newValue) => {\r\n inputValue.value = newValue\r\n },\r\n)\r\n\r\nconst selectColor = (color: string) => {\r\n emit('update:modelValue', color)\r\n inputValue.value = color\r\n}\r\n\r\nconst handleInputChange = () => {\r\n const color = inputValue.value\r\n // Validate hex color\r\n if (/^#([0-9A-Fa-f]{3}){1,2}$/.test(color)) {\r\n emit('update:modelValue', color)\r\n }\r\n}\r\n\r\nconst handleNativeInput = (event: Event) => {\r\n const color = (event.target as HTMLInputElement).value\r\n emit('update:modelValue', color)\r\n inputValue.value = color\r\n}\r\n\r\nconst togglePicker = () => {\r\n if (!props.disabled) {\r\n isOpen.value = !isOpen.value\r\n }\r\n}\r\n\r\nconst closePicker = () => {\r\n isOpen.value = false\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative inline-block\">\r\n <label v-if=\"label\" class=\"block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1\">\r\n {{ label }}\r\n </label>\r\n\r\n <!-- Trigger -->\r\n <button\r\n type=\"button\"\r\n class=\"flex items-center gap-2 px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-lg bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 transition-colors\"\r\n :class=\"{ 'opacity-50 cursor-not-allowed': disabled }\"\r\n :disabled=\"disabled\"\r\n @click=\"togglePicker\"\r\n >\r\n <span\r\n class=\"w-6 h-6 rounded border border-gray-200 dark:border-gray-600\"\r\n :style=\"{ backgroundColor: modelValue }\"\r\n />\r\n <span class=\"text-sm font-mono text-gray-700 dark:text-gray-300\">\r\n {{ modelValue }}\r\n </span>\r\n <Icon\r\n icon=\"heroicons:chevron-down\"\r\n class=\"w-4 h-4 text-gray-400\"\r\n :class=\"{ 'rotate-180': isOpen }\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"opacity-0 scale-95\"\r\n enter-to-class=\"opacity-100 scale-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"opacity-100 scale-100\"\r\n leave-to-class=\"opacity-0 scale-95\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"absolute z-50 mt-2 p-3 bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-lg shadow-lg\"\r\n @click.stop\r\n >\r\n <!-- Swatches -->\r\n <div class=\"grid grid-cols-5 gap-2 mb-3\">\r\n <button\r\n v-for=\"color in swatches\"\r\n :key=\"color\"\r\n type=\"button\"\r\n class=\"w-8 h-8 rounded-lg border-2 transition-transform hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1\"\r\n :class=\"[\r\n modelValue === color\r\n ? 'border-primary-500 ring-2 ring-primary-500 ring-offset-1'\r\n : 'border-transparent',\r\n ]\"\r\n :style=\"{ backgroundColor: color }\"\r\n :title=\"color\"\r\n @click=\"selectColor(color)\"\r\n >\r\n <Icon\r\n v-if=\"modelValue === color\"\r\n icon=\"heroicons:check\"\r\n class=\"w-4 h-4 mx-auto\"\r\n :class=\"[\r\n ['#ffffff', '#f9fafb', '#f3f4f6', '#e5e7eb', '#eab308', '#f59e0b'].includes(color)\r\n ? 'text-gray-800'\r\n : 'text-white',\r\n ]\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Custom input -->\r\n <div v-if=\"showInput\" class=\"flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700\">\r\n <input\r\n type=\"color\"\r\n :value=\"modelValue\"\r\n class=\"w-8 h-8 rounded cursor-pointer border-0 p-0\"\r\n @input=\"handleNativeInput\"\r\n />\r\n <input\r\n v-model=\"inputValue\"\r\n type=\"text\"\r\n class=\"flex-1 px-2 py-1 text-sm font-mono border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-white\"\r\n placeholder=\"#000000\"\r\n @change=\"handleInputChange\"\r\n @keyup.enter=\"handleInputChange\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n\r\n <!-- Click outside to close -->\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"fixed inset-0 z-40\"\r\n @click=\"closePicker\"\r\n />\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current range value [min, max] */\r\n modelValue?: [number, number]\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step increment */\r\n step?: number\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show value labels */\r\n showLabels?: boolean\r\n /** Show min/max labels */\r\n showMinMax?: boolean\r\n /** Format function for labels */\r\n formatLabel?: (value: number) => string\r\n }>(),\r\n {\r\n modelValue: () => [25, 75],\r\n min: 0,\r\n max: 100,\r\n step: 1,\r\n disabled: false,\r\n showLabels: true,\r\n showMinMax: true,\r\n formatLabel: (v: number) => v.toString(),\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: [number, number]]\r\n}>()\r\n\r\nconst sliderRef = ref<HTMLDivElement>()\r\nconst dragging = ref<'min' | 'max' | null>(null)\r\n\r\nconst minValue = computed(() => props.modelValue[0])\r\nconst maxValue = computed(() => props.modelValue[1])\r\n\r\nconst minPercent = computed(() => {\r\n return ((minValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst maxPercent = computed(() => {\r\n return ((maxValue.value - props.min) / (props.max - props.min)) * 100\r\n})\r\n\r\nconst rangeStyle = computed(() => ({\r\n left: `${minPercent.value}%`,\r\n width: `${maxPercent.value - minPercent.value}%`,\r\n}))\r\n\r\nconst getValueFromPosition = (clientX: number): number => {\r\n if (!sliderRef.value) return props.min\r\n\r\n const rect = sliderRef.value.getBoundingClientRect()\r\n const percent = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width))\r\n const rawValue = props.min + percent * (props.max - props.min)\r\n\r\n // Snap to step\r\n const steppedValue = Math.round(rawValue / props.step) * props.step\r\n return Math.max(props.min, Math.min(props.max, steppedValue))\r\n}\r\n\r\nconst updateValue = (handle: 'min' | 'max', newValue: number) => {\r\n const [currentMin, currentMax] = props.modelValue\r\n\r\n if (handle === 'min') {\r\n // Don't let min exceed max\r\n const clampedValue = Math.min(newValue, currentMax)\r\n emit('update:modelValue', [clampedValue, currentMax])\r\n } else {\r\n // Don't let max go below min\r\n const clampedValue = Math.max(newValue, currentMin)\r\n emit('update:modelValue', [currentMin, clampedValue])\r\n }\r\n}\r\n\r\nconst handleMouseDown = (handle: 'min' | 'max') => (event: MouseEvent) => {\r\n if (props.disabled) return\r\n event.preventDefault()\r\n dragging.value = handle\r\n\r\n const handleMouseMove = (e: MouseEvent) => {\r\n if (dragging.value) {\r\n const value = getValueFromPosition(e.clientX)\r\n updateValue(dragging.value, value)\r\n }\r\n }\r\n\r\n const handleMouseUp = () => {\r\n dragging.value = null\r\n document.removeEventListener('mousemove', handleMouseMove)\r\n document.removeEventListener('mouseup', handleMouseUp)\r\n }\r\n\r\n document.addEventListener('mousemove', handleMouseMove)\r\n document.addEventListener('mouseup', handleMouseUp)\r\n}\r\n\r\nconst handleTrackClick = (event: MouseEvent) => {\r\n if (props.disabled) return\r\n\r\n const value = getValueFromPosition(event.clientX)\r\n\r\n // Determine which handle to move based on proximity\r\n const distToMin = Math.abs(value - minValue.value)\r\n const distToMax = Math.abs(value - maxValue.value)\r\n\r\n if (distToMin <= distToMax) {\r\n updateValue('min', value)\r\n } else {\r\n updateValue('max', value)\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-2\">\r\n <!-- Labels row -->\r\n <div v-if=\"showLabels\" class=\"flex justify-between text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n <span>{{ formatLabel(minValue) }}</span>\r\n <span>{{ formatLabel(maxValue) }}</span>\r\n </div>\r\n\r\n <!-- Slider track -->\r\n <div\r\n ref=\"sliderRef\"\r\n class=\"relative h-2 rounded-full cursor-pointer\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-200 dark:bg-gray-700 cursor-not-allowed'\r\n : 'bg-gray-200 dark:bg-gray-700',\r\n ]\"\r\n @click=\"handleTrackClick\"\r\n >\r\n <!-- Active range -->\r\n <div\r\n class=\"absolute h-full rounded-full\"\r\n :class=\"[disabled ? 'bg-gray-400' : 'bg-primary-500']\"\r\n :style=\"rangeStyle\"\r\n />\r\n\r\n <!-- Min handle -->\r\n <div\r\n class=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'min' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${minPercent}%` }\"\r\n @mousedown=\"handleMouseDown('min')\"\r\n />\r\n\r\n <!-- Max handle -->\r\n <div\r\n class=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'max' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${maxPercent}%` }\"\r\n @mousedown=\"handleMouseDown('max')\"\r\n />\r\n </div>\r\n\r\n <!-- Min/Max labels -->\r\n <div v-if=\"showMinMax\" class=\"flex justify-between text-xs text-gray-500 dark:text-gray-400\">\r\n <span>{{ formatLabel(min) }}</span>\r\n <span>{{ formatLabel(max) }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","ref","useDropdown","computed","nextTick","watch","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","Icon","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_hoisted_5","_hoisted_6","_hoisted_7","_Fragment","_renderList","_hoisted_9","_hoisted_10","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2","_hoisted_8","_withModifiers","_normalizeStyle"],"mappings":"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"}
|