cisse-vue-ui 0.1.10 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +162 -8
  2. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js +54 -0
  3. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js.map +1 -0
  4. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs +53 -0
  5. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs.map +1 -0
  6. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs → CollapsibleCard.vue_vue_type_script_setup_true_lang-Cs6KGC-0.cjs} +398 -79
  7. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Cs6KGC-0.cjs.map +1 -0
  8. package/dist/{CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js → CollapsibleCard.vue_vue_type_script_setup_true_lang-DTGAuLCh.js} +406 -87
  9. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-DTGAuLCh.js.map +1 -0
  10. package/dist/{Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js → Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js} +44 -94
  11. package/dist/Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map +1 -0
  12. package/dist/{Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs → Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs} +44 -94
  13. package/dist/Switch.vue_vue_type_script_setup_true_lang-V-FtNcTd.cjs.map +1 -0
  14. package/dist/components/core/MobileList.vue.d.ts +80 -0
  15. package/dist/components/core/ResponsiveList.vue.d.ts +115 -0
  16. package/dist/components/core/TableComponent.vue.d.ts +26 -28
  17. package/dist/components/core/index.cjs +11 -9
  18. package/dist/components/core/index.cjs.map +1 -1
  19. package/dist/components/core/index.d.ts +4 -0
  20. package/dist/components/core/index.js +11 -9
  21. package/dist/components/form/index.cjs +10 -9
  22. package/dist/components/form/index.cjs.map +1 -1
  23. package/dist/components/form/index.js +3 -2
  24. package/dist/components/form/index.js.map +1 -1
  25. package/dist/components/index.cjs +21 -18
  26. package/dist/components/index.cjs.map +1 -1
  27. package/dist/components/index.js +18 -15
  28. package/dist/components/index.js.map +1 -1
  29. package/dist/index-Ck4eaNes.js +51 -0
  30. package/dist/index-Ck4eaNes.js.map +1 -0
  31. package/dist/{index-m8Oi-7YC.cjs → index-c27X2k2e.cjs} +22 -19
  32. package/dist/index-c27X2k2e.cjs.map +1 -0
  33. package/dist/index.cjs +22 -19
  34. package/dist/index.cjs.map +1 -1
  35. package/dist/index.js +19 -16
  36. package/dist/index.js.map +1 -1
  37. package/dist/style.css +1 -1
  38. package/package.json +1 -1
  39. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js.map +0 -1
  40. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-CgLR8V21.cjs.map +0 -1
  41. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-Bd6TPEpH.cjs.map +0 -1
  42. package/dist/CollapsibleCard.vue_vue_type_script_setup_true_lang-l4KQ8HX8.js.map +0 -1
  43. package/dist/index-DacstXRp.js +0 -48
  44. package/dist/index-DacstXRp.js.map +0 -1
  45. package/dist/index-m8Oi-7YC.cjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CollapsibleCard.vue_vue_type_script_setup_true_lang-DTGAuLCh.js","sources":["../src/components/core/CardComponent.vue","../src/components/core/TableComponent.vue","../src/components/core/MobileList.vue","../src/components/core/ResponsiveList.vue","../src/components/core/AutocompleteComponent.vue","../src/components/core/TableAction.vue","../src/components/core/Button.vue","../src/components/core/Avatar.vue","../src/components/core/Tabs.vue","../src/components/core/TabPanel.vue","../src/components/core/Stepper.vue","../src/components/core/CollapsibleCard.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n title?: string\n description?: string\n}>()\n</script>\n\n<template>\n <div class=\"flex flex-col overflow-hidden rounded-lg bg-white shadow-md dark:bg-slate-950\">\n <div\n v-if=\"title || description || $slots.title || $slots.description || $slots.actions\"\n class=\"flex items-center justify-between border-b border-gray-200 px-5 py-3 dark:border-gray-700\"\n >\n <div class=\"flex flex-col gap-0.5\">\n <span\n v-if=\"title || $slots.title\"\n class=\"text-md font-semibold text-gray-800 dark:text-gray-200\"\n >\n <slot name=\"title\">\n {{ title }}\n </slot>\n </span>\n\n <span\n v-if=\"description || $slots.description\"\n class=\"text-sm font-normal text-gray-600 dark:text-gray-400\"\n >\n <slot name=\"description\">\n {{ description }}\n </slot>\n </span>\n </div>\n\n <div class=\"flex gap-2\">\n <slot name=\"actions\" />\n </div>\n </div>\n\n <slot />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport type { Property } from '@/types'\nimport TextType from '@/components/type/TextType.vue'\nimport NumberType from '@/components/type/NumberType.vue'\nimport DateType from '@/components/type/DateType.vue'\nimport BooleanType from '@/components/type/BooleanType.vue'\nimport BadgeType from '@/components/type/BadgeType.vue'\nimport Checkbox from '@/components/form/Checkbox.vue'\nimport { computed, type Component, useSlots } from 'vue'\n\ntype ItemType = { id: number | string; [key: string]: unknown }\n\nconst props = withDefaults(\n defineProps<{\n /** Column definitions */\n properties: Property[]\n /** Array of items to display */\n items: ItemType[]\n /** Enable selection mode */\n selectable?: boolean\n /** Set of selected item keys */\n selectedItems?: Set<string>\n /** Filter function to determine if an item is selectable */\n selectableFilter?: (item: ItemType) => boolean\n /** Key field for unique identification (default: 'id') */\n keyField?: string\n }>(),\n {\n selectable: false,\n keyField: 'id',\n },\n)\n\nconst emit = defineEmits<{\n /** Emitted when an item is selected/deselected */\n select: [id: string]\n /** Emitted when select all is toggled */\n selectAll: []\n}>()\n\nconst slots = useSlots()\n\n// Type components mapping\nconst typeComponents: Record<string, Component> = {\n text: TextType,\n number: NumberType,\n date: DateType,\n boolean: BooleanType,\n badge: BadgeType,\n}\n\nconst getTypeComponent = (type: string = 'text'): Component => {\n return typeComponents[type] || TextType\n}\n\n// Filter out hidden properties\nconst visibleProperties = computed(() => props.properties.filter((p) => !p.hidden))\n\n// Get item key\nconst getKey = (item: ItemType): string => {\n const keyValue = item[props.keyField]\n return String(keyValue ?? Math.random())\n}\n\n// Get nested property value\nconst getItemValue = (item: Record<string, unknown>, property: Property): unknown => {\n if (property.name.includes('.')) {\n let value: unknown = item\n for (const key of property.name.split('.')) {\n if (value && typeof value === 'object' && key in value) {\n value = (value as Record<string, unknown>)[key]\n } else {\n return undefined\n }\n }\n return value\n }\n return item[property.name]\n}\n\nconst getAlignmentClass = (align?: 'left' | 'center' | 'right') => {\n switch (align) {\n case 'center':\n return 'text-center'\n case 'right':\n return 'text-right'\n default:\n return 'text-left'\n }\n}\n\nconst getMainClass = (main?: boolean) => {\n if (main) {\n return 'text-sm font-semibold text-gray-900 dark:text-gray-100'\n }\n return 'text-xs font-medium text-gray-600 dark:text-gray-400'\n}\n\n// Selection logic\nconst selectableItems = computed(() => {\n if (!props.selectableFilter) return props.items\n return props.items.filter(props.selectableFilter)\n})\n\nconst allSelected = computed(() => {\n if (selectableItems.value.length === 0) return false\n return selectableItems.value.every((item) => props.selectedItems?.has(getKey(item)))\n})\n\nconst someSelected = computed(() => {\n return (props.selectedItems?.size || 0) > 0 && !allSelected.value\n})\n\nconst isSelected = (item: ItemType): boolean => {\n return props.selectedItems?.has(getKey(item)) || false\n}\n\nconst isSelectable = (item: ItemType): boolean => {\n if (!props.selectable) return false\n if (!props.selectableFilter) return true\n return props.selectableFilter(item)\n}\n\nconst handleSelect = (item: ItemType) => {\n emit('select', getKey(item))\n}\n\nconst hasActionSlot = computed(() => !!slots.action)\n</script>\n\n<template>\n <div\n class=\"bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 overflow-hidden\"\n >\n <div class=\"overflow-x-auto\">\n <table class=\"w-full divide-y divide-black/10 text-left dark:divide-white/10\">\n <thead\n class=\"bg-black/5 text-sm font-semibold text-gray-600 uppercase dark:bg-white/5 dark:text-gray-400\"\n >\n <tr>\n <!-- Selection header -->\n <th v-if=\"selectable\" class=\"w-12 px-3 py-3\">\n <Checkbox\n :model-value=\"allSelected\"\n :indeterminate=\"someSelected\"\n :disabled=\"selectableItems.length === 0\"\n @update:model-value=\"emit('selectAll')\"\n />\n </th>\n\n <th\n v-for=\"property in visibleProperties\"\n :key=\"property.name\"\n :class=\"[getAlignmentClass(property.align), 'px-3 py-3']\"\n >\n <slot :name=\"'header-' + property.name\" :property>\n {{ property.label ?? property.name }}\n </slot>\n </th>\n\n <th v-if=\"hasActionSlot\" class=\"px-3 py-3 text-right\"></th>\n </tr>\n </thead>\n\n <tbody class=\"divide-y divide-black/10 font-medium dark:divide-white/10\">\n <tr\n v-for=\"item in items\"\n :key=\"getKey(item)\"\n class=\"hover:bg-black/5 dark:hover:bg-white/5 transition-colors\"\n :class=\"{ 'bg-primary/5 dark:bg-primary/10': isSelected(item) }\"\n >\n <!-- Selection cell -->\n <td v-if=\"selectable\" class=\"px-3 py-4\">\n <Checkbox\n v-if=\"isSelectable(item)\"\n :model-value=\"isSelected(item)\"\n @update:model-value=\"handleSelect(item)\"\n />\n </td>\n\n <td\n v-for=\"property in visibleProperties\"\n :key=\"property.name\"\n :class=\"[\n getAlignmentClass(property.align),\n getMainClass(property.main),\n property.className,\n 'px-3 py-4',\n ]\"\n >\n <slot\n :item=\"item\"\n :name=\"'item-' + property.name\"\n :property\n :value=\"getItemValue(item, property)\"\n >\n <component\n :is=\"getTypeComponent(property.type || 'text')\"\n :value=\"getItemValue(item, property)\"\n />\n </slot>\n </td>\n\n <td v-if=\"hasActionSlot\" class=\"flex items-center justify-end gap-2 px-3 py-4\">\n <slot :item=\"item\" name=\"action\"></slot>\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <!-- Empty state -->\n <div v-if=\"!items || items.length === 0\">\n <slot name=\"empty\"></slot>\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport Checkbox from '@/components/form/Checkbox.vue'\n\nexport interface MobileListColumn {\n key: string\n label: string\n /** Hide this column on mobile */\n hideOnMobile?: boolean\n /** Mark as primary info (shown prominently) */\n primary?: boolean\n /** Mark as secondary info */\n secondary?: boolean\n}\n\ntype ItemType = { id: number | string; [key: string]: unknown }\n\nconst props = withDefaults(\n defineProps<{\n /** Array of items to display */\n items: ItemType[]\n /** Key field for unique identification */\n keyField?: string\n /** Enable selection mode */\n selectable?: boolean\n /** Set of selected item keys */\n selectedItems?: Set<string>\n /** Filter function to determine if an item is selectable */\n selectableFilter?: (item: ItemType) => boolean\n }>(),\n {\n keyField: 'id',\n selectable: false,\n },\n)\n\nconst emit = defineEmits<{\n /** Emitted when an item is selected/deselected */\n select: [id: string]\n /** Emitted when select all is toggled */\n selectAll: []\n}>()\n\ndefineSlots<{\n /** Avatar/icon slot for each item */\n avatar?: (props: { item: ItemType }) => unknown\n /** Main content area for each item */\n content?: (props: { item: ItemType }) => unknown\n /** Actions slot (right side) for each item */\n actions?: (props: { item: ItemType }) => unknown\n /** Empty state slot */\n empty?: () => unknown\n}>()\n\nconst slots = useSlots()\n\nconst getKey = (item: ItemType): string => {\n const keyValue = item[props.keyField]\n return String(keyValue ?? Math.random())\n}\n\nconst selectableItems = computed(() => {\n if (!props.selectableFilter) return props.items\n return props.items.filter(props.selectableFilter)\n})\n\nconst allSelected = computed(() => {\n if (selectableItems.value.length === 0) return false\n return selectableItems.value.every((item) => props.selectedItems?.has(getKey(item)))\n})\n\nconst someSelected = computed(() => {\n return (props.selectedItems?.size || 0) > 0 && !allSelected.value\n})\n\nconst isSelected = (item: ItemType): boolean => {\n return props.selectedItems?.has(getKey(item)) || false\n}\n\nconst isSelectable = (item: ItemType): boolean => {\n if (!props.selectable) return false\n if (!props.selectableFilter) return true\n return props.selectableFilter(item)\n}\n\nconst handleSelect = (item: ItemType) => {\n emit('select', getKey(item))\n}\n\nconst hasEmptySlot = computed(() => !!slots.empty)\n</script>\n\n<template>\n <div class=\"space-y-3\">\n <!-- Select All Header (when selectable) -->\n <div\n v-if=\"selectable && selectableItems.length > 0\"\n class=\"flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-800/50 rounded-xl\"\n >\n <Checkbox\n :model-value=\"allSelected\"\n :indeterminate=\"someSelected\"\n @update:model-value=\"emit('selectAll')\"\n />\n <span class=\"text-sm text-gray-600 dark:text-gray-400\">\n {{ allSelected ? 'Tout désélectionner' : 'Tout sélectionner' }}\n </span>\n <span\n v-if=\"selectedItems && selectedItems.size > 0\"\n class=\"text-sm text-primary font-medium\"\n >\n ({{ selectedItems.size }} sélectionné{{ selectedItems.size > 1 ? 's' : '' }})\n </span>\n </div>\n\n <!-- Items List -->\n <div\n v-for=\"item in items\"\n :key=\"getKey(item)\"\n class=\"bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 hover:border-primary/30 dark:hover:border-primary/50 hover:shadow-md transition-all duration-200\"\n :class=\"{\n 'ring-2 ring-primary border-primary': isSelected(item),\n }\"\n >\n <div class=\"p-4 flex items-center gap-4\">\n <!-- Checkbox -->\n <div v-if=\"selectable\" class=\"flex-shrink-0\">\n <Checkbox\n v-if=\"isSelectable(item)\"\n :model-value=\"isSelected(item)\"\n @update:model-value=\"handleSelect(item)\"\n />\n <div v-else class=\"w-5 h-5\" />\n </div>\n\n <!-- Avatar slot -->\n <slot name=\"avatar\" :item=\"item\" />\n\n <!-- Content -->\n <div class=\"flex-1 min-w-0\">\n <slot name=\"content\" :item=\"item\" />\n </div>\n\n <!-- Actions -->\n <div class=\"flex-shrink-0\">\n <slot name=\"actions\" :item=\"item\" />\n </div>\n </div>\n </div>\n\n <!-- Empty state -->\n <div v-if=\"items.length === 0 && hasEmptySlot\">\n <slot name=\"empty\" />\n </div>\n </div>\n</template>\n","<script setup lang=\"ts\">\nimport { computed, useSlots } from 'vue'\nimport type { Property } from '@/types'\nimport MobileList from './MobileList.vue'\nimport TableComponent from './TableComponent.vue'\n\nexport interface ResponsiveListColumn {\n /** Column key - corresponds to the data field name (alias for 'name' for backward compatibility) */\n key?: string\n /** Column name - corresponds to the data field name */\n name?: string\n /** Display label for the column header */\n label?: string\n /** Column type for automatic rendering */\n type?: 'text' | 'number' | 'date' | 'badge' | 'boolean' | string\n /** Text alignment in the column */\n align?: 'left' | 'center' | 'right'\n /** Header CSS class */\n headerClass?: string\n /** Cell CSS class */\n className?: string\n /** Whether the column is sortable */\n sortable?: boolean\n /** Whether to hide the column */\n hidden?: boolean\n /** Whether the column is the main/primary column */\n main?: boolean\n /** Hide this column on mobile view */\n hideOnMobile?: boolean\n}\n\ntype ItemType = { id: number | string; [key: string]: unknown }\n\nconst props = withDefaults(\n defineProps<{\n /** Array of items to display */\n items: ItemType[]\n /** Column definitions (extends Property with mobile options) */\n columns: ResponsiveListColumn[]\n /** Key field for unique identification */\n keyField?: string\n /** Enable selection mode */\n selectable?: boolean\n /** Set of selected item keys */\n selectedItems?: Set<string>\n /** Filter function to determine if an item is selectable */\n selectableFilter?: (item: ItemType) => boolean\n /** Breakpoint for switching between mobile and desktop views (default: 'lg' = 1024px) */\n breakpoint?: 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n }>(),\n {\n keyField: 'id',\n selectable: false,\n breakpoint: 'lg',\n },\n)\n\nconst emit = defineEmits<{\n /** Emitted when an item is selected/deselected */\n select: [id: string]\n /** Emitted when select all is toggled */\n selectAll: []\n}>()\n\ndefineSlots<{\n // Mobile slots\n /** Avatar/icon slot for mobile view */\n avatar?: (props: { item: ItemType }) => unknown\n /** Main content for mobile view */\n mobileContent?: (props: { item: ItemType }) => unknown\n /** Actions for mobile view */\n mobileActions?: (props: { item: ItemType }) => unknown\n\n // Table cell slots - dynamic based on column key\n /** Custom cell rendering for table view */\n [key: `cell-${string}`]: (props: { item: ItemType; value: unknown }) => unknown\n\n // Shared slots\n /** Actions column for table view, also used as fallback for mobile */\n actions?: (props: { item: ItemType }) => unknown\n /** Empty state slot */\n empty?: () => unknown\n}>()\n\nconst slots = useSlots()\n\n// Helper to get column key (supports both 'key' and 'name' for backward compatibility)\nconst getColumnKey = (col: ResponsiveListColumn): string => col.key || col.name || ''\n\n// Convert columns to Property format for TableComponent\nconst tableProperties = computed<Property[]>(() =>\n props.columns.map((col) => ({\n name: getColumnKey(col),\n label: col.label,\n type: col.type,\n sortable: col.sortable,\n hidden: col.hidden,\n align: col.align,\n className: col.className,\n main: col.main,\n })),\n)\n\n// Get breakpoint class\nconst breakpointClass = computed(() => {\n const breakpoints: Record<string, { mobile: string; desktop: string }> = {\n sm: { mobile: 'sm:hidden', desktop: 'hidden sm:block' },\n md: { mobile: 'md:hidden', desktop: 'hidden md:block' },\n lg: { mobile: 'lg:hidden', desktop: 'hidden lg:block' },\n xl: { mobile: 'xl:hidden', desktop: 'hidden xl:block' },\n '2xl': { mobile: '2xl:hidden', desktop: 'hidden 2xl:block' },\n }\n return breakpoints[props.breakpoint]\n})\n\n// Get cell value for table slots\nconst getCellValue = (item: ItemType, key: string): unknown => {\n const keys = key.split('.')\n let value: unknown = item\n for (const k of keys) {\n if (value && typeof value === 'object' && k in value) {\n value = (value as Record<string, unknown>)[k]\n } else {\n return undefined\n }\n }\n return value\n}\n\n// Check if a cell slot exists\nconst hasCellSlot = (key: string): boolean => {\n return !!slots[`cell-${key}`]\n}\n\nconst hasActionsSlot = computed(() => !!slots.actions)\n</script>\n\n<template>\n <div>\n <!-- Mobile View -->\n <div :class=\"breakpointClass.mobile\">\n <MobileList\n :items=\"items\"\n :key-field=\"keyField\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n :selectable-filter=\"selectableFilter\"\n @select=\"emit('select', $event)\"\n @select-all=\"emit('selectAll')\"\n >\n <template #avatar=\"{ item }\">\n <slot name=\"avatar\" :item=\"item\" />\n </template>\n\n <template #content=\"{ item }\">\n <slot name=\"mobileContent\" :item=\"item\" />\n </template>\n\n <template #actions=\"{ item }\">\n <slot name=\"mobileActions\" :item=\"item\">\n <slot name=\"actions\" :item=\"item\" />\n </slot>\n </template>\n\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </MobileList>\n </div>\n\n <!-- Desktop View -->\n <div :class=\"breakpointClass.desktop\">\n <TableComponent\n :items=\"items\"\n :properties=\"tableProperties\"\n :key-field=\"keyField\"\n :selectable=\"selectable\"\n :selected-items=\"selectedItems\"\n :selectable-filter=\"selectableFilter\"\n @select=\"emit('select', $event)\"\n @select-all=\"emit('selectAll')\"\n >\n <!-- Forward cell slots -->\n <template v-for=\"col in columns\" :key=\"getColumnKey(col)\" #[`item-${getColumnKey(col)}`]=\"{ item, value }\">\n <slot\n v-if=\"hasCellSlot(getColumnKey(col))\"\n :name=\"`cell-${getColumnKey(col)}`\"\n :item=\"item\"\n :value=\"getCellValue(item, getColumnKey(col))\"\n />\n <template v-else>{{ value }}</template>\n </template>\n\n <!-- Actions slot -->\n <template v-if=\"hasActionsSlot\" #action=\"{ item }\">\n <slot name=\"actions\" :item=\"item\" />\n </template>\n\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </TableComponent>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, nextTick, onUnmounted, ref, watch } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { AutocompleteOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<{\n modelValue: string | null\n options: AutocompleteOption[]\n placeholder?: string\n disabled?: boolean\n label?: string\n error?: string\n noResultsText?: string\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n }>(),\n {\n teleport: true,\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string | null]\n}>()\n\nconst searchQuery = ref('')\nconst isOpen = ref(false)\nconst highlightedIndex = ref(-1)\nconst inputRef = ref<HTMLInputElement | null>(null)\nconst dropdownRef = ref<HTMLDivElement | null>(null)\nconst containerRef = ref<HTMLDivElement | null>(null)\nconst inputWrapperRef = ref<HTMLDivElement | null>(null)\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst filteredOptions = computed(() => {\n if (!searchQuery.value) {\n return props.options\n }\n const query = searchQuery.value.toLowerCase()\n return props.options.filter(\n (option) =>\n option.label.toLowerCase().includes(query) || option.value.toLowerCase().includes(query),\n )\n})\n\nconst selectedLabel = computed(() => {\n if (!props.modelValue) return ''\n const option = props.options.find((opt) => opt.value === props.modelValue)\n return option?.label || ''\n})\n\nwatch(\n () => props.modelValue,\n () => {\n if (!isOpen.value) {\n searchQuery.value = selectedLabel.value\n }\n },\n { immediate: true },\n)\n\nconst updatePosition = () => {\n if (!inputWrapperRef.value || !props.teleport) return\n const rect = inputWrapperRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 8,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst openDropdown = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = -1\n nextTick(() => {\n inputRef.value?.focus()\n updatePosition()\n })\n}\n\nconst closeDropdown = () => {\n isOpen.value = false\n searchQuery.value = selectedLabel.value\n highlightedIndex.value = -1\n}\n\nconst selectOption = (option: AutocompleteOption) => {\n emit('update:modelValue', option.value)\n searchQuery.value = option.label\n closeDropdown()\n}\n\nconst clearSelection = () => {\n emit('update:modelValue', null)\n searchQuery.value = ''\n highlightedIndex.value = -1\n nextTick(() => {\n inputRef.value?.focus()\n })\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) return\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1,\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[highlightedIndex.value])\n }\n break\n case 'Escape':\n event.preventDefault()\n closeDropdown()\n break\n }\n}\n\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlightedElement = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`,\n ) as HTMLElement\n if (highlightedElement) {\n highlightedElement.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideContainer = containerRef.value?.contains(target)\n const isInsideDropdown = dropdownRef.value?.contains(target)\n if (!isInsideContainer && !isInsideDropdown) {\n closeDropdown()\n }\n}\n\nwatch(isOpen, (newValue) => {\n if (newValue) {\n document.addEventListener('click', handleClickOutside)\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n } else {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n</script>\n\n<template>\n <div ref=\"containerRef\" class=\"autocomplete-container\">\n <label v-if=\"label\" class=\"mb-2 block text-sm font-medium text-gray-700 dark:text-gray-300\">\n {{ label }}\n </label>\n\n <div class=\"relative\">\n <div\n ref=\"inputWrapperRef\"\n :class=\"{\n 'border-red-500': error,\n 'border-gray-300 dark:border-gray-600': !error && !isOpen,\n 'border-primary ring-2 ring-primary/20': isOpen,\n 'cursor-not-allowed opacity-50': disabled,\n }\"\n class=\"flex items-center gap-2 rounded-lg border bg-white px-3 py-2 transition dark:bg-gray-800\"\n >\n <Icon class=\"size-5 text-gray-400\" icon=\"lucide:search\" />\n\n <input\n ref=\"inputRef\"\n v-model=\"searchQuery\"\n :disabled=\"disabled\"\n :placeholder=\"placeholder || 'Search...'\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n type=\"text\"\n @focus=\"openDropdown\"\n @keydown=\"handleKeydown\"\n />\n\n <button\n v-if=\"modelValue && !disabled\"\n class=\"rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click.stop=\"clearSelection\"\n >\n <Icon class=\"size-4 text-gray-400\" icon=\"lucide:x\" />\n </button>\n\n <button\n :disabled=\"disabled\"\n class=\"rounded p-1 transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click.stop=\"isOpen ? closeDropdown() : openDropdown()\"\n >\n <Icon\n :class=\"{ 'rotate-180': isOpen }\"\n class=\"size-4 text-gray-400 transition\"\n icon=\"lucide:chevron-down\"\n />\n </button>\n </div>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\n 'autocomplete-dropdown 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',\n !teleport && 'absolute mt-2 w-full',\n ]\"\n >\n <div v-if=\"filteredOptions.length === 0\" class=\"px-4 py-3 text-sm text-gray-500\">\n {{ noResultsText || 'No results found' }}\n </div>\n\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"option.value\"\n :class=\"{\n 'bg-gray-100 dark:bg-gray-700': highlightedIndex === index,\n 'bg-primary/10': modelValue === option.value,\n }\"\n :data-index=\"index\"\n class=\"flex w-full items-center gap-2 px-4 py-2 text-left text-sm transition hover:bg-gray-100 dark:hover:bg-gray-700\"\n type=\"button\"\n @click=\"selectOption(option)\"\n >\n <Icon\n v-if=\"modelValue === option.value\"\n class=\"size-4 text-primary\"\n icon=\"lucide:check\"\n />\n <span class=\"flex-1 dark:text-white\">{{ option.label }}</span>\n <span class=\"text-xs text-gray-400\">({{ option.value }})</span>\n </button>\n </div>\n </Transition>\n </Teleport>\n </div>\n\n <p v-if=\"error\" class=\"mt-1 text-sm text-red-600\">{{ error }}</p>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { TableActionColor } from '@/types'\n\nconst { color, icon, link } = defineProps<{\n link?: string\n icon: string\n color?: TableActionColor\n}>()\n\nconst colorClass = computed(() => {\n switch (color) {\n case 'info':\n return 'border-blue-200 hover:bg-blue-100 dark:border-blue-800 dark:hover:bg-blue-900'\n case 'warning':\n return 'border-yellow-200 hover:bg-yellow-100 dark:border-yellow-800 dark:hover:bg-yellow-900'\n case 'success':\n return 'border-green-200 hover:bg-green-100 dark:border-green-800 dark:hover:bg-green-900'\n case 'error':\n return 'border-red-200 hover:bg-red-100 dark:border-red-800 dark:hover:bg-red-900'\n default:\n return 'border-gray-200 hover:bg-gray-100 dark:border-gray-700 dark:bg-gray-900 dark:hover:bg-gray-800'\n }\n})\n\nconst iconColorClass = computed(() => {\n switch (color) {\n case 'info':\n return 'text-blue-600 group-hover:text-blue-900 dark:text-blue-400 dark:group-hover:text-blue-100'\n case 'warning':\n return 'text-yellow-600 group-hover:text-yellow-900 dark:text-yellow-400 dark:group-hover:text-yellow-100'\n case 'success':\n return 'text-green-600 group-hover:text-green-900 dark:text-green-400 dark:group-hover:text-green-100'\n case 'error':\n return 'text-red-600 group-hover:text-red-900 dark:text-red-400 dark:group-hover:text-red-100'\n default:\n return 'text-gray-600 group-hover:text-gray-900 dark:text-gray-400 dark:group-hover:text-gray-100'\n }\n})\n\n// Try to resolve RouterLink, fallback to 'a' tag\nconst linkComponent = computed(() => {\n if (!link) return 'button'\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') {\n return RouterLink\n }\n } catch {\n // RouterLink not available\n }\n return 'a'\n})\n\nconst linkProps = computed(() => {\n if (!link) return {}\n if (linkComponent.value === 'a') {\n return { href: link }\n }\n return { to: link }\n})\n</script>\n\n<template>\n <component\n :is=\"linkComponent\"\n v-bind=\"linkProps\"\n :class=\"colorClass\"\n class=\"group flex size-8 items-center justify-center rounded-lg border\"\n >\n <Icon :class=\"iconColorClass\" :icon class=\"size-4\" />\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, resolveComponent } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport type ButtonVariant = 'primary' | 'secondary' | 'outline' | 'ghost' | 'danger' | 'success'\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl'\n\nconst props = withDefaults(\n defineProps<{\n /** Button variant */\n variant?: ButtonVariant\n /** Button size */\n size?: ButtonSize\n /** Icon to show (left side) */\n icon?: string\n /** Icon on right side */\n iconRight?: string\n /** Loading state */\n loading?: boolean\n /** Disabled state */\n disabled?: boolean\n /** Full width */\n block?: boolean\n /** Link href (renders as <a>) */\n href?: string\n /** Router link (renders as RouterLink) */\n to?: string\n /** Button type */\n type?: 'button' | 'submit' | 'reset'\n }>(),\n {\n variant: 'primary',\n size: 'md',\n type: 'button',\n },\n)\n\nconst emit = defineEmits<{\n click: [event: MouseEvent]\n}>()\n\nconst variantClasses: Record<ButtonVariant, string> = {\n primary: 'bg-primary text-primary-foreground hover:bg-primary/90 focus:ring-primary',\n secondary: 'bg-secondary text-secondary-foreground hover:bg-secondary/90 focus:ring-secondary',\n outline: 'border border-gray-300 bg-transparent text-gray-700 hover:bg-gray-50 focus:ring-primary dark:border-gray-600 dark:text-gray-300 dark:hover:bg-gray-800',\n ghost: 'bg-transparent text-gray-700 hover:bg-gray-100 focus:ring-primary dark:text-gray-300 dark:hover:bg-gray-800',\n danger: 'bg-red-500 text-white hover:bg-red-600 focus:ring-red-500',\n success: 'bg-green-500 text-white hover:bg-green-600 focus:ring-green-500',\n}\n\nconst sizeClasses: Record<ButtonSize, string> = {\n xs: 'px-2 py-1 text-xs gap-1',\n sm: 'px-3 py-1.5 text-sm gap-1.5',\n md: 'px-4 py-2 text-sm gap-2',\n lg: 'px-5 py-2.5 text-base gap-2',\n xl: 'px-6 py-3 text-lg gap-2.5',\n}\n\nconst iconSizeClasses: Record<ButtonSize, string> = {\n xs: 'size-3',\n sm: 'size-4',\n md: 'size-4',\n lg: 'size-5',\n xl: 'size-6',\n}\n\nconst classes = computed(() => [\n 'inline-flex items-center justify-center font-medium rounded-lg transition-colors focus:outline-none focus:ring-2 focus:ring-offset-2 disabled:opacity-50 disabled:cursor-not-allowed',\n variantClasses[props.variant],\n sizeClasses[props.size],\n props.block && 'w-full',\n])\n\nconst component = computed(() => {\n if (props.to) {\n try {\n const RouterLink = resolveComponent('RouterLink')\n if (typeof RouterLink !== 'string') return RouterLink\n } catch {\n // RouterLink not available\n }\n }\n if (props.href) return 'a'\n return 'button'\n})\n\nconst componentProps = computed(() => {\n if (props.to) return { to: props.to }\n if (props.href) return { href: props.href }\n return { type: props.type, disabled: props.disabled || props.loading }\n})\n\nconst handleClick = (event: MouseEvent) => {\n if (props.disabled || props.loading) return\n emit('click', event)\n}\n</script>\n\n<template>\n <component\n :is=\"component\"\n v-bind=\"componentProps\"\n :class=\"classes\"\n @click=\"handleClick\"\n >\n <Icon\n v-if=\"loading\"\n icon=\"lucide:loader-2\"\n :class=\"[iconSizeClasses[size], 'animate-spin']\"\n />\n <Icon\n v-else-if=\"icon\"\n :icon=\"icon\"\n :class=\"iconSizeClasses[size]\"\n />\n <slot />\n <Icon\n v-if=\"iconRight && !loading\"\n :icon=\"iconRight\"\n :class=\"iconSizeClasses[size]\"\n />\n </component>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref } from 'vue'\nimport { Icon } from '@iconify/vue'\n\nexport type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'\n\nconst props = withDefaults(\n defineProps<{\n /** Image source URL */\n src?: string\n /** Alt text for image */\n alt?: string\n /** Fallback name (shows initials) */\n name?: string\n /** Size variant */\n size?: AvatarSize\n /** Show online status indicator */\n status?: 'online' | 'offline' | 'away' | 'busy'\n /** Rounded style */\n rounded?: 'full' | 'lg' | 'md'\n }>(),\n {\n size: 'md',\n rounded: 'full',\n },\n)\n\nconst imageError = ref(false)\n\nconst sizeClasses: Record<AvatarSize, string> = {\n xs: 'size-6 text-xs',\n sm: 'size-8 text-sm',\n md: 'size-10 text-base',\n lg: 'size-12 text-lg',\n xl: 'size-16 text-xl',\n '2xl': 'size-20 text-2xl',\n}\n\nconst statusSizes: Record<AvatarSize, string> = {\n xs: 'size-1.5',\n sm: 'size-2',\n md: 'size-2.5',\n lg: 'size-3',\n xl: 'size-4',\n '2xl': 'size-5',\n}\n\nconst statusColors: Record<string, string> = {\n online: 'bg-green-500',\n offline: 'bg-gray-400',\n away: 'bg-yellow-500',\n busy: 'bg-red-500',\n}\n\nconst roundedClasses: Record<string, string> = {\n full: 'rounded-full',\n lg: 'rounded-lg',\n md: 'rounded-md',\n}\n\nconst initials = computed(() => {\n if (!props.name) return ''\n return props.name\n .split(' ')\n .map(n => n[0])\n .slice(0, 2)\n .join('')\n .toUpperCase()\n})\n\nconst showImage = computed(() => props.src && !imageError.value)\n</script>\n\n<template>\n <div class=\"relative inline-block\">\n <div\n :class=\"[\n 'flex items-center justify-center overflow-hidden bg-gray-200 font-medium text-gray-600 dark:bg-gray-700 dark:text-gray-300',\n sizeClasses[size],\n roundedClasses[rounded],\n ]\"\n >\n <img\n v-if=\"showImage\"\n :src=\"src\"\n :alt=\"alt || name\"\n class=\"size-full object-cover\"\n @error=\"imageError = true\"\n />\n <span v-else-if=\"initials\">{{ initials }}</span>\n <Icon v-else icon=\"lucide:user\" class=\"size-1/2\" />\n </div>\n <span\n v-if=\"status\"\n :class=\"[\n 'absolute bottom-0 right-0 block rounded-full ring-2 ring-white dark:ring-gray-900',\n statusSizes[size],\n statusColors[status],\n ]\"\n />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, provide } from 'vue'\n\nexport interface Tab {\n key: string\n label: string\n icon?: string\n disabled?: boolean\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Array of tab definitions */\n tabs: Tab[]\n /** Currently active tab key */\n modelValue?: string\n /** Tab style variant */\n variant?: 'underline' | 'pills' | 'boxed'\n }>(),\n {\n variant: 'underline',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst activeTab = computed({\n get: () => props.modelValue || props.tabs[0]?.key,\n set: (value: string) => emit('update:modelValue', value),\n})\n\nconst selectTab = (tab: Tab) => {\n if (tab.disabled) return\n activeTab.value = tab.key\n}\n\nconst variantClasses = {\n underline: {\n container: 'border-b border-gray-200 dark:border-gray-700',\n tab: 'border-b-2 -mb-px px-4 py-2',\n active: 'border-primary text-primary dark:text-primary',\n inactive: 'border-transparent text-gray-500 hover:text-gray-700 hover:border-gray-300 dark:text-gray-400 dark:hover:text-gray-300',\n },\n pills: {\n container: 'gap-2',\n tab: 'px-4 py-2 rounded-lg',\n active: 'bg-primary text-white',\n inactive: 'text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800',\n },\n boxed: {\n container: 'bg-gray-100 dark:bg-gray-800 p-1 rounded-lg gap-1',\n tab: 'px-4 py-2 rounded-md',\n active: 'bg-white dark:bg-gray-900 text-gray-900 dark:text-white shadow-sm',\n inactive: 'text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-300',\n },\n}\n\nprovide('activeTab', activeTab)\n</script>\n\n<template>\n <div>\n <div\n :class=\"[\n 'flex',\n variantClasses[variant].container,\n ]\"\n role=\"tablist\"\n >\n <button\n v-for=\"tab in tabs\"\n :key=\"tab.key\"\n type=\"button\"\n role=\"tab\"\n :aria-selected=\"activeTab === tab.key\"\n :disabled=\"tab.disabled\"\n :class=\"[\n 'text-sm font-medium transition-colors focus:outline-none disabled:cursor-not-allowed disabled:opacity-50',\n variantClasses[variant].tab,\n activeTab === tab.key\n ? variantClasses[variant].active\n : variantClasses[variant].inactive,\n ]\"\n @click=\"selectTab(tab)\"\n >\n {{ tab.label }}\n </button>\n </div>\n <div class=\"mt-4\">\n <slot :active-tab=\"activeTab\" />\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { inject, computed, type Ref } from 'vue'\n\nconst props = defineProps<{\n /** Tab key this panel belongs to */\n value: string\n}>()\n\nconst activeTab = inject<Ref<string>>('activeTab')\n\nconst isActive = computed(() => activeTab?.value === props.value)\n</script>\n\n<template>\n <div v-show=\"isActive\" role=\"tabpanel\">\n <slot />\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nexport interface Step {\n key: string | number\n title: string\n description?: string\n icon?: string\n}\n\nconst props = withDefaults(\n defineProps<{\n /** Array of step definitions */\n steps: Step[]\n /** Current step (key or index) */\n modelValue?: string | number\n /** Orientation */\n orientation?: 'horizontal' | 'vertical'\n }>(),\n {\n orientation: 'horizontal',\n },\n)\n\ndefineEmits<{\n 'update:modelValue': [value: string | number]\n}>()\n\nconst getCurrentStepIndex = () => {\n if (props.modelValue === undefined) return 0\n const index = props.steps.findIndex((s) => s.key === props.modelValue)\n return index >= 0 ? index : 0\n}\n\nconst isStepComplete = (index: number) => index < getCurrentStepIndex()\nconst isStepActive = (index: number) => index === getCurrentStepIndex()\nconst isStepPending = (index: number) => index > getCurrentStepIndex()\n</script>\n\n<template>\n <div\n :class=\"[\n 'w-full',\n orientation === 'vertical' ? 'flex flex-col' : '',\n ]\"\n >\n <div\n :class=\"[\n orientation === 'horizontal'\n ? 'relative flex items-start justify-between'\n : 'relative flex flex-col gap-4',\n ]\"\n >\n <!-- Horizontal Progress Line -->\n <template v-if=\"orientation === 'horizontal'\">\n <div\n class=\"absolute left-0 top-6 h-0.5 w-full bg-gray-200 dark:bg-gray-700\"\n aria-hidden=\"true\"\n />\n <div\n class=\"absolute left-0 top-6 h-0.5 bg-primary transition-all duration-500 ease-in-out\"\n :style=\"{\n width: `${(getCurrentStepIndex() / (steps.length - 1)) * 100}%`,\n }\"\n aria-hidden=\"true\"\n />\n </template>\n\n <!-- Steps -->\n <div\n v-for=\"(step, index) in steps\"\n :key=\"step.key\"\n :class=\"[\n 'relative',\n orientation === 'horizontal'\n ? 'flex flex-1 flex-col items-center'\n : 'flex items-start gap-4',\n ]\"\n >\n <!-- Vertical Line -->\n <div\n v-if=\"orientation === 'vertical' && index < steps.length - 1\"\n class=\"absolute left-6 top-12 h-full w-0.5 -translate-x-1/2\"\n :class=\"isStepComplete(index) ? 'bg-primary' : 'bg-gray-200 dark:bg-gray-700'\"\n />\n\n <!-- Step Circle -->\n <div\n class=\"relative z-10 flex size-12 shrink-0 items-center justify-center rounded-full border-2 transition-all duration-300\"\n :class=\"{\n 'border-primary bg-primary text-white shadow-lg': isStepActive(index) || isStepComplete(index),\n 'border-gray-300 bg-white text-gray-400 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-500':\n isStepPending(index),\n }\"\n >\n <Icon\n v-if=\"isStepComplete(index)\"\n icon=\"lucide:check\"\n class=\"size-6\"\n />\n <Icon\n v-else-if=\"step.icon\"\n :icon=\"step.icon\"\n class=\"size-6\"\n />\n <span v-else class=\"text-sm font-semibold\">{{ index + 1 }}</span>\n </div>\n\n <!-- Step Content -->\n <div\n :class=\"[\n orientation === 'horizontal'\n ? 'mt-4 flex flex-col items-center text-center'\n : 'flex flex-col pt-2',\n ]\"\n >\n <p\n class=\"text-sm font-semibold transition-colors\"\n :class=\"{\n 'text-primary dark:text-primary': isStepActive(index) || isStepComplete(index),\n 'text-gray-500 dark:text-gray-400': isStepPending(index),\n }\"\n >\n {{ step.title }}\n </p>\n <p\n v-if=\"step.description\"\n class=\"mt-1 text-xs\"\n :class=\"{\n 'text-gray-600 dark:text-gray-300': isStepActive(index),\n 'text-gray-500 dark:text-gray-400': !isStepActive(index),\n }\"\n >\n {{ step.description }}\n </p>\n </div>\n </div>\n </div>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\nimport { ref } from 'vue'\nimport CardComponent from './CardComponent.vue'\n\nconst props = withDefaults(\n defineProps<{\n /** Card title */\n title?: string\n /** Card description */\n description?: string\n /** Whether the card is initially expanded */\n defaultExpanded?: boolean\n }>(),\n {\n defaultExpanded: true,\n },\n)\n\nconst isExpanded = ref(props.defaultExpanded)\n\nconst toggle = () => {\n isExpanded.value = !isExpanded.value\n}\n</script>\n\n<template>\n <CardComponent :title=\"title\" :description=\"description\">\n <template #actions>\n <slot name=\"actions\" />\n <button\n type=\"button\"\n class=\"rounded-lg p-1.5 text-gray-500 hover:bg-gray-100 dark:text-gray-400 dark:hover:bg-gray-800\"\n @click=\"toggle\"\n >\n <Icon\n :icon=\"isExpanded ? 'lucide:chevron-up' : 'lucide:chevron-down'\"\n class=\"size-5\"\n />\n </button>\n </template>\n\n <Transition\n enter-active-class=\"transition-all duration-200 ease-out\"\n enter-from-class=\"opacity-0 max-h-0\"\n enter-to-class=\"opacity-100 max-h-[2000px]\"\n leave-active-class=\"transition-all duration-200 ease-in\"\n leave-from-class=\"opacity-100 max-h-[2000px]\"\n leave-to-class=\"opacity-0 max-h-0\"\n >\n <div v-show=\"isExpanded\" class=\"overflow-hidden\">\n <div class=\"space-y-4 p-6\">\n <slot />\n </div>\n </div>\n </Transition>\n </CardComponent>\n</template>\n"],"names":["_openBlock","_createElementBlock","_hoisted_1","$slots","_hoisted_2","_createElementVNode","_hoisted_3","_hoisted_4","_renderSlot","_hoisted_5","_hoisted_6","TextType","NumberType","DateType","BooleanType","BadgeType","_createVNode","Checkbox","_Fragment","_renderList","_normalizeClass","_createTextVNode","_toDisplayString","_hoisted_7","_hoisted_8","_createBlock","_resolveDynamicComponent","_hoisted_9","_hoisted_10","MobileList","_withCtx","TableComponent","_unref","_withModifiers","_Teleport","_Transition","_mergeProps","_withDirectives","_normalizeStyle","CardComponent"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { defineComponent, createElementBlock, openBlock, renderSlot, createTextVNode, toDisplayString, mergeModels, useModel, withDirectives, mergeProps, vModelDynamic, ref, computed, watch, onUnmounted, createElementVNode, createBlock, normalizeClass, createVNode, unref, Teleport, Transition, withCtx, createCommentVNode, normalizeStyle, vModelText, Fragment, renderList, nextTick } from "vue";
2
2
  import { Icon } from "@iconify/vue";
3
- const _hoisted_1$7 = ["data-error", "for"];
4
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
3
+ const _hoisted_1$6 = ["data-error", "for"];
4
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
5
5
  __name: "FormLabel",
6
6
  props: {
7
7
  error: { type: [String, Boolean] },
@@ -15,12 +15,12 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
15
15
  class: "block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300"
16
16
  }, [
17
17
  renderSlot(_ctx.$slots, "default")
18
- ], 8, _hoisted_1$7);
18
+ ], 8, _hoisted_1$6);
19
19
  };
