cisse-vue-ui 0.5.21 → 0.5.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-D3_Oddwt.js → Button.vue_vue_type_script_setup_true_lang-CD9QPOeU.js} +114 -10
  2. package/dist/Button.vue_vue_type_script_setup_true_lang-CD9QPOeU.js.map +1 -0
  3. package/dist/{ListSkeleton.vue_vue_type_script_setup_true_lang-CrEu33_J.cjs → Button.vue_vue_type_script_setup_true_lang-Cev21KGJ.cjs} +113 -9
  4. package/dist/Button.vue_vue_type_script_setup_true_lang-Cev21KGJ.cjs.map +1 -0
  5. package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs → Combobox.vue_vue_type_script_setup_true_lang-D9TIId4E.cjs} +621 -266
  6. package/dist/Combobox.vue_vue_type_script_setup_true_lang-D9TIId4E.cjs.map +1 -0
  7. package/dist/{RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js → Combobox.vue_vue_type_script_setup_true_lang-DCLKWzhc.js} +595 -240
  8. package/dist/Combobox.vue_vue_type_script_setup_true_lang-DCLKWzhc.js.map +1 -0
  9. package/dist/{Skeleton.vue_vue_type_script_setup_true_lang-CsDMGhaT.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-CwHYxBhR.cjs} +290 -128
  10. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CwHYxBhR.cjs.map +1 -0
  11. package/dist/{Skeleton.vue_vue_type_script_setup_true_lang-Q4PcIELi.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-Dm4kLAnr.js} +291 -129
  12. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Dm4kLAnr.js.map +1 -0
  13. package/dist/{Timeline.vue_vue_type_script_setup_true_lang-C5SKEGPG.cjs → DarkModeToggle.vue_vue_type_script_setup_true_lang-CSxGvdSP.cjs} +192 -408
  14. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-CSxGvdSP.cjs.map +1 -0
  15. package/dist/{Timeline.vue_vue_type_script_setup_true_lang-ykGksWXN.js → DarkModeToggle.vue_vue_type_script_setup_true_lang-D1Q43mhJ.js} +153 -369
  16. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-D1Q43mhJ.js.map +1 -0
  17. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-DKxcVBKu.cjs → Dropdown.vue_vue_type_script_setup_true_lang-DNeh9Gi-.cjs} +32 -15
  18. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DNeh9Gi-.cjs.map +1 -0
  19. package/dist/{Dropdown.vue_vue_type_script_setup_true_lang-C3pr8BwC.js → Dropdown.vue_vue_type_script_setup_true_lang-DXV811zB.js} +32 -15
  20. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DXV811zB.js.map +1 -0
  21. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-D22uNeS1.cjs → PageLayout.vue_vue_type_script_setup_true_lang-C0YzyJnK.cjs} +2 -2
  22. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-D22uNeS1.cjs.map → PageLayout.vue_vue_type_script_setup_true_lang-C0YzyJnK.cjs.map} +1 -1
  23. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js → PageLayout.vue_vue_type_script_setup_true_lang-ClzYGS8h.js} +2 -2
  24. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js.map → PageLayout.vue_vue_type_script_setup_true_lang-ClzYGS8h.js.map} +1 -1
  25. package/dist/components/core/AccordionItem.vue.d.ts +2 -0
  26. package/dist/components/core/DarkModeToggle.stories.d.ts +15 -0
  27. package/dist/components/core/DarkModeToggle.test.d.ts +1 -0
  28. package/dist/components/core/DarkModeToggle.vue.d.ts +21 -0
  29. package/dist/components/core/Dropdown.vue.d.ts +2 -0
  30. package/dist/components/core/Popover.vue.d.ts +2 -0
  31. package/dist/components/core/Tooltip.vue.d.ts +2 -0
  32. package/dist/components/core/index.cjs +23 -21
  33. package/dist/components/core/index.cjs.map +1 -1
  34. package/dist/components/core/index.d.ts +2 -0
  35. package/dist/components/core/index.js +17 -15
  36. package/dist/components/core/index.js.map +1 -1
  37. package/dist/components/core/index.test.d.ts +1 -0
  38. package/dist/components/feedback/ConfirmDialog.stories.d.ts +12 -0
  39. package/dist/components/feedback/ConfirmDialog.test.d.ts +1 -0
  40. package/dist/components/feedback/ConfirmDialog.vue.d.ts +53 -0
  41. package/dist/components/feedback/LoadingSpinner.vue.d.ts +6 -1
  42. package/dist/components/feedback/Modal.vue.d.ts +18 -3
  43. package/dist/components/feedback/Progress.vue.d.ts +1 -1
  44. package/dist/components/feedback/index.cjs +17 -16
  45. package/dist/components/feedback/index.cjs.map +1 -1
  46. package/dist/components/feedback/index.d.ts +2 -0
  47. package/dist/components/feedback/index.js +6 -5
  48. package/dist/components/feedback/index.test.d.ts +1 -0
  49. package/dist/components/form/Checkbox.vue.d.ts +2 -0
  50. package/dist/components/form/ColorPicker.vue.d.ts +3 -0
  51. package/dist/components/form/Combobox.stories.d.ts +15 -0
  52. package/dist/components/form/Combobox.test.d.ts +1 -0
  53. package/dist/components/form/Combobox.vue.d.ts +46 -0
  54. package/dist/components/form/DatePicker.vue.d.ts +2 -0
  55. package/dist/components/form/FormHelp.vue.d.ts +2 -0
  56. package/dist/components/form/Switch.vue.d.ts +2 -0
  57. package/dist/components/form/index.cjs +17 -16
  58. package/dist/components/form/index.cjs.map +1 -1
  59. package/dist/components/form/index.d.ts +2 -0
  60. package/dist/components/form/index.js +3 -2
  61. package/dist/components/form/index.test.d.ts +1 -0
  62. package/dist/components/index.cjs +57 -54
  63. package/dist/components/index.cjs.map +1 -1
  64. package/dist/components/index.js +35 -32
  65. package/dist/components/index.test.d.ts +1 -0
  66. package/dist/components/layout/index.cjs +1 -1
  67. package/dist/components/layout/index.js +1 -1
  68. package/dist/components/layout/index.test.d.ts +1 -0
  69. package/dist/components/type/index.test.d.ts +1 -0
  70. package/dist/composables/index.cjs +9 -2
  71. package/dist/composables/index.cjs.map +1 -1
  72. package/dist/composables/index.d.ts +2 -0
  73. package/dist/composables/index.js +15 -8
  74. package/dist/composables/index.js.map +1 -1
  75. package/dist/composables/index.test.d.ts +1 -0
  76. package/dist/composables/useDarkMode.test.d.ts +1 -0
  77. package/dist/composables/useDropdown.test.d.ts +1 -0
  78. package/dist/composables/useExportCSV.test.d.ts +1 -0
  79. package/dist/composables/useFocusTrap.d.ts +41 -0
  80. package/dist/composables/useFocusTrap.test.d.ts +1 -0
  81. package/dist/composables/useId.d.ts +42 -0
  82. package/dist/composables/useId.test.d.ts +1 -0
  83. package/dist/composables/useModal.d.ts +1 -1
  84. package/dist/composables/useModal.test.d.ts +1 -0
  85. package/dist/index-BMoLBt6A.js +75 -0
  86. package/dist/index-BMoLBt6A.js.map +1 -0
  87. package/dist/index-CJwlO351.js +347 -0
  88. package/dist/index-CJwlO351.js.map +1 -0
  89. package/dist/index-CUNU12xk.cjs +346 -0
  90. package/dist/index-CUNU12xk.cjs.map +1 -0
  91. package/dist/index-DwFvFW-3.cjs +74 -0
  92. package/dist/index-DwFvFW-3.cjs.map +1 -0
  93. package/dist/index.cjs +67 -57
  94. package/dist/index.cjs.map +1 -1
  95. package/dist/index.js +51 -41
  96. package/dist/index.js.map +1 -1
  97. package/dist/index.test.d.ts +1 -0
  98. package/dist/style.css +1 -1
  99. package/dist/types/form.d.ts +4 -0
  100. package/dist/types/index.test.d.ts +1 -0
  101. package/dist/useDarkMode-Cl5QWTlC.js +53 -0
  102. package/dist/useDarkMode-Cl5QWTlC.js.map +1 -0
  103. package/dist/useDarkMode-DLZcJEUQ.cjs +52 -0
  104. package/dist/useDarkMode-DLZcJEUQ.cjs.map +1 -0
  105. package/dist/useFocusTrap-AnlJsihM.js +120 -0
  106. package/dist/useFocusTrap-AnlJsihM.js.map +1 -0
  107. package/dist/useFocusTrap-kcxO8AeU.cjs +119 -0
  108. package/dist/useFocusTrap-kcxO8AeU.cjs.map +1 -0
  109. package/dist/useId-nxrBaIC9.cjs +25 -0
  110. package/dist/useId-nxrBaIC9.cjs.map +1 -0
  111. package/dist/useId-xeHj7rkg.js +26 -0
  112. package/dist/useId-xeHj7rkg.js.map +1 -0
  113. package/dist/{useToast-CRh_sG82.cjs → useToast-Bk60GArg.cjs} +1 -50
  114. package/dist/useToast-Bk60GArg.cjs.map +1 -0
  115. package/dist/{useToast-DwFOkewC.js → useToast-ina5g3mj.js} +6 -55
  116. package/dist/useToast-ina5g3mj.js.map +1 -0
  117. package/package.json +9 -8
  118. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js +0 -54
  119. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-B-nLCCNY.js.map +0 -1
  120. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs +0 -53
  121. package/dist/Checkbox.vue_vue_type_script_setup_true_lang-DIoHDji4.cjs.map +0 -1
  122. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-C3pr8BwC.js.map +0 -1
  123. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DKxcVBKu.cjs.map +0 -1
  124. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-CrEu33_J.cjs.map +0 -1
  125. package/dist/ListSkeleton.vue_vue_type_script_setup_true_lang-D3_Oddwt.js.map +0 -1
  126. package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js.map +0 -1
  127. package/dist/RangeSlider.vue_vue_type_script_setup_true_lang-ClH-pyK8.cjs.map +0 -1
  128. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-CsDMGhaT.cjs.map +0 -1
  129. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-Q4PcIELi.js.map +0 -1
  130. package/dist/Timeline.vue_vue_type_script_setup_true_lang-C5SKEGPG.cjs.map +0 -1
  131. package/dist/Timeline.vue_vue_type_script_setup_true_lang-ykGksWXN.js.map +0 -1
  132. package/dist/index-C3NAM2ds.js +0 -72
  133. package/dist/index-C3NAM2ds.js.map +0 -1
  134. package/dist/index-Ti1RIOEG.cjs +0 -71
  135. package/dist/index-Ti1RIOEG.cjs.map +0 -1
  136. package/dist/useToast-CRh_sG82.cjs.map +0 -1
  137. package/dist/useToast-DwFOkewC.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Combobox.vue_vue_type_script_setup_true_lang-D9TIId4E.cjs","sources":["../src/components/form/FormLabel.vue","../src/components/form/FormHelp.vue","../src/components/form/FormInput.vue","../src/components/form/FormSelect.vue","../src/components/form/FormGroup.vue","../src/components/form/SearchInput.vue","../src/components/form/Switch.vue","../src/components/form/Slider.vue","../src/components/form/DatePicker.vue","../src/components/form/FileUpload.vue","../src/components/form/Rating.vue","../src/components/form/ColorPicker.vue","../src/components/form/RangeSlider.vue","../src/components/form/Combobox.vue"],"sourcesContent":["<script lang=\"ts\" setup>\ndefineProps<{\n error?: string | boolean\n htmlFor?: string\n}>()\n</script>\n\n<template>\n <label\n :data-error=\"!!error\"\n :for=\"htmlFor ?? ''\"\n class=\"block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300\"\n >\n <slot />\n </label>\n</template>\n","<script lang=\"ts\" setup>\r\ndefineProps<{\r\n /** ID for aria-describedby linking */\r\n id?: string\r\n error?: boolean\r\n text?: string\r\n}>()\r\n</script>\r\n\r\n<template>\r\n <p\r\n :id=\"id\"\r\n :data-error=\"error\"\r\n :role=\"error ? 'alert' : undefined\"\r\n :aria-live=\"error ? 'polite' : undefined\"\r\n class=\"mt-2 text-sm text-gray-400 peer-user-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500\"\r\n >\r\n <slot>{{ text ?? '' }}</slot>\r\n </p>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport type { InputProps } from '@/types'\r\n\r\nconst props = withDefaults(defineProps<InputProps>(), {\r\n type: 'text',\r\n})\r\n\r\nconst modelValue = defineModel<string>()\r\n</script>\r\n\r\n<template>\r\n <input\r\n :id=\"props.id ?? props.name ?? ''\"\r\n v-model=\"modelValue\"\r\n :disabled=\"props.disabled\"\r\n :name=\"props.name ?? ''\"\r\n :placeholder=\"props.placeholder\"\r\n :type=\"props.type\"\r\n :required=\"props.required\"\r\n :aria-invalid=\"props.invalid || undefined\"\r\n :aria-required=\"props.required || undefined\"\r\n :aria-describedby=\"props.describedBy || undefined\"\r\n class=\"mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm user-invalid:border-red-500 user-invalid:text-red-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-none focus:user-invalid:border-red-500 focus:user-invalid:ring-red-500 disabled:border-gray-200 disabled:bg-gray-50 disabled:text-gray-500 disabled:shadow-none dark:border-gray-700 dark:bg-gray-900 dark:text-gray-200 dark:placeholder-gray-500 dark:focus:border-primary dark:focus:ring-primary dark:disabled:border-gray-800 dark:disabled:bg-gray-950 dark:disabled:text-gray-500\"\r\n v-bind=\"$attrs\"\r\n >\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed, ref, watch, nextTick } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\nimport type { SelectProps, SelectOption } from '@/types'\r\nimport { useDropdown } from '@/composables/useDropdown'\r\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-none dark:text-white\"\r\n placeholder=\"Search...\"\r\n aria-label=\"Search options\"\r\n @keydown=\"handleKeydown\"\r\n >\r\n </div>\r\n </div>\r\n\r\n <!-- Empty state -->\r\n <div\r\n v-if=\"filteredOptions.length === 0\"\r\n class=\"px-4 py-3 text-sm text-gray-500 dark:text-gray-400\"\r\n role=\"status\"\r\n >\r\n {{ noResultsText }}\r\n </div>\r\n\r\n <!-- Options -->\r\n <div class=\"py-1\">\r\n <button\r\n v-for=\"(option, index) in filteredOptions\"\r\n :key=\"String(option.value)\"\r\n type=\"button\"\r\n role=\"option\"\r\n :aria-selected=\"modelValue === option.value\"\r\n :data-index=\"index\"\r\n :class=\"[\r\n 'flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors',\r\n highlightedIndex === index && 'bg-gray-100 dark:bg-gray-700',\r\n modelValue === option.value && 'bg-primary/10 text-primary',\r\n modelValue !== option.value && 'text-gray-700 dark:text-gray-200',\r\n ]\"\r\n @click=\"selectOption(option)\"\r\n @mouseenter=\"highlightedIndex = index\"\r\n >\r\n <slot\r\n name=\"option\"\r\n :option=\"option\"\r\n :selected=\"modelValue === option.value\"\r\n :index=\"index\"\r\n >\r\n <Icon\r\n v-if=\"modelValue === option.value\"\r\n icon=\"lucide:check\"\r\n class=\"size-4 shrink-0 text-primary\"\r\n aria-hidden=\"true\"\r\n />\r\n <span\r\n v-else\r\n class=\"size-4 shrink-0\"\r\n aria-hidden=\"true\"\r\n />\r\n <span class=\"flex-1\">{{ option.label }}</span>\r\n </slot>\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { computed } from 'vue'\r\nimport type { FormGroupProps } from '@/types'\r\nimport { useId } from '@/composables/useId'\r\nimport FormLabel from './FormLabel.vue'\r\nimport FormInput from './FormInput.vue'\r\nimport FormSelect from './FormSelect.vue'\r\nimport FormHelp from './FormHelp.vue'\r\n\r\nconst props = withDefaults(defineProps<FormGroupProps>(), {\r\n cols: 6,\r\n})\r\n\r\nconst modelValue = defineModel()\r\n\r\n// Generate unique IDs for accessibility\r\nconst { id: generatedId, related } = useId({ prefix: 'field', id: props.id })\r\nconst inputId = computed(() => props.id ?? props.name ?? generatedId.value)\r\nconst helpId = computed(() => related('help'))\r\n\r\nconst computedCols = computed(() => `span ${props.cols} / span ${props.cols}`)\r\n\r\nconst isSelect = computed(() => props.select === true)\r\n\r\n// Determine if we should link to error message\r\nconst hasError = computed(() => props.error && typeof props.error === 'string')\r\n</script>\r\n\r\n<template>\r\n <div\r\n :style=\"{ gridColumn: computedCols }\"\r\n :hidden=\"hidden\"\r\n >\r\n <slot>\r\n <slot name=\"label\">\r\n <FormLabel\r\n v-if=\"label\"\r\n :html-for=\"inputId\"\r\n :error=\"error\"\r\n >\r\n {{ label }}\r\n </FormLabel>\r\n </slot>\r\n\r\n <slot name=\"input\">\r\n <FormSelect\r\n v-if=\"isSelect\"\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n :id=\"inputId\"\r\n :invalid=\"Boolean(error)\"\r\n :described-by=\"hasError ? helpId : undefined\"\r\n />\r\n <FormInput\r\n v-else\r\n v-model=\"modelValue\"\r\n v-bind=\"{ ...$attrs, ...$props }\"\r\n :id=\"inputId\"\r\n :invalid=\"Boolean(error)\"\r\n :described-by=\"hasError ? helpId : undefined\"\r\n />\r\n </slot>\r\n\r\n <FormHelp\r\n v-if=\"hasError\"\r\n :id=\"helpId\"\r\n :error=\"true\"\r\n >\r\n {{ error }}\r\n </FormHelp>\r\n </slot>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\nimport { Icon } from '@iconify/vue'\n\nconst {\n placeholder = 'Search...',\n icon = 'lucide:search',\n disabled = false,\n} = defineProps<{\n modelValue?: string\n placeholder?: string\n icon?: string\n disabled?: boolean\n}>()\n\nconst emit = defineEmits<{\n 'update:modelValue': [value: string]\n}>()\n\nconst handleInput = (event: Event) => {\n const target = event.target as HTMLInputElement\n emit('update:modelValue', target.value)\n}\n</script>\n\n<template>\n <div class=\"relative\">\n <Icon\n :icon=\"icon\"\n class=\"absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400\"\n />\n <input\n :disabled=\"disabled\"\n :placeholder=\"placeholder\"\n :value=\"modelValue\"\n class=\"focus:border-primary focus:ring-primary w-full rounded-lg border border-gray-300 bg-white py-2 pr-4 pl-10 text-gray-900 placeholder-gray-400 transition-colors disabled:cursor-not-allowed disabled:opacity-50 dark:border-gray-600 dark:bg-gray-800 dark:text-gray-100 dark:placeholder-gray-500\"\n type=\"text\"\n @input=\"handleInput\"\n >\n </div>\n</template>\n","<script lang=\"ts\" setup>\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-none focus:ring-2 focus:ring-primary focus:ring-offset-2',\n switchSizes[size],\n modelValue ? 'bg-primary' : 'bg-gray-300 dark:bg-gray-600',\n ]\"\n @click=\"toggle\"\n >\n <span\n :class=\"[\n 'inline-block transform rounded-full bg-white shadow-sm transition-transform',\n dotSizes[size],\n modelValue ? translateSizes[size] : 'translate-x-1',\n ]\"\n 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 'h-8 w-8 rounded text-sm transition',\r\n day.isDisabled && 'cursor-not-allowed opacity-30',\r\n !day.isCurrentMonth && 'text-gray-400 dark:text-gray-600',\r\n day.isCurrentMonth && !day.isSelected && !day.isToday && 'text-gray-900 hover:bg-gray-100 dark:text-white dark:hover:bg-gray-700',\r\n day.isToday && !day.isSelected && 'bg-gray-100 font-semibold text-gray-900 dark:bg-gray-700 dark:text-white',\r\n day.isSelected && 'bg-primary text-white font-semibold',\r\n ]\"\r\n @click=\"selectDate(day)\"\r\n >\r\n {{ day.date.getDate() }}\r\n </button>\r\n </div>\r\n\r\n <!-- Today button -->\r\n <div class=\"mt-4 border-t border-gray-200 pt-3 dark:border-gray-700\">\r\n <button\r\n type=\"button\"\r\n class=\"w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10\"\r\n @click=\"selectDate({ date: new Date(), isCurrentMonth: true, isToday: true, isSelected: false, isDisabled: false })\"\r\n >\r\n Today\r\n </button>\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport interface UploadedFile {\r\n file: File\r\n id: string\r\n progress: number\r\n status: 'pending' | 'uploading' | 'success' | 'error'\r\n error?: string\r\n}\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Accepted file types (e.g., 'image/*,.pdf') */\r\n accept?: string\r\n /** Allow multiple files */\r\n multiple?: boolean\r\n /** Maximum file size in bytes */\r\n maxSize?: number\r\n /** Maximum number of files */\r\n maxFiles?: number\r\n /** Disable the upload */\r\n disabled?: boolean\r\n /** Custom label text */\r\n label?: string\r\n /** Custom description text */\r\n description?: string\r\n }>(),\r\n {\r\n multiple: false,\r\n disabled: false,\r\n label: 'Drop files here or click to upload',\r\n description: '',\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'files-selected': [files: File[]]\r\n 'file-removed': [file: File]\r\n 'error': [message: string]\r\n}>()\r\n\r\nconst isDragging = ref(false)\r\nconst files = ref<UploadedFile[]>([])\r\nconst inputRef = ref<HTMLInputElement>()\r\n\r\nconst formatSize = (bytes: number): string => {\r\n if (bytes === 0) return '0 B'\r\n const k = 1024\r\n const sizes = ['B', 'KB', 'MB', 'GB']\r\n const i = Math.floor(Math.log(bytes) / Math.log(k))\r\n return parseFloat((bytes / Math.pow(k, i)).toFixed(1)) + ' ' + sizes[i]\r\n}\r\n\r\nconst validateFile = (file: File): string | null => {\r\n if (props.maxSize && file.size > props.maxSize) {\r\n return `File too large. Max size: ${formatSize(props.maxSize)}`\r\n }\r\n if (props.accept) {\r\n const acceptedTypes = props.accept.split(',').map((t) => t.trim())\r\n const fileType = file.type\r\n const fileExt = '.' + file.name.split('.').pop()?.toLowerCase()\r\n\r\n const isAccepted = acceptedTypes.some((type) => {\r\n if (type.startsWith('.')) {\r\n return fileExt === type.toLowerCase()\r\n }\r\n if (type.endsWith('/*')) {\r\n return fileType.startsWith(type.replace('/*', '/'))\r\n }\r\n return fileType === type\r\n })\r\n\r\n if (!isAccepted) {\r\n return `File type not accepted`\r\n }\r\n }\r\n return null\r\n}\r\n\r\nconst addFiles = (newFiles: FileList | File[]) => {\r\n const fileArray = Array.from(newFiles)\r\n const validFiles: File[] = []\r\n\r\n for (const file of fileArray) {\r\n if (props.maxFiles && files.value.length + validFiles.length >= props.maxFiles) {\r\n emit('error', `Maximum ${props.maxFiles} files allowed`)\r\n break\r\n }\r\n\r\n const error = validateFile(file)\r\n if (error) {\r\n emit('error', `${file.name}: ${error}`)\r\n continue\r\n }\r\n\r\n validFiles.push(file)\r\n files.value.push({\r\n file,\r\n id: Math.random().toString(36).substring(2),\r\n progress: 0,\r\n status: 'pending',\r\n })\r\n }\r\n\r\n if (validFiles.length > 0) {\r\n emit('files-selected', validFiles)\r\n }\r\n}\r\n\r\nconst removeFile = (id: string) => {\r\n const index = files.value.findIndex((f) => f.id === id)\r\n if (index > -1) {\r\n const removed = files.value.splice(index, 1)[0]\r\n emit('file-removed', removed.file)\r\n }\r\n}\r\n\r\nconst handleDrop = (e: DragEvent) => {\r\n isDragging.value = false\r\n if (props.disabled || !e.dataTransfer?.files) return\r\n addFiles(e.dataTransfer.files)\r\n}\r\n\r\nconst handleDragOver = (e: DragEvent) => {\r\n e.preventDefault()\r\n if (!props.disabled) {\r\n isDragging.value = true\r\n }\r\n}\r\n\r\nconst handleDragLeave = () => {\r\n isDragging.value = false\r\n}\r\n\r\nconst handleClick = () => {\r\n if (!props.disabled) {\r\n inputRef.value?.click()\r\n }\r\n}\r\n\r\nconst handleInputChange = (e: Event) => {\r\n const target = e.target as HTMLInputElement\r\n if (target.files) {\r\n addFiles(target.files)\r\n target.value = ''\r\n }\r\n}\r\n\r\nconst dropzoneClasses = computed(() => {\r\n const base =\r\n 'relative border-2 border-dashed rounded-lg p-8 text-center cursor-pointer transition-colors'\r\n if (props.disabled) {\r\n return `${base} border-gray-200 bg-gray-50 cursor-not-allowed dark:border-gray-700 dark:bg-gray-800`\r\n }\r\n if (isDragging.value) {\r\n return `${base} border-primary-500 bg-primary-50 dark:bg-primary-900/20`\r\n }\r\n return `${base} border-gray-300 hover:border-primary-400 hover:bg-gray-50 dark:border-gray-600 dark:hover:border-primary-500 dark:hover:bg-gray-800`\r\n})\r\n\r\nconst getFileIcon = (file: File): string => {\r\n if (file.type.startsWith('image/')) return 'heroicons:photo'\r\n if (file.type.startsWith('video/')) return 'heroicons:video-camera'\r\n if (file.type.startsWith('audio/')) return 'heroicons:musical-note'\r\n if (file.type.includes('pdf')) return 'heroicons:document-text'\r\n if (file.type.includes('zip') || file.type.includes('rar')) return 'heroicons:archive-box'\r\n return 'heroicons:document'\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"space-y-4\">\r\n <!-- Dropzone -->\r\n <div\r\n :class=\"dropzoneClasses\"\r\n @drop.prevent=\"handleDrop\"\r\n @dragover=\"handleDragOver\"\r\n @dragleave=\"handleDragLeave\"\r\n @click=\"handleClick\"\r\n >\r\n <input\r\n ref=\"inputRef\"\r\n type=\"file\"\r\n class=\"hidden\"\r\n :accept=\"accept\"\r\n :multiple=\"multiple\"\r\n :disabled=\"disabled\"\r\n @change=\"handleInputChange\"\r\n />\r\n\r\n <div class=\"space-y-2\">\r\n <Icon\r\n icon=\"heroicons:cloud-arrow-up\"\r\n class=\"w-12 h-12 mx-auto text-gray-400\"\r\n :class=\"{ 'text-primary-500': isDragging }\"\r\n />\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300\">\r\n {{ label }}\r\n </p>\r\n <p v-if=\"description\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ description }}\r\n </p>\r\n <p v-if=\"maxSize\" class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n Max size: {{ formatSize(maxSize) }}\r\n </p>\r\n </div>\r\n </div>\r\n\r\n <!-- File list -->\r\n <ul v-if=\"files.length > 0\" class=\"space-y-2\">\r\n <li\r\n v-for=\"uploadedFile in files\"\r\n :key=\"uploadedFile.id\"\r\n class=\"flex items-center gap-3 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg\"\r\n >\r\n <Icon :icon=\"getFileIcon(uploadedFile.file)\" class=\"w-8 h-8 text-gray-400\" />\r\n\r\n <div class=\"flex-1 min-w-0\">\r\n <p class=\"text-sm font-medium text-gray-700 dark:text-gray-300 truncate\">\r\n {{ uploadedFile.file.name }}\r\n </p>\r\n <p class=\"text-xs text-gray-500 dark:text-gray-400\">\r\n {{ formatSize(uploadedFile.file.size) }}\r\n </p>\r\n </div>\r\n\r\n <button\r\n type=\"button\"\r\n class=\"p-1 text-gray-400 hover:text-red-500 rounded\"\r\n @click.stop=\"removeFile(uploadedFile.id)\"\r\n >\r\n <Icon icon=\"heroicons:x-mark\" class=\"w-5 h-5\" />\r\n </button>\r\n </li>\r\n </ul>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, computed } from 'vue'\r\nimport { Icon } from '@iconify/vue'\r\n\r\nexport type RatingSize = 'sm' | 'md' | 'lg'\r\n\r\nconst props = withDefaults(\r\n defineProps<{\r\n /** Current rating value */\r\n modelValue?: number\r\n /** Maximum rating */\r\n max?: number\r\n /** Allow half stars */\r\n allowHalf?: boolean\r\n /** Read only mode */\r\n readonly?: boolean\r\n /** Disabled state */\r\n disabled?: boolean\r\n /** Size of stars */\r\n size?: RatingSize\r\n /** Icon for filled star */\r\n filledIcon?: string\r\n /** Icon for empty star */\r\n emptyIcon?: string\r\n /** Icon for half star */\r\n halfIcon?: string\r\n /** Color of filled stars */\r\n color?: string\r\n /** Show rating value */\r\n showValue?: boolean\r\n }>(),\r\n {\r\n modelValue: 0,\r\n max: 5,\r\n allowHalf: false,\r\n readonly: false,\r\n disabled: false,\r\n size: 'md',\r\n filledIcon: 'heroicons:star-solid',\r\n emptyIcon: 'heroicons:star',\r\n halfIcon: 'heroicons:star-solid',\r\n color: 'text-yellow-400',\r\n showValue: false,\r\n },\r\n)\r\n\r\nconst emit = defineEmits<{\r\n 'update:modelValue': [value: number]\r\n}>()\r\n\r\nconst hoverValue = ref<number | null>(null)\r\n\r\nconst displayValue = computed(() => {\r\n return hoverValue.value !== null ? hoverValue.value : props.modelValue\r\n})\r\n\r\nconst sizeClasses = computed(() => {\r\n switch (props.size) {\r\n case 'sm':\r\n return 'w-4 h-4'\r\n case 'lg':\r\n return 'w-8 h-8'\r\n default:\r\n return 'w-6 h-6'\r\n }\r\n})\r\n\r\nconst getStarState = (index: number): 'full' | 'half' | 'empty' => {\r\n const value = displayValue.value\r\n if (value >= index) return 'full'\r\n if (props.allowHalf && value >= index - 0.5) return 'half'\r\n return 'empty'\r\n}\r\n\r\nconst handleClick = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n emit('update:modelValue', value)\r\n}\r\n\r\nconst handleMouseMove = (index: number, event: MouseEvent) => {\r\n if (props.readonly || props.disabled) return\r\n\r\n let value = index\r\n if (props.allowHalf) {\r\n const rect = (event.target as HTMLElement).getBoundingClientRect()\r\n const isLeftHalf = event.clientX - rect.left < rect.width / 2\r\n value = isLeftHalf ? index - 0.5 : index\r\n }\r\n\r\n hoverValue.value = value\r\n}\r\n\r\nconst handleMouseLeave = () => {\r\n hoverValue.value = null\r\n}\r\n</script>\r\n\r\n<template>\r\n <div class=\"flex items-center gap-1\">\r\n <div\r\n class=\"flex items-center\"\r\n @mouseleave=\"handleMouseLeave\"\r\n >\r\n <button\r\n v-for=\"index in max\"\r\n :key=\"index\"\r\n type=\"button\"\r\n class=\"relative focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1 rounded\"\r\n :class=\"[\r\n readonly || disabled ? 'cursor-default' : 'cursor-pointer',\r\n disabled && 'opacity-50',\r\n ]\"\r\n :disabled=\"readonly || disabled\"\r\n @click=\"handleClick(index, $event)\"\r\n @mousemove=\"handleMouseMove(index, $event)\"\r\n >\r\n <!-- Empty star (background) -->\r\n <Icon\r\n :icon=\"emptyIcon\"\r\n :class=\"[sizeClasses, 'text-gray-300 dark:text-gray-600']\"\r\n />\r\n\r\n <!-- Filled star (overlay) -->\r\n <div\r\n class=\"absolute inset-0 overflow-hidden\"\r\n :style=\"{\r\n width:\r\n getStarState(index) === 'full'\r\n ? '100%'\r\n : getStarState(index) === 'half'\r\n ? '50%'\r\n : '0%',\r\n }\"\r\n >\r\n <Icon\r\n :icon=\"filledIcon\"\r\n :class=\"[sizeClasses, color]\"\r\n />\r\n </div>\r\n </button>\r\n </div>\r\n\r\n <span\r\n v-if=\"showValue\"\r\n class=\"ml-2 text-sm font-medium text-gray-700 dark:text-gray-300\"\r\n >\r\n {{ modelValue.toFixed(allowHalf ? 1 : 0) }}\r\n </span>\r\n </div>\r\n</template>\r\n","<script lang=\"ts\" setup>\r\nimport { ref, watch, 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=\"w-6 h-6 rounded border border-gray-200 dark:border-gray-600\"\r\n :style=\"{ backgroundColor: modelValue }\"\r\n />\r\n <span class=\"text-sm font-mono text-gray-700 dark:text-gray-300\">\r\n {{ modelValue }}\r\n </span>\r\n <Icon\r\n icon=\"heroicons:chevron-down\"\r\n class=\"w-4 h-4 text-gray-400\"\r\n :class=\"{ 'rotate-180': isOpen }\"\r\n />\r\n </button>\r\n\r\n <!-- Dropdown -->\r\n <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=\"w-8 h-8 rounded-lg border-2 transition-transform hover:scale-110 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:ring-offset-1\"\r\n :class=\"[\r\n modelValue === color\r\n ? 'border-primary-500 ring-2 ring-primary-500 ring-offset-1'\r\n : 'border-transparent',\r\n ]\"\r\n :style=\"{ backgroundColor: color }\"\r\n :title=\"color\"\r\n @click=\"selectColor(color)\"\r\n >\r\n <Icon\r\n v-if=\"modelValue === color\"\r\n icon=\"heroicons:check\"\r\n class=\"w-4 h-4 mx-auto\"\r\n :class=\"[\r\n ['#ffffff', '#f9fafb', '#f3f4f6', '#e5e7eb', '#eab308', '#f59e0b'].includes(color)\r\n ? 'text-gray-800'\r\n : 'text-white',\r\n ]\"\r\n />\r\n </button>\r\n </div>\r\n\r\n <!-- Custom input -->\r\n <div v-if=\"showInput\" class=\"flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700\">\r\n <input\r\n type=\"color\"\r\n :value=\"modelValue\"\r\n class=\"w-8 h-8 rounded cursor-pointer border-0 p-0\"\r\n @input=\"handleNativeInput\"\r\n />\r\n <input\r\n v-model=\"inputValue\"\r\n type=\"text\"\r\n class=\"flex-1 px-2 py-1 text-sm font-mono border border-gray-300 dark:border-gray-600 rounded bg-white dark:bg-gray-700 text-gray-900 dark:text-white\"\r\n placeholder=\"#000000\"\r\n @change=\"handleInputChange\"\r\n @keyup.enter=\"handleInputChange\"\r\n />\r\n </div>\r\n </div>\r\n </Transition>\r\n\r\n <!-- Click outside to close -->\r\n <div\r\n v-if=\"isOpen\"\r\n class=\"fixed inset-0 z-40\"\r\n @click=\"closePicker\"\r\n />\r\n </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 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'min' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${minPercent}%` }\"\r\n @mousedown=\"handleMouseDown('min')\"\r\n />\r\n\r\n <!-- Max handle -->\r\n <div\r\n class=\"absolute top-1/2 -translate-y-1/2 -translate-x-1/2 w-5 h-5 rounded-full border-2 shadow transition-shadow\"\r\n :class=\"[\r\n disabled\r\n ? 'bg-gray-300 border-gray-400 cursor-not-allowed'\r\n : 'bg-white border-primary-500 cursor-grab hover:shadow-md active:cursor-grabbing',\r\n dragging === 'max' && 'ring-4 ring-primary-200 dark:ring-primary-800',\r\n ]\"\r\n :style=\"{ left: `${maxPercent}%` }\"\r\n @mousedown=\"handleMouseDown('max')\"\r\n />\r\n </div>\r\n\r\n <!-- Min/Max labels -->\r\n <div v-if=\"showMinMax\" class=\"flex justify-between text-xs text-gray-500 dark:text-gray-400\">\r\n <span>{{ formatLabel(min) }}</span>\r\n <span>{{ formatLabel(max) }}</span>\r\n </div>\r\n </div>\r\n</template>\r\n","<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-none 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=\"h-4 w-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 'h-4 w-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 h-4 w-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=\"h-3 w-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=\"h-4 w-4 text-primary\"\r\n aria-hidden=\"true\"\r\n />\r\n </button>\r\n </template>\r\n\r\n <!-- No results -->\r\n <div\r\n v-else\r\n class=\"px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400\"\r\n role=\"status\"\r\n >\r\n {{ noResultsText }}\r\n </div>\r\n </div>\r\n </Transition>\r\n </Teleport>\r\n </div>\r\n</template>\r\n"],"names":["_createElementBlock","_renderSlot","_useModel","_withDirectives","_openBlock","_mergeProps","$attrs","_hoisted_1","useId","computed","ref","useDropdown","nextTick","index","watch","_createElementVNode","_unref","_hoisted_3","_toDisplayString","_createVNode","Icon","_createBlock","_Teleport","_Transition","_normalizeClass","_hoisted_5","_hoisted_6","_hoisted_7","_hoisted_8","_Fragment","_renderList","_hoisted_10","_hoisted_11","FormLabel","FormSelect","$props","FormInput","FormHelp","_hoisted_2","_hoisted_4","_hoisted_9","_withModifiers","_normalizeStyle","onClickOutside"],"mappings":"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"}