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
@@ -1,9 +1,11 @@
1
- import { defineComponent, createElementBlock, openBlock, renderSlot, createTextVNode, toDisplayString, mergeModels, useModel, withDirectives, mergeProps, vModelDynamic, ref, computed, watch, createElementVNode, createBlock, normalizeClass, createVNode, unref, Teleport, Transition, withCtx, createCommentVNode, normalizeStyle, vModelText, Fragment, renderList, nextTick, withModifiers, withKeys } from "vue";
1
+ import { defineComponent, createElementBlock, openBlock, renderSlot, createTextVNode, toDisplayString, mergeModels, useModel, withDirectives, mergeProps, vModelDynamic, computed, ref, watch, createElementVNode, createBlock, unref, normalizeClass, createVNode, Teleport, Transition, withCtx, createCommentVNode, normalizeStyle, vModelText, Fragment, renderList, nextTick, withModifiers, withKeys } from "vue";
2
+ import { u as useId } from "./useId-xeHj7rkg.js";
2
3
  import { Icon } from "@iconify/vue";
3
4
  import { u as useDropdown } from "./useDropdown-iVu14E6s.js";
4
5
  import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
5
- const _hoisted_1$c = ["data-error", "for"];
6
- const _sfc_main$c = /* @__PURE__ */ defineComponent({
6
+ import { o as onClickOutside } from "./index-CJwlO351.js";
7
+ const _hoisted_1$d = ["data-error", "for"];
8
+ const _sfc_main$d = /* @__PURE__ */ defineComponent({
7
9
  __name: "FormLabel",
8
10
  props: {
9
11
  error: { type: [String, Boolean] },
@@ -17,32 +19,36 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
17
19
  class: "block text-sm font-medium text-gray-700 data-[error=true]:text-red-500 dark:text-gray-300"
18
20
  }, [
19
21
  renderSlot(_ctx.$slots, "default")
20
- ], 8, _hoisted_1$c);
22
+ ], 8, _hoisted_1$d);
21
23
  };
22
24
  }
23
25
  });
24
- const _hoisted_1$b = ["data-error"];
25
- const _sfc_main$b = /* @__PURE__ */ defineComponent({
26
+ const _hoisted_1$c = ["id", "data-error", "role", "aria-live"];
27
+ const _sfc_main$c = /* @__PURE__ */ defineComponent({
26
28
  __name: "FormHelp",
27
29
  props: {
30
+ id: {},
28
31
  error: { type: Boolean },
29
32
  text: {}
30
33
  },
31
34
  setup(__props) {
32
35
  return (_ctx, _cache) => {
33
36
  return openBlock(), createElementBlock("p", {
37
+ id: __props.id,
34
38
  "data-error": __props.error,
39
+ role: __props.error ? "alert" : void 0,
40
+ "aria-live": __props.error ? "polite" : void 0,
35
41
  class: "mt-2 text-sm text-gray-400 peer-user-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500"
36
42
  }, [
37
43
  renderSlot(_ctx.$slots, "default", {}, () => [
38
44
  createTextVNode(toDisplayString(__props.text ?? ""), 1)
39
45
  ])
40
- ], 8, _hoisted_1$b);
46
+ ], 8, _hoisted_1$c);
41
47
  };
42
48
  }
43
49
  });
44
- const _hoisted_1$a = ["id", "disabled", "name", "placeholder", "type"];
45
- const _sfc_main$a = /* @__PURE__ */ defineComponent({
50
+ const _hoisted_1$b = ["id", "disabled", "name", "placeholder", "type", "required", "aria-invalid", "aria-required", "aria-describedby"];
51
+ const _sfc_main$b = /* @__PURE__ */ defineComponent({
46
52
  __name: "FormInput",
47
53
  props: /* @__PURE__ */ mergeModels({
48
54
  type: { default: "text" },
@@ -51,49 +57,59 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
51
57
  disabled: { type: Boolean },
52
58
  invalid: { type: Boolean },
53
59
  id: {},
54
- name: {}
60
+ name: {},
61
+ required: { type: Boolean },
62
+ describedBy: {}
55
63
  }, {
56
64
  "modelValue": {},
57
65
  "modelModifiers": {}
58
66
  }),
59
67
  emits: ["update:modelValue"],
60
68
  setup(__props) {
69
+ const props = __props;
61
70
  const modelValue = useModel(__props, "modelValue");
62
71
  return (_ctx, _cache) => {
63
72
  return withDirectives((openBlock(), createElementBlock("input", mergeProps({
64
- id: __props.id ?? __props.name ?? "",
73
+ id: props.id ?? props.name ?? "",
65
74
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
66
- disabled: __props.disabled,
67
- name: __props.name ?? "",
68
- placeholder: __props.placeholder,
69
- type: __props.type,
75
+ disabled: props.disabled,
76
+ name: props.name ?? "",
77
+ placeholder: props.placeholder,
78
+ type: props.type,
79
+ required: props.required,
80
+ "aria-invalid": props.invalid || void 0,
81
+ "aria-required": props.required || void 0,
82
+ "aria-describedby": props.describedBy || void 0,
70
83
  class: "mt-1 block w-full rounded-md border border-gray-300 bg-white px-3 py-2 text-sm text-gray-800 placeholder-gray-400 shadow-sm user-invalid:border-red-500 user-invalid:text-red-600 focus:border-primary focus:ring-1 focus:ring-primary focus:outline-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"
71
- }, _ctx.$attrs), null, 16, _hoisted_1$a)), [
84
+ }, _ctx.$attrs), null, 16, _hoisted_1$b)), [
72
85
  [vModelDynamic, modelValue.value]
73
86
  ]);
74
87
  };
75
88
  }
76
89
  });