20
20
  }
21
21
  });
22
- const _hoisted_1$6 = ["data-error"];
23
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
22
+ const _hoisted_1$5 = ["data-error"];
23
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
24
24
  __name: "FormHelp",
25
25
  props: {
26
26
  error: { type: Boolean },
@@ -35,12 +35,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
35
35
  renderSlot(_ctx.$slots, "default", {}, () => [
36
36
  createTextVNode(toDisplayString(__props.text ?? ""), 1)
37
37
  ])
38
- ], 8, _hoisted_1$6);
38
+ ], 8, _hoisted_1$5);
39
39
  };
40
40
  }
41
41
  });
42
- const _hoisted_1$5 = ["id", "disabled", "name", "placeholder", "type"];
43
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
42
+ const _hoisted_1$4 = ["id", "disabled", "name", "placeholder", "type"];
43
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
44
44
  __name: "FormInput",
45
45
  props: /* @__PURE__ */ mergeModels({
46
46
  type: { default: "text" },
@@ -66,16 +66,16 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
66
66
  placeholder: __props.placeholder,
67
67
  type: __props.type,
68
68
  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 invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-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"
69
- }, _ctx.$attrs), null, 16, _hoisted_1$5)), [
69
+ }, _ctx.$attrs), null, 16, _hoisted_1$4)), [
70
70
  [vModelDynamic, modelValue.value]
71
71
  ]);
