cisse-vue-ui 0.8.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +879 -879
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-hHJdvUYS.js → CheckboxGroup.vue_vue_type_script_setup_true_lang-BPALlche.js} +3 -3
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-BPALlche.js.map +1 -0
- package/dist/{CheckboxGroup.vue_vue_type_script_setup_true_lang-DJbuHoDj.cjs → CheckboxGroup.vue_vue_type_script_setup_true_lang-CYnPpiRd.cjs} +3 -3
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-CYnPpiRd.cjs.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs} +58 -9
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-BGUoa5fT.cjs.map +1 -0
- package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js} +58 -9
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DWs2V7xX.js.map +1 -0
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-56CxoSmj.js.map +1 -1
- package/dist/Dropdown.vue_vue_type_script_setup_true_lang-Dd3ySRNB.cjs.map +1 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-Bj3I5Sn7.cjs.map +1 -1
- package/dist/FilterTabs.vue_vue_type_script_setup_true_lang-DzLwUVCW.js.map +1 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-BwtEbaiT.js.map +1 -1
- package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-DtwwmfWr.cjs.map +1 -1
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-Bi97ypMD.cjs.map +1 -1
- package/dist/PageHero.vue_vue_type_script_setup_true_lang-DQQGYAw0.js.map +1 -1
- package/dist/cisse-vue-ui.css +57 -57
- package/dist/components/feedback/PaginationControls.stories.d.ts +5 -0
- package/dist/components/feedback/PaginationControls.vue.d.ts +2 -0
- package/dist/components/feedback/index.cjs +1 -1
- package/dist/components/feedback/index.js +1 -1
- package/dist/components/form/index.cjs +1 -1
- package/dist/components/form/index.js +1 -1
- package/dist/components/index.cjs +2 -2
- package/dist/components/index.js +2 -2
- package/dist/{index-rBD1MYh-.js → index-CE90-_mh.js} +3 -3
- package/dist/index-CE90-_mh.js.map +1 -0
- package/dist/{index-DwqCXgDx.cjs → index-QKwLtDJE.cjs} +3 -3
- package/dist/{index-DwqCXgDx.cjs.map → index-QKwLtDJE.cjs.map} +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.js +3 -3
- package/dist/style.css +1 -1
- package/dist/useDropdown-DHFnd259.cjs.map +1 -1
- package/dist/useDropdown-iVu14E6s.js.map +1 -1
- package/dist/useFocusTrap-AnlJsihM.js.map +1 -1
- package/dist/useFocusTrap-kcxO8AeU.cjs.map +1 -1
- package/dist/useId-nxrBaIC9.cjs.map +1 -1
- package/dist/useId-xeHj7rkg.js.map +1 -1
- package/dist/useToast-Bk60GArg.cjs.map +1 -1
- package/dist/useToast-ina5g3mj.js.map +1 -1
- package/package.json +169 -169
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-DJbuHoDj.cjs.map +0 -1
- package/dist/CheckboxGroup.vue_vue_type_script_setup_true_lang-hHJdvUYS.js.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bine-xfp.cjs.map +0 -1
- package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DqkA1Zr-.js.map +0 -1
- package/dist/index-rBD1MYh-.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CheckboxGroup.vue_vue_type_script_setup_true_lang-CYnPpiRd.cjs","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/InputWrapper.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","../src/components/form/IconPicker.vue","../src/components/form/FormSection.vue","../src/components/form/FormActions.vue","../src/components/form/EmailInput.vue","../src/components/form/PasswordInput.vue","../src/components/form/PhoneInput.vue","../src/components/form/NumberInput.vue","../src/components/form/MoneyInput.vue","../src/components/form/PercentInput.vue","../src/components/form/QuantityInput.vue","../src/components/form/URLInput.vue","../src/components/form/OTPInput.vue","../src/components/form/TagsInput.vue","../src/components/form/TextArea.vue","../src/components/form/CheckboxGroup.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 { computed, useSlots } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport type InputWrapperSize = 'sm' | 'md' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Icon on the left (Iconify format) */\r\n icon?: string\r\n /** Icon on the right (Iconify format) */\r\n iconRight?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Invalid/error state */\r\n invalid?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Custom wrapper classes */\r\n wrapperClass?: string\r\n }>(),\r\n {\r\n size: 'md',\r\n }\r\n)\r\n\r\nconst slots = useSlots()\r\n\r\nconst hasLeftIcon = computed(() => props.icon || slots.icon)\r\nconst hasRightContent = computed(() => props.iconRight || slots.actions)\r\n\r\nconst inputClass = computed(() => [\r\n // Base styles\r\n 'block w-full rounded-xl border text-sm transition-all',\r\n 'border-gray-200 bg-gray-50 text-gray-900 placeholder-gray-400',\r\n 'focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:bg-white focus:outline-hidden',\r\n 'disabled:border-gray-200 disabled:bg-gray-100 disabled:text-gray-500 disabled:cursor-not-allowed',\r\n // Dark mode\r\n 'dark:border-slate-600 dark:bg-slate-700 dark:text-white dark:placeholder-gray-500',\r\n 'dark:focus:border-primary-500 dark:focus:ring-primary-500 dark:focus:bg-slate-600',\r\n 'dark:disabled:bg-slate-800 dark:disabled:text-gray-500',\r\n // Padding based on icons/actions\r\n hasLeftIcon.value ? 'pl-10' : 'pl-4',\r\n hasRightContent.value ? 'pr-10' : 'pr-4',\r\n // Size\r\n props.size === 'sm' && 'py-2 text-xs',\r\n props.size === 'md' && 'py-3 text-sm',\r\n props.size === 'lg' && 'py-4 text-base',\r\n // Invalid state\r\n props.invalid && 'border-red-500 focus:border-red-500 focus:ring-red-500 dark:border-red-500',\r\n])\r\n\r\ndefineExpose({ inputClass })\r\n</script>\r\n\r\n<template>\r\n <div :class=\"['relative', wrapperClass]\">\r\n <!-- Left icon -->\r\n <div\r\n v-if=\"hasLeftIcon\"\r\n class=\"absolute left-3 top-1/2 -translate-y-1/2 pointer-events-none text-gray-400\"\r\n >\r\n <slot name=\"icon\">\r\n <Icon v-if=\"icon\" :icon=\"icon\" class=\"size-5\" />\r\n </slot>\r\n </div>\r\n\r\n <!-- Input slot with inputClass passed via scoped slot -->\r\n <slot :input-class=\"inputClass\" />\r\n\r\n <!-- Right side: actions or icon -->\r\n <div\r\n v-if=\"hasRightContent\"\r\n class=\"absolute right-3 top-1/2 -translate-y-1/2 flex items-center gap-1\"\r\n >\r\n <slot name=\"actions\">\r\n <Icon\r\n v-if=\"iconRight\"\r\n :icon=\"iconRight\"\r\n class=\"size-5 text-gray-400 pointer-events-none\"\r\n />\r\n </slot>\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputProps } from '@/types'\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\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 <InputWrapper\r\n :icon=\"props.icon\"\r\n :icon-right=\"props.iconRight\"\r\n :disabled=\"props.disabled\"\r\n :invalid=\"props.invalid\"\r\n >\r\n <template #default=\"{ inputClass }\">\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=\"inputClass\"\r\n v-bind=\"$attrs\"\r\n />\r\n </template>\r\n </InputWrapper>\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>\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Search icon (Iconify format) */\r\n icon?: string\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Input name */\r\n name?: string\r\n }>(),\r\n {\r\n placeholder: 'Search...',\r\n icon: 'lucide:search',\r\n size: 'md',\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n :icon=\"props.icon\"\r\n :size=\"props.size\"\r\n :disabled=\"props.disabled\"\r\n >\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n v-model=\"modelValue\"\r\n type=\"text\"\r\n :name=\"props.name\"\r\n :placeholder=\"props.placeholder\"\r\n :disabled=\"props.disabled\"\r\n :class=\"inputClass\"\r\n v-bind=\"$attrs\"\r\n />\r\n </template>\r\n </InputWrapper>\r\n</template>\r\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","<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport { useDebounceFn } from '@vueuse/core'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormHelp from './FormHelp.vue'\r\nimport { useId } from '@/composables/useId'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Field label */\r\n label?: string\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Help text */\r\n help?: string\r\n /** Error message */\r\n error?: string\r\n /** Whether the field is required */\r\n required?: boolean\r\n /** Whether the field is disabled */\r\n disabled?: boolean\r\n /** Custom ID */\r\n id?: string\r\n /** Icon collections to search (default: mdi, heroicons, lucide) */\r\n collections?: string[]\r\n /** Number of results to show */\r\n limit?: number\r\n }>(),\r\n {\r\n placeholder: 'Rechercher une icône...',\r\n collections: () => ['mdi', 'heroicons', 'lucide'],\r\n limit: 48,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst { id: generatedId, related } = useId({ prefix: 'iconpicker', id: props.id })\r\nconst inputId = computed(() => props.id ?? generatedId.value)\r\nconst helpId = computed(() => related('help'))\r\n\r\nconst searchQuery = ref('')\r\nconst isOpen = ref(false)\r\nconst isLoading = ref(false)\r\nconst searchResults = ref<string[]>([])\r\n\r\n// Popular icons to show by default\r\nconst popularIcons = [\r\n 'mdi:heart', 'mdi:star', 'mdi:home', 'mdi:account', 'mdi:email', 'mdi:phone',\r\n 'mdi:calendar', 'mdi:clock', 'mdi:check', 'mdi:close', 'mdi:plus', 'mdi:minus',\r\n 'mdi:stethoscope', 'mdi:hospital', 'mdi:medical-bag', 'mdi:pill', 'mdi:heart-pulse',\r\n 'mdi:tooth', 'mdi:eye', 'mdi:brain', 'mdi:lungs', 'mdi:bone',\r\n 'heroicons:heart', 'heroicons:star', 'heroicons:home', 'heroicons:user',\r\n 'heroicons:envelope', 'heroicons:phone', 'heroicons:calendar', 'heroicons:clock',\r\n 'heroicons:check', 'heroicons:x-mark', 'heroicons:plus', 'heroicons:minus',\r\n 'lucide:heart', 'lucide:star', 'lucide:home', 'lucide:user',\r\n 'lucide:mail', 'lucide:phone', 'lucide:calendar', 'lucide:clock',\r\n 'lucide:check', 'lucide:x', 'lucide:plus', 'lucide:minus',\r\n]\r\n\r\nconst displayedIcons = computed(() => {\r\n if (searchQuery.value && searchResults.value.length > 0) {\r\n return searchResults.value\r\n }\r\n return popularIcons\r\n})\r\n\r\nconst hasError = computed(() => props.error && typeof props.error === 'string')\r\n\r\nasync function searchIcons(query: string): Promise<void> {\r\n if (!query || query.length < 2) {\r\n searchResults.value = []\r\n return\r\n }\r\n\r\n isLoading.value = true\r\n try {\r\n const collectionsParam = props.collections.join(',')\r\n const response = await fetch(\r\n `https://api.iconify.design/search?query=${encodeURIComponent(query)}&limit=${props.limit}&prefixes=${collectionsParam}`\r\n )\r\n const data = await response.json()\r\n searchResults.value = data.icons || []\r\n } catch (error) {\r\n console.error('Failed to search icons:', error)\r\n searchResults.value = []\r\n } finally {\r\n isLoading.value = false\r\n }\r\n}\r\n\r\nconst debouncedSearch = useDebounceFn(searchIcons, 300)\r\n\r\nwatch(searchQuery, (query) => {\r\n debouncedSearch(query)\r\n})\r\n\r\nfunction selectIcon(icon: string): void {\r\n modelValue.value = icon\r\n isOpen.value = false\r\n searchQuery.value = ''\r\n}\r\n\r\nfunction clearSelection(): void {\r\n modelValue.value = ''\r\n}\r\n\r\nfunction openPicker(): void {\r\n if (!props.disabled) {\r\n isOpen.value = true\r\n }\r\n}\r\n\r\nfunction closePicker(): void {\r\n isOpen.value = false\r\n searchQuery.value = ''\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\">\r\n <FormLabel\r\n v-if=\"label\"\r\n :html-for=\"inputId\"\r\n :error=\"error\"\r\n >\r\n {{ label }}\r\n <span v-if=\"required\" class=\"text-red-500 ml-0.5\">*</span>\r\n </FormLabel>\r\n\r\n <!-- Selected icon display / trigger -->\r\n <button\r\n :id=\"inputId\"\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n :aria-invalid=\"hasError || undefined\"\r\n :aria-describedby=\"hasError ? helpId : undefined\"\r\n class=\"mt-1 flex w-full items-center gap-3 rounded-md border bg-white px-3 py-2 text-left text-sm shadow-sm transition-colors focus:outline-none focus:ring-2 focus:ring-primary dark:bg-gray-900\"\r\n :class=\"[\r\n hasError\r\n ? 'border-red-500 focus:border-red-500 focus:ring-red-500'\r\n : 'border-gray-300 focus:border-primary dark:border-gray-700',\r\n disabled\r\n ? 'cursor-not-allowed bg-gray-50 dark:bg-gray-950'\r\n : 'cursor-pointer hover:border-gray-400 dark:hover:border-gray-600',\r\n ]\"\r\n @click=\"openPicker\"\r\n >\r\n <div\r\n v-if=\"modelValue\"\r\n class=\"flex items-center gap-2 flex-1\"\r\n >\r\n <div class=\"flex size-8 items-center justify-center rounded bg-gray-100 dark:bg-gray-800\">\r\n <Icon :icon=\"modelValue\" class=\"size-5 text-gray-700 dark:text-gray-300\" />\r\n </div>\r\n <span class=\"text-gray-700 dark:text-gray-300 font-mono text-xs truncate\">{{ modelValue }}</span>\r\n </div>\r\n <span v-else class=\"flex-1 text-gray-400 dark:text-gray-500\">\r\n {{ placeholder }}\r\n </span>\r\n <button\r\n v-if=\"modelValue && !disabled\"\r\n type=\"button\"\r\n class=\"p-1 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n @click.stop=\"clearSelection\"\r\n >\r\n <Icon icon=\"lucide:x\" class=\"size-4\" />\r\n </button>\r\n <Icon icon=\"lucide:chevron-down\" class=\"size-4 text-gray-400\" />\r\n </button>\r\n\r\n <!-- Help/Error text -->\r\n <FormHelp v-if=\"help && !hasError\" :id=\"helpId\">\r\n {{ help }}\r\n </FormHelp>\r\n <FormHelp v-if=\"hasError\" :id=\"helpId\" :error=\"true\">\r\n {{ error }}\r\n </FormHelp>\r\n\r\n <!-- Dropdown picker -->\r\n <Teleport to=\"body\">\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"fixed inset-0 z-50\"\r\n @click=\"closePicker\"\r\n >\r\n <div\r\n class=\"absolute left-1/2 top-1/2 -translate-x-1/2 -translate-y-1/2 w-full max-w-md rounded-lg border border-gray-200 bg-white p-4 shadow-xl dark:border-gray-700 dark:bg-gray-900\"\r\n @click.stop\r\n >\r\n <!-- Search input -->\r\n <div class=\"relative mb-4\">\r\n <Icon\r\n icon=\"lucide:search\"\r\n class=\"absolute left-3 top-1/2 size-4 -translate-y-1/2 text-gray-400\"\r\n />\r\n <input\r\n v-model=\"searchQuery\"\r\n type=\"text\"\r\n :placeholder=\"placeholder\"\r\n class=\"w-full rounded-md border border-gray-300 bg-white py-2 pl-10 pr-4 text-sm text-gray-800 placeholder-gray-400 focus:border-primary focus:outline-none focus:ring-1 focus:ring-primary dark:border-gray-700 dark:bg-gray-800 dark:text-gray-200 dark:placeholder-gray-500\"\r\n autofocus\r\n />\r\n <div\r\n v-if=\"isLoading\"\r\n class=\"absolute right-3 top-1/2 -translate-y-1/2\"\r\n >\r\n <Icon icon=\"lucide:loader-2\" class=\"size-4 animate-spin text-gray-400\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Icons grid -->\r\n <div class=\"max-h-64 overflow-y-auto\">\r\n <div\r\n v-if=\"displayedIcons.length === 0 && searchQuery\"\r\n class=\"py-8 text-center text-sm text-gray-500\"\r\n >\r\n Aucune icône trouvée pour \"{{ searchQuery }}\"\r\n </div>\r\n <div\r\n v-else\r\n class=\"grid grid-cols-8 gap-1\"\r\n >\r\n <button\r\n v-for=\"icon in displayedIcons\"\r\n :key=\"icon\"\r\n type=\"button\"\r\n class=\"flex size-9 items-center justify-center rounded transition-colors\"\r\n :class=\"[\r\n modelValue === icon\r\n ? 'bg-primary text-white'\r\n : 'hover:bg-gray-100 dark:hover:bg-gray-800 text-gray-700 dark:text-gray-300',\r\n ]\"\r\n :title=\"icon\"\r\n @click=\"selectIcon(icon)\"\r\n >\r\n <Icon :icon=\"icon\" class=\"size-5\" />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div class=\"mt-4 flex items-center justify-between border-t border-gray-200 pt-4 dark:border-gray-700\">\r\n <p class=\"text-xs text-gray-500\">\r\n {{ searchQuery ? `${displayedIcons.length} résultats` : 'Icônes populaires' }}\r\n </p>\r\n <button\r\n type=\"button\"\r\n class=\"text-sm text-gray-500 hover:text-gray-700 dark:hover:text-gray-300\"\r\n @click=\"closePicker\"\r\n >\r\n Fermer\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { Icon } from '@iconify/vue'\r\n\r\nwithDefaults(\r\n defineProps<{\r\n /** Section title */\r\n title: string\r\n /** Section subtitle/description */\r\n subtitle?: string\r\n /** Icon name (iconify format) */\r\n icon?: string\r\n /** Icon color scheme */\r\n iconColor?: 'primary' | 'gray' | 'success' | 'warning' | 'danger'\r\n /** Show border around section */\r\n bordered?: boolean\r\n /** Collapsible section */\r\n collapsible?: boolean\r\n /** Initially collapsed (only when collapsible) */\r\n collapsed?: boolean\r\n }>(),\r\n {\r\n iconColor: 'primary',\r\n bordered: true,\r\n collapsible: false,\r\n collapsed: false,\r\n }\r\n)\r\n\r\nconst isCollapsed = defineModel<boolean>('collapsed', { default: false })\r\n\r\nfunction toggleCollapse() {\r\n isCollapsed.value = !isCollapsed.value\r\n}\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"[\r\n 'bg-white dark:bg-slate-800 rounded-2xl overflow-hidden',\r\n bordered && 'border border-gray-100 dark:border-slate-700 shadow-sm',\r\n ]\"\r\n >\r\n <!-- Header -->\r\n <div\r\n :class=\"[\r\n 'p-5 border-b border-gray-100 dark:border-slate-700 bg-linear-to-r from-gray-50 to-white dark:from-slate-800 dark:to-slate-800',\r\n collapsible && 'cursor-pointer hover:bg-gray-50 dark:hover:bg-slate-700/50 transition-colors',\r\n ]\"\r\n @click=\"collapsible && toggleCollapse()\"\r\n >\r\n <div class=\"flex items-center justify-between\">\r\n <div class=\"flex items-center gap-3\">\r\n <!-- Icon -->\r\n <div\r\n v-if=\"icon\"\r\n :class=\"[\r\n 'size-10 rounded-xl flex items-center justify-center',\r\n iconColor === 'primary' && 'bg-primary-100 dark:bg-primary-900/30',\r\n iconColor === 'gray' && 'bg-gray-100 dark:bg-slate-700',\r\n iconColor === 'success' && 'bg-emerald-100 dark:bg-emerald-900/30',\r\n iconColor === 'warning' && 'bg-amber-100 dark:bg-amber-900/30',\r\n iconColor === 'danger' && 'bg-red-100 dark:bg-red-900/30',\r\n ]\"\r\n >\r\n <Icon\r\n :icon=\"icon\"\r\n :class=\"[\r\n 'size-5',\r\n iconColor === 'primary' && 'text-primary-600 dark:text-primary-400',\r\n iconColor === 'gray' && 'text-gray-600 dark:text-gray-400',\r\n iconColor === 'success' && 'text-emerald-600 dark:text-emerald-400',\r\n iconColor === 'warning' && 'text-amber-600 dark:text-amber-400',\r\n iconColor === 'danger' && 'text-red-600 dark:text-red-400',\r\n ]\"\r\n />\r\n </div>\r\n\r\n <!-- Title & Subtitle -->\r\n <div>\r\n <h2 class=\"text-lg font-semibold text-gray-900 dark:text-white\">\r\n <slot name=\"title\">{{ title }}</slot>\r\n </h2>\r\n <p v-if=\"subtitle\" class=\"text-sm text-gray-500 dark:text-gray-400\">\r\n <slot name=\"subtitle\">{{ subtitle }}</slot>\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- Collapse toggle -->\r\n <button\r\n v-if=\"collapsible\"\r\n type=\"button\"\r\n class=\"p-2 rounded-lg hover:bg-gray-100 dark:hover:bg-slate-700 transition-colors\"\r\n @click.stop=\"toggleCollapse\"\r\n >\r\n <Icon\r\n icon=\"heroicons:chevron-down\"\r\n :class=\"[\r\n 'w-5 h-5 text-gray-400 transition-transform duration-200',\r\n isCollapsed && '-rotate-90',\r\n ]\"\r\n />\r\n </button>\r\n\r\n <!-- Header actions slot -->\r\n <slot name=\"header-actions\" />\r\n </div>\r\n </div>\r\n\r\n <!-- Content -->\r\n <div\r\n v-show=\"!isCollapsed\"\r\n class=\"p-5 sm:p-6\"\r\n >\r\n <slot />\r\n </div>\r\n\r\n <!-- Footer -->\r\n <div\r\n v-if=\"$slots.footer\"\r\n v-show=\"!isCollapsed\"\r\n class=\"px-5 py-4 bg-gray-50 dark:bg-slate-800/50 border-t border-gray-100 dark:border-slate-700\"\r\n >\r\n <slot name=\"footer\" />\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { Icon } from '@iconify/vue'\r\nimport Button from '../core/Button.vue'\r\n\r\nwithDefaults(\r\n defineProps<{\r\n /** Submit button label */\r\n submitLabel?: string\r\n /** Cancel button label */\r\n cancelLabel?: string\r\n /** Submit button icon */\r\n submitIcon?: string\r\n /** Cancel button icon */\r\n cancelIcon?: string\r\n /** Loading state */\r\n loading?: boolean\r\n /** Loading label */\r\n loadingLabel?: string\r\n /** Disable submit button */\r\n disabled?: boolean\r\n /** Show cancel button */\r\n showCancel?: boolean\r\n /** Alignment */\r\n align?: 'left' | 'center' | 'right' | 'stretch'\r\n /** Stack buttons on mobile */\r\n stackOnMobile?: boolean\r\n /** Submit button variant */\r\n submitVariant?: 'primary' | 'success' | 'danger'\r\n }>(),\r\n {\r\n submitLabel: 'Enregistrer',\r\n cancelLabel: 'Annuler',\r\n submitIcon: 'heroicons:check',\r\n cancelIcon: 'heroicons:x-mark',\r\n showCancel: true,\r\n align: 'right',\r\n stackOnMobile: false,\r\n submitVariant: 'primary',\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n submit: []\r\n cancel: []\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"[\r\n 'flex gap-3 pt-2',\r\n align === 'left' && 'justify-start',\r\n align === 'center' && 'justify-center',\r\n align === 'right' && 'justify-end',\r\n align === 'stretch' && '[&>*]:flex-1',\r\n stackOnMobile && 'flex-col sm:flex-row',\r\n ]\"\r\n >\r\n <!-- Cancel button -->\r\n <Button\r\n v-if=\"showCancel\"\r\n type=\"button\"\r\n variant=\"outline\"\r\n :disabled=\"loading\"\r\n :class=\"[\r\n stackOnMobile && 'order-2 sm:order-1',\r\n ]\"\r\n @click=\"emit('cancel')\"\r\n >\r\n <Icon v-if=\"cancelIcon\" :icon=\"cancelIcon\" class=\"w-5 h-5\" />\r\n {{ cancelLabel }}\r\n </Button>\r\n\r\n <!-- Submit button -->\r\n <Button\r\n type=\"submit\"\r\n :variant=\"submitVariant\"\r\n :disabled=\"disabled || loading\"\r\n :loading=\"loading\"\r\n :class=\"[\r\n stackOnMobile && 'order-1 sm:order-2',\r\n ]\"\r\n @click=\"emit('submit')\"\r\n >\r\n <template v-if=\"!loading\">\r\n <Icon v-if=\"submitIcon\" :icon=\"submitIcon\" class=\"w-5 h-5\" />\r\n {{ submitLabel }}\r\n </template>\r\n <span v-else>{{ loadingLabel || submitLabel + '...' }}</span>\r\n </Button>\r\n\r\n <!-- Extra actions slot -->\r\n <slot name=\"extra\" />\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed, ref } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show validation state */\r\n showValidation?: boolean\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n }>(),\r\n {\r\n placeholder: 'Enter email address...',\r\n size: 'md',\r\n showValidation: true,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\r\n\r\nconst isValid = computed(() => {\r\n if (!modelValue.value) return null\r\n return emailRegex.test(modelValue.value)\r\n})\r\n\r\nconst isTouched = ref(false)\r\n\r\nconst showStatus = computed(() => {\r\n return props.showValidation && isTouched.value && !!modelValue.value\r\n})\r\n\r\nfunction handleBlur() {\r\n isTouched.value = true\r\n}\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n icon=\"lucide:mail\"\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n :invalid=\"showStatus && isValid === false\"\r\n >\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n v-model=\"modelValue\"\r\n type=\"email\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :aria-invalid=\"(showStatus && isValid === false) || undefined\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"inputClass\"\r\n v-bind=\"$attrs\"\r\n @blur=\"handleBlur\"\r\n />\r\n </template>\r\n <template #actions>\r\n <Icon\r\n v-if=\"showStatus && isValid\"\r\n icon=\"lucide:check-circle\"\r\n class=\"size-5 text-emerald-500\"\r\n />\r\n <Icon\r\n v-else-if=\"showStatus && isValid === false\"\r\n icon=\"lucide:alert-circle\"\r\n class=\"size-5 text-red-500\"\r\n />\r\n </template>\r\n </InputWrapper>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed, ref } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nexport type PasswordStrength = 'weak' | 'fair' | 'good' | 'strong'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show strength indicator */\r\n showStrength?: boolean\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n /** Minimum length for strength calculation */\r\n minLength?: number\r\n }>(),\r\n {\r\n placeholder: 'Enter password...',\r\n size: 'md',\r\n showStrength: false,\r\n minLength: 8,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst showPassword = ref(false)\r\n\r\nconst strength = computed<PasswordStrength | null>(() => {\r\n const password = modelValue.value\r\n if (!password) return null\r\n\r\n let score = 0\r\n\r\n // Length check\r\n if (password.length >= props.minLength) score++\r\n if (password.length >= 12) score++\r\n\r\n // Character variety checks\r\n if (/[a-z]/.test(password)) score++\r\n if (/[A-Z]/.test(password)) score++\r\n if (/[0-9]/.test(password)) score++\r\n if (/[^a-zA-Z0-9]/.test(password)) score++\r\n\r\n if (score <= 2) return 'weak'\r\n if (score <= 3) return 'fair'\r\n if (score <= 4) return 'good'\r\n return 'strong'\r\n})\r\n\r\nconst strengthConfig = computed(() => {\r\n const configs = {\r\n weak: { label: 'Weak', color: 'bg-red-500', width: 'w-1/4' },\r\n fair: { label: 'Fair', color: 'bg-orange-500', width: 'w-2/4' },\r\n good: { label: 'Good', color: 'bg-yellow-500', width: 'w-3/4' },\r\n strong: { label: 'Strong', color: 'bg-emerald-500', width: 'w-full' },\r\n }\r\n return strength.value ? configs[strength.value] : null\r\n})\r\n\r\nfunction toggleVisibility() {\r\n showPassword.value = !showPassword.value\r\n}\r\n</script>\r\n\r\n<template>\r\n <div>\r\n <InputWrapper\r\n icon=\"lucide:lock\"\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n >\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n v-model=\"modelValue\"\r\n :type=\"showPassword ? 'text' : 'password'\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"inputClass\"\r\n v-bind=\"$attrs\"\r\n autocomplete=\"new-password\"\r\n />\r\n </template>\r\n <template #actions>\r\n <button\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n @click=\"toggleVisibility\"\r\n >\r\n <Icon\r\n :icon=\"showPassword ? 'lucide:eye-off' : 'lucide:eye'\"\r\n class=\"size-5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300\"\r\n />\r\n </button>\r\n </template>\r\n </InputWrapper>\r\n\r\n <!-- Strength indicator -->\r\n <div v-if=\"showStrength && modelValue\" class=\"mt-2\">\r\n <div class=\"h-1.5 w-full rounded-full bg-gray-200 dark:bg-slate-700 overflow-hidden\">\r\n <div\r\n :class=\"[\r\n 'h-full rounded-full transition-all duration-300',\r\n strengthConfig?.color,\r\n strengthConfig?.width,\r\n ]\"\r\n />\r\n </div>\r\n <p\r\n v-if=\"strengthConfig\"\r\n :class=\"[\r\n 'mt-1 text-xs font-medium',\r\n strength === 'weak' && 'text-red-500',\r\n strength === 'fair' && 'text-orange-500',\r\n strength === 'good' && 'text-yellow-600 dark:text-yellow-500',\r\n strength === 'strong' && 'text-emerald-500',\r\n ]\"\r\n >\r\n {{ strengthConfig.label }}\r\n </p>\r\n </div>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\">\r\nexport interface PhoneCountry {\r\n code: string\r\n name: string\r\n dialCode: string\r\n flag: string\r\n /** Format pattern: # = digit, space = space separator */\r\n format?: string\r\n}\r\n\r\nexport const defaultCountries: PhoneCountry[] = [\r\n { code: 'FR', name: 'France', dialCode: '+33', flag: '🇫🇷', format: '## ## ## ## ##' },\r\n { code: 'US', name: 'United States', dialCode: '+1', flag: '🇺🇸', format: '(###) ###-####' },\r\n { code: 'GB', name: 'United Kingdom', dialCode: '+44', flag: '🇬🇧', format: '#### ######' },\r\n { code: 'DE', name: 'Germany', dialCode: '+49', flag: '🇩🇪', format: '### #######' },\r\n { code: 'ES', name: 'Spain', dialCode: '+34', flag: '🇪🇸', format: '### ### ###' },\r\n { code: 'IT', name: 'Italy', dialCode: '+39', flag: '🇮🇹', format: '### ### ####' },\r\n { code: 'BE', name: 'Belgium', dialCode: '+32', flag: '🇧🇪', format: '### ## ## ##' },\r\n { code: 'CH', name: 'Switzerland', dialCode: '+41', flag: '🇨🇭', format: '## ### ## ##' },\r\n { code: 'CA', name: 'Canada', dialCode: '+1', flag: '🇨🇦', format: '(###) ###-####' },\r\n { code: 'AU', name: 'Australia', dialCode: '+61', flag: '🇦🇺', format: '### ### ###' },\r\n { code: 'ML', name: 'Mali', dialCode: '+223', flag: '🇲🇱', format: '## ## ## ##' },\r\n { code: 'SN', name: 'Senegal', dialCode: '+221', flag: '🇸🇳', format: '## ### ## ##' },\r\n { code: 'CI', name: 'Côte d\\'Ivoire', dialCode: '+225', flag: '🇨🇮', format: '## ## ## ## ##' },\r\n { code: 'MA', name: 'Morocco', dialCode: '+212', flag: '🇲🇦', format: '## ## ## ## ##' },\r\n { code: 'TN', name: 'Tunisia', dialCode: '+216', flag: '🇹🇳', format: '## ### ###' },\r\n { code: 'DZ', name: 'Algeria', dialCode: '+213', flag: '🇩🇿', format: '### ## ## ##' },\r\n]\r\n\r\n/** Format a phone number according to a pattern */\r\nexport function formatPhoneWithPattern(value: string, pattern?: string): string {\r\n if (!pattern) return value\r\n const digits = value.replace(/\\D/g, '')\r\n let result = ''\r\n let digitIndex = 0\r\n\r\n for (const char of pattern) {\r\n if (digitIndex >= digits.length) break\r\n if (char === '#') {\r\n result += digits[digitIndex]\r\n digitIndex++\r\n } else {\r\n result += char\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\n/** Get raw digits from formatted phone number */\r\nexport function getPhoneDigits(value: string): string {\r\n return value.replace(/\\D/g, '')\r\n}\r\n\r\n/** Get max digits allowed from a format pattern */\r\nexport function getMaxDigitsFromPattern(pattern?: string): number | undefined {\r\n if (!pattern) return undefined\r\n return (pattern.match(/#/g) || []).length\r\n}\r\n</script>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { ref, computed, watch } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show dial code in input value */\r\n showDialCode?: boolean\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n /** Default country code */\r\n defaultCountry?: string\r\n /** Available countries */\r\n countries?: PhoneCountry[]\r\n }>(),\r\n {\r\n placeholder: 'Phone number',\r\n size: 'md',\r\n showDialCode: false,\r\n defaultCountry: 'FR',\r\n countries: () => defaultCountries,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst selectedCountry = ref<PhoneCountry>(\r\n props.countries.find((c) => c.code === props.defaultCountry) || props.countries[0]\r\n)\r\n\r\nconst showDropdown = ref(false)\r\nconst searchQuery = ref('')\r\nconst dropdownRef = ref<HTMLDivElement | null>(null)\r\n/** Track raw input when user is typing a dial code */\r\nconst rawDialCodeInput = ref('')\r\n\r\nconst filteredCountries = computed(() => {\r\n if (!searchQuery.value) return props.countries\r\n const query = searchQuery.value.toLowerCase()\r\n return props.countries.filter(\r\n (c) =>\r\n c.name.toLowerCase().includes(query) ||\r\n c.dialCode.includes(query) ||\r\n c.code.toLowerCase().includes(query)\r\n )\r\n})\r\n\r\nconst fullNumber = computed(() => {\r\n if (!modelValue.value) return ''\r\n return `${selectedCountry.value.dialCode}${modelValue.value}`\r\n})\r\n\r\nconst maxDigits = computed(() => getMaxDigitsFromPattern(selectedCountry.value.format))\r\n\r\nconst displayValue = computed(() => {\r\n // If user is typing a dial code, show what they typed\r\n if (rawDialCodeInput.value) {\r\n return rawDialCodeInput.value\r\n }\r\n const formatted = formatPhoneWithPattern(modelValue.value, selectedCountry.value.format)\r\n if (props.showDialCode && modelValue.value) {\r\n return `${selectedCountry.value.dialCode} ${formatted}`\r\n }\r\n return formatted\r\n})\r\n\r\nfunction selectCountry(country: PhoneCountry) {\r\n selectedCountry.value = country\r\n showDropdown.value = false\r\n searchQuery.value = ''\r\n}\r\n\r\n/** Parse a phone number that may contain a dial code and detect country */\r\nfunction parsePhoneWithDialCode(value: string): { digits: string; country?: PhoneCountry } {\r\n const cleaned = value.replace(/\\s/g, '')\r\n\r\n // Check if it starts with + or 00\r\n if (cleaned.startsWith('+') || cleaned.startsWith('00')) {\r\n const withPlus = cleaned.startsWith('00') ? '+' + cleaned.slice(2) : cleaned\r\n\r\n // Try to match dial code\r\n for (const country of props.countries) {\r\n if (withPlus.startsWith(country.dialCode)) {\r\n const digits = withPlus.slice(country.dialCode.length).replace(/\\D/g, '')\r\n return { digits, country }\r\n }\r\n }\r\n }\r\n\r\n // No dial code found, just extract digits\r\n return { digits: getPhoneDigits(value) }\r\n}\r\n\r\n/** Limit digits to max allowed by pattern */\r\nfunction limitDigits(digits: string, max?: number): string {\r\n if (max === undefined) return digits\r\n return digits.slice(0, max)\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement\r\n const inputValue = target.value\r\n\r\n // Check if user is typing a dial code (starts with + or 00)\r\n if (inputValue.startsWith('+') || inputValue.startsWith('00')) {\r\n const { digits, country } = parsePhoneWithDialCode(inputValue)\r\n\r\n if (country) {\r\n // Found a country match - update country and use just the digits\r\n selectedCountry.value = country\r\n const countryMax = getMaxDigitsFromPattern(country.format)\r\n modelValue.value = limitDigits(digits, countryMax)\r\n rawDialCodeInput.value = '' // Clear - switch to formatted display\r\n } else {\r\n // Still typing dial code - keep showing what they typed\r\n rawDialCodeInput.value = inputValue\r\n modelValue.value = ''\r\n }\r\n } else {\r\n // Regular digit entry - limit to max digits for current country\r\n rawDialCodeInput.value = ''\r\n const digits = getPhoneDigits(inputValue)\r\n modelValue.value = limitDigits(digits, maxDigits.value)\r\n }\r\n}\r\n\r\nfunction handlePaste(event: ClipboardEvent) {\r\n const pastedData = event.clipboardData?.getData('text')\r\n if (!pastedData) return\r\n\r\n // Check if pasted data contains a dial code\r\n const { digits, country } = parsePhoneWithDialCode(pastedData)\r\n\r\n if (country) {\r\n event.preventDefault()\r\n selectedCountry.value = country\r\n const countryMax = getMaxDigitsFromPattern(country.format)\r\n modelValue.value = limitDigits(digits, countryMax)\r\n }\r\n // If no country detected, let the normal input handling take over\r\n}\r\n\r\nfunction handleClickOutside(event: MouseEvent) {\r\n if (dropdownRef.value && !dropdownRef.value.contains(event.target as Node)) {\r\n showDropdown.value = false\r\n searchQuery.value = ''\r\n }\r\n}\r\n\r\nwatch(showDropdown, (isOpen) => {\r\n if (isOpen) {\r\n document.addEventListener('click', handleClickOutside)\r\n } else {\r\n document.removeEventListener('click', handleClickOutside)\r\n }\r\n})\r\n\r\ndefineExpose({ selectedCountry, fullNumber })\r\n</script>\r\n\r\n<template>\r\n <div class=\"relative\" ref=\"dropdownRef\">\r\n <InputWrapper\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n >\r\n <template #icon>\r\n <button\r\n type=\"button\"\r\n :disabled=\"disabled\"\r\n class=\"flex items-center gap-1 pr-2 border-r border-gray-200 dark:border-slate-600 hover:bg-gray-50 dark:hover:bg-slate-600 -ml-1 pl-1 py-1 rounded-l transition-colors disabled:opacity-50 disabled:cursor-not-allowed\"\r\n @click.stop=\"showDropdown = !showDropdown\"\r\n >\r\n <span class=\"text-lg leading-none\">{{ selectedCountry.flag }}</span>\r\n <Icon\r\n icon=\"lucide:chevron-down\"\r\n :class=\"[\r\n 'size-3 text-gray-400 transition-transform',\r\n showDropdown && 'rotate-180',\r\n ]\"\r\n />\r\n </button>\r\n </template>\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n :value=\"displayValue\"\r\n type=\"tel\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"[inputClass, 'pl-20']\"\r\n v-bind=\"$attrs\"\r\n @input=\"handleInput\"\r\n @paste=\"handlePaste\"\r\n />\r\n </template>\r\n <template #actions>\r\n <span class=\"text-xs text-gray-400 font-medium\">\r\n {{ selectedCountry.dialCode }}\r\n </span>\r\n </template>\r\n </InputWrapper>\r\n\r\n <!-- Country dropdown -->\r\n <Transition\r\n enter-active-class=\"transition-all duration-200 ease-out\"\r\n enter-from-class=\"opacity-0 -translate-y-2\"\r\n enter-to-class=\"opacity-100 translate-y-0\"\r\n leave-active-class=\"transition-all duration-150 ease-in\"\r\n leave-from-class=\"opacity-100 translate-y-0\"\r\n leave-to-class=\"opacity-0 -translate-y-2\"\r\n >\r\n <div\r\n v-if=\"showDropdown\"\r\n class=\"absolute z-50 mt-1 w-full bg-white dark:bg-slate-800 border border-gray-200 dark:border-slate-700 rounded-xl shadow-lg overflow-hidden\"\r\n >\r\n <!-- Search -->\r\n <div class=\"p-2 border-b border-gray-100 dark:border-slate-700\">\r\n <input\r\n v-model=\"searchQuery\"\r\n type=\"text\"\r\n placeholder=\"Search countries...\"\r\n class=\"w-full px-3 py-2 text-sm border border-gray-200 dark:border-slate-600 rounded-lg bg-gray-50 dark:bg-slate-700 text-gray-900 dark:text-white placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-primary-500\"\r\n />\r\n </div>\r\n\r\n <!-- Country list -->\r\n <ul class=\"max-h-48 overflow-y-auto\">\r\n <li\r\n v-for=\"country in filteredCountries\"\r\n :key=\"country.code\"\r\n class=\"flex items-center gap-3 px-3 py-2 cursor-pointer hover:bg-gray-50 dark:hover:bg-slate-700 transition-colors\"\r\n :class=\"selectedCountry.code === country.code && 'bg-primary-50 dark:bg-primary-900/20'\"\r\n @click=\"selectCountry(country)\"\r\n >\r\n <span class=\"text-lg\">{{ country.flag }}</span>\r\n <span class=\"flex-1 text-sm text-gray-700 dark:text-gray-300\">{{ country.name }}</span>\r\n <span class=\"text-sm text-gray-400\">{{ country.dialCode }}</span>\r\n </li>\r\n <li v-if=\"filteredCountries.length === 0\" class=\"px-3 py-4 text-center text-sm text-gray-500\">\r\n No countries found\r\n </li>\r\n </ul>\r\n </div>\r\n </Transition>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step value */\r\n step?: number\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n /** Show stepper buttons */\r\n showStepper?: boolean\r\n }>(),\r\n {\r\n placeholder: '0',\r\n size: 'md',\r\n step: 1,\r\n showStepper: true,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<number | null>({ default: null })\r\n\r\nconst canDecrement = computed(() => {\r\n if (props.disabled) return false\r\n if (modelValue.value === null) return true\r\n if (props.min !== undefined) return modelValue.value > props.min\r\n return true\r\n})\r\n\r\nconst canIncrement = computed(() => {\r\n if (props.disabled) return false\r\n if (modelValue.value === null) return true\r\n if (props.max !== undefined) return modelValue.value < props.max\r\n return true\r\n})\r\n\r\nfunction increment() {\r\n if (!canIncrement.value) return\r\n const current = modelValue.value ?? 0\r\n const newValue = current + props.step\r\n modelValue.value = props.max !== undefined ? Math.min(newValue, props.max) : newValue\r\n}\r\n\r\nfunction decrement() {\r\n if (!canDecrement.value) return\r\n const current = modelValue.value ?? 0\r\n const newValue = current - props.step\r\n modelValue.value = props.min !== undefined ? Math.max(newValue, props.min) : newValue\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement\r\n const value = target.value === '' ? null : parseFloat(target.value)\r\n\r\n if (value !== null && !isNaN(value)) {\r\n let clampedValue = value\r\n if (props.min !== undefined) clampedValue = Math.max(clampedValue, props.min)\r\n if (props.max !== undefined) clampedValue = Math.min(clampedValue, props.max)\r\n modelValue.value = clampedValue\r\n } else {\r\n modelValue.value = null\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n >\r\n <template v-if=\"showStepper\" #icon>\r\n <button\r\n type=\"button\"\r\n :disabled=\"!canDecrement\"\r\n class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\r\n @click=\"decrement\"\r\n >\r\n <Icon icon=\"lucide:minus\" class=\"size-4 text-gray-500\" />\r\n </button>\r\n </template>\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n :value=\"modelValue\"\r\n type=\"number\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :min=\"min\"\r\n :max=\"max\"\r\n :step=\"step\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"[inputClass, 'text-center', showStepper && 'pl-12 pr-12']\"\r\n v-bind=\"$attrs\"\r\n @input=\"handleInput\"\r\n />\r\n </template>\r\n <template v-if=\"showStepper\" #actions>\r\n <button\r\n type=\"button\"\r\n :disabled=\"!canIncrement\"\r\n class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors disabled:opacity-30 disabled:cursor-not-allowed\"\r\n @click=\"increment\"\r\n >\r\n <Icon icon=\"lucide:plus\" class=\"size-4 text-gray-500\" />\r\n </button>\r\n </template>\r\n </InputWrapper>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed, ref, watch } from 'vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nexport type Currency = 'EUR' | 'USD' | 'GBP' | 'XOF' | 'MAD' | 'CHF' | 'CAD'\r\n\r\nconst currencyConfig: Record<Currency, { symbol: string; locale: string; position: 'prefix' | 'suffix' }> = {\r\n EUR: { symbol: '€', locale: 'fr-FR', position: 'suffix' },\r\n USD: { symbol: '$', locale: 'en-US', position: 'prefix' },\r\n GBP: { symbol: '£', locale: 'en-GB', position: 'prefix' },\r\n XOF: { symbol: 'CFA', locale: 'fr-FR', position: 'suffix' },\r\n MAD: { symbol: 'DH', locale: 'fr-MA', position: 'suffix' },\r\n CHF: { symbol: 'CHF', locale: 'fr-CH', position: 'suffix' },\r\n CAD: { symbol: 'CA$', locale: 'en-CA', position: 'prefix' },\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Currency code */\r\n currency?: Currency\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Decimal places */\r\n decimals?: number\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n }>(),\r\n {\r\n placeholder: '0.00',\r\n size: 'md',\r\n currency: 'EUR',\r\n decimals: 2,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<number | null>({ default: null })\r\n\r\nconst config = computed(() => currencyConfig[props.currency])\r\n\r\nconst displayValue = ref('')\r\n\r\n// Format number for display\r\nfunction formatForDisplay(value: number | null): string {\r\n if (value === null) return ''\r\n return value.toLocaleString(config.value.locale, {\r\n minimumFractionDigits: props.decimals,\r\n maximumFractionDigits: props.decimals,\r\n })\r\n}\r\n\r\n// Parse display value to number\r\nfunction parseDisplayValue(value: string): number | null {\r\n if (!value) return null\r\n // Remove formatting characters (spaces, commas as thousand separators)\r\n const cleaned = value.replace(/\\s/g, '').replace(/,/g, '.')\r\n const parsed = parseFloat(cleaned)\r\n return isNaN(parsed) ? null : parsed\r\n}\r\n\r\n// Sync display value with model\r\nwatch(\r\n () => modelValue.value,\r\n (newValue) => {\r\n displayValue.value = formatForDisplay(newValue)\r\n },\r\n { immediate: true }\r\n)\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement\r\n displayValue.value = target.value\r\n}\r\n\r\nfunction handleBlur() {\r\n const parsed = parseDisplayValue(displayValue.value)\r\n\r\n if (parsed !== null) {\r\n let clampedValue = parsed\r\n if (props.min !== undefined) clampedValue = Math.max(clampedValue, props.min)\r\n if (props.max !== undefined) clampedValue = Math.min(clampedValue, props.max)\r\n modelValue.value = clampedValue\r\n displayValue.value = formatForDisplay(clampedValue)\r\n } else {\r\n modelValue.value = null\r\n displayValue.value = ''\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n >\r\n <template v-if=\"config.position === 'prefix'\" #icon>\r\n <span class=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {{ config.symbol }}\r\n </span>\r\n </template>\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n :value=\"displayValue\"\r\n type=\"text\"\r\n inputmode=\"decimal\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"[inputClass, 'text-right']\"\r\n v-bind=\"$attrs\"\r\n @input=\"handleInput\"\r\n @blur=\"handleBlur\"\r\n />\r\n </template>\r\n <template v-if=\"config.position === 'suffix'\" #actions>\r\n <span class=\"text-sm font-medium text-gray-500 dark:text-gray-400\">\r\n {{ config.symbol }}\r\n </span>\r\n </template>\r\n </InputWrapper>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed } from 'vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Minimum value (0-100) */\r\n min?: number\r\n /** Maximum value (0-100) */\r\n max?: number\r\n /** Decimal places */\r\n decimals?: number\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n }>(),\r\n {\r\n placeholder: '0',\r\n size: 'md',\r\n min: 0,\r\n max: 100,\r\n decimals: 0,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<number | null>({ default: null })\r\n\r\nconst displayValue = computed({\r\n get: () => (modelValue.value !== null ? modelValue.value.toString() : ''),\r\n set: (val: string) => {\r\n if (val === '') {\r\n modelValue.value = null\r\n return\r\n }\r\n const parsed = parseFloat(val)\r\n if (!isNaN(parsed)) {\r\n let clamped = parsed\r\n if (props.min !== undefined) clamped = Math.max(clamped, props.min)\r\n if (props.max !== undefined) clamped = Math.min(clamped, props.max)\r\n modelValue.value = clamped\r\n }\r\n },\r\n})\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement\r\n displayValue.value = target.value\r\n}\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n >\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n :value=\"displayValue\"\r\n type=\"number\"\r\n inputmode=\"decimal\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :min=\"min\"\r\n :max=\"max\"\r\n :step=\"decimals > 0 ? Math.pow(10, -decimals) : 1\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"[inputClass, 'text-right pr-10']\"\r\n v-bind=\"$attrs\"\r\n @input=\"handleInput\"\r\n />\r\n </template>\r\n <template #actions>\r\n <span class=\"text-sm font-medium text-gray-500 dark:text-gray-400\">%</span>\r\n </template>\r\n </InputWrapper>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Minimum value */\r\n min?: number\r\n /** Maximum value */\r\n max?: number\r\n /** Step value */\r\n step?: number\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n }>(),\r\n {\r\n size: 'md',\r\n min: 1,\r\n step: 1,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<number>({ default: 1 })\r\n\r\nconst canDecrement = computed(() => {\r\n if (props.disabled) return false\r\n if (props.min !== undefined) return modelValue.value > props.min\r\n return true\r\n})\r\n\r\nconst canIncrement = computed(() => {\r\n if (props.disabled) return false\r\n if (props.max !== undefined) return modelValue.value < props.max\r\n return true\r\n})\r\n\r\nfunction increment() {\r\n if (!canIncrement.value) return\r\n const newValue = modelValue.value + props.step\r\n modelValue.value = props.max !== undefined ? Math.min(newValue, props.max) : newValue\r\n}\r\n\r\nfunction decrement() {\r\n if (!canDecrement.value) return\r\n const newValue = modelValue.value - props.step\r\n modelValue.value = props.min !== undefined ? Math.max(newValue, props.min) : newValue\r\n}\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLInputElement\r\n const value = parseInt(target.value, 10)\r\n\r\n if (!isNaN(value)) {\r\n let clampedValue = value\r\n if (props.min !== undefined) clampedValue = Math.max(clampedValue, props.min)\r\n if (props.max !== undefined) clampedValue = Math.min(clampedValue, props.max)\r\n modelValue.value = clampedValue\r\n }\r\n}\r\n\r\nconst sizeClasses = computed(() => ({\r\n button: {\r\n sm: 'size-7',\r\n md: 'size-9',\r\n lg: 'size-11',\r\n }[props.size],\r\n icon: {\r\n sm: 'size-3',\r\n md: 'size-4',\r\n lg: 'size-5',\r\n }[props.size],\r\n input: {\r\n sm: 'text-sm w-10',\r\n md: 'text-base w-12',\r\n lg: 'text-lg w-14',\r\n }[props.size],\r\n}))\r\n</script>\r\n\r\n<template>\r\n <div class=\"inline-flex items-center gap-2 bg-gray-50 dark:bg-slate-700 rounded-xl p-1 border border-gray-200 dark:border-slate-600\">\r\n <!-- Decrement button -->\r\n <button\r\n type=\"button\"\r\n :disabled=\"!canDecrement\"\r\n :class=\"[\r\n 'flex items-center justify-center rounded-lg bg-white dark:bg-slate-600 border border-gray-200 dark:border-slate-500 transition-all',\r\n 'hover:bg-gray-50 dark:hover:bg-slate-500 hover:border-gray-300 dark:hover:border-slate-400',\r\n 'disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-white dark:disabled:hover:bg-slate-600',\r\n 'shadow-sm',\r\n sizeClasses.button,\r\n ]\"\r\n @click=\"decrement\"\r\n >\r\n <Icon icon=\"lucide:minus\" :class=\"['text-gray-600 dark:text-gray-300', sizeClasses.icon]\" />\r\n </button>\r\n\r\n <!-- Value display -->\r\n <input\r\n :id=\"id ?? name\"\r\n :value=\"modelValue\"\r\n type=\"number\"\r\n :name=\"name\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :min=\"min\"\r\n :max=\"max\"\r\n :class=\"[\r\n 'bg-transparent text-center font-semibold text-gray-900 dark:text-white',\r\n 'focus:outline-none appearance-none',\r\n '[&::-webkit-inner-spin-button]:appearance-none [&::-webkit-outer-spin-button]:appearance-none',\r\n 'disabled:opacity-50',\r\n sizeClasses.input,\r\n ]\"\r\n v-bind=\"$attrs\"\r\n @input=\"handleInput\"\r\n />\r\n\r\n <!-- Increment button -->\r\n <button\r\n type=\"button\"\r\n :disabled=\"!canIncrement\"\r\n :class=\"[\r\n 'flex items-center justify-center rounded-lg bg-white dark:bg-slate-600 border border-gray-200 dark:border-slate-500 transition-all',\r\n 'hover:bg-gray-50 dark:hover:bg-slate-500 hover:border-gray-300 dark:hover:border-slate-400',\r\n 'disabled:opacity-40 disabled:cursor-not-allowed disabled:hover:bg-white dark:disabled:hover:bg-slate-600',\r\n 'shadow-sm',\r\n sizeClasses.button,\r\n ]\"\r\n @click=\"increment\"\r\n >\r\n <Icon icon=\"lucide:plus\" :class=\"['text-gray-600 dark:text-gray-300', sizeClasses.icon]\" />\r\n </button>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { computed, ref } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport InputWrapper from './InputWrapper.vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Show validation state */\r\n showValidation?: boolean\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n /** Aria describedby */\r\n describedBy?: string\r\n }>(),\r\n {\r\n placeholder: 'https://example.com',\r\n size: 'md',\r\n showValidation: true,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst urlRegex = /^(https?:\\/\\/)?([\\da-z.-]+)\\.([a-z.]{2,6})([/\\w .-]*)*\\/?$/\r\n\r\nconst isValid = computed(() => {\r\n if (!modelValue.value) return null\r\n return urlRegex.test(modelValue.value)\r\n})\r\n\r\nconst isTouched = ref(false)\r\n\r\nconst showStatus = computed(() => {\r\n return props.showValidation && isTouched.value && !!modelValue.value\r\n})\r\n\r\nfunction handleBlur() {\r\n isTouched.value = true\r\n}\r\n\r\nfunction openUrl() {\r\n if (isValid.value && modelValue.value) {\r\n const url = modelValue.value.startsWith('http') ? modelValue.value : `https://${modelValue.value}`\r\n window.open(url, '_blank')\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <InputWrapper\r\n icon=\"lucide:link\"\r\n :size=\"size\"\r\n :disabled=\"disabled\"\r\n :invalid=\"showStatus && isValid === false\"\r\n >\r\n <template #default=\"{ inputClass }\">\r\n <input\r\n :id=\"id ?? name\"\r\n v-model=\"modelValue\"\r\n type=\"url\"\r\n :name=\"name\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :required=\"required\"\r\n :aria-invalid=\"(showStatus && isValid === false) || undefined\"\r\n :aria-required=\"required || undefined\"\r\n :aria-describedby=\"describedBy\"\r\n :class=\"inputClass\"\r\n v-bind=\"$attrs\"\r\n @blur=\"handleBlur\"\r\n />\r\n </template>\r\n <template #actions>\r\n <button\r\n v-if=\"showStatus && isValid && modelValue\"\r\n type=\"button\"\r\n class=\"p-1 rounded hover:bg-gray-100 dark:hover:bg-slate-600 transition-colors\"\r\n title=\"Open URL\"\r\n @click=\"openUrl\"\r\n >\r\n <Icon icon=\"lucide:external-link\" class=\"size-4 text-gray-400 hover:text-primary-500\" />\r\n </button>\r\n <Icon\r\n v-else-if=\"showStatus && isValid === false\"\r\n icon=\"lucide:alert-circle\"\r\n class=\"size-5 text-red-500\"\r\n />\r\n </template>\r\n </InputWrapper>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { ref, computed, watch, nextTick, onMounted } from 'vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Number of digits */\r\n length?: number\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Auto focus first input */\r\n autoFocus?: boolean\r\n /** Input name prefix */\r\n name?: string\r\n /** Mask input (show dots instead of numbers) */\r\n masked?: boolean\r\n }>(),\r\n {\r\n length: 6,\r\n size: 'md',\r\n autoFocus: true,\r\n masked: false,\r\n }\r\n)\r\n\r\nconst emit = defineEmits<{\r\n complete: [code: string]\r\n}>()\r\n\r\nconst modelValue = defineModel<string>({ default: '' })\r\n\r\nconst inputRefs = ref<HTMLInputElement[]>([])\r\n\r\nconst digits = computed(() => {\r\n const arr = modelValue.value.split('')\r\n while (arr.length < props.length) {\r\n arr.push('')\r\n }\r\n return arr.slice(0, props.length)\r\n})\r\n\r\nconst sizeClasses = computed(() => ({\r\n input: {\r\n sm: 'size-10 text-lg',\r\n md: 'size-12 text-xl',\r\n lg: 'size-14 text-2xl',\r\n }[props.size],\r\n gap: {\r\n sm: 'gap-2',\r\n md: 'gap-3',\r\n lg: 'gap-4',\r\n }[props.size],\r\n}))\r\n\r\nfunction updateValue(index: number, value: string) {\r\n const newDigits = [...digits.value]\r\n newDigits[index] = value.slice(-1)\r\n modelValue.value = newDigits.join('')\r\n\r\n // Check if complete\r\n if (modelValue.value.length === props.length && !modelValue.value.includes('')) {\r\n emit('complete', modelValue.value)\r\n }\r\n}\r\n\r\nfunction handleInput(event: Event, index: number) {\r\n const target = event.target as HTMLInputElement\r\n const value = target.value.replace(/\\D/g, '')\r\n\r\n if (value) {\r\n updateValue(index, value)\r\n\r\n // Move to next input\r\n if (index < props.length - 1) {\r\n nextTick(() => {\r\n inputRefs.value[index + 1]?.focus()\r\n })\r\n }\r\n }\r\n}\r\n\r\nfunction handleKeydown(event: KeyboardEvent, index: number) {\r\n const target = event.target as HTMLInputElement\r\n\r\n if (event.key === 'Backspace') {\r\n if (!target.value && index > 0) {\r\n // Move to previous input\r\n inputRefs.value[index - 1]?.focus()\r\n }\r\n updateValue(index, '')\r\n } else if (event.key === 'ArrowLeft' && index > 0) {\r\n inputRefs.value[index - 1]?.focus()\r\n } else if (event.key === 'ArrowRight' && index < props.length - 1) {\r\n inputRefs.value[index + 1]?.focus()\r\n }\r\n}\r\n\r\nfunction handlePaste(event: ClipboardEvent) {\r\n event.preventDefault()\r\n const pastedData = event.clipboardData?.getData('text').replace(/\\D/g, '').slice(0, props.length)\r\n if (pastedData) {\r\n modelValue.value = pastedData\r\n // Focus last filled input or next empty\r\n const focusIndex = Math.min(pastedData.length, props.length - 1)\r\n nextTick(() => {\r\n inputRefs.value[focusIndex]?.focus()\r\n })\r\n }\r\n}\r\n\r\nfunction handleFocus(event: FocusEvent) {\r\n const target = event.target as HTMLInputElement\r\n target.select()\r\n}\r\n\r\nwatch(\r\n () => modelValue.value,\r\n (newValue) => {\r\n if (newValue.length === props.length) {\r\n emit('complete', newValue)\r\n }\r\n }\r\n)\r\n\r\nonMounted(() => {\r\n if (props.autoFocus) {\r\n inputRefs.value[0]?.focus()\r\n }\r\n})\r\n\r\nfunction setInputRef(el: HTMLInputElement | null, index: number) {\r\n if (el) {\r\n inputRefs.value[index] = el\r\n }\r\n}\r\n\r\ndefineExpose({ focus: () => inputRefs.value[0]?.focus() })\r\n</script>\r\n\r\n<template>\r\n <div :class=\"['inline-flex', sizeClasses.gap]\">\r\n <input\r\n v-for=\"(digit, index) in digits\"\r\n :key=\"index\"\r\n :ref=\"(el) => setInputRef(el as HTMLInputElement, index)\"\r\n :value=\"digit\"\r\n :type=\"masked ? 'password' : 'text'\"\r\n inputmode=\"numeric\"\r\n :name=\"name ? `${name}-${index}` : undefined\"\r\n :disabled=\"disabled\"\r\n maxlength=\"1\"\r\n autocomplete=\"one-time-code\"\r\n :class=\"[\r\n 'text-center font-semibold rounded-xl border-2 transition-all',\r\n 'bg-gray-50 dark:bg-slate-700 text-gray-900 dark:text-white',\r\n 'border-gray-200 dark:border-slate-600',\r\n 'focus:border-primary-500 focus:ring-2 focus:ring-primary-500 focus:ring-offset-2 focus:outline-none',\r\n 'disabled:opacity-50 disabled:cursor-not-allowed',\r\n digit ? 'border-primary-300 dark:border-primary-500/50' : '',\r\n sizeClasses.input,\r\n ]\"\r\n @input=\"handleInput($event, index)\"\r\n @keydown=\"handleKeydown($event, index)\"\r\n @paste=\"handlePaste\"\r\n @focus=\"handleFocus\"\r\n />\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\ndefineOptions({\r\n inheritAttrs: false,\r\n})\r\n\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport type { InputWrapperSize } from './InputWrapper.vue'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Placeholder text */\r\n placeholder?: string\r\n /** Input size */\r\n size?: InputWrapperSize\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Maximum number of tags */\r\n max?: number\r\n /** Allow duplicates */\r\n allowDuplicates?: boolean\r\n /** Input name */\r\n name?: string\r\n /** Input id */\r\n id?: string\r\n /** Required field */\r\n required?: boolean\r\n }>(),\r\n {\r\n placeholder: 'Add tag...',\r\n size: 'md',\r\n allowDuplicates: false,\r\n }\r\n)\r\n\r\nconst modelValue = defineModel<string[]>({ default: () => [] })\r\n\r\nconst inputValue = ref('')\r\nconst inputRef = ref<HTMLInputElement | null>(null)\r\n\r\nconst canAddMore = computed(() => {\r\n if (props.max !== undefined) return modelValue.value.length < props.max\r\n return true\r\n})\r\n\r\nconst sizeClasses = computed(() => ({\r\n wrapper: {\r\n sm: 'min-h-9 py-1.5 px-2 gap-1',\r\n md: 'min-h-11 py-2 px-3 gap-1.5',\r\n lg: 'min-h-13 py-2.5 px-4 gap-2',\r\n }[props.size],\r\n tag: {\r\n sm: 'text-xs px-2 py-0.5',\r\n md: 'text-sm px-2.5 py-1',\r\n lg: 'text-base px-3 py-1.5',\r\n }[props.size],\r\n input: {\r\n sm: 'text-xs',\r\n md: 'text-sm',\r\n lg: 'text-base',\r\n }[props.size],\r\n icon: {\r\n sm: 'size-3',\r\n md: 'size-3.5',\r\n lg: 'size-4',\r\n }[props.size],\r\n}))\r\n\r\nfunction addTag(value: string) {\r\n const trimmed = value.trim()\r\n if (!trimmed) return\r\n if (!canAddMore.value) return\r\n if (!props.allowDuplicates && modelValue.value.includes(trimmed)) return\r\n\r\n modelValue.value = [...modelValue.value, trimmed]\r\n inputValue.value = ''\r\n}\r\n\r\nfunction removeTag(index: number) {\r\n if (props.disabled) return\r\n modelValue.value = modelValue.value.filter((_, i) => i !== index)\r\n}\r\n\r\nfunction handleKeydown(event: KeyboardEvent) {\r\n if (event.key === 'Enter' || event.key === ',') {\r\n event.preventDefault()\r\n addTag(inputValue.value)\r\n } else if (event.key === 'Backspace' && !inputValue.value && modelValue.value.length > 0) {\r\n removeTag(modelValue.value.length - 1)\r\n }\r\n}\r\n\r\nfunction handleBlur() {\r\n if (inputValue.value) {\r\n addTag(inputValue.value)\r\n }\r\n}\r\n\r\nfunction focusInput() {\r\n inputRef.value?.focus()\r\n}\r\n\r\ndefineExpose({ focus: focusInput })\r\n</script>\r\n\r\n<template>\r\n <div\r\n :class=\"[\r\n 'flex flex-wrap items-center rounded-xl border transition-all cursor-text',\r\n 'bg-gray-50 dark:bg-slate-700',\r\n 'border-gray-200 dark:border-slate-600',\r\n 'focus-within:border-primary-500 focus-within:ring-2 focus-within:ring-primary-500 focus-within:bg-white dark:focus-within:bg-slate-600',\r\n disabled && 'opacity-50 cursor-not-allowed',\r\n sizeClasses.wrapper,\r\n ]\"\r\n @click=\"focusInput\"\r\n >\r\n <!-- Tags -->\r\n <TransitionGroup\r\n name=\"tag\"\r\n tag=\"div\"\r\n class=\"flex flex-wrap gap-1.5\"\r\n >\r\n <span\r\n v-for=\"(tag, index) in modelValue\"\r\n :key=\"tag + index\"\r\n :class=\"[\r\n 'inline-flex items-center gap-1 rounded-lg font-medium',\r\n 'bg-primary-100 dark:bg-primary-900/30 text-primary-700 dark:text-primary-300',\r\n sizeClasses.tag,\r\n ]\"\r\n >\r\n {{ tag }}\r\n <button\r\n v-if=\"!disabled\"\r\n type=\"button\"\r\n class=\"rounded-full hover:bg-primary-200 dark:hover:bg-primary-800/50 transition-colors p-0.5\"\r\n @click.stop=\"removeTag(index)\"\r\n >\r\n <Icon icon=\"lucide:x\" :class=\"['text-primary-500', sizeClasses.icon]\" />\r\n </button>\r\n </span>\r\n </TransitionGroup>\r\n\r\n <!-- Input -->\r\n <input\r\n v-if=\"canAddMore\"\r\n :id=\"id ?? name\"\r\n ref=\"inputRef\"\r\n v-model=\"inputValue\"\r\n type=\"text\"\r\n :name=\"name\"\r\n :placeholder=\"modelValue.length === 0 ? placeholder : ''\"\r\n :disabled=\"disabled\"\r\n :required=\"required && modelValue.length === 0\"\r\n :class=\"[\r\n 'flex-1 min-w-20 bg-transparent border-none focus:outline-none',\r\n 'text-gray-900 dark:text-white placeholder-gray-400',\r\n sizeClasses.input,\r\n ]\"\r\n v-bind=\"$attrs\"\r\n @keydown=\"handleKeydown\"\r\n @blur=\"handleBlur\"\r\n />\r\n </div>\r\n</template>\r\n\r\n<style scoped>\r\n.tag-enter-active,\r\n.tag-leave-active {\r\n transition: all 0.2s ease;\r\n}\r\n\r\n.tag-enter-from,\r\n.tag-leave-to {\r\n opacity: 0;\r\n transform: scale(0.8);\r\n}\r\n</style>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormHelp from './FormHelp.vue'\r\n\r\ninterface Props {\r\n modelValue?: string\r\n label?: string\r\n placeholder?: string\r\n hint?: string\r\n error?: string\r\n disabled?: boolean\r\n readonly?: boolean\r\n required?: boolean\r\n rows?: number\r\n maxLength?: number\r\n showCount?: boolean\r\n resize?: 'none' | 'vertical' | 'horizontal' | 'both'\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: '',\r\n rows: 3,\r\n resize: 'vertical',\r\n showCount: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string]\r\n}>()\r\n\r\nconst charCount = computed(() => props.modelValue?.length ?? 0)\r\n\r\nconst resizeClass = computed(() => {\r\n switch (props.resize) {\r\n case 'none':\r\n return 'resize-none'\r\n case 'vertical':\r\n return 'resize-y'\r\n case 'horizontal':\r\n return 'resize-x'\r\n case 'both':\r\n return 'resize'\r\n default:\r\n return 'resize-y'\r\n }\r\n})\r\n\r\nfunction handleInput(event: Event) {\r\n const target = event.target as HTMLTextAreaElement\r\n emit('update:modelValue', target.value)\r\n}\r\n</script>\r\n\r\n<template>\r\n <div>\r\n <FormLabel v-if=\"label || $slots.label\" :error=\"error\">\r\n <slot name=\"label\">{{ label }}</slot>\r\n <span v-if=\"required\" class=\"text-red-500 ml-1\">*</span>\r\n </FormLabel>\r\n <textarea\r\n :value=\"modelValue\"\r\n :placeholder=\"placeholder\"\r\n :disabled=\"disabled\"\r\n :readonly=\"readonly\"\r\n :required=\"required\"\r\n :rows=\"rows\"\r\n :maxlength=\"maxLength\"\r\n :class=\"[\r\n 'w-full px-4 py-3 rounded-xl border transition-all duration-200',\r\n 'focus:outline-none focus:ring-2 focus:ring-offset-0',\r\n resizeClass,\r\n label || $slots.label ? 'mt-2' : '',\r\n error\r\n ? 'border-red-300 dark:border-red-500 focus:border-red-500 focus:ring-red-500/20'\r\n : 'border-gray-200 dark:border-slate-600 focus:border-primary-500 focus:ring-primary-500/20',\r\n disabled\r\n ? 'bg-gray-50 dark:bg-slate-800 text-gray-400 cursor-not-allowed'\r\n : 'bg-white dark:bg-slate-700 text-gray-900 dark:text-white',\r\n ]\"\r\n @input=\"handleInput\"\r\n />\r\n <div v-if=\"showCount || maxLength\" class=\"flex justify-end mt-1\">\r\n <span class=\"text-xs text-gray-400\">\r\n {{ charCount }}<span v-if=\"maxLength\"> / {{ maxLength }}</span>\r\n </span>\r\n </div>\r\n <FormHelp v-if=\"hint && !error\">{{ hint }}</FormHelp>\r\n <FormHelp v-if=\"error\" :error=\"true\">{{ error }}</FormHelp>\r\n </div>\r\n</template>\r\n","<script setup lang=\"ts\">\r\nimport { computed } from 'vue'\r\nimport Checkbox from './Checkbox.vue'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormHelp from './FormHelp.vue'\r\n\r\ninterface Option {\r\n value: string\r\n label: string\r\n disabled?: boolean\r\n}\r\n\r\ninterface Props {\r\n modelValue?: string[]\r\n options: Option[]\r\n label?: string\r\n hint?: string\r\n error?: string\r\n disabled?: boolean\r\n required?: boolean\r\n columns?: 1 | 2 | 3 | 4\r\n inline?: boolean\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n modelValue: () => [],\r\n columns: 2,\r\n inline: false,\r\n})\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: string[]]\r\n}>()\r\n\r\nconst gridClass = computed(() => {\r\n if (props.inline) return 'flex flex-wrap gap-4'\r\n switch (props.columns) {\r\n case 1:\r\n return 'grid grid-cols-1 gap-2'\r\n case 2:\r\n return 'grid grid-cols-1 sm:grid-cols-2 gap-2'\r\n case 3:\r\n return 'grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-2'\r\n case 4:\r\n return 'grid grid-cols-2 sm:grid-cols-4 gap-2'\r\n default:\r\n return 'grid grid-cols-1 sm:grid-cols-2 gap-2'\r\n }\r\n})\r\n\r\nfunction isChecked(value: string): boolean {\r\n return props.modelValue?.includes(value) ?? false\r\n}\r\n\r\nfunction toggleValue(value: string, checked: boolean) {\r\n const current = props.modelValue ?? []\r\n if (checked) {\r\n if (!current.includes(value)) {\r\n emit('update:modelValue', [...current, value])\r\n }\r\n } else {\r\n emit('update:modelValue', current.filter((v) => v !== value))\r\n }\r\n}\r\n</script>\r\n\r\n<template>\r\n <div>\r\n <FormLabel v-if=\"label\" :error=\"error\">\r\n {{ label }}<span v-if=\"required\" class=\"text-red-500 ml-1\">*</span>\r\n </FormLabel>\r\n <div :class=\"[gridClass, label ? 'mt-2' : '']\">\r\n <Checkbox\r\n v-for=\"option in options\"\r\n :key=\"option.value\"\r\n :model-value=\"isChecked(option.value)\"\r\n :label=\"option.label\"\r\n :disabled=\"disabled || option.disabled\"\r\n @update:model-value=\"(checked: boolean) => toggleValue(option.value, checked)\"\r\n />\r\n </div>\r\n <FormHelp v-if=\"hint && !error\">{{ hint }}</FormHelp>\r\n <FormHelp v-if=\"error\" :error=\"true\">{{ error }}</FormHelp>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_renderSlot","useSlots","computed","_openBlock","_hoisted_1","_createBlock","_unref","Icon","_hoisted_2","_useModel","InputWrapper","_withCtx","_withDirectives","_createElementVNode","_mergeProps","$attrs","useId","ref","useDropdown","nextTick","index","watch","_hoisted_3","_toDisplayString","_createVNode","_Teleport","_Transition","_normalizeClass","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_Fragment","_renderList","_hoisted_10","_hoisted_11","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_4","_hoisted_9","_hoisted_12","_withModifiers","_normalizeStyle","onClickOutside","useDebounceFn","_createTextVNode","$slots","Button","_a","onMounted","_TransitionGroup","Checkbox"],"mappings":"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"}
|