77
- const _hoisted_1$9 = { class: "relative" };
78
- const _hoisted_2$8 = ["id", "disabled"];
79
- const _hoisted_3$7 = { class: "flex-1 truncate" };
80
- const _hoisted_4$5 = {
90
+ const _hoisted_1$a = { class: "relative" };
91
+ const _hoisted_2$9 = ["id", "disabled", "aria-expanded", "aria-controls", "aria-invalid", "aria-describedby"];
92
+ const _hoisted_3$8 = { class: "flex-1 truncate" };
93
+ const _hoisted_4$6 = ["id", "aria-label"];
94
+ const _hoisted_5$5 = {
81
95
  key: 0,
82
96
  class: "sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800"
83
97
  };
84
- const _hoisted_5$4 = { 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" };
85
- const _hoisted_6$4 = {
98
+ const _hoisted_6$5 = { 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" };
99
+ const _hoisted_7$5 = {
86
100
  key: 1,
87
- class: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400"
101
+ class: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400",
102
+ role: "status"
88
103
  };
89
- const _hoisted_7$4 = { class: "py-1" };
90
- const _hoisted_8$4 = ["data-index", "onClick", "onMouseenter"];
91
- const _hoisted_9$2 = {
104
+ const _hoisted_8$4 = { class: "py-1" };
105
+ const _hoisted_9$2 = ["aria-selected", "data-index", "onClick", "onMouseenter"];
106
+ const _hoisted_10$2 = {
92
107
  key: 1,
93
- class: "size-4 shrink-0"
108
+ class: "size-4 shrink-0",
109
+ "aria-hidden": "true"
94
110
  };
95
- const _hoisted_10$2 = { class: "flex-1" };
96
- const _sfc_main$9 = /* @__PURE__ */ defineComponent({
111
+ const _hoisted_11$2 = { class: "flex-1" };
112
+ const _sfc_main$a = /* @__PURE__ */ defineComponent({
97
113
  __name: "FormSelect",
98
114
  props: /* @__PURE__ */ mergeModels({
99
115
  options: {},
@@ -104,6 +120,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
104
120
  invalid: { type: Boolean },
105
121
  id: {},
106
122
  name: {},
123
+ required: { type: Boolean },
124
+ describedBy: {},
107
125
  teleport: { type: Boolean, default: true },
108
126
  searchable: { type: Boolean, default: false },
109
127
  noResultsText: { default: "No results found" },
@@ -115,6 +133,9 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
115
133
  emits: ["update:modelValue"],
116
134
  setup(__props) {
117
135
  const props = __props;
136
+ const { id: generatedId, related } = useId({ prefix: "select", id: props.id });
137
+ const triggerId = computed(() => props.id ?? props.name ?? generatedId.value);
138
+ const listboxId = computed(() => related("listbox"));
118
139
  const modelValue = useModel(__props, "modelValue");
119
140
  const searchQuery = ref("");
120
141
  const triggerRef = ref();
@@ -206,14 +227,19 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
206
227
  return [base, state, text, props.triggerClass];
207
228
  });
208
229
  return (_ctx, _cache) => {
209
- return openBlock(), createElementBlock("div", _hoisted_1$9, [
230
+ return openBlock(), createElementBlock("div", _hoisted_1$a, [
210
231
  createElementVNode("button", {
211
- id: __props.id ?? __props.name ?? void 0,
232
+ id: triggerId.value,
212
233
  ref_key: "triggerRef",
213
234
  ref: triggerRef,
214
235
  type: "button",
215
236
  disabled: __props.disabled,
216
237
  class: normalizeClass(triggerClasses.value),
238
+ "aria-haspopup": "listbox",
239
+ "aria-expanded": unref(isOpen),
240
+ "aria-controls": listboxId.value,
241
+ "aria-invalid": __props.invalid || void 0,
242
+ "aria-describedby": __props.describedBy || void 0,
217
243
  onClick: toggle,
218
244
  onKeydown: handleKeydown
219
245
  }, [
@@ -221,13 +247,14 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
221
247
  option: selectedOption.value,
222
248
  placeholder: __props.placeholder
223
249
  }, () => [
224
- createElementVNode("span", _hoisted_3$7, toDisplayString(displayValue.value), 1)
250
+ createElementVNode("span", _hoisted_3$8, toDisplayString(displayValue.value), 1)
225
251
  ]),
226
252
  createVNode(unref(Icon), {
227
253
  icon: "lucide:chevron-down",
228
- class: normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", unref(isOpen) && "rotate-180"])
254
+ class: normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", unref(isOpen) && "rotate-180"]),
255
+ "aria-hidden": "true"
229
256
  }, null, 8, ["class"])
230
- ], 42, _hoisted_2$8),
257
+ ], 42, _hoisted_2$9),
231
258
  (openBlock(), createBlock(Teleport, {
232
259
  to: "body",
233
260
  disabled: !__props.teleport
@@ -243,19 +270,23 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
243
270
  default: withCtx(() => [
244
271
  unref(isOpen) ? (openBlock(), createElementBlock("div", {
245
272
  key: 0,
273
+ id: listboxId.value,
246
274
  ref_key: "dropdownRef",
247
275
  ref: dropdownRef,
276
+ role: "listbox",
277
+ "aria-label": __props.placeholder || "Select an option",
248
278
  style: normalizeStyle(unref(dropdownStyle)),
249
279
  class: normalizeClass([
250
280
  "z-[9999] max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800",
251
281
  !__props.teleport && "absolute mt-1 w-full"
252
282
  ])
253
283
  }, [
254
- __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_4$5, [
255
- createElementVNode("div", _hoisted_5$4, [
284
+ __props.searchable ? (openBlock(), createElementBlock("div", _hoisted_5$5, [
285
+ createElementVNode("div", _hoisted_6$5, [
256
286
  createVNode(unref(Icon), {
257
287
  icon: "lucide:search",
258
- class: "size-4 text-gray-400"
288
+ class: "size-4 text-gray-400",
289
+ "aria-hidden": "true"
259
290
  }),
260
291
  withDirectives(createElementVNode("input", {
261
292
  ref_key: "searchInputRef",
@@ -264,18 +295,21 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
264
295
  type: "text",
265
296
  class: "flex-1 bg-transparent text-sm outline-none dark:text-white",
266
297
  placeholder: "Search...",
298
+ "aria-label": "Search options",
267
299
  onKeydown: handleKeydown
268
300
  }, null, 544), [
269
301
  [vModelText, searchQuery.value]
270
302
  ])
271
303
  ])
272
304
  ])) : createCommentVNode("", true),
273
- filteredOptions.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_6$4, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true),
274
- createElementVNode("div", _hoisted_7$4, [
305
+ filteredOptions.value.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_7$5, toDisplayString(__props.noResultsText), 1)) : createCommentVNode("", true),
306
+ createElementVNode("div", _hoisted_8$4, [
275
307
  (openBlock(true), createElementBlock(Fragment, null, renderList(filteredOptions.value, (option, index) => {
276
308
  return openBlock(), createElementBlock("button", {
277
309
  key: String(option.value),
278
310
  type: "button",
311
+ role: "option",
312
+ "aria-selected": modelValue.value === option.value,
279
313
  "data-index": index,
280
314
  class: normalizeClass([
281
315
  "flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors",
@@ -294,14 +328,15 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
294
328
  modelValue.value === option.value ? (openBlock(), createBlock(unref(Icon), {
295
329
  key: 0,
296
330
  icon: "lucide:check",
297
- class: "size-4 shrink-0 text-primary"
298
- })) : (openBlock(), createElementBlock("span", _hoisted_9$2)),
299
- createElementVNode("span", _hoisted_10$2, toDisplayString(option.label), 1)
331
+ class: "size-4 shrink-0 text-primary",
332
+ "aria-hidden": "true"
333
+ })) : (openBlock(), createElementBlock("span", _hoisted_10$2)),
334
+ createElementVNode("span", _hoisted_11$2, toDisplayString(option.label), 1)
300
335
  ])
301
- ], 42, _hoisted_8$4);
336
+ ], 42, _hoisted_9$2);
302
337
  }), 128))
303
338
  ])
304
- ], 6)) : createCommentVNode("", true)
339
+ ], 14, _hoisted_4$6)) : createCommentVNode("", true)
305
340
  ]),
306
341
  _: 3
307
342
  })
@@ -310,8 +345,8 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
310
345
  };
311
346
  }
312
347
  });
313
- const _hoisted_1$8 = ["hidden"];
314
- const _sfc_main$8 = /* @__PURE__ */ defineComponent({
348
+ const _hoisted_1$9 = ["hidden"];
349
+ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
315
350
  __name: "FormGroup",
316
351
  props: /* @__PURE__ */ mergeModels({
317
352
  label: {},
@@ -326,6 +361,8 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
326
361
  invalid: { type: Boolean },
327
362
  id: {},
328
363
  name: {},
364
+ required: { type: Boolean },
365
+ describedBy: {},
329
366
  options: {}
330
367
  }, {
331
368
  "modelValue": {},
@@ -335,8 +372,12 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
335
372
  setup(__props) {
336
373
  const props = __props;
337
374
  const modelValue = useModel(__props, "modelValue");
375
+ const { id: generatedId, related } = useId({ prefix: "field", id: props.id });
376
+ const inputId = computed(() => props.id ?? props.name ?? generatedId.value);
377
+ const helpId = computed(() => related("help"));
338
378
  const computedCols = computed(() => `span ${props.cols} / span ${props.cols}`);
339
379
  const isSelect = computed(() => props.select === true);
380
+ const hasError = computed(() => props.error && typeof props.error === "string");
340
381
  return (_ctx, _cache) => {
341
382
  return openBlock(), createElementBlock("div", {
342
383
  style: normalizeStyle({ gridColumn: computedCols.value }),
@@ -344,9 +385,9 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
344
385
  }, [
345
386
  renderSlot(_ctx.$slots, "default", {}, () => [
346
387
  renderSlot(_ctx.$slots, "label", {}, () => [
347
- __props.label ? (openBlock(), createBlock(_sfc_main$c, {
388
+ __props.label ? (openBlock(), createBlock(_sfc_main$d, {
348
389
  key: 0,
349
- "html-for": __props.id ?? __props.name,
390
+ "html-for": inputId.value,
350
391
  error: __props.error
351
392
  }, {
352
393
  default: withCtx(() => [
@@ -356,33 +397,42 @@ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
356
397
  }, 8, ["html-for", "error"])) : createCommentVNode("", true)
357
398
  ]),
358
399
  renderSlot(_ctx.$slots, "input", {}, () => [
359
- isSelect.value ? (openBlock(), createBlock(_sfc_main$9, mergeProps({
400
+ isSelect.value ? (openBlock(), createBlock(_sfc_main$a, mergeProps({
360
401
  key: 0,
361
402
  modelValue: modelValue.value,
362
403
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event)
363
- }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"])) : (openBlock(), createBlock(_sfc_main$a, mergeProps({
404
+ }, { ..._ctx.$attrs, ..._ctx.$props }, {
405
+ id: inputId.value,
406
+ invalid: Boolean(__props.error),
407
+ "described-by": hasError.value ? helpId.value : void 0
408
+ }), null, 16, ["modelValue", "id", "invalid", "described-by"])) : (openBlock(), createBlock(_sfc_main$b, mergeProps({
364
409
  key: 1,
365
410
  modelValue: modelValue.value,
366
411
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event)
367
- }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"]))
412
+ }, { ..._ctx.$attrs, ..._ctx.$props }, {
413
+ id: inputId.value,
414
+ invalid: Boolean(__props.error),
415
+ "described-by": hasError.value ? helpId.value : void 0
416
+ }), null, 16, ["modelValue", "id", "invalid", "described-by"]))
368
417
  ]),
369
- __props.error && typeof __props.error === "string" ? (openBlock(), createBlock(_sfc_main$b, {
418
+ hasError.value ? (openBlock(), createBlock(_sfc_main$c, {
370
419
  key: 0,
420
+ id: helpId.value,
371
421
  error: true
372
422
  }, {
373
423
  default: withCtx(() => [
374
424
  createTextVNode(toDisplayString(__props.error), 1)
375
425
  ]),
376
426
  _: 1
377
- })) : createCommentVNode("", true)
427
+ }, 8, ["id"])) : createCommentVNode("", true)
378
428
  ])
379
- ], 12, _hoisted_1$8);
429
+ ], 12, _hoisted_1$9);
380
430
  };
381
431
  }
382
432
  });
383
- const _hoisted_1$7 = { class: "relative" };
384
- const _hoisted_2$7 = ["disabled", "placeholder", "value"];
385
- const _sfc_main$7 = /* @__PURE__ */ defineComponent({
433
+ const _hoisted_1$8 = { class: "relative" };
434
+ const _hoisted_2$8 = ["disabled", "placeholder", "value"];
435
+ const _sfc_main$8 = /* @__PURE__ */ defineComponent({
386
436
  __name: "SearchInput",
387
437
  props: {
388
438
  modelValue: {},
@@ -398,7 +448,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
398
448
  emit("update:modelValue", target.value);
399
449
  };
400
450
  return (_ctx, _cache) => {
401
- return openBlock(), createElementBlock("div", _hoisted_1$7, [
451
+ return openBlock(), createElementBlock("div", _hoisted_1$8, [
402
452
  createVNode(unref(Icon), {
403
453
  icon: __props.icon,
404
454
  class: "absolute top-1/2 left-3 h-5 w-5 -translate-y-1/2 text-gray-400"
@@ -410,37 +460,36 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
410
460
  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",
411
461
  type: "text",
412
462
  onInput: handleInput
413
- }, null, 40, _hoisted_2$7)
463
+ }, null, 40, _hoisted_2$8)
414
464
  ]);
415
465
  };
416
466
  }
417
467
  });
418
- const _hoisted_1$6 = ["aria-checked", "disabled"];
419
- const _hoisted_2$6 = {
468
+ const _hoisted_1$7 = ["id", "aria-checked", "aria-labelledby", "aria-describedby", "disabled"];
469
+ const _hoisted_2$7 = {
420
470
  key: 0,
421
471
  class: "flex flex-col"
422
472
  };
423
- const _hoisted_3$6 = {
424
- key: 0,
425
- class: "text-sm font-medium text-gray-900 dark:text-white"
426
- };
427
- const _hoisted_4$4 = {
428
- key: 1,
429
- class: "text-sm text-gray-500 dark:text-gray-400"
430
- };
431
- const _sfc_main$6 = /* @__PURE__ */ defineComponent({
473
+ const _hoisted_3$7 = ["id"];
474
+ const _hoisted_4$5 = ["id"];
475
+ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
432
476
  __name: "Switch",
433
477
  props: {
434
478
  modelValue: { type: Boolean, default: false },
435
479
  label: {},
436
480
  description: {},
437
481
  disabled: { type: Boolean },
438
- size: { default: "md" }
482
+ size: { default: "md" },
483
+ id: {}
439
484
  },
440
485
  emits: ["update:modelValue"],
441
486
  setup(__props, { emit: __emit }) {
442
487
  const props = __props;
443
488
  const emit = __emit;
489
+ const { id: generatedId, related } = useId({ prefix: "switch", id: props.id });
490
+ const switchId = computed(() => props.id ?? generatedId.value);
491
+ const labelId = computed(() => related("label"));
492
+ const descriptionId = computed(() => related("description"));
444
493
  const toggle = () => {
445
494
  if (props.disabled) return;
446
495
  emit("update:modelValue", !props.modelValue);
@@ -465,9 +514,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
465
514
  class: normalizeClass(["inline-flex items-start gap-3", __props.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"])
466
515
  }, [
467
516
  createElementVNode("button", {
517
+ id: switchId.value,
468
518
  type: "button",
469
519
  role: "switch",
470
520
  "aria-checked": __props.modelValue,
521
+ "aria-labelledby": __props.label ? labelId.value : void 0,
522
+ "aria-describedby": __props.description ? descriptionId.value : void 0,
471
523
  disabled: __props.disabled,
472
524
  class: normalizeClass([
473
525
  "relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",
@@ -481,29 +533,38 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
481
533
  "inline-block transform rounded-full bg-white shadow-sm transition-transform",
482
534
  dotSizes[__props.size],
483
535
  __props.modelValue ? translateSizes[__props.size] : "translate-x-1"
484
- ])
536
+ ]),
537
+ "aria-hidden": "true"
485
538
  }, null, 2)
486
- ], 10, _hoisted_1$6),
487
- __props.label || __props.description ? (openBlock(), createElementBlock("div", _hoisted_2$6, [
488
- __props.label ? (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
489
- __props.description ? (openBlock(), createElementBlock("span", _hoisted_4$4, toDisplayString(__props.description), 1)) : createCommentVNode("", true)
539
+ ], 10, _hoisted_1$7),
540
+ __props.label || __props.description ? (openBlock(), createElementBlock("div", _hoisted_2$7, [
541
+ __props.label ? (openBlock(), createElementBlock("span", {
542
+ key: 0,
543
+ id: labelId.value,
544
+ class: "text-sm font-medium text-gray-900 dark:text-white"
545
+ }, toDisplayString(__props.label), 9, _hoisted_3$7)) : createCommentVNode("", true),
546
+ __props.description ? (openBlock(), createElementBlock("span", {
547
+ key: 1,
548
+ id: descriptionId.value,
549
+ class: "text-sm text-gray-500 dark:text-gray-400"
550
+ }, toDisplayString(__props.description), 9, _hoisted_4$5)) : createCommentVNode("", true)
490
551
  ])) : createCommentVNode("", true)
491
552
  ], 2);
492
553
  };
493
554
  }
494
555
  });
495
- const _hoisted_1$5 = { class: "w-full" };
496
- const _hoisted_2$5 = {
556
+ const _hoisted_1$6 = { class: "w-full" };
557
+ const _hoisted_2$6 = {
497
558
  key: 0,
498
559
  class: "mb-2 flex justify-between text-sm"
499
560
  };
500
- const _hoisted_3$5 = { class: "text-gray-600 dark:text-gray-400" };
501
- const _hoisted_4$3 = { class: "font-medium text-gray-900 dark:text-white" };
502
- const _hoisted_5$3 = { class: "text-gray-600 dark:text-gray-400" };
503
- const _hoisted_6$3 = { class: "relative" };
504
- const _hoisted_7$3 = ["value", "min", "max", "step", "disabled"];
561
+ const _hoisted_3$6 = { class: "text-gray-600 dark:text-gray-400" };
562
+ const _hoisted_4$4 = { class: "font-medium text-gray-900 dark:text-white" };
563
+ const _hoisted_5$4 = { class: "text-gray-600 dark:text-gray-400" };
564
+ const _hoisted_6$4 = { class: "relative" };
565
+ const _hoisted_7$4 = ["value", "min", "max", "step", "disabled"];
505
566
  const _hoisted_8$3 = { class: "pointer-events-none absolute inset-y-0 left-0 flex items-center" };
506
- const _sfc_main$5 = /* @__PURE__ */ defineComponent({
567
+ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
507
568
  __name: "Slider",
508
569
  props: /* @__PURE__ */ mergeModels({
509
570
  min: { default: 0 },
@@ -534,13 +595,13 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
534
595
  modelValue.value = Number(target.value);
535
596
  };
536
597
  return (_ctx, _cache) => {
537
- return openBlock(), createElementBlock("div", _hoisted_1$5, [
538
- __props.showValue ? (openBlock(), createElementBlock("div", _hoisted_2$5, [
539
- createElementVNode("span", _hoisted_3$5, toDisplayString(__props.min), 1),
540
- createElementVNode("span", _hoisted_4$3, toDisplayString(displayValue.value), 1),
541
- createElementVNode("span", _hoisted_5$3, toDisplayString(__props.max), 1)
598
+ return openBlock(), createElementBlock("div", _hoisted_1$6, [
599
+ __props.showValue ? (openBlock(), createElementBlock("div", _hoisted_2$6, [
600
+ createElementVNode("span", _hoisted_3$6, toDisplayString(__props.min), 1),
601
+ createElementVNode("span", _hoisted_4$4, toDisplayString(displayValue.value), 1),
602
+ createElementVNode("span", _hoisted_5$4, toDisplayString(__props.max), 1)
542
603
  ])) : createCommentVNode("", true),
543
- createElementVNode("div", _hoisted_6$3, [
604
+ createElementVNode("div", _hoisted_6$4, [
544
605
  createElementVNode("input", {
545
606
  type: "range",
546
607
  value: modelValue.value,
@@ -550,7 +611,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
550
611
  disabled: __props.disabled,
551
612
  class: "slider-input w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed disabled:opacity-50",
552
613
  onInput: handleInput
553
- }, null, 40, _hoisted_7$3),
614
+ }, null, 40, _hoisted_7$4),
554
615
  createElementVNode("div", _hoisted_8$3, [
555
616
  createElementVNode("div", {
556
617
  class: "h-2 rounded-full bg-primary",
@@ -562,18 +623,27 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
562
623
  };
563
624
  }
564
625
  });
565
- const Slider = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-a411f1b4"]]);
566
- const _hoisted_1$4 = { class: "relative" };
567
- const _hoisted_2$4 = ["disabled"];
568
- const _hoisted_3$4 = { class: "flex-1 truncate" };
569
- const _hoisted_4$2 = { class: "flex items-center gap-1" };
570
- const _hoisted_5$2 = { class: "mb-4 flex items-center justify-between" };
571
- const _hoisted_6$2 = { class: "font-medium text-gray-900 dark:text-white" };
572
- const _hoisted_7$2 = { class: "mb-2 grid grid-cols-7 gap-1" };
573
- const _hoisted_8$2 = { class: "grid grid-cols-7 gap-1" };
574
- const _hoisted_9$1 = ["disabled", "onClick"];
575
- const _hoisted_10$1 = { class: "mt-4 border-t border-gray-200 pt-3 dark:border-gray-700" };
576
- const _sfc_main$4 = /* @__PURE__ */ defineComponent({
626
+ const Slider = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-a411f1b4"]]);
627
+ const _hoisted_1$5 = { class: "relative" };
628
+ const _hoisted_2$5 = ["id", "disabled", "aria-expanded", "aria-controls"];
629
+ const _hoisted_3$5 = { class: "flex-1 truncate" };
630
+ const _hoisted_4$3 = { class: "flex items-center gap-1" };
631
+ const _hoisted_5$3 = ["id", "aria-label"];
632
+ const _hoisted_6$3 = { class: "mb-4 flex items-center justify-between" };
633
+ const _hoisted_7$3 = {
634
+ class: "font-medium text-gray-900 dark:text-white",
635
+ "aria-live": "polite",
636
+ "aria-atomic": "true"
637
+ };
638
+ const _hoisted_8$2 = {
639
+ class: "mb-2 grid grid-cols-7 gap-1",
640
+ role: "row"
641
+ };
642
+ const _hoisted_9$1 = ["abbr"];
643
+ const _hoisted_10$1 = ["id", "aria-label"];
644
+ const _hoisted_11$1 = ["aria-label", "aria-selected", "aria-disabled", "disabled", "onClick"];
645
+ const _hoisted_12 = { class: "mt-4 border-t border-gray-200 pt-3 dark:border-gray-700" };
646
+ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
577
647
  __name: "DatePicker",
578
648
  props: /* @__PURE__ */ mergeModels({
579
649
  placeholder: { default: "Select date" },
@@ -582,7 +652,8 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
582
652
  disabled: { type: Boolean, default: false },
583
653
  minDate: {},
584
654
  maxDate: {},
585
- teleport: { type: Boolean, default: true }
655
+ teleport: { type: Boolean, default: true },
656
+ id: {}
586
657
  }, {
587
658
  "modelValue": { default: null },
588
659
  "modelModifiers": {}
@@ -590,6 +661,10 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
590
661
  emits: ["update:modelValue"],
591
662
  setup(__props) {
592
663
  const props = __props;
664
+ const { related } = useId({ prefix: "datepicker", id: props.id });
665
+ const triggerId = computed(() => related("trigger"));
666
+ const calendarId = computed(() => related("calendar"));
667
+ const gridId = computed(() => related("grid"));
593
668
  const modelValue = useModel(__props, "modelValue");
594
669
  const triggerRef = ref();
595
670
  const calendarRef = ref();
@@ -682,13 +757,26 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
682
757
  const clear = () => {
683
758
  modelValue.value = null;
684
759
  };
760
+ const getDateLabel = (date) => {
761
+ const formatter = new Intl.DateTimeFormat(props.locale, {
762
+ weekday: "long",
763
+ year: "numeric",
764
+ month: "long",
765
+ day: "numeric"
766
+ });
767
+ return formatter.format(date);
768
+ };
685
769
  return (_ctx, _cache) => {
686
- return openBlock(), createElementBlock("div", _hoisted_1$4, [
770
+ return openBlock(), createElementBlock("div", _hoisted_1$5, [
687
771
  createElementVNode("button", {
772
+ id: triggerId.value,
688
773
  ref_key: "triggerRef",
689
774
  ref: triggerRef,
690
775
  type: "button",
691
776
  disabled: __props.disabled,
777
+ "aria-expanded": unref(isOpen),
778
+ "aria-haspopup": "dialog",
779
+ "aria-controls": calendarId.value,
692
780
  class: normalizeClass([
693
781
  "flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition",
694
782
  __props.disabled ? "cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950" : unref(isOpen) ? "border-primary ring-2 ring-primary/20 bg-white dark:bg-gray-900" : "border-gray-300 bg-white hover:border-gray-400 dark:border-gray-700 dark:bg-gray-900",
@@ -697,25 +785,28 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
697
785
  onClick: _cache[0] || (_cache[0] = //@ts-ignore
698
786
  (...args) => unref(toggle) && unref(toggle)(...args))
699
787
  }, [
700
- createElementVNode("span", _hoisted_3$4, toDisplayString(displayValue.value || __props.placeholder), 1),
701
- createElementVNode("div", _hoisted_4$2, [
788
+ createElementVNode("span", _hoisted_3$5, toDisplayString(displayValue.value || __props.placeholder), 1),
789
+ createElementVNode("div", _hoisted_4$3, [
702
790
  modelValue.value ? (openBlock(), createElementBlock("button", {
703
791
  key: 0,
704
792
  type: "button",
705
793
  class: "rounded p-0.5 hover:bg-gray-100 dark:hover:bg-gray-800",
794
+ "aria-label": "Clear date",
706
795
  onClick: withModifiers(clear, ["stop"])
707
796
  }, [
708
797
  createVNode(unref(Icon), {
709
798
  icon: "lucide:x",
710
- class: "size-4 text-gray-400"
799
+ class: "size-4 text-gray-400",
800
+ "aria-hidden": "true"
711
801
  })
712
802
  ])) : createCommentVNode("", true),
713
803
  createVNode(unref(Icon), {
714
804
  icon: "lucide:calendar",
715
- class: "size-4 text-gray-400"
805
+ class: "size-4 text-gray-400",
806
+ "aria-hidden": "true"
716
807
  })
717
808
  ])
718
- ], 10, _hoisted_2$4),
809
+ ], 10, _hoisted_2$5),
719
810
  (openBlock(), createBlock(Teleport, {
720
811
  to: "body",
721
812
  disabled: !__props.teleport
@@ -731,47 +822,66 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
731
822
  default: withCtx(() => [
732
823
  unref(isOpen) ? (openBlock(), createElementBlock("div", {
733
824
  key: 0,
825
+ id: calendarId.value,
734
826
  ref_key: "calendarRef",
735
827
  ref: calendarRef,
828
+ role: "dialog",
829
+ "aria-modal": "true",
830
+ "aria-label": `Choose date, ${monthYear.value}`,
736
831
  style: normalizeStyle(unref(dropdownStyle)),
737
832
  class: "z-[9999] w-72 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800"
738
833
  }, [
739
- createElementVNode("div", _hoisted_5$2, [
834
+ createElementVNode("div", _hoisted_6$3, [
740
835
  createElementVNode("button", {
741
836
  type: "button",
742
837
  class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
838
+ "aria-label": "Previous month",
743
839
  onClick: prevMonth
744
840
  }, [
745
841
  createVNode(unref(Icon), {
746
842
  icon: "lucide:chevron-left",
747
- class: "size-5 text-gray-600 dark:text-gray-400"
843
+ class: "size-5 text-gray-600 dark:text-gray-400",
844
+ "aria-hidden": "true"
748
845
  })
749
846
  ]),
750
- createElementVNode("span", _hoisted_6$2, toDisplayString(monthYear.value), 1),
847
+ createElementVNode("span", _hoisted_7$3, toDisplayString(monthYear.value), 1),
751
848
  createElementVNode("button", {
752
849
  type: "button",
753
850
  class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
851
+ "aria-label": "Next month",
754
852
  onClick: nextMonth
755
853
  }, [
756
854
  createVNode(unref(Icon), {
757
855
  icon: "lucide:chevron-right",
758
- class: "size-5 text-gray-600 dark:text-gray-400"
856
+ class: "size-5 text-gray-600 dark:text-gray-400",
857
+ "aria-hidden": "true"
759
858
  })
760
859
  ])
761
860
  ]),
762
- createElementVNode("div", _hoisted_7$2, [
861
+ createElementVNode("div", _hoisted_8$2, [
763
862
  (openBlock(true), createElementBlock(Fragment, null, renderList(weekDays.value, (day) => {
764
863
  return openBlock(), createElementBlock("div", {
765
864
  key: day,
766
- class: "text-center text-xs font-medium text-gray-500 dark:text-gray-400"
767
- }, toDisplayString(day), 1);
865
+ class: "text-center text-xs font-medium text-gray-500 dark:text-gray-400",
866
+ role: "columnheader",
867
+ abbr: day
868
+ }, toDisplayString(day), 9, _hoisted_9$1);
768
869
  }), 128))
769
870
  ]),
770
- createElementVNode("div", _hoisted_8$2, [
871
+ createElementVNode("div", {
872
+ id: gridId.value,
873
+ class: "grid grid-cols-7 gap-1",
874
+ role: "grid",
875
+ "aria-label": monthYear.value
876
+ }, [
771
877
  (openBlock(true), createElementBlock(Fragment, null, renderList(calendarDays.value, (day, index) => {
772
878
  return openBlock(), createElementBlock("button", {
773
879
  key: index,
774
880
  type: "button",
881
+ role: "gridcell",
882
+ "aria-label": getDateLabel(day.date),
883
+ "aria-selected": day.isSelected,
884
+ "aria-disabled": day.isDisabled || void 0,
775
885
  disabled: day.isDisabled,
776
886
  class: normalizeClass([
777
887
  "h-8 w-8 rounded text-sm transition",
@@ -782,17 +892,17 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
782
892
  day.isSelected && "bg-primary text-white font-semibold"
783
893
  ]),
784
894
  onClick: ($event) => selectDate(day)
785
- }, toDisplayString(day.date.getDate()), 11, _hoisted_9$1);
895
+ }, toDisplayString(day.date.getDate()), 11, _hoisted_11$1);
786
896
  }), 128))
787
- ]),
788
- createElementVNode("div", _hoisted_10$1, [
897
+ ], 8, _hoisted_10$1),
898
+ createElementVNode("div", _hoisted_12, [
789
899
  createElementVNode("button", {
790
900
  type: "button",
791
901
  class: "w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10",
792
902
  onClick: _cache[1] || (_cache[1] = ($event) => selectDate({ date: /* @__PURE__ */ new Date(), isDisabled: false }))
793
903
  }, " Today ")
794
904
  ])
795
- ], 4)) : createCommentVNode("", true)
905
+ ], 12, _hoisted_5$3)) : createCommentVNode("", true)
796
906
  ]),
797
907
  _: 1
798
908
  })
@@ -801,19 +911,19 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
801
911
  };
802
912
  }
803
913
  });
804
- const _hoisted_1$3 = { class: "space-y-4" };
805
- const _hoisted_2$3 = ["accept", "multiple", "disabled"];
806
- const _hoisted_3$3 = { class: "space-y-2" };
807
- const _hoisted_4$1 = { class: "text-sm font-medium text-gray-700 dark:text-gray-300" };
808
- const _hoisted_5$1 = {
914
+ const _hoisted_1$4 = { class: "space-y-4" };
915
+ const _hoisted_2$4 = ["accept", "multiple", "disabled"];
916
+ const _hoisted_3$4 = { class: "space-y-2" };
917
+ const _hoisted_4$2 = { class: "text-sm font-medium text-gray-700 dark:text-gray-300" };
918
+ const _hoisted_5$2 = {
809
919
  key: 0,
810
920
  class: "text-xs text-gray-500 dark:text-gray-400"
811
921
  };
812
- const _hoisted_6$1 = {
922
+ const _hoisted_6$2 = {
813
923
  key: 1,
814
924
  class: "text-xs text-gray-500 dark:text-gray-400"
815
925
  };
816
- const _hoisted_7$1 = {
926
+ const _hoisted_7$2 = {
817
927
  key: 0,
818
928
  class: "space-y-2"
819
929
  };
@@ -821,7 +931,7 @@ const _hoisted_8$1 = { class: "flex-1 min-w-0" };
821
931
  const _hoisted_9 = { class: "text-sm font-medium text-gray-700 dark:text-gray-300 truncate" };
822
932
  const _hoisted_10 = { class: "text-xs text-gray-500 dark:text-gray-400" };
823
933
  const _hoisted_11 = ["onClick"];
824
- const _sfc_main$3 = /* @__PURE__ */ defineComponent({
934
+ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
825
935
  __name: "FileUpload",
826
936
  props: {
827
937
  accept: {},
@@ -949,7 +1059,7 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
949
1059
  return "heroicons:document";
950
1060
  };
951
1061
  return (_ctx, _cache) => {
952
- return openBlock(), createElementBlock("div", _hoisted_1$3, [
1062
+ return openBlock(), createElementBlock("div", _hoisted_1$4, [
953
1063
  createElementVNode("div", {
954
1064
  class: normalizeClass(dropzoneClasses.value),
955
1065
  onDrop: withModifiers(handleDrop, ["prevent"]),
@@ -966,18 +1076,18 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
966
1076
  multiple: __props.multiple,
967
1077
  disabled: __props.disabled,
968
1078
  onChange: handleInputChange
969
- }, null, 40, _hoisted_2$3),
970
- createElementVNode("div", _hoisted_3$3, [
1079
+ }, null, 40, _hoisted_2$4),
1080
+ createElementVNode("div", _hoisted_3$4, [
971
1081
  createVNode(unref(Icon), {
972
1082
  icon: "heroicons:cloud-arrow-up",
973
1083
  class: normalizeClass(["w-12 h-12 mx-auto text-gray-400", { "text-primary-500": isDragging.value }])
974
1084
  }, null, 8, ["class"]),
975
- createElementVNode("p", _hoisted_4$1, toDisplayString(__props.label), 1),
976
- __props.description ? (openBlock(), createElementBlock("p", _hoisted_5$1, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
977
- __props.maxSize ? (openBlock(), createElementBlock("p", _hoisted_6$1, " Max size: " + toDisplayString(formatSize(__props.maxSize)), 1)) : createCommentVNode("", true)
1085
+ createElementVNode("p", _hoisted_4$2, toDisplayString(__props.label), 1),
1086
+ __props.description ? (openBlock(), createElementBlock("p", _hoisted_5$2, toDisplayString(__props.description), 1)) : createCommentVNode("", true),
1087
+ __props.maxSize ? (openBlock(), createElementBlock("p", _hoisted_6$2, " Max size: " + toDisplayString(formatSize(__props.maxSize)), 1)) : createCommentVNode("", true)
978
1088
  ])
979
1089
  ], 34),
980
- files.value.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_7$1, [
1090
+ files.value.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_7$2, [
981
1091
  (openBlock(true), createElementBlock(Fragment, null, renderList(files.value, (uploadedFile) => {
982
1092
  return openBlock(), createElementBlock("li", {
983
1093
  key: uploadedFile.id,
@@ -1008,13 +1118,13 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
1008
1118
  };
1009
1119
  }
1010
1120
  });
1011
- const _hoisted_1$2 = { class: "flex items-center gap-1" };
1012
- const _hoisted_2$2 = ["disabled", "onClick", "onMousemove"];
1013
- const _hoisted_3$2 = {
1121
+ const _hoisted_1$3 = { class: "flex items-center gap-1" };
1122
+ const _hoisted_2$3 = ["disabled", "onClick", "onMousemove"];
1123
+ const _hoisted_3$3 = {
1014
1124
  key: 0,
1015
1125
  class: "ml-2 text-sm font-medium text-gray-700 dark:text-gray-300"
1016
1126
  };
1017
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1127
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
1018
1128
  __name: "Rating",
1019
1129
  props: {
1020
1130
  modelValue: { default: 0 },
@@ -1077,7 +1187,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1077
1187
  hoverValue.value = null;
1078
1188
  };
1079
1189
  return (_ctx, _cache) => {
1080
- return openBlock(), createElementBlock("div", _hoisted_1$2, [
1190
+ return openBlock(), createElementBlock("div", _hoisted_1$3, [
1081
1191
  createElementVNode("div", {
1082
1192
  class: "flex items-center",
1083
1193
  onMouseleave: handleMouseLeave
@@ -1109,29 +1219,29 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1109
1219
  class: normalizeClass([sizeClasses.value, __props.color])
1110
1220
  }, null, 8, ["icon", "class"])
1111
1221
  ], 4)
1112
- ], 42, _hoisted_2$2);
1222
+ ], 42, _hoisted_2$3);
1113
1223
  }), 128))
1114
1224
  ], 32),
1115
- __props.showValue ? (openBlock(), createElementBlock("span", _hoisted_3$2, toDisplayString(__props.modelValue.toFixed(__props.allowHalf ? 1 : 0)), 1)) : createCommentVNode("", true)
1225
+ __props.showValue ? (openBlock(), createElementBlock("span", _hoisted_3$3, toDisplayString(__props.modelValue.toFixed(__props.allowHalf ? 1 : 0)), 1)) : createCommentVNode("", true)
1116
1226
  ]);
1117
1227
  };
1118
1228
  }
1119
1229
  });
1120
- const _hoisted_1$1 = { class: "relative inline-block" };
1121
- const _hoisted_2$1 = {
1230
+ const _hoisted_1$2 = { class: "relative inline-block" };
1231
+ const _hoisted_2$2 = {
1122
1232
  key: 0,
1123
1233
  class: "block text-sm font-medium text-gray-700 dark:text-gray-300 mb-1"
1124
1234
  };
1125
- const _hoisted_3$1 = ["disabled"];
1126
- const _hoisted_4 = { class: "text-sm font-mono text-gray-700 dark:text-gray-300" };
1127
- const _hoisted_5 = { class: "grid grid-cols-5 gap-2 mb-3" };
1128
- const _hoisted_6 = ["title", "onClick"];
1129
- const _hoisted_7 = {
1235
+ const _hoisted_3$2 = ["disabled"];
1236
+ const _hoisted_4$1 = { class: "text-sm font-mono text-gray-700 dark:text-gray-300" };
1237
+ const _hoisted_5$1 = { class: "grid grid-cols-5 gap-2 mb-3" };
1238
+ const _hoisted_6$1 = ["title", "onClick"];
1239
+ const _hoisted_7$1 = {
1130
1240
  key: 0,
1131
1241
  class: "flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700"
1132
1242
  };
1133
1243
  const _hoisted_8 = ["value"];
1134
- const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1244
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
1135
1245
  __name: "ColorPicker",
1136
1246
  props: {
1137
1247
  modelValue: { default: "#3b82f6" },
@@ -1159,11 +1269,14 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1159
1269
  ] },
1160
1270
  showInput: { type: Boolean, default: true },
1161
1271
  disabled: { type: Boolean, default: false },
1162
- label: {}
1272
+ label: {},
1273
+ teleport: { type: [String, Boolean], default: false }
1163
1274
  },
1164
1275
  emits: ["update:modelValue"],
1165
1276
  setup(__props, { emit: __emit }) {
1166
1277
  const props = __props;
1278
+ const teleportDisabled = computed(() => props.teleport === false);
1279
+ const teleportTarget = computed(() => props.teleport === false ? "body" : props.teleport);
1167
1280
  const emit = __emit;
1168
1281
  const isOpen = ref(false);
1169
1282
  const inputValue = ref(props.modelValue);
@@ -1197,8 +1310,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1197
1310
  isOpen.value = false;
1198
1311
  };
1199
1312
  return (_ctx, _cache) => {
1200
- return openBlock(), createElementBlock("div", _hoisted_1$1, [
1201
- __props.label ? (openBlock(), createElementBlock("label", _hoisted_2$1, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
1313
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [
1314
+ __props.label ? (openBlock(), createElementBlock("label", _hoisted_2$2, toDisplayString(__props.label), 1)) : createCommentVNode("", true),
1202
1315
  createElementVNode("button", {
1203
1316
  type: "button",
1204
1317
  class: normalizeClass(["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", { "opacity-50 cursor-not-allowed": __props.disabled }]),
@@ -1209,90 +1322,95 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1209
1322
  class: "w-6 h-6 rounded border border-gray-200 dark:border-gray-600",
1210
1323
  style: normalizeStyle({ backgroundColor: __props.modelValue })
1211
1324
  }, null, 4),
1212
- createElementVNode("span", _hoisted_4, toDisplayString(__props.modelValue), 1),
1325
+ createElementVNode("span", _hoisted_4$1, toDisplayString(__props.modelValue), 1),
1213
1326
  createVNode(unref(Icon), {
1214
1327
  icon: "heroicons:chevron-down",
1215
1328
  class: normalizeClass(["w-4 h-4 text-gray-400", { "rotate-180": isOpen.value }])
1216
1329
  }, null, 8, ["class"])
1217
- ], 10, _hoisted_3$1),
1218
- createVNode(Transition, {
1219
- "enter-active-class": "transition duration-100 ease-out",
1220
- "enter-from-class": "opacity-0 scale-95",
1221
- "enter-to-class": "opacity-100 scale-100",
1222
- "leave-active-class": "transition duration-75 ease-in",
1223
- "leave-from-class": "opacity-100 scale-100",
1224
- "leave-to-class": "opacity-0 scale-95"
1225
- }, {
1226
- default: withCtx(() => [
1227
- isOpen.value ? (openBlock(), createElementBlock("div", {
1228
- key: 0,
1229
- 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",
1230
- onClick: _cache[1] || (_cache[1] = withModifiers(() => {
1231
- }, ["stop"]))
1232
- }, [
1233
- createElementVNode("div", _hoisted_5, [
1234
- (openBlock(true), createElementBlock(Fragment, null, renderList(__props.swatches, (color) => {
1235
- return openBlock(), createElementBlock("button", {
1236
- key: color,
1237
- type: "button",
1238
- class: normalizeClass(["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", [
1239
- __props.modelValue === color ? "border-primary-500 ring-2 ring-primary-500 ring-offset-1" : "border-transparent"
1240
- ]]),
1241
- style: normalizeStyle({ backgroundColor: color }),
1242
- title: color,
1243
- onClick: ($event) => selectColor(color)
1244
- }, [
1245
- __props.modelValue === color ? (openBlock(), createBlock(unref(Icon), {
1246
- key: 0,
1247
- icon: "heroicons:check",
1248
- class: normalizeClass(["w-4 h-4 mx-auto", [
1249
- ["#ffffff", "#f9fafb", "#f3f4f6", "#e5e7eb", "#eab308", "#f59e0b"].includes(color) ? "text-gray-800" : "text-white"
1250
- ]])
1251
- }, null, 8, ["class"])) : createCommentVNode("", true)
1252
- ], 14, _hoisted_6);
1253
- }), 128))
1254
- ]),
1255
- __props.showInput ? (openBlock(), createElementBlock("div", _hoisted_7, [
1256
- createElementVNode("input", {
1257
- type: "color",
1258
- value: __props.modelValue,
1259
- class: "w-8 h-8 rounded cursor-pointer border-0 p-0",
1260
- onInput: handleNativeInput
1261
- }, null, 40, _hoisted_8),
1262
- withDirectives(createElementVNode("input", {
1263
- "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
1264
- type: "text",
1265
- 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",
1266
- placeholder: "#000000",
1267
- onChange: handleInputChange,
1268
- onKeyup: withKeys(handleInputChange, ["enter"])
1269
- }, null, 544), [
1270
- [vModelText, inputValue.value]
1271
- ])
1330
+ ], 10, _hoisted_3$2),
1331
+ (openBlock(), createBlock(Teleport, {
1332
+ to: teleportTarget.value,
1333
+ disabled: teleportDisabled.value
1334
+ }, [
1335
+ createVNode(Transition, {
1336
+ "enter-active-class": "transition duration-100 ease-out",
1337
+ "enter-from-class": "opacity-0 scale-95",
1338
+ "enter-to-class": "opacity-100 scale-100",
1339
+ "leave-active-class": "transition duration-75 ease-in",
1340
+ "leave-from-class": "opacity-100 scale-100",
1341
+ "leave-to-class": "opacity-0 scale-95"
1342
+ }, {
1343
+ default: withCtx(() => [
1344
+ isOpen.value ? (openBlock(), createElementBlock("div", {
1345
+ key: 0,
1346
+ 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",
1347
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {
1348
+ }, ["stop"]))
1349
+ }, [
1350
+ createElementVNode("div", _hoisted_5$1, [
1351
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.swatches, (color) => {
1352
+ return openBlock(), createElementBlock("button", {
1353
+ key: color,
1354
+ type: "button",
1355
+ class: normalizeClass(["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", [
1356
+ __props.modelValue === color ? "border-primary-500 ring-2 ring-primary-500 ring-offset-1" : "border-transparent"
1357
+ ]]),
1358
+ style: normalizeStyle({ backgroundColor: color }),
1359
+ title: color,
1360
+ onClick: ($event) => selectColor(color)
1361
+ }, [
1362
+ __props.modelValue === color ? (openBlock(), createBlock(unref(Icon), {
1363
+ key: 0,
1364
+ icon: "heroicons:check",
1365
+ class: normalizeClass(["w-4 h-4 mx-auto", [
1366
+ ["#ffffff", "#f9fafb", "#f3f4f6", "#e5e7eb", "#eab308", "#f59e0b"].includes(color) ? "text-gray-800" : "text-white"
1367
+ ]])
1368
+ }, null, 8, ["class"])) : createCommentVNode("", true)
1369
+ ], 14, _hoisted_6$1);
1370
+ }), 128))
1371
+ ]),
1372
+ __props.showInput ? (openBlock(), createElementBlock("div", _hoisted_7$1, [
1373
+ createElementVNode("input", {
1374
+ type: "color",
1375
+ value: __props.modelValue,
1376
+ class: "w-8 h-8 rounded cursor-pointer border-0 p-0",
1377
+ onInput: handleNativeInput
1378
+ }, null, 40, _hoisted_8),
1379
+ withDirectives(createElementVNode("input", {
1380
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => inputValue.value = $event),
1381
+ type: "text",
1382
+ 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",
1383
+ placeholder: "#000000",
1384
+ onChange: handleInputChange,
1385
+ onKeyup: withKeys(handleInputChange, ["enter"])
1386
+ }, null, 544), [
1387
+ [vModelText, inputValue.value]
1388
+ ])
1389
+ ])) : createCommentVNode("", true)
1272
1390
  ])) : createCommentVNode("", true)
1273
- ])) : createCommentVNode("", true)
1274
- ]),
1275
- _: 1
1276
- }),
1277
- isOpen.value ? (openBlock(), createElementBlock("div", {
1278
- key: 1,
1279
- class: "fixed inset-0 z-40",
1280
- onClick: closePicker
1281
- })) : createCommentVNode("", true)
1391
+ ]),
1392
+ _: 1
1393
+ }),
1394
+ isOpen.value ? (openBlock(), createElementBlock("div", {
1395
+ key: 0,
1396
+ class: "fixed inset-0 z-40",
1397
+ onClick: closePicker
1398
+ })) : createCommentVNode("", true)
1399
+ ], 8, ["to", "disabled"]))
1282
1400
  ]);
1283
1401
  };
1284
1402
  }
1285
1403
  });
1286
- const _hoisted_1 = { class: "space-y-2" };
1287
- const _hoisted_2 = {
1404
+ const _hoisted_1$1 = { class: "space-y-2" };
1405
+ const _hoisted_2$1 = {
1288
1406
  key: 0,
1289
1407
  class: "flex justify-between text-sm font-medium text-gray-700 dark:text-gray-300"
1290
1408
  };
1291
- const _hoisted_3 = {
1409
+ const _hoisted_3$1 = {
1292
1410
  key: 1,
1293
1411
  class: "flex justify-between text-xs text-gray-500 dark:text-gray-400"
1294
1412
  };
1295
- const _sfc_main = /* @__PURE__ */ defineComponent({
1413
+ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
1296
1414
  __name: "RangeSlider",
1297
1415
  props: {
1298
1416
  modelValue: { default: () => [25, 75] },
@@ -1370,8 +1488,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1370
1488
  }
1371
1489
  };
1372
1490
  return (_ctx, _cache) => {
1373
- return openBlock(), createElementBlock("div", _hoisted_1, [
1374
- __props.showLabels ? (openBlock(), createElementBlock("div", _hoisted_2, [
1491
+ return openBlock(), createElementBlock("div", _hoisted_1$1, [
1492
+ __props.showLabels ? (openBlock(), createElementBlock("div", _hoisted_2$1, [
1375
1493
  createElementVNode("span", null, toDisplayString(__props.formatLabel(minValue.value)), 1),
1376
1494
  createElementVNode("span", null, toDisplayString(__props.formatLabel(maxValue.value)), 1)
1377
1495
  ])) : createCommentVNode("", true),
@@ -1404,7 +1522,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1404
1522
  onMousedown: _cache[1] || (_cache[1] = ($event) => handleMouseDown("max"))
1405
1523
  }, null, 38)
1406
1524
  ], 2),
1407
- __props.showMinMax ? (openBlock(), createElementBlock("div", _hoisted_3, [
1525
+ __props.showMinMax ? (openBlock(), createElementBlock("div", _hoisted_3$1, [
1408
1526
  createElementVNode("span", null, toDisplayString(__props.formatLabel(__props.min)), 1),
1409
1527
  createElementVNode("span", null, toDisplayString(__props.formatLabel(__props.max)), 1)
1410
1528
  ])) : createCommentVNode("", true)
@@ -1412,19 +1530,256 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1412
1530
  };
1413
1531
  }
1414
1532
  });
1533
+ const _hoisted_1 = ["aria-expanded", "aria-controls"];
1534
+ const _hoisted_2 = ["id", "name", "placeholder", "disabled", "aria-controls"];
1535
+ const _hoisted_3 = { class: "flex items-center gap-1" };
1536
+ const _hoisted_4 = ["id", "aria-label", "aria-multiselectable"];
1537
+ const _hoisted_5 = ["aria-selected", "aria-disabled", "disabled", "onClick"];
1538
+ const _hoisted_6 = { class: "flex-1" };
1539
+ const _hoisted_7 = {
1540
+ key: 1,
1541
+ class: "px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400",
1542
+ role: "status"
1543
+ };
1544
+ const _sfc_main = /* @__PURE__ */ defineComponent({
1545
+ __name: "Combobox",
1546
+ props: {
1547
+ modelValue: {},
1548
+ options: {},
1549
+ placeholder: { default: "Select..." },
1550
+ searchPlaceholder: { default: "Search..." },
1551
+ multiple: { type: Boolean, default: false },
1552
+ disabled: { type: Boolean, default: false },
1553
+ clearable: { type: Boolean, default: false },
1554
+ noResultsText: { default: "No results found" },
1555
+ name: {},
1556
+ id: {},
1557
+ teleport: { type: [String, Boolean], default: false }
1558
+ },
1559
+ emits: ["update:modelValue"],
1560
+ setup(__props, { emit: __emit }) {
1561
+ const props = __props;
1562
+ const { id: generatedId, related } = useId({ prefix: "combobox", id: props.id });
1563
+ const inputId = computed(() => props.id ?? generatedId.value);
1564
+ const listboxId = computed(() => related("listbox"));
1565
+ const teleportDisabled = computed(() => props.teleport === false);
1566
+ const teleportTarget = computed(() => props.teleport === false ? "body" : props.teleport);
1567
+ const emit = __emit;
1568
+ const containerRef = ref();
1569
+ const inputRef = ref();
1570
+ const isOpen = ref(false);
1571
+ const search = ref("");
1572
+ onClickOutside(containerRef, () => {
1573
+ isOpen.value = false;
1574
+ });
1575
+ const filteredOptions = computed(() => {
1576
+ if (!search.value) return props.options;
1577
+ const query = search.value.toLowerCase();
1578
+ return props.options.filter(
1579
+ (opt) => opt.label.toLowerCase().includes(query)
1580
+ );
1581
+ });
1582
+ const selectedOptions = computed(() => {
1583
+ if (props.modelValue === null || props.modelValue === void 0) return [];
1584
+ const values = Array.isArray(props.modelValue) ? props.modelValue : [props.modelValue];
1585
+ return props.options.filter((opt) => values.includes(opt.value));
1586
+ });
1587
+ const displayValue = computed(() => {
1588
+ var _a;
1589
+ if (selectedOptions.value.length === 0) return "";
1590
+ if (props.multiple) {
1591
+ return selectedOptions.value.map((o) => o.label).join(", ");
1592
+ }
1593
+ return ((_a = selectedOptions.value[0]) == null ? void 0 : _a.label) || "";
1594
+ });
1595
+ const isSelected = (option) => {
1596
+ if (props.modelValue === null || props.modelValue === void 0) return false;
1597
+ if (Array.isArray(props.modelValue)) {
1598
+ return props.modelValue.includes(option.value);
1599
+ }
1600
+ return props.modelValue === option.value;
1601
+ };
1602
+ const toggleOption = (option) => {
1603
+ if (option.disabled) return;
1604
+ if (props.multiple) {
1605
+ const currentValues = Array.isArray(props.modelValue) ? [...props.modelValue] : [];
1606
+ const index = currentValues.indexOf(option.value);
1607
+ if (index === -1) {
1608
+ currentValues.push(option.value);
1609
+ } else {
1610
+ currentValues.splice(index, 1);
1611
+ }
1612
+ emit("update:modelValue", currentValues);
1613
+ } else {
1614
+ emit("update:modelValue", option.value);
1615
+ isOpen.value = false;
1616
+ search.value = "";
1617
+ }
1618
+ };
1619
+ const clear = () => {
1620
+ emit("update:modelValue", props.multiple ? [] : null);
1621
+ search.value = "";
1622
+ };
1623
+ const openDropdown = () => {
1624
+ if (props.disabled) return;
1625
+ isOpen.value = true;
1626
+ nextTick(() => {
1627
+ var _a;
1628
+ (_a = inputRef.value) == null ? void 0 : _a.focus();
1629
+ });
1630
+ };
1631
+ watch(isOpen, (open) => {
1632
+ if (!open) {
1633
+ search.value = "";
1634
+ }
1635
+ });
1636
+ return (_ctx, _cache) => {
1637
+ return openBlock(), createElementBlock("div", {
1638
+ ref_key: "containerRef",
1639
+ ref: containerRef,
1640
+ class: "relative"
1641
+ }, [
1642
+ createElementVNode("div", {
1643
+ role: "combobox",
1644
+ "aria-expanded": isOpen.value,
1645
+ "aria-haspopup": "listbox",
1646
+ "aria-controls": listboxId.value,
1647
+ class: normalizeClass([
1648
+ "flex min-h-[42px] w-full cursor-pointer items-center rounded-lg border bg-white px-3 py-2 transition-colors",
1649
+ "dark:bg-gray-900",
1650
+ __props.disabled ? "cursor-not-allowed border-gray-200 bg-gray-50 dark:border-gray-700 dark:bg-gray-800" : isOpen.value ? "border-primary ring-2 ring-primary/20" : "border-gray-300 hover:border-gray-400 dark:border-gray-600 dark:hover:border-gray-500"
1651
+ ]),
1652
+ onClick: openDropdown
1653
+ }, [
1654
+ !isOpen.value ? (openBlock(), createElementBlock("span", {
1655
+ key: 0,
1656
+ class: normalizeClass([
1657
+ "flex-1 truncate text-sm",
1658
+ selectedOptions.value.length ? "text-gray-900 dark:text-gray-100" : "text-gray-400 dark:text-gray-500"
1659
+ ])
1660
+ }, toDisplayString(displayValue.value || __props.placeholder), 3)) : withDirectives((openBlock(), createElementBlock("input", {
1661
+ key: 1,
1662
+ id: inputId.value,
1663
+ ref_key: "inputRef",
1664
+ ref: inputRef,
1665
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => search.value = $event),
1666
+ type: "text",
1667
+ name: __props.name,
1668
+ placeholder: __props.searchPlaceholder,
1669
+ disabled: __props.disabled,
1670
+ "aria-autocomplete": "list",
1671
+ "aria-controls": listboxId.value,
1672
+ 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",
1673
+ onClick: _cache[1] || (_cache[1] = withModifiers(() => {
1674
+ }, ["stop"]))
1675
+ }, null, 8, _hoisted_2)), [
1676
+ [vModelText, search.value]
1677
+ ]),
1678
+ createElementVNode("div", _hoisted_3, [
1679
+ __props.clearable && selectedOptions.value.length > 0 && !__props.disabled ? (openBlock(), createElementBlock("button", {
1680
+ key: 0,
1681
+ type: "button",
1682
+ class: "rounded p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
1683
+ "aria-label": "Clear selection",
1684
+ onClick: withModifiers(clear, ["stop"])
1685
+ }, [
1686
+ createVNode(unref(Icon), {
1687
+ icon: "lucide:x",
1688
+ class: "h-4 w-4",
1689
+ "aria-hidden": "true"
1690
+ })
1691
+ ])) : createCommentVNode("", true),
1692
+ createVNode(unref(Icon), {
1693
+ icon: "lucide:chevron-down",
1694
+ class: normalizeClass([
1695
+ "h-4 w-4 text-gray-400 transition-transform",
1696
+ isOpen.value && "rotate-180"
1697
+ ]),
1698
+ "aria-hidden": "true"
1699
+ }, null, 8, ["class"])
1700
+ ])
1701
+ ], 10, _hoisted_1),
1702
+ (openBlock(), createBlock(Teleport, {
1703
+ to: teleportTarget.value,
1704
+ disabled: teleportDisabled.value
1705
+ }, [
1706
+ createVNode(Transition, {
1707
+ "enter-active-class": "transition duration-100 ease-out",
1708
+ "enter-from-class": "transform scale-95 opacity-0",
1709
+ "enter-to-class": "transform scale-100 opacity-100",
1710
+ "leave-active-class": "transition duration-75 ease-in",
1711
+ "leave-from-class": "transform scale-100 opacity-100",
1712
+ "leave-to-class": "transform scale-95 opacity-0"
1713
+ }, {
1714
+ default: withCtx(() => [
1715
+ isOpen.value ? (openBlock(), createElementBlock("div", {
1716
+ key: 0,
1717
+ id: listboxId.value,
1718
+ role: "listbox",
1719
+ "aria-label": __props.placeholder,
1720
+ "aria-multiselectable": __props.multiple || void 0,
1721
+ 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"
1722
+ }, [
1723
+ filteredOptions.value.length ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(filteredOptions.value, (option) => {
1724
+ return openBlock(), createElementBlock("button", {
1725
+ key: option.value,
1726
+ type: "button",
1727
+ role: "option",
1728
+ "aria-selected": isSelected(option),
1729
+ "aria-disabled": option.disabled || void 0,
1730
+ disabled: option.disabled,
1731
+ class: normalizeClass([
1732
+ "flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors",
1733
+ option.disabled ? "cursor-not-allowed text-gray-400 dark:text-gray-500" : isSelected(option) ? "bg-primary/10 text-primary dark:bg-primary/20" : "text-gray-700 hover:bg-gray-100 dark:text-gray-300 dark:hover:bg-gray-800"
1734
+ ]),
1735
+ onClick: ($event) => toggleOption(option)
1736
+ }, [
1737
+ __props.multiple ? (openBlock(), createElementBlock("span", {
1738
+ key: 0,
1739
+ class: normalizeClass([
1740
+ "flex h-4 w-4 items-center justify-center rounded border",
1741
+ isSelected(option) ? "border-primary bg-primary text-white" : "border-gray-300 dark:border-gray-600"
1742
+ ]),
1743
+ "aria-hidden": "true"
1744
+ }, [
1745
+ isSelected(option) ? (openBlock(), createBlock(unref(Icon), {
1746
+ key: 0,
1747
+ icon: "lucide:check",
1748
+ class: "h-3 w-3"
1749
+ })) : createCommentVNode("", true)
1750
+ ], 2)) : createCommentVNode("", true),
1751
+ createElementVNode("span", _hoisted_6, toDisplayString(option.label), 1),
1752
+ !__props.multiple && isSelected(option) ? (openBlock(), createBlock(unref(Icon), {
1753
+ key: 1,
1754
+ icon: "lucide:check",
1755
+ class: "h-4 w-4 text-primary",
1756
+ "aria-hidden": "true"
1757
+ })) : createCommentVNode("", true)
1758
+ ], 10, _hoisted_5);
1759
+ }), 128)) : (openBlock(), createElementBlock("div", _hoisted_7, toDisplayString(__props.noResultsText), 1))
1760
+ ], 8, _hoisted_4)) : createCommentVNode("", true)
1761
+ ]),
1762
+ _: 1
1763
+ })
1764
+ ], 8, ["to", "disabled"]))
1765
+ ], 512);
1766
+ };
1767
+ }
1768
+ });
1415
1769
  export {
1416
1770
  Slider as S,
1417
- _sfc_main$c as _,
1418
- _sfc_main$b as a,
1419
- _sfc_main$a as b,
1420
- _sfc_main$9 as c,
1421
- _sfc_main$8 as d,
1422
- _sfc_main$7 as e,
1423
- _sfc_main$6 as f,
1424
- _sfc_main$4 as g,
1425
- _sfc_main$3 as h,
1426
- _sfc_main$2 as i,
1427
- _sfc_main$1 as j,
1428
- _sfc_main as k
1771
+ _sfc_main$d as _,
1772
+ _sfc_main$c as a,
1773
+ _sfc_main$b as b,
1774
+ _sfc_main$a as c,
1775
+ _sfc_main$9 as d,
1776
+ _sfc_main$8 as e,
1777
+ _sfc_main$7 as f,
1778
+ _sfc_main$5 as g,
1779
+ _sfc_main$4 as h,
1780
+ _sfc_main$3 as i,
1781
+ _sfc_main$2 as j,
1782
+ _sfc_main$1 as k,
1783
+ _sfc_main as l
1429
1784
  };
1430
- //# sourceMappingURL=RangeSlider.vue_vue_type_script_setup_true_lang-B79_S1JL.js.map
1785
+ //# sourceMappingURL=Combobox.vue_vue_type_script_setup_true_lang-DCLKWzhc.js.map