72
72
  };
73
73
  }
74
74
  });
75
- const _hoisted_1$4 = { class: "relative" };
76
- const _hoisted_2$3 = ["id", "disabled"];
77
- const _hoisted_3$2 = { class: "flex-1 truncate" };
78
- const _hoisted_4$2 = {
75
+ const _hoisted_1$3 = { class: "relative" };
76
+ const _hoisted_2$2 = ["id", "disabled"];
77
+ const _hoisted_3$1 = { class: "flex-1 truncate" };
78
+ const _hoisted_4$1 = {
79
79
  key: 0,
80
80
  class: "sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800"
81
81
  };
@@ -91,7 +91,7 @@ const _hoisted_9 = {
91
91
  class: "size-4 shrink-0"
92
92
  };
93
93
  const _hoisted_10 = { class: "flex-1" };
94
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
94
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
95
95
  __name: "FormSelect",
96
96
  props: /* @__PURE__ */ mergeModels({
97
97
  options: {},
@@ -275,7 +275,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
275
275
  return [base, state, text, props.triggerClass];
276
276
  });
277
277
  return (_ctx, _cache) => {
278
- return openBlock(), createElementBlock("div", _hoisted_1$4, [
278
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [
279
279
  createElementVNode("button", {
280
280
  ref_key: "triggerRef",
281
281
  ref: triggerRef,
@@ -290,13 +290,13 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
290
290
  option: selectedOption.value,
291
291
  placeholder: __props.placeholder
292
292
  }, () => [
293
- createElementVNode("span", _hoisted_3$2, toDisplayString(displayValue.value), 1)
293
+ createElementVNode("span", _hoisted_3$1, toDisplayString(displayValue.value), 1)
294
294
  ]),
295
295
  createVNode(unref(Icon), {
296
296
  icon: "lucide:chevron-down",
297
297
  class: normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", isOpen.value && "rotate-180"])
298
298
  }, null, 8, ["class"])
299
- ], 42, _hoisted_2$3),
299
+ ], 42, _hoisted_2$2),
300
300
  (openBlock(), createBlock(Teleport, {
301
301
  to: "body",
302
302
  disabled: !__props.teleport
@@ -320,7 +320,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
320
320
  !__props.teleport && "absolute mt-1 w-full"
321
321
  ])
322
322
  }, [
323
- __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_4$2, [
323
+ __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_4$1, [
324
324
  createElementVNode("div", _hoisted_5, [
325
325
  createVNode(unref(Icon), {
326
326
  icon: "lucide:search",
@@ -379,8 +379,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
379
379
  };
380
380
  }
381
381
  });
382
- const _hoisted_1$3 = ["hidden"];
383
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
382
+ const _hoisted_1$2 = ["hidden"];
383
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
384
384
  __name: "FormGroup",
385
385
  props: /* @__PURE__ */ mergeModels({
386
386
  label: {},
@@ -413,7 +413,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
413
413
  }, [
414
414
  renderSlot(_ctx.$slots, "default", {}, () => [
415
415
  renderSlot(_ctx.$slots, "label", {}, () => [
416
- __props.label ? (openBlock(), createBlock(_sfc_main$7, {
416
+ __props.label ? (openBlock(), createBlock(_sfc_main$6, {
417
417
  key: 0,
418
418
  "html-for": __props.id ?? __props.name,
419
419
  error: __props.error
@@ -425,17 +425,17 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
425
425
  }, 8, ["html-for", "error"])) : createCommentVNode("", true)
426
426
  ]),
427
427
  renderSlot(_ctx.$slots, "input", {}, () => [
428
- isSelect.value ? (openBlock(), createBlock(_sfc_main$4, mergeProps({
428
+ isSelect.value ? (openBlock(), createBlock(_sfc_main$3, mergeProps({
429
429
  key: 0,
430
430
  modelValue: modelValue.value,
431
431
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event)
432
- }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"])) : (openBlock(), createBlock(_sfc_main$5, mergeProps({
432
+ }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"])) : (openBlock(), createBlock(_sfc_main$4, mergeProps({
433
433
  key: 1,
434
434
  modelValue: modelValue.value,
435
435
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event)
436
436
  }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"]))
437
437
  ]),
438
- __props.error && typeof __props.error === "string" ? (openBlock(), createBlock(_sfc_main$6, {
438
+ __props.error && typeof __props.error === "string" ? (openBlock(), createBlock(_sfc_main$5, {
439
439
  key: 0,
440
440
  error: true
441
441
  }, {
@@ -445,13 +445,13 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
445
445
  _: 1
446
446
  })) : createCommentVNode("", true)
447
447
  ])
448
- ], 12, _hoisted_1$3);
448
+ ], 12, _hoisted_1$2);
449
449
  };
450
450
  }
451
451
  });
452
- const _hoisted_1$2 = { class: "relative" };
453
- const _hoisted_2$2 = ["disabled", "placeholder", "value"];
454
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
452
+ const _hoisted_1$1 = { class: "relative" };
453
+ const _hoisted_2$1 = ["disabled", "placeholder", "value"];
454
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
455
455
  __name: "SearchInput",
456
456
  props: {
457
457
  modelValue: {},
@@ -467,7 +467,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
467
467
  emit("update:modelValue", target.value);
468
468
  };
469
469
  return (_ctx, _cache) => {
470
- return openBlock(), createElementBlock("div", _hoisted_1$2, [
470
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
471
471
  createVNode(unref(Icon), {
472
472
  icon: __props.icon,
473
473
  class: "absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400"
@@ -479,25 +479,25 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
479
479
  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",
480
480
  type: "text",
481
481
  onInput: handleInput
482
- }, null, 40, _hoisted_2$2)
482
+ }, null, 40, _hoisted_2$1)
483
483
  ]);
484
484
  };
485
485
  }
486
486
  });
487
- const _hoisted_1$1 = ["aria-checked", "disabled"];
488
- const _hoisted_2$1 = {
487
+ const _hoisted_1 = ["aria-checked", "disabled"];
488
+ const _hoisted_2 = {
489
489
  key: 0,
490
490
  class: "flex flex-col"
491
491
  };
492
- const _hoisted_3$1 = {
492
+ const _hoisted_3 = {
493
493
  key: 0,
494
494
  class: "text-sm font-medium text-gray-900 dark:text-white"
495
495
  };
496
- const _hoisted_4$1 = {
496
+ const _hoisted_4 = {
497
497
  key: 1,
498
498
  class: "text-sm text-gray-500 dark:text-gray-400"
499
499
  };
500
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
500
+ const _sfc_main = /* @__PURE__ */ defineComponent({
501
501
  __name: "Switch",
502
502
  props: {
503
503
  modelValue: { type: Boolean, default: false },
@@ -552,56 +552,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
552
552
  __props.modelValue ? translateSizes[__props.size] : "translate-x-1"
553
553
  ])
554
554
  }, null, 2)
555
- ], 10, _hoisted_1$1),
556
- __props.label || __props.description ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
557
- __props.label ? (openBlock(), createElementBlock("span", _hoisted_3$1, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
558
- __props.description ? (openBlock(), createElementBlock("span", _hoisted_4$1, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
559
- ])) : createCommentVNode("", true)
560
- ], 2);
561
- };
562
- }
563
- });
564
- const _hoisted_1 = ["checked", "disabled", "indeterminate"];
565
- const _hoisted_2 = {
566
- key: 0,
567
- class: "flex flex-col"
568
- };
569
- const _hoisted_3 = {
570
- key: 0,
571
- class: "text-sm font-medium text-gray-900 dark:text-white"
572
- };
573
- const _hoisted_4 = {
574
- key: 1,
575
- class: "text-sm text-gray-500 dark:text-gray-400"
576
- };
577
- const _sfc_main = /* @__PURE__ */ defineComponent({
578
- __name: "Checkbox",
579
- props: {
580
- modelValue: { type: Boolean, default: false },
581
- label: {},
582
- description: {},
583
- disabled: { type: Boolean },
584
- indeterminate: { type: Boolean }
585
- },
586
- emits: ["update:modelValue"],
587
- setup(__props, { emit: __emit }) {
588
- const emit = __emit;
589
- const toggle = (event) => {
590
- const target = event.target;
591
- emit("update:modelValue", target.checked);
592
- };
593
- return (_ctx, _cache) => {
594
- return openBlock(), createElementBlock("label", {
595
- class: normalizeClass(["inline-flex items-start gap-3", __props.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"])
596
- }, [
597
- createElementVNode("input", {
598
- type: "checkbox",
599
- checked: __props.modelValue,
600
- disabled: __props.disabled,
601
- indeterminate: __props.indeterminate,
602
- class: "mt-0.5 size-4 rounded border-gray-300 text-primary/90 focus:ring-2 focus:ring-primary focus:ring-offset-2 disabled:cursor-not-allowed dark:border-gray-600 dark:bg-gray-800 dark:focus:ring-offset-gray-900",
603
- onChange: toggle
604
- }, null, 40, _hoisted_1),
555
+ ], 10, _hoisted_1),
605
556
  __props.label || __props.description ? (openBlock(), createElementBlock("div", _hoisted_2, [
606
557
  __props.label ? (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
607
558
  __props.description ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
@@ -611,13 +562,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
611
562
  }
612
563
  });
613
564
  export {
614
- _sfc_main$7 as _,
615
- _sfc_main$6 as a,
616
- _sfc_main$5 as b,
617
- _sfc_main$4 as c,
618
- _sfc_main$3 as d,
619
- _sfc_main$2 as e,
620
- _sfc_main$1 as f,
621
- _sfc_main as g
565
+ _sfc_main$6 as _,
566
+ _sfc_main$5 as a,
567
+ _sfc_main$4 as b,
568
+ _sfc_main$3 as c,
569
+ _sfc_main$2 as d,
570
+ _sfc_main$1 as e,
571
+ _sfc_main as f
622
572
  };
623
- //# sourceMappingURL=Checkbox.vue_vue_type_script_setup_true_lang-CMq22Cg1.js.map
573
+ //# sourceMappingURL=Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Switch.vue_vue_type_script_setup_true_lang-C2_5u-HL.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"],"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>\ndefineProps<{\n error?: boolean\n text?: string\n}>()\n</script>\n\n<template>\n <p\n :data-error=\"error\"\n class=\"mt-2 text-sm text-gray-400 peer-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\n >\n <slot>{{ text ?? '' }}</slot>\n </p>\n</template>\n","<script lang=\"ts\" setup>\nimport type { InputProps } from '@/types'\n\nwithDefaults(defineProps<InputProps>(), {\n type: 'text',\n})\n\nconst modelValue = defineModel<string>()\n</script>\n\n<template>\n <input\n :id=\"id ?? name ?? ''\"\n v-model=\"modelValue\"\n :disabled=\"disabled\"\n :name=\"name ?? ''\"\n :placeholder=\"placeholder\"\n :type=\"type\"\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 invalid:border-pink-500 invalid:text-pink-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:invalid:border-pink-500 focus:invalid:ring-pink-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\"\n v-bind=\"$attrs\"\n />\n</template>\n","<script lang=\"ts\" setup>\nimport { computed, ref, watch, nextTick, onUnmounted } from 'vue'\nimport { Icon } from '@iconify/vue'\nimport type { SelectProps, SelectOption } from '@/types'\n\nconst props = withDefaults(\n defineProps<\n SelectProps & {\n /** Use teleport to body to avoid overflow clipping */\n teleport?: boolean\n /** Show search input in dropdown */\n searchable?: boolean\n /** Text shown when no results match search */\n noResultsText?: string\n /** Custom class for the trigger button */\n triggerClass?: string\n }\n >(),\n {\n teleport: true,\n searchable: false,\n noResultsText: 'No results found',\n },\n)\n\nconst modelValue = defineModel<string | number | boolean | null>()\n\nconst isOpen = ref(false)\nconst searchQuery = ref('')\nconst highlightedIndex = ref(-1)\nconst triggerRef = ref<HTMLElement>()\nconst dropdownRef = ref<HTMLElement>()\nconst searchInputRef = ref<HTMLInputElement>()\nconst dropdownPosition = ref({ top: 0, left: 0, width: 0 })\n\nconst visibleOptions = computed(() => {\n return (props.options ?? []).filter((opt) => !opt.hidden)\n})\n\nconst filteredOptions = computed(() => {\n if (!props.searchable || !searchQuery.value) {\n return visibleOptions.value\n }\n const query = searchQuery.value.toLowerCase()\n return visibleOptions.value.filter((opt) =>\n opt.label.toLowerCase().includes(query) ||\n String(opt.value).toLowerCase().includes(query)\n )\n})\n\nconst selectedOption = computed(() => {\n return visibleOptions.value.find((opt) => opt.value === modelValue.value)\n})\n\nconst displayValue = computed(() => {\n if (selectedOption.value) {\n return selectedOption.value.label\n }\n return props.placeholder || 'Select...'\n})\n\nconst updatePosition = () => {\n if (!triggerRef.value || !props.teleport) return\n const rect = triggerRef.value.getBoundingClientRect()\n dropdownPosition.value = {\n top: rect.bottom + window.scrollY + 4,\n left: rect.left + window.scrollX,\n width: rect.width,\n }\n}\n\nconst open = () => {\n if (props.disabled) return\n isOpen.value = true\n searchQuery.value = ''\n highlightedIndex.value = filteredOptions.value.findIndex(\n (opt) => opt.value === modelValue.value\n )\n nextTick(() => {\n updatePosition()\n if (props.searchable) {\n searchInputRef.value?.focus()\n }\n })\n}\n\nconst close = () => {\n isOpen.value = false\n searchQuery.value = ''\n highlightedIndex.value = -1\n}\n\nconst toggle = () => {\n if (isOpen.value) {\n close()\n } else {\n open()\n }\n}\n\nconst selectOption = (option: SelectOption) => {\n modelValue.value = option.value\n close()\n}\n\nconst handleKeydown = (event: KeyboardEvent) => {\n if (!isOpen.value) {\n if (event.key === 'Enter' || event.key === ' ' || event.key === 'ArrowDown') {\n event.preventDefault()\n open()\n }\n return\n }\n\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault()\n highlightedIndex.value = Math.min(\n highlightedIndex.value + 1,\n filteredOptions.value.length - 1\n )\n scrollToHighlighted()\n break\n case 'ArrowUp':\n event.preventDefault()\n highlightedIndex.value = Math.max(highlightedIndex.value - 1, 0)\n scrollToHighlighted()\n break\n case 'Enter':\n event.preventDefault()\n if (highlightedIndex.value >= 0 && filteredOptions.value[highlightedIndex.value]) {\n selectOption(filteredOptions.value[highlightedIndex.value])\n }\n break\n case 'Escape':\n event.preventDefault()\n close()\n break\n case 'Tab':\n close()\n break\n }\n}\n\nconst scrollToHighlighted = () => {\n nextTick(() => {\n if (dropdownRef.value) {\n const highlighted = dropdownRef.value.querySelector(\n `[data-index=\"${highlightedIndex.value}\"]`\n ) as HTMLElement\n if (highlighted) {\n highlighted.scrollIntoView({ block: 'nearest' })\n }\n }\n })\n}\n\nconst handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node\n const isInsideTrigger = triggerRef.value?.contains(target)\n const isInsideDropdown = dropdownRef.value?.contains(target)\n if (!isInsideTrigger && !isInsideDropdown) {\n close()\n }\n}\n\nwatch(isOpen, (newValue) => {\n if (newValue) {\n document.addEventListener('click', handleClickOutside)\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n } else {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n }\n})\n\nwatch(searchQuery, () => {\n highlightedIndex.value = 0\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n})\n\nconst dropdownStyle = computed(() => {\n if (!props.teleport) return {}\n return {\n position: 'absolute' as const,\n top: `${dropdownPosition.value.top}px`,\n left: `${dropdownPosition.value.left}px`,\n width: `${dropdownPosition.value.width}px`,\n }\n})\n\nconst triggerClasses = computed(() => {\n const base = 'flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition'\n const state = props.disabled\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'\n : isOpen.value\n ? 'border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900'\n : 'border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900 dark:hover:border-gray-600'\n const text = selectedOption.value\n ? 'text-gray-800 dark:text-gray-200'\n : 'text-gray-400 dark:text-gray-500'\n return [base, state, text, props.triggerClass]\n})\n</script>\n\n<template>\n <div class=\"relative\">\n <!-- Trigger -->\n <button\n ref=\"triggerRef\"\n type=\"button\"\n :id=\"id ?? name ?? undefined\"\n :disabled=\"disabled\"\n :class=\"triggerClasses\"\n @click=\"toggle\"\n @keydown=\"handleKeydown\"\n >\n <slot name=\"selected\" :option=\"selectedOption\" :placeholder=\"placeholder\">\n <span class=\"flex-1 truncate\">{{ displayValue }}</span>\n </slot>\n <Icon\n icon=\"lucide:chevron-down\"\n :class=\"['size-4 shrink-0 text-gray-400 transition-transform', isOpen && 'rotate-180']\"\n />\n </button>\n\n <!-- Dropdown -->\n <Teleport to=\"body\" :disabled=\"!teleport\">\n <Transition\n enter-active-class=\"transition duration-100 ease-out\"\n enter-from-class=\"opacity-0 scale-95\"\n enter-to-class=\"opacity-100 scale-100\"\n leave-active-class=\"transition duration-75 ease-in\"\n leave-from-class=\"opacity-100 scale-100\"\n leave-to-class=\"opacity-0 scale-95\"\n >\n <div\n v-if=\"isOpen\"\n ref=\"dropdownRef\"\n :style=\"dropdownStyle\"\n :class=\"[\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',\n !teleport && 'absolute mt-1 w-full',\n ]\"\n >\n <!-- Search input -->\n <div v-if=\"searchable\" class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\">\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\">\n <Icon icon=\"lucide:search\" class=\"size-4 text-gray-400\" />\n <input\n ref=\"searchInputRef\"\n v-model=\"searchQuery\"\n type=\"text\"\n class=\"flex-1 bg-transparent text-sm outline-none dark:text-white\"\n placeholder=\"Search...\"\n @keydown=\"handleKeydown\"\n />\n </div>\n </div>\n\n <!-- Empty state -->\n <div\n v-if=\"filteredOptions.length === 0\"\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\n >\n {{ noResultsText }}\n </div>\n\n <!-- Options -->\n <div class=\"py-1\">\n <button\n v-for=\"(option, index) in filteredOptions\"\n :key=\"String(option.value)\"\n type=\"button\"\n :data-index=\"index\"\n :class=\"[\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\n modelValue === option.value && 'bg-primary/10 text-primary',\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\n ]\"\n @click=\"selectOption(option)\"\n @mouseenter=\"highlightedIndex = index\"\n >\n <slot name=\"option\" :option=\"option\" :selected=\"modelValue === option.value\" :index=\"index\">\n <Icon\n v-if=\"modelValue === option.value\"\n icon=\"lucide:check\"\n class=\"size-4 shrink-0 text-primary\"\n />\n <span v-else class=\"size-4 shrink-0\" />\n <span class=\"flex-1\">{{ option.label }}</span>\n </slot>\n </button>\n </div>\n </div>\n </Transition>\n </Teleport>\n </div>\n</template>\n","<script lang=\"ts\" setup>\nimport { computed } from 'vue'\nimport type { FormGroupProps } from '@/types'\nimport FormLabel from './FormLabel.vue'\nimport FormInput from './FormInput.vue'\nimport FormSelect from './FormSelect.vue'\nimport FormHelp from './FormHelp.vue'\n\nconst props = withDefaults(defineProps<FormGroupProps>(), {\n cols: 6,\n})\n\nconst modelValue = defineModel()\n\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\n\nconst isSelect = computed(() => props.select === true)\n</script>\n\n<template>\n <div :style=\"{ gridColumn: computedCols }\" :hidden=\"hidden\">\n <slot>\n <slot name=\"label\">\n <FormLabel v-if=\"label\" :html-for=\"id ?? name\" :error=\"error\">\n {{ label }}\n </FormLabel>\n </slot>\n\n <slot name=\"input\">\n <FormSelect\n v-if=\"isSelect\"\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n <FormInput\n v-else\n v-model=\"modelValue\"\n v-bind=\"{ ...$attrs, ...$props }\"\n />\n </slot>\n\n <FormHelp v-if=\"error && typeof error === 'string'\" :error=\"true\">\n {{ error }}\n </FormHelp>\n </slot>\n </div>\n</template>\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 :icon=\"icon\" class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\" />\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 v-if=\"label || description\" class=\"flex flex-col\">\n <span v-if=\"label\" class=\"text-sm font-medium text-gray-900 dark:text-white\">\n {{ label }}\n </span>\n <span v-if=\"description\" class=\"text-sm text-gray-500 dark:text-gray-400\">\n {{ description }}\n </span>\n </div>\n </label>\n</template>\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","_createElementVNode","_hoisted_3","_toDisplayString","_createVNode","_unref","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_4","_Fragment","_renderList","FormLabel","FormSelect","$props","FormInput","FormHelp"],"mappings":"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"}