cisse-vue-ui 0.5.23 → 0.5.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js → BadgeType.vue_vue_type_script_setup_true_lang-tHRMWBb-.js} +2 -2
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-tHRMWBb-.js.map +1 -0
- package/dist/{BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs → BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs} +2 -2
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-zs0NXN4g.cjs.map +1 -0
- package/dist/{Button.vue_vue_type_script_setup_true_lang-CD9QPOeU.js → Button.vue_vue_type_script_setup_true_lang-BHpVJnRn.js} +5 -5
- package/dist/Button.vue_vue_type_script_setup_true_lang-BHpVJnRn.js.map +1 -0
- package/dist/{Button.vue_vue_type_script_setup_true_lang-Cev21KGJ.cjs → Button.vue_vue_type_script_setup_true_lang-CLmHDal2.cjs} +5 -5
- package/dist/Button.vue_vue_type_script_setup_true_lang-CLmHDal2.cjs.map +1 -0
- package/dist/{Combobox.vue_vue_type_script_setup_true_lang-D9TIId4E.cjs → Combobox.vue_vue_type_script_setup_true_lang-B8WioleN.cjs} +28 -28
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-B8WioleN.cjs.map +1 -0
- package/dist/{Combobox.vue_vue_type_script_setup_true_lang-DCLKWzhc.js → Combobox.vue_vue_type_script_setup_true_lang-DKDJV0Ey.js} +28 -28
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-DKDJV0Ey.js.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-Dm4kLAnr.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-B1zS6nTR.js} +13 -13
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-B1zS6nTR.js.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-CwHYxBhR.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-CvEWAzaw.cjs} +13 -13
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CvEWAzaw.cjs.map +1 -0
- package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-D1Q43mhJ.js → DarkModeToggle.vue_vue_type_script_setup_true_lang-BBIkEeLJ.js} +28 -28
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-BBIkEeLJ.js.map +1 -0
- package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-CSxGvdSP.cjs → DarkModeToggle.vue_vue_type_script_setup_true_lang-BHabkuFp.cjs} +28 -28
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-BHabkuFp.cjs.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DNeh9Gi-.cjs → Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs} +3 -3
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.cjs.map +1 -0
- package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DXV811zB.js → Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js} +3 -3
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.js.map +1 -0
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-C0YzyJnK.cjs → PageLayout.vue_vue_type_script_setup_true_lang-6OrQy9W4.cjs} +3 -3
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-C0YzyJnK.cjs.map → PageLayout.vue_vue_type_script_setup_true_lang-6OrQy9W4.cjs.map} +1 -1
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-ClzYGS8h.js → PageLayout.vue_vue_type_script_setup_true_lang-BgTJd526.js} +3 -3
- package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-ClzYGS8h.js.map → PageLayout.vue_vue_type_script_setup_true_lang-BgTJd526.js.map} +1 -1
- package/dist/components/core/index.cjs +4 -4
- package/dist/components/core/index.js +4 -4
- package/dist/components/feedback/index.cjs +2 -2
- package/dist/components/feedback/index.js +2 -2
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +7 -7
- package/dist/components/index.js +7 -7
- package/dist/components/layout/index.cjs +1 -1
- package/dist/components/layout/index.js +1 -1
- package/dist/components/type/index.cjs +1 -1
- package/dist/components/type/index.js +1 -1
- package/dist/{index-DwFvFW-3.cjs → index-D5M6ePuo.cjs} +8 -8
- package/dist/index-D5M6ePuo.cjs.map +1 -0
- package/dist/{index-BMoLBt6A.js → index-yQvianuj.js} +8 -8
- package/dist/index-yQvianuj.js.map +1 -0
- package/dist/index.cjs +8 -8
- package/dist/index.js +8 -8
- package/dist/style.css +1 -1
- package/package.json +169 -169
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CJb63H1I.cjs.map +0 -1
- package/dist/BadgeType.vue_vue_type_script_setup_true_lang-CnB5eNEM.js.map +0 -1
- package/dist/Button.vue_vue_type_script_setup_true_lang-CD9QPOeU.js.map +0 -1
- package/dist/Button.vue_vue_type_script_setup_true_lang-Cev21KGJ.cjs.map +0 -1
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-D9TIId4E.cjs.map +0 -1
- package/dist/Combobox.vue_vue_type_script_setup_true_lang-DCLKWzhc.js.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CwHYxBhR.cjs.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Dm4kLAnr.js.map +0 -1
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-CSxGvdSP.cjs.map +0 -1
- package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-D1Q43mhJ.js.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DNeh9Gi-.cjs.map +0 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DXV811zB.js.map +0 -1
- package/dist/index-BMoLBt6A.js.map +0 -1
- package/dist/index-DwFvFW-3.cjs.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Combobox.vue_vue_type_script_setup_true_lang-B8WioleN.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","../src/components/form/Combobox.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 /** ID for aria-describedby linking */\r\n id?: string\r\n error?: boolean\r\n text?: string\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <p\r\n :id=\"id\"\r\n :data-error=\"error\"\r\n :role=\"error ? 'alert' : undefined\"\r\n :aria-live=\"error ? 'polite' : undefined\"\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\nconst props = withDefaults(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=\"props.id ?? props.name ?? ''\"\r\n v-model=\"modelValue\"\r\n :disabled=\"props.disabled\"\r\n :name=\"props.name ?? ''\"\r\n :placeholder=\"props.placeholder\"\r\n :type=\"props.type\"\r\n :required=\"props.required\"\r\n :aria-invalid=\"props.invalid || undefined\"\r\n :aria-required=\"props.required || undefined\"\r\n :aria-describedby=\"props.describedBy || undefined\"\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-hidden 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\nimport { useId } from '@/composables/useId'\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\n// Generate unique IDs for accessibility\r\nconst { id: generatedId, related } = useId({ prefix: 'select', id: props.id })\r\nconst triggerId = computed(() => props.id ?? props.name ?? generatedId.value)\r\nconst listboxId = computed(() => related('listbox'))\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=\"triggerId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :class=\"triggerClasses\"\r\n :aria-haspopup=\"'listbox'\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-controls=\"listboxId\"\r\n :aria-invalid=\"invalid || undefined\"\r\n :aria-describedby=\"describedBy || undefined\"\r\n @click=\"toggle\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n <slot\r\n name=\"selected\"\r\n :option=\"selectedOption\"\r\n :placeholder=\"placeholder\"\r\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 aria-hidden=\"true\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Teleport\r\n to=\"body\"\r\n :disabled=\"!teleport\"\r\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 :id=\"listboxId\"\r\n ref=\"dropdownRef\"\r\n role=\"listbox\"\r\n :aria-label=\"placeholder || 'Select an option'\"\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\r\n v-if=\"searchable\"\r\n class=\"sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800\"\r\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\r\n icon=\"lucide:search\"\r\n class=\"size-4 text-gray-400\"\r\n aria-hidden=\"true\"\r\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-hidden dark:text-white\"\r\n placeholder=\"Search...\"\r\n aria-label=\"Search options\"\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 role=\"status\"\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 role=\"option\"\r\n :aria-selected=\"modelValue === option.value\"\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\r\n name=\"option\"\r\n :option=\"option\"\r\n :selected=\"modelValue === option.value\"\r\n :index=\"index\"\r\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 aria-hidden=\"true\"\r\n />\r\n <span\r\n v-else\r\n class=\"size-4 shrink-0\"\r\n aria-hidden=\"true\"\r\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 { useId } from '@/composables/useId'\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\n// Generate unique IDs for accessibility\r\nconst { id: generatedId, related } = useId({ prefix: 'field', id: props.id })\r\nconst inputId = computed(() => props.id ?? props.name ?? generatedId.value)\r\nconst helpId = computed(() => related('help'))\r\n\r\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\r\n\r\nconst isSelect = computed(() => props.select === true)\r\n\r\n// Determine if we should link to error message\r\nconst hasError = computed(() => props.error && typeof props.error === 'string')\r\n</script>\r\n\r\n<template>\r\n <div\r\n :style=\"{ gridColumn: computedCols }\"\r\n :hidden=\"hidden\"\r\n >\r\n <slot>\r\n <slot name=\"label\">\r\n <FormLabel\r\n v-if=\"label\"\r\n :html-for=\"inputId\"\r\n :error=\"error\"\r\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 :id=\"inputId\"\r\n :invalid=\"Boolean(error)\"\r\n :described-by=\"hasError ? helpId : undefined\"\r\n />\r\n <FormInput\r\n v-else\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n :id=\"inputId\"\r\n :invalid=\"Boolean(error)\"\r\n :described-by=\"hasError ? helpId : undefined\"\r\n />\r\n </slot>\r\n\r\n <FormHelp\r\n v-if=\"hasError\"\r\n :id=\"helpId\"\r\n :error=\"true\"\r\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 size-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>\nimport { computed } from 'vue'\nimport { useId } from '@/composables/useId'\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 /** Custom ID for the switch */\n id?: string\n }>(),\n {\n modelValue: false,\n size: 'md',\n },\n)\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: boolean]\n}>()\n\n// Generate unique IDs for accessibility\nconst { id: generatedId, related } = useId({ prefix: 'switch', id: props.id })\nconst switchId = computed(() => props.id ?? generatedId.value)\nconst labelId = computed(() => related('label'))\nconst descriptionId = computed(() => related('description'))\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 :id=\"switchId\"\n type=\"button\"\n role=\"switch\"\n :aria-checked=\"modelValue\"\n :aria-labelledby=\"label ? labelId : undefined\"\n :aria-describedby=\"description ? descriptionId : undefined\"\n :disabled=\"disabled\"\n :class=\"[\n 'relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-hidden 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 aria-hidden=\"true\"\n />\n </button>\n <div\n v-if=\"label || description\"\n class=\"flex flex-col\"\n >\n <span\n v-if=\"label\"\n :id=\"labelId\"\n class=\"text-sm font-medium text-gray-900 dark:text-white\"\n >\n {{ label }}\n </span>\n <span\n v-if=\"description\"\n :id=\"descriptionId\"\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\nimport { useId } from '@/composables/useId'\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 /** Custom ID for accessibility */\r\n id?: string\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\n// Generate unique IDs for accessibility\r\nconst { related } = useId({ prefix: 'datepicker', id: props.id })\r\nconst triggerId = computed(() => related('trigger'))\r\nconst calendarId = computed(() => related('calendar'))\r\nconst gridId = computed(() => related('grid'))\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\r\n// Generate accessible label for a date\r\nconst getDateLabel = (date: Date): string => {\r\n const formatter = new Intl.DateTimeFormat(props.locale, {\r\n weekday: 'long',\r\n year: 'numeric',\r\n month: 'long',\r\n day: 'numeric',\r\n })\r\n return formatter.format(date)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <button\r\n :id=\"triggerId\"\r\n ref=\"triggerRef\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-haspopup=\"'dialog'\"\r\n :aria-controls=\"calendarId\"\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 aria-label=\"Clear date\"\r\n @click.stop=\"clear\"\r\n >\r\n <Icon\r\n icon=\"lucide:x\"\r\n class=\"size-4 text-gray-400\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <Icon\r\n icon=\"lucide:calendar\"\r\n class=\"size-4 text-gray-400\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </button>\r\n\r\n <Teleport\r\n to=\"body\"\r\n :disabled=\"!teleport\"\r\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 :id=\"calendarId\"\r\n ref=\"calendarRef\"\r\n role=\"dialog\"\r\n aria-modal=\"true\"\r\n :aria-label=\"`Choose date, ${monthYear}`\"\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 aria-label=\"Previous month\"\r\n @click=\"prevMonth\"\r\n >\r\n <Icon\r\n icon=\"lucide:chevron-left\"\r\n class=\"size-5 text-gray-600 dark:text-gray-400\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n <span\r\n class=\"font-medium text-gray-900 dark:text-white\"\r\n aria-live=\"polite\"\r\n aria-atomic=\"true\"\r\n >\r\n {{ monthYear }}\r\n </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 aria-label=\"Next month\"\r\n @click=\"nextMonth\"\r\n >\r\n <Icon\r\n icon=\"lucide:chevron-right\"\r\n class=\"size-5 text-gray-600 dark:text-gray-400\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Week days -->\r\n <div\r\n class=\"mb-2 grid grid-cols-7 gap-1\"\r\n role=\"row\"\r\n >\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 role=\"columnheader\"\r\n :abbr=\"day\"\r\n >\r\n {{ day }}\r\n </div>\r\n </div>\r\n\r\n <!-- Days grid -->\r\n <div\r\n :id=\"gridId\"\r\n class=\"grid grid-cols-7 gap-1\"\r\n role=\"grid\"\r\n :aria-label=\"monthYear\"\r\n >\r\n <button\r\n v-for=\"(day, index) in calendarDays\"\r\n :key=\"index\"\r\n type=\"button\"\r\n role=\"gridcell\"\r\n :aria-label=\"getDateLabel(day.date)\"\r\n :aria-selected=\"day.isSelected\"\r\n :aria-disabled=\"day.isDisabled || undefined\"\r\n :disabled=\"day.isDisabled\"\r\n :class=\"[\r\n 'size-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=\"size-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=\"size-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=\"size-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 'size-4'\r\n case 'lg':\r\n return 'size-8'\r\n default:\r\n return 'size-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-hidden 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, computed } 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 /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\r\n teleport?: string | false\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 teleport: false,\r\n },\r\n)\r\n\r\nconst teleportDisabled = computed(() => props.teleport === false)\r\nconst teleportTarget = computed(() => props.teleport === false ? 'body' : props.teleport)\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=\"size-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=\"size-4 text-gray-400\"\r\n :class=\"{ 'rotate-180': isOpen }\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <Teleport :to=\"teleportTarget\" :disabled=\"teleportDisabled\">\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=\"size-8 rounded-lg border-2 transition-transform hover:scale-110 focus:outline-hidden 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=\"size-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=\"size-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 </Teleport>\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 size-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 size-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","<script lang=\"ts\" setup>\r\nimport { ref, computed, watch, nextTick } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { onClickOutside } from '@vueuse/core'\r\nimport { useId } from '@/composables/useId'\r\n\r\nexport interface ComboboxOption {\r\n value: string | number\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Selected value(s) */\r\n modelValue?: string | number | (string | number)[] | null\r\n /** Available options */\r\n options: ComboboxOption[]\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Search placeholder */\r\n searchPlaceholder?: string\r\n /** Allow multiple selection */\r\n multiple?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Allow clearing selection */\r\n clearable?: boolean\r\n /** No results message */\r\n noResultsText?: string\r\n /** Input name attribute */\r\n name?: string\r\n /** Input id attribute */\r\n id?: string\r\n /** Teleport target (e.g., 'body', '#app'). Set to false to disable teleport. */\r\n teleport?: string | false\r\n }>(),\r\n {\r\n placeholder: 'Select...',\r\n searchPlaceholder: 'Search...',\r\n multiple: false,\r\n disabled: false,\r\n clearable: false,\r\n noResultsText: 'No results found',\r\n teleport: false,\r\n },\r\n)\r\n\r\n// Generate unique IDs for accessibility\r\nconst { id: generatedId, related } = useId({ prefix: 'combobox', id: props.id })\r\nconst inputId = computed(() => props.id ?? generatedId.value)\r\nconst listboxId = computed(() => related('listbox'))\r\n\r\nconst teleportDisabled = computed(() => props.teleport === false)\r\nconst teleportTarget = computed(() => props.teleport === false ? 'body' : props.teleport)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string | number | (string | number)[] | null]\r\n}>()\r\n\r\nconst containerRef = ref<HTMLElement>()\r\nconst inputRef = ref<HTMLInputElement>()\r\nconst isOpen = ref(false)\r\nconst search = ref('')\r\n\r\nonClickOutside(containerRef, () => {\r\n isOpen.value = false\r\n})\r\n\r\nconst filteredOptions = computed(() => {\r\n if (!search.value) return props.options\r\n const query = search.value.toLowerCase()\r\n return props.options.filter((opt) =>\r\n opt.label.toLowerCase().includes(query)\r\n )\r\n})\r\n\r\nconst selectedOptions = computed(() => {\r\n if (props.modelValue === null || props.modelValue === undefined) return []\r\n const values = Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue]\r\n return props.options.filter((opt) => values.includes(opt.value))\r\n})\r\n\r\nconst displayValue = computed(() => {\r\n if (selectedOptions.value.length === 0) return ''\r\n if (props.multiple) {\r\n return selectedOptions.value.map((o) => o.label).join(', ')\r\n }\r\n return selectedOptions.value[0]?.label || ''\r\n})\r\n\r\nconst isSelected = (option: ComboboxOption): boolean => {\r\n if (props.modelValue === null || props.modelValue === undefined) return false\r\n if (Array.isArray(props.modelValue)) {\r\n return props.modelValue.includes(option.value)\r\n }\r\n return props.modelValue === option.value\r\n}\r\n\r\nconst toggleOption = (option: ComboboxOption) => {\r\n if (option.disabled) return\r\n\r\n if (props.multiple) {\r\n const currentValues = Array.isArray(props.modelValue) ? [...props.modelValue] : []\r\n const index = currentValues.indexOf(option.value)\r\n if (index === -1) {\r\n currentValues.push(option.value)\r\n } else {\r\n currentValues.splice(index, 1)\r\n }\r\n emit('update:modelValue', currentValues)\r\n } else {\r\n emit('update:modelValue', option.value)\r\n isOpen.value = false\r\n search.value = ''\r\n }\r\n}\r\n\r\nconst clear = () => {\r\n emit('update:modelValue', props.multiple ? [] : null)\r\n search.value = ''\r\n}\r\n\r\nconst openDropdown = () => {\r\n if (props.disabled) return\r\n isOpen.value = true\r\n nextTick(() => {\r\n inputRef.value?.focus()\r\n })\r\n}\r\n\r\nwatch(isOpen, (open) => {\r\n if (!open) {\r\n search.value = ''\r\n }\r\n})\r\n</script>\r\n\r\n<template>\r\n <div\r\n ref=\"containerRef\"\r\n class=\"relative\"\r\n >\r\n <!-- Trigger -->\r\n <div\r\n role=\"combobox\"\r\n :aria-expanded=\"isOpen\"\r\n :aria-haspopup=\"'listbox'\"\r\n :aria-controls=\"listboxId\"\r\n :class=\"[\r\n 'flex min-h-[42px] w-full cursor-pointer items-center rounded-lg border bg-white px-3 py-2 transition-colors',\r\n 'dark:bg-gray-900',\r\n disabled\r\n ? 'cursor-not-allowed border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800'\r\n : isOpen\r\n ? 'border-primary ring-2 ring-primary/20'\r\n : 'border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500',\r\n ]\"\r\n @click=\"openDropdown\"\r\n >\r\n <!-- Selected value or placeholder -->\r\n <span\r\n v-if=\"!isOpen\"\r\n :class=\"[\r\n 'flex-1 truncate text-sm',\r\n selectedOptions.length ? 'text-gray-900 dark:text-gray-100' : 'text-gray-400 dark:text-gray-500',\r\n ]\"\r\n >\r\n {{ displayValue || placeholder }}\r\n </span>\r\n\r\n <!-- Search input (when open) -->\r\n <input\r\n v-else\r\n :id=\"inputId\"\r\n ref=\"inputRef\"\r\n v-model=\"search\"\r\n type=\"text\"\r\n :name=\"name\"\r\n :placeholder=\"searchPlaceholder\"\r\n :disabled=\"disabled\"\r\n aria-autocomplete=\"list\"\r\n :aria-controls=\"listboxId\"\r\n class=\"flex-1 border-none bg-transparent text-sm text-gray-900 outline-hidden placeholder:text-gray-400 dark:text-gray-100 dark:placeholder:text-gray-500\"\r\n @click.stop\r\n />\r\n\r\n <!-- Actions -->\r\n <div class=\"flex items-center gap-1\">\r\n <!-- Clear button -->\r\n <button\r\n v-if=\"clearable && selectedOptions.length > 0 && !disabled\"\r\n type=\"button\"\r\n class=\"rounded p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n aria-label=\"Clear selection\"\r\n @click.stop=\"clear\"\r\n >\r\n <Icon icon=\"lucide:x\" class=\"size-4\" aria-hidden=\"true\" />\r\n </button>\r\n\r\n <!-- Chevron -->\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"[\r\n 'size-4 text-gray-400 transition-transform',\r\n isOpen && 'rotate-180',\r\n ]\"\r\n aria-hidden=\"true\"\r\n />\r\n </div>\r\n </div>\r\n\r\n <!-- Dropdown -->\r\n <Teleport :to=\"teleportTarget\" :disabled=\"teleportDisabled\">\r\n <Transition\r\n enter-active-class=\"transition duration-100 ease-out\"\r\n enter-from-class=\"transform scale-95 opacity-0\"\r\n enter-to-class=\"transform scale-100 opacity-100\"\r\n leave-active-class=\"transition duration-75 ease-in\"\r\n leave-from-class=\"transform scale-100 opacity-100\"\r\n leave-to-class=\"transform scale-95 opacity-0\"\r\n >\r\n <div\r\n v-if=\"isOpen\"\r\n :id=\"listboxId\"\r\n role=\"listbox\"\r\n :aria-label=\"placeholder\"\r\n :aria-multiselectable=\"multiple || undefined\"\r\n class=\"absolute z-50 mt-1 max-h-60 w-full overflow-auto rounded-lg border border-gray-200 bg-white py-1 shadow-lg dark:border-gray-700 dark:bg-gray-900\"\r\n >\r\n <!-- Options -->\r\n <template v-if=\"filteredOptions.length\">\r\n <button\r\n v-for=\"option in filteredOptions\"\r\n :key=\"option.value\"\r\n type=\"button\"\r\n role=\"option\"\r\n :aria-selected=\"isSelected(option)\"\r\n :aria-disabled=\"option.disabled || undefined\"\r\n :disabled=\"option.disabled\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\r\n option.disabled\r\n ? 'cursor-not-allowed text-gray-400 dark:text-gray-500'\r\n : isSelected(option)\r\n ? 'bg-primary/10 text-primary dark:bg-primary/20'\r\n : 'text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800',\r\n ]\"\r\n @click=\"toggleOption(option)\"\r\n >\r\n <!-- Checkbox for multiple -->\r\n <span\r\n v-if=\"multiple\"\r\n :class=\"[\r\n 'flex size-4 items-center justify-center rounded border',\r\n isSelected(option)\r\n ? 'border-primary bg-primary text-white'\r\n : 'border-gray-300 dark:border-gray-600',\r\n ]\"\r\n aria-hidden=\"true\"\r\n >\r\n <Icon v-if=\"isSelected(option)\" icon=\"lucide:check\" class=\"size-3\" />\r\n </span>\r\n\r\n <!-- Label -->\r\n <span class=\"flex-1\">{{ option.label }}</span>\r\n\r\n <!-- Check for single -->\r\n <Icon\r\n v-if=\"!multiple && isSelected(option)\"\r\n icon=\"lucide:check\"\r\n class=\"size-4 text-primary\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n </template>\r\n\r\n <!-- No results -->\r\n <div\r\n v-else\r\n class=\"px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400\"\r\n role=\"status\"\r\n >\r\n {{ noResultsText }}\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","useId","computed","ref","useDropdown","nextTick","index","watch","_createElementVNode","_unref","_hoisted_3","_toDisplayString","_createVNode","Icon","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_Fragment","_renderList","_hoisted_10","_hoisted_11","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2","_hoisted_4","_hoisted_9","_withModifiers","_normalizeStyle","onClickOutside"],"mappings":"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"}
|
|
@@ -80,7 +80,7 @@ const _sfc_main$b = /* @__PURE__ */ defineComponent({
|
|
|
80
80
|
"aria-invalid": props.invalid || void 0,
|
|
81
81
|
"aria-required": props.required || void 0,
|
|
82
82
|
"aria-describedby": props.describedBy || void 0,
|
|
83
|
-
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-
|
|
83
|
+
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-hidden 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"
|
|
84
84
|
}, _ctx.$attrs), null, 16, _hoisted_1$b)), [
|
|
85
85
|
[vModelDynamic, modelValue.value]
|
|
86
86
|
]);
|
|
@@ -277,7 +277,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
|
|
|
277
277
|
"aria-label": __props.placeholder || "Select an option",
|
|
278
278
|
style: normalizeStyle(unref(dropdownStyle)),
|
|
279
279
|
class: normalizeClass([
|
|
280
|
-
"z-
|
|
280
|
+
"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",
|
|
281
281
|
!__props.teleport && "absolute mt-1 w-full"
|
|
282
282
|
])
|
|
283
283
|
}, [
|
|
@@ -293,7 +293,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
|
|
|
293
293
|
ref: searchInputRef,
|
|
294
294
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => searchQuery.value = $event),
|
|
295
295
|
type: "text",
|
|
296
|
-
class: "flex-1 bg-transparent text-sm outline-
|
|
296
|
+
class: "flex-1 bg-transparent text-sm outline-hidden dark:text-white",
|
|
297
297
|
placeholder: "Search...",
|
|
298
298
|
"aria-label": "Search options",
|
|
299
299
|
onKeydown: handleKeydown
|
|
@@ -451,7 +451,7 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
|
|
|
451
451
|
return openBlock(), createElementBlock("div", _hoisted_1$8, [
|
|
452
452
|
createVNode(unref(Icon), {
|
|
453
453
|
icon: __props.icon,
|
|
454
|
-
class: "absolute top-1/2 left-3
|
|
454
|
+
class: "absolute top-1/2 left-3 size-5 -translate-y-1/2 text-gray-400"
|
|
455
455
|
}, null, 8, ["icon"]),
|
|
456
456
|
createElementVNode("input", {
|
|
457
457
|
disabled: __props.disabled,
|
|
@@ -522,7 +522,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
|
|
|
522
522
|
"aria-describedby": __props.description ? descriptionId.value : void 0,
|
|
523
523
|
disabled: __props.disabled,
|
|
524
524
|
class: normalizeClass([
|
|
525
|
-
"relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-
|
|
525
|
+
"relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-hidden focus:ring-2 focus:ring-primary focus:ring-offset-2",
|
|
526
526
|
switchSizes[__props.size],
|
|
527
527
|
__props.modelValue ? "bg-primary" : "bg-gray-300 dark:bg-gray-600"
|
|
528
528
|
]),
|
|
@@ -829,7 +829,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
829
829
|
"aria-modal": "true",
|
|
830
830
|
"aria-label": `Choose date, ${monthYear.value}`,
|
|
831
831
|
style: normalizeStyle(unref(dropdownStyle)),
|
|
832
|
-
class: "z-
|
|
832
|
+
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"
|
|
833
833
|
}, [
|
|
834
834
|
createElementVNode("div", _hoisted_6$3, [
|
|
835
835
|
createElementVNode("button", {
|
|
@@ -884,7 +884,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
|
|
|
884
884
|
"aria-disabled": day.isDisabled || void 0,
|
|
885
885
|
disabled: day.isDisabled,
|
|
886
886
|
class: normalizeClass([
|
|
887
|
-
"
|
|
887
|
+
"size-8 rounded text-sm transition",
|
|
888
888
|
day.isDisabled && "cursor-not-allowed opacity-30",
|
|
889
889
|
!day.isCurrentMonth && "text-gray-400 dark:text-gray-600",
|
|
890
890
|
day.isCurrentMonth && !day.isSelected && !day.isToday && "text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700",
|
|
@@ -1080,7 +1080,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
|
1080
1080
|
createElementVNode("div", _hoisted_3$4, [
|
|
1081
1081
|
createVNode(unref(Icon), {
|
|
1082
1082
|
icon: "heroicons:cloud-arrow-up",
|
|
1083
|
-
class: normalizeClass(["
|
|
1083
|
+
class: normalizeClass(["size-12 mx-auto text-gray-400", { "text-primary-500": isDragging.value }])
|
|
1084
1084
|
}, null, 8, ["class"]),
|
|
1085
1085
|
createElementVNode("p", _hoisted_4$2, toDisplayString(__props.label), 1),
|
|
1086
1086
|
__props.description ? (openBlock(), createElementBlock("p", _hoisted_5$2, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
|
|
@@ -1095,7 +1095,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
|
1095
1095
|
}, [
|
|
1096
1096
|
createVNode(unref(Icon), {
|
|
1097
1097
|
icon: getFileIcon(uploadedFile.file),
|
|
1098
|
-
class: "
|
|
1098
|
+
class: "size-8 text-gray-400"
|
|
1099
1099
|
}, null, 8, ["icon"]),
|
|
1100
1100
|
createElementVNode("div", _hoisted_8$1, [
|
|
1101
1101
|
createElementVNode("p", _hoisted_9, toDisplayString(uploadedFile.file.name), 1),
|
|
@@ -1108,7 +1108,7 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
|
|
|
1108
1108
|
}, [
|
|
1109
1109
|
createVNode(unref(Icon), {
|
|
1110
1110
|
icon: "heroicons:x-mark",
|
|
1111
|
-
class: "
|
|
1111
|
+
class: "size-5"
|
|
1112
1112
|
})
|
|
1113
1113
|
], 8, _hoisted_11)
|
|
1114
1114
|
]);
|
|
@@ -1150,11 +1150,11 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
|
1150
1150
|
const sizeClasses = computed(() => {
|
|
1151
1151
|
switch (props.size) {
|
|
1152
1152
|
case "sm":
|
|
1153
|
-
return "
|
|
1153
|
+
return "size-4";
|
|
1154
1154
|
case "lg":
|
|
1155
|
-
return "
|
|
1155
|
+
return "size-8";
|
|
1156
1156
|
default:
|
|
1157
|
-
return "
|
|
1157
|
+
return "size-6";
|
|
1158
1158
|
}
|
|
1159
1159
|
});
|
|
1160
1160
|
const getStarState = (index) => {
|
|
@@ -1196,7 +1196,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
|
|
|
1196
1196
|
return openBlock(), createElementBlock("button", {
|
|
1197
1197
|
key: index,
|
|
1198
1198
|
type: "button",
|
|
1199
|
-
class: normalizeClass(["relative focus:outline-
|
|
1199
|
+
class: normalizeClass(["relative focus:outline-hidden focus:ring-2 focus:ring-primary-500 focus:ring-offset-1 rounded", [
|
|
1200
1200
|
__props.readonly || __props.disabled ? "cursor-default" : "cursor-pointer",
|
|
1201
1201
|
__props.disabled && "opacity-50"
|
|
1202
1202
|
]]),
|
|
@@ -1319,13 +1319,13 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
1319
1319
|
onClick: togglePicker
|
|
1320
1320
|
}, [
|
|
1321
1321
|
createElementVNode("span", {
|
|
1322
|
-
class: "
|
|
1322
|
+
class: "size-6 rounded border border-gray-200 dark:border-gray-600",
|
|
1323
1323
|
style: normalizeStyle({ backgroundColor: __props.modelValue })
|
|
1324
1324
|
}, null, 4),
|
|
1325
1325
|
createElementVNode("span", _hoisted_4$1, toDisplayString(__props.modelValue), 1),
|
|
1326
1326
|
createVNode(unref(Icon), {
|
|
1327
1327
|
icon: "heroicons:chevron-down",
|
|
1328
|
-
class: normalizeClass(["
|
|
1328
|
+
class: normalizeClass(["size-4 text-gray-400", { "rotate-180": isOpen.value }])
|
|
1329
1329
|
}, null, 8, ["class"])
|
|
1330
1330
|
], 10, _hoisted_3$2),
|
|
1331
1331
|
(openBlock(), createBlock(Teleport, {
|
|
@@ -1352,7 +1352,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
1352
1352
|
return openBlock(), createElementBlock("button", {
|
|
1353
1353
|
key: color,
|
|
1354
1354
|
type: "button",
|
|
1355
|
-
class: normalizeClass(["
|
|
1355
|
+
class: normalizeClass(["size-8 rounded-lg border-2 transition-transform hover:scale-110 focus:outline-hidden focus:ring-2 focus:ring-primary-500 focus:ring-offset-1", [
|
|
1356
1356
|
__props.modelValue === color ? "border-primary-500 ring-2 ring-primary-500 ring-offset-1" : "border-transparent"
|
|
1357
1357
|
]]),
|
|
1358
1358
|
style: normalizeStyle({ backgroundColor: color }),
|
|
@@ -1362,7 +1362,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
1362
1362
|
__props.modelValue === color ? (openBlock(), createBlock(unref(Icon), {
|
|
1363
1363
|
key: 0,
|
|
1364
1364
|
icon: "heroicons:check",
|
|
1365
|
-
class: normalizeClass(["
|
|
1365
|
+
class: normalizeClass(["size-4 mx-auto", [
|
|
1366
1366
|
["#ffffff", "#f9fafb", "#f3f4f6", "#e5e7eb", "#eab308", "#f59e0b"].includes(color) ? "text-gray-800" : "text-white"
|
|
1367
1367
|
]])
|
|
1368
1368
|
}, null, 8, ["class"])) : createCommentVNode("", true)
|
|
@@ -1373,7 +1373,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
|
|
|
1373
1373
|
createElementVNode("input", {
|
|
1374
1374
|
type: "color",
|
|
1375
1375
|
value: __props.modelValue,
|
|
1376
|
-
class: "
|
|
1376
|
+
class: "size-8 rounded cursor-pointer border-0 p-0",
|
|
1377
1377
|
onInput: handleNativeInput
|
|
1378
1378
|
}, null, 40, _hoisted_8),
|
|
1379
1379
|
withDirectives(createElementVNode("input", {
|
|
@@ -1506,7 +1506,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
1506
1506
|
style: normalizeStyle(rangeStyle.value)
|
|
1507
1507
|
}, null, 6),
|
|
1508
1508
|
createElementVNode("div", {
|
|
1509
|
-
class: normalizeClass(["absolute top-1/2 -translate-y-1/2 -translate-x-1/2
|
|
1509
|
+
class: normalizeClass(["absolute top-1/2 -translate-y-1/2 -translate-x-1/2 size-5 rounded-full border-2 shadow transition-shadow", [
|
|
1510
1510
|
__props.disabled ? "bg-gray-300 border-gray-400 cursor-not-allowed" : "bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing",
|
|
1511
1511
|
dragging.value === "min" && "ring-4 ring-primary-200 dark:ring-primary-800"
|
|
1512
1512
|
]]),
|
|
@@ -1514,7 +1514,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
|
|
|
1514
1514
|
onMousedown: _cache[0] || (_cache[0] = ($event) => handleMouseDown("min"))
|
|
1515
1515
|
}, null, 38),
|
|
1516
1516
|
createElementVNode("div", {
|
|
1517
|
-
class: normalizeClass(["absolute top-1/2 -translate-y-1/2 -translate-x-1/2
|
|
1517
|
+
class: normalizeClass(["absolute top-1/2 -translate-y-1/2 -translate-x-1/2 size-5 rounded-full border-2 shadow transition-shadow", [
|
|
1518
1518
|
__props.disabled ? "bg-gray-300 border-gray-400 cursor-not-allowed" : "bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing",
|
|
1519
1519
|
dragging.value === "max" && "ring-4 ring-primary-200 dark:ring-primary-800"
|
|
1520
1520
|
]]),
|
|
@@ -1669,7 +1669,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
1669
1669
|
disabled: __props.disabled,
|
|
1670
1670
|
"aria-autocomplete": "list",
|
|
1671
1671
|
"aria-controls": listboxId.value,
|
|
1672
|
-
class: "flex-1 border-none bg-transparent text-sm text-gray-900 outline-
|
|
1672
|
+
class: "flex-1 border-none bg-transparent text-sm text-gray-900 outline-hidden placeholder:text-gray-400 dark:text-gray-100 dark:placeholder:text-gray-500",
|
|
1673
1673
|
onClick: _cache[1] || (_cache[1] = withModifiers(() => {
|
|
1674
1674
|
}, ["stop"]))
|
|
1675
1675
|
}, null, 8, _hoisted_2)), [
|
|
@@ -1685,14 +1685,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
1685
1685
|
}, [
|
|
1686
1686
|
createVNode(unref(Icon), {
|
|
1687
1687
|
icon: "lucide:x",
|
|
1688
|
-
class: "
|
|
1688
|
+
class: "size-4",
|
|
1689
1689
|
"aria-hidden": "true"
|
|
1690
1690
|
})
|
|
1691
1691
|
])) : createCommentVNode("", true),
|
|
1692
1692
|
createVNode(unref(Icon), {
|
|
1693
1693
|
icon: "lucide:chevron-down",
|
|
1694
1694
|
class: normalizeClass([
|
|
1695
|
-
"
|
|
1695
|
+
"size-4 text-gray-400 transition-transform",
|
|
1696
1696
|
isOpen.value && "rotate-180"
|
|
1697
1697
|
]),
|
|
1698
1698
|
"aria-hidden": "true"
|
|
@@ -1737,7 +1737,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
1737
1737
|
__props.multiple ? (openBlock(), createElementBlock("span", {
|
|
1738
1738
|
key: 0,
|
|
1739
1739
|
class: normalizeClass([
|
|
1740
|
-
"flex
|
|
1740
|
+
"flex size-4 items-center justify-center rounded border",
|
|
1741
1741
|
isSelected(option) ? "border-primary bg-primary text-white" : "border-gray-300 dark:border-gray-600"
|
|
1742
1742
|
]),
|
|
1743
1743
|
"aria-hidden": "true"
|
|
@@ -1745,14 +1745,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
1745
1745
|
isSelected(option) ? (openBlock(), createBlock(unref(Icon), {
|
|
1746
1746
|
key: 0,
|
|
1747
1747
|
icon: "lucide:check",
|
|
1748
|
-
class: "
|
|
1748
|
+
class: "size-3"
|
|
1749
1749
|
})) : createCommentVNode("", true)
|
|
1750
1750
|
], 2)) : createCommentVNode("", true),
|
|
1751
1751
|
createElementVNode("span", _hoisted_6, toDisplayString(option.label), 1),
|
|
1752
1752
|
!__props.multiple && isSelected(option) ? (openBlock(), createBlock(unref(Icon), {
|
|
1753
1753
|
key: 1,
|
|
1754
1754
|
icon: "lucide:check",
|
|
1755
|
-
class: "
|
|
1755
|
+
class: "size-4 text-primary",
|
|
1756
1756
|
"aria-hidden": "true"
|
|
1757
1757
|
})) : createCommentVNode("", true)
|
|
1758
1758
|
], 10, _hoisted_5);
|
|
@@ -1782,4 +1782,4 @@ export {
|
|
|
1782
1782
|
_sfc_main$1 as k,
|
|
1783
1783
|
_sfc_main as l
|
|
1784
1784
|
};
|
|
1785
|
-
//# sourceMappingURL=Combobox.vue_vue_type_script_setup_true_lang-
|
|
1785
|
+
//# sourceMappingURL=Combobox.vue_vue_type_script_setup_true_lang-DKDJV0Ey.js.map
|