cisse-vue-ui 0.5.22 → 0.5.24

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 (106) hide show
  1. package/dist/{Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs → Button.vue_vue_type_script_setup_true_lang-B3pJ5qJ7.cjs} +15 -6
  2. package/dist/Button.vue_vue_type_script_setup_true_lang-B3pJ5qJ7.cjs.map +1 -0
  3. package/dist/{Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js → Button.vue_vue_type_script_setup_true_lang-Dn8aHGGg.js} +15 -6
  4. package/dist/Button.vue_vue_type_script_setup_true_lang-Dn8aHGGg.js.map +1 -0
  5. package/dist/{Combobox.vue_vue_type_script_setup_true_lang-FdUrjmSG.cjs → Combobox.vue_vue_type_script_setup_true_lang-BS_MitQQ.cjs} +235 -103
  6. package/dist/Combobox.vue_vue_type_script_setup_true_lang-BS_MitQQ.cjs.map +1 -0
  7. package/dist/{Combobox.vue_vue_type_script_setup_true_lang-DhcLb6DX.js → Combobox.vue_vue_type_script_setup_true_lang-BtLRG3an.js} +236 -104
  8. package/dist/Combobox.vue_vue_type_script_setup_true_lang-BtLRG3an.js.map +1 -0
  9. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-CNucAMQg.js → ConfirmDialog.vue_vue_type_script_setup_true_lang-5Wl0RVdP.js} +78 -31
  10. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-5Wl0RVdP.js.map +1 -0
  11. package/dist/{ConfirmDialog.vue_vue_type_script_setup_true_lang-DXb9wQQv.cjs → ConfirmDialog.vue_vue_type_script_setup_true_lang-Bf0OYXDM.cjs} +77 -30
  12. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-Bf0OYXDM.cjs.map +1 -0
  13. package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-BoB48313.cjs → DarkModeToggle.vue_vue_type_script_setup_true_lang-De0C6hnN.cjs} +86 -54
  14. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-De0C6hnN.cjs.map +1 -0
  15. package/dist/{DarkModeToggle.vue_vue_type_script_setup_true_lang-43fxlbro.js → DarkModeToggle.vue_vue_type_script_setup_true_lang-ikdyJymX.js} +86 -54
  16. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-ikdyJymX.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-BNOHbbm5.cjs} +34 -17
  18. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-BNOHbbm5.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-nyND94f_.js} +34 -17
  20. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-nyND94f_.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-6OrQy9W4.cjs} +3 -3
  22. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-D22uNeS1.cjs.map → PageLayout.vue_vue_type_script_setup_true_lang-6OrQy9W4.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-BgTJd526.js} +3 -3
  24. package/dist/{PageLayout.vue_vue_type_script_setup_true_lang-kT7np2ir.js.map → PageLayout.vue_vue_type_script_setup_true_lang-BgTJd526.js.map} +1 -1
  25. package/dist/components/core/AccordionItem.vue.d.ts +2 -0
  26. package/dist/components/core/Dropdown.vue.d.ts +2 -0
  27. package/dist/components/core/Popover.vue.d.ts +2 -0
  28. package/dist/components/core/Tooltip.vue.d.ts +2 -0
  29. package/dist/components/core/index.cjs +3 -3
  30. package/dist/components/core/index.js +3 -3
  31. package/dist/components/core/index.test.d.ts +1 -0
  32. package/dist/components/feedback/LoadingSpinner.vue.d.ts +6 -1
  33. package/dist/components/feedback/Modal.vue.d.ts +8 -2
  34. package/dist/components/feedback/index.cjs +2 -2
  35. package/dist/components/feedback/index.js +2 -2
  36. package/dist/components/feedback/index.test.d.ts +1 -0
  37. package/dist/components/form/Checkbox.vue.d.ts +2 -0
  38. package/dist/components/form/DatePicker.vue.d.ts +2 -0
  39. package/dist/components/form/FormHelp.vue.d.ts +2 -0
  40. package/dist/components/form/Switch.vue.d.ts +2 -0
  41. package/dist/components/form/index.cjs +2 -2
  42. package/dist/components/form/index.js +2 -2
  43. package/dist/components/form/index.test.d.ts +1 -0
  44. package/dist/components/index.cjs +7 -7
  45. package/dist/components/index.js +7 -7
  46. package/dist/components/index.test.d.ts +1 -0
  47. package/dist/components/layout/index.cjs +1 -1
  48. package/dist/components/layout/index.js +1 -1
  49. package/dist/components/layout/index.test.d.ts +1 -0
  50. package/dist/components/type/index.test.d.ts +1 -0
  51. package/dist/composables/index.cjs +6 -0
  52. package/dist/composables/index.cjs.map +1 -1
  53. package/dist/composables/index.d.ts +2 -0
  54. package/dist/composables/index.js +6 -0
  55. package/dist/composables/index.js.map +1 -1
  56. package/dist/composables/index.test.d.ts +1 -0
  57. package/dist/composables/useDarkMode.test.d.ts +1 -0
  58. package/dist/composables/useDropdown.test.d.ts +1 -0
  59. package/dist/composables/useExportCSV.test.d.ts +1 -0
  60. package/dist/composables/useFocusTrap.d.ts +41 -0
  61. package/dist/composables/useFocusTrap.test.d.ts +1 -0
  62. package/dist/composables/useId.d.ts +42 -0
  63. package/dist/composables/useId.test.d.ts +1 -0
  64. package/dist/composables/useModal.d.ts +1 -1
  65. package/dist/composables/useModal.test.d.ts +1 -0
  66. package/dist/{index-DZYqrXV0.js → index-7T5IxJdf.js} +8 -8
  67. package/dist/index-7T5IxJdf.js.map +1 -0
  68. package/dist/{index-Dghdw1yo.js → index-CJwlO351.js} +18 -9
  69. package/dist/index-CJwlO351.js.map +1 -0
  70. package/dist/{index-DjEv91o4.cjs → index-CL_Ie5nl.cjs} +8 -8
  71. package/dist/index-CL_Ie5nl.cjs.map +1 -0
  72. package/dist/{index-D7HVSFi2.cjs → index-CUNU12xk.cjs} +17 -8
  73. package/dist/index-CUNU12xk.cjs.map +1 -0
  74. package/dist/index.cjs +14 -8
  75. package/dist/index.cjs.map +1 -1
  76. package/dist/index.js +14 -8
  77. package/dist/index.js.map +1 -1
  78. package/dist/index.test.d.ts +1 -0
  79. package/dist/style.css +1 -1
  80. package/dist/types/form.d.ts +4 -0
  81. package/dist/types/index.test.d.ts +1 -0
  82. package/dist/useFocusTrap-AnlJsihM.js +120 -0
  83. package/dist/useFocusTrap-AnlJsihM.js.map +1 -0
  84. package/dist/useFocusTrap-kcxO8AeU.cjs +119 -0
  85. package/dist/useFocusTrap-kcxO8AeU.cjs.map +1 -0
  86. package/dist/useId-nxrBaIC9.cjs +25 -0
  87. package/dist/useId-nxrBaIC9.cjs.map +1 -0
  88. package/dist/useId-xeHj7rkg.js +26 -0
  89. package/dist/useId-xeHj7rkg.js.map +1 -0
  90. package/dist/useToast-Bk60GArg.cjs.map +1 -1
  91. package/dist/useToast-ina5g3mj.js.map +1 -1
  92. package/package.json +169 -168
  93. package/dist/Button.vue_vue_type_script_setup_true_lang-DKE8elsf.js.map +0 -1
  94. package/dist/Button.vue_vue_type_script_setup_true_lang-DrGM65ny.cjs.map +0 -1
  95. package/dist/Combobox.vue_vue_type_script_setup_true_lang-DhcLb6DX.js.map +0 -1
  96. package/dist/Combobox.vue_vue_type_script_setup_true_lang-FdUrjmSG.cjs.map +0 -1
  97. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-CNucAMQg.js.map +0 -1
  98. package/dist/ConfirmDialog.vue_vue_type_script_setup_true_lang-DXb9wQQv.cjs.map +0 -1
  99. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-43fxlbro.js.map +0 -1
  100. package/dist/DarkModeToggle.vue_vue_type_script_setup_true_lang-BoB48313.cjs.map +0 -1
  101. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-C3pr8BwC.js.map +0 -1
  102. package/dist/Dropdown.vue_vue_type_script_setup_true_lang-DKxcVBKu.cjs.map +0 -1
  103. package/dist/index-D7HVSFi2.cjs.map +0 -1
  104. package/dist/index-DZYqrXV0.js.map +0 -1
  105. package/dist/index-Dghdw1yo.js.map +0 -1
  106. package/dist/index-DjEv91o4.cjs.map +0 -1
@@ -1,9 +1,10 @@
1
1
  "use strict";
2
2
  const vue = require("vue");
3
+ const useId = require("./useId-nxrBaIC9.cjs");
3
4
  const vue$1 = require("@iconify/vue");
4
5
  const useDropdown = require("./useDropdown-DHFnd259.cjs");
5
6
  const _pluginVue_exportHelper = require("./_plugin-vue_export-helper-DM9IkUGy.cjs");
6
- const index = require("./index-D7HVSFi2.cjs");
7
+ const index = require("./index-CUNU12xk.cjs");
7
8
  const _hoisted_1$d = ["data-error", "for"];
8
9
  const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
9
10
  __name: "FormLabel",
@@ -23,17 +24,21 @@ const _sfc_main$d = /* @__PURE__ */ vue.defineComponent({
23
24
  };
24
25
  }
25
26
  });
26
- const _hoisted_1$c = ["data-error"];
27
+ const _hoisted_1$c = ["id", "data-error", "role", "aria-live"];
27
28
  const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
28
29
  __name: "FormHelp",
29
30
  props: {
31
+ id: {},
30
32
  error: { type: Boolean },
31
33
  text: {}
32
34
  },
33
35
  setup(__props) {
34
36
  return (_ctx, _cache) => {
35
37
  return vue.openBlock(), vue.createElementBlock("p", {
38
+ id: __props.id,
36
39
  "data-error": __props.error,
40
+ role: __props.error ? "alert" : void 0,
41
+ "aria-live": __props.error ? "polite" : void 0,
37
42
  class: "mt-2 text-sm text-gray-400 peer-user-invalid:visible data-[error=true]:text-red-500 dark:text-gray-500"
38
43
  }, [
39
44
  vue.renderSlot(_ctx.$slots, "default", {}, () => [
@@ -43,7 +48,7 @@ const _sfc_main$c = /* @__PURE__ */ vue.defineComponent({
43
48
  };
44
49
  }
45
50
  });
46
- const _hoisted_1$b = ["id", "disabled", "name", "placeholder", "type"];
51
+ const _hoisted_1$b = ["id", "disabled", "name", "placeholder", "type", "required", "aria-invalid", "aria-required", "aria-describedby"];
47
52
  const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
48
53
  __name: "FormInput",
49
54
  props: /* @__PURE__ */ vue.mergeModels({
@@ -53,22 +58,29 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
53
58
  disabled: { type: Boolean },
54
59
  invalid: { type: Boolean },
55
60
  id: {},
56
- name: {}
61
+ name: {},
62
+ required: { type: Boolean },
63
+ describedBy: {}
57
64
  }, {
58
65
  "modelValue": {},
59
66
  "modelModifiers": {}
60
67
  }),
61
68
  emits: ["update:modelValue"],
62
69
  setup(__props) {
70
+ const props = __props;
63
71
  const modelValue = vue.useModel(__props, "modelValue");
64
72
  return (_ctx, _cache) => {
65
73
  return vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", vue.mergeProps({
66
- id: __props.id ?? __props.name ?? "",
74
+ id: props.id ?? props.name ?? "",
67
75
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event),
68
- disabled: __props.disabled,
69
- name: __props.name ?? "",
70
- placeholder: __props.placeholder,
71
- type: __props.type,
76
+ disabled: props.disabled,
77
+ name: props.name ?? "",
78
+ placeholder: props.placeholder,
79
+ type: props.type,
80
+ required: props.required,
81
+ "aria-invalid": props.invalid || void 0,
82
+ "aria-required": props.required || void 0,
83
+ "aria-describedby": props.describedBy || void 0,
72
84
  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"
73
85
  }, _ctx.$attrs), null, 16, _hoisted_1$b)), [
74
86
  [vue.vModelDynamic, modelValue.value]
@@ -77,24 +89,27 @@ const _sfc_main$b = /* @__PURE__ */ vue.defineComponent({
77
89
  }
78
90
  });
79
91
  const _hoisted_1$a = { class: "relative" };
80
- const _hoisted_2$9 = ["id", "disabled"];
92
+ const _hoisted_2$9 = ["id", "disabled", "aria-expanded", "aria-controls", "aria-invalid", "aria-describedby"];
81
93
  const _hoisted_3$8 = { class: "flex-1 truncate" };
82
- const _hoisted_4$6 = {
94
+ const _hoisted_4$6 = ["id", "aria-label"];
95
+ const _hoisted_5$5 = {
83
96
  key: 0,
84
97
  class: "sticky top-0 border-b border-gray-200 bg-white p-2 dark:border-gray-700 dark:bg-gray-800"
85
98
  };
86
- const _hoisted_5$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" };
87
- const _hoisted_6$5 = {
99
+ 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" };
100
+ const _hoisted_7$5 = {
88
101
  key: 1,
89
- class: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400"
102
+ class: "px-4 py-3 text-sm text-gray-500 dark:text-gray-400",
103
+ role: "status"
90
104
  };
91
- const _hoisted_7$4 = { class: "py-1" };
92
- const _hoisted_8$4 = ["data-index", "onClick", "onMouseenter"];
93
- const _hoisted_9$2 = {
105
+ const _hoisted_8$4 = { class: "py-1" };
106
+ const _hoisted_9$2 = ["aria-selected", "data-index", "onClick", "onMouseenter"];
107
+ const _hoisted_10$2 = {
94
108
  key: 1,
95
- class: "size-4 shrink-0"
109
+ class: "size-4 shrink-0",
110
+ "aria-hidden": "true"
96
111
  };
97
- const _hoisted_10$2 = { class: "flex-1" };
112
+ const _hoisted_11$2 = { class: "flex-1" };
98
113
  const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
99
114
  __name: "FormSelect",
100
115
  props: /* @__PURE__ */ vue.mergeModels({
@@ -106,6 +121,8 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
106
121
  invalid: { type: Boolean },
107
122
  id: {},
108
123
  name: {},
124
+ required: { type: Boolean },
125
+ describedBy: {},
109
126
  teleport: { type: Boolean, default: true },
110
127
  searchable: { type: Boolean, default: false },
111
128
  noResultsText: { default: "No results found" },
@@ -117,6 +134,9 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
117
134
  emits: ["update:modelValue"],
118
135
  setup(__props) {
119
136
  const props = __props;
137
+ const { id: generatedId, related } = useId.useId({ prefix: "select", id: props.id });
138
+ const triggerId = vue.computed(() => props.id ?? props.name ?? generatedId.value);
139
+ const listboxId = vue.computed(() => related("listbox"));
120
140
  const modelValue = vue.useModel(__props, "modelValue");
121
141
  const searchQuery = vue.ref("");
122
142
  const triggerRef = vue.ref();
@@ -210,12 +230,17 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
210
230
  return (_ctx, _cache) => {
211
231
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$a, [
212
232
  vue.createElementVNode("button", {
213
- id: __props.id ?? __props.name ?? void 0,
233
+ id: triggerId.value,
214
234
  ref_key: "triggerRef",
215
235
  ref: triggerRef,
216
236
  type: "button",
217
237
  disabled: __props.disabled,
218
238
  class: vue.normalizeClass(triggerClasses.value),
239
+ "aria-haspopup": "listbox",
240
+ "aria-expanded": vue.unref(isOpen),
241
+ "aria-controls": listboxId.value,
242
+ "aria-invalid": __props.invalid || void 0,
243
+ "aria-describedby": __props.describedBy || void 0,
219
244
  onClick: toggle,
220
245
  onKeydown: handleKeydown
221
246
  }, [
@@ -227,7 +252,8 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
227
252
  ]),
228
253
  vue.createVNode(vue.unref(vue$1.Icon), {
229
254
  icon: "lucide:chevron-down",
230
- class: vue.normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", vue.unref(isOpen) && "rotate-180"])
255
+ class: vue.normalizeClass(["size-4 shrink-0 text-gray-400 transition-transform", vue.unref(isOpen) && "rotate-180"]),
256
+ "aria-hidden": "true"
231
257
  }, null, 8, ["class"])
232
258
  ], 42, _hoisted_2$9),
233
259
  (vue.openBlock(), vue.createBlock(vue.Teleport, {
@@ -245,19 +271,23 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
245
271
  default: vue.withCtx(() => [
246
272
  vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
247
273
  key: 0,
274
+ id: listboxId.value,
248
275
  ref_key: "dropdownRef",
249
276
  ref: dropdownRef,
277
+ role: "listbox",
278
+ "aria-label": __props.placeholder || "Select an option",
250
279
  style: vue.normalizeStyle(vue.unref(dropdownStyle)),
251
280
  class: vue.normalizeClass([
252
- "z-[9999] max-h-60 overflow-auto rounded-lg border border-gray-200 bg-white shadow-lg dark:border-gray-700 dark:bg-gray-800",
281
+ "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",
253
282
  !__props.teleport && "absolute mt-1 w-full"
254
283
  ])
255
284
  }, [
256
- __props.searchable ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_4$6, [
257
- vue.createElementVNode("div", _hoisted_5$5, [
285
+ __props.searchable ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_5$5, [
286
+ vue.createElementVNode("div", _hoisted_6$5, [
258
287
  vue.createVNode(vue.unref(vue$1.Icon), {
259
288
  icon: "lucide:search",
260
- class: "size-4 text-gray-400"
289
+ class: "size-4 text-gray-400",
290
+ "aria-hidden": "true"
261
291
  }),
262
292
  vue.withDirectives(vue.createElementVNode("input", {
263
293
  ref_key: "searchInputRef",
@@ -266,18 +296,21 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
266
296
  type: "text",
267
297
  class: "flex-1 bg-transparent text-sm outline-none dark:text-white",
268
298
  placeholder: "Search...",
299
+ "aria-label": "Search options",
269
300
  onKeydown: handleKeydown
270
301
  }, null, 544), [
271
302
  [vue.vModelText, searchQuery.value]
272
303
  ])
273
304
  ])
274
305
  ])) : vue.createCommentVNode("", true),
275
- filteredOptions.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_6$5, vue.toDisplayString(__props.noResultsText), 1)) : vue.createCommentVNode("", true),
276
- vue.createElementVNode("div", _hoisted_7$4, [
306
+ filteredOptions.value.length === 0 ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$5, vue.toDisplayString(__props.noResultsText), 1)) : vue.createCommentVNode("", true),
307
+ vue.createElementVNode("div", _hoisted_8$4, [
277
308
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(filteredOptions.value, (option, index2) => {
278
309
  return vue.openBlock(), vue.createElementBlock("button", {
279
310
  key: String(option.value),
280
311
  type: "button",
312
+ role: "option",
313
+ "aria-selected": modelValue.value === option.value,
281
314
  "data-index": index2,
282
315
  class: vue.normalizeClass([
283
316
  "flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors",
@@ -296,14 +329,15 @@ const _sfc_main$a = /* @__PURE__ */ vue.defineComponent({
296
329
  modelValue.value === option.value ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
297
330
  key: 0,
298
331
  icon: "lucide:check",
299
- class: "size-4 shrink-0 text-primary"
300
- })) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_9$2)),
301
- vue.createElementVNode("span", _hoisted_10$2, vue.toDisplayString(option.label), 1)
332
+ class: "size-4 shrink-0 text-primary",
333
+ "aria-hidden": "true"
334
+ })) : (vue.openBlock(), vue.createElementBlock("span", _hoisted_10$2)),
335
+ vue.createElementVNode("span", _hoisted_11$2, vue.toDisplayString(option.label), 1)
302
336
  ])
303
- ], 42, _hoisted_8$4);
337
+ ], 42, _hoisted_9$2);
304
338
  }), 128))
305
339
  ])
306
- ], 6)) : vue.createCommentVNode("", true)
340
+ ], 14, _hoisted_4$6)) : vue.createCommentVNode("", true)
307
341
  ]),
308
342
  _: 3
309
343
  })
@@ -328,6 +362,8 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
328
362
  invalid: { type: Boolean },
329
363
  id: {},
330
364
  name: {},
365
+ required: { type: Boolean },
366
+ describedBy: {},
331
367
  options: {}
332
368
  }, {
333
369
  "modelValue": {},
@@ -337,8 +373,12 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
337
373
  setup(__props) {
338
374
  const props = __props;
339
375
  const modelValue = vue.useModel(__props, "modelValue");
376
+ const { id: generatedId, related } = useId.useId({ prefix: "field", id: props.id });
377
+ const inputId = vue.computed(() => props.id ?? props.name ?? generatedId.value);
378
+ const helpId = vue.computed(() => related("help"));
340
379
  const computedCols = vue.computed(() => `span ${props.cols} / span ${props.cols}`);
341
380
  const isSelect = vue.computed(() => props.select === true);
381
+ const hasError = vue.computed(() => props.error && typeof props.error === "string");
342
382
  return (_ctx, _cache) => {
343
383
  return vue.openBlock(), vue.createElementBlock("div", {
344
384
  style: vue.normalizeStyle({ gridColumn: computedCols.value }),
@@ -348,7 +388,7 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
348
388
  vue.renderSlot(_ctx.$slots, "label", {}, () => [
349
389
  __props.label ? (vue.openBlock(), vue.createBlock(_sfc_main$d, {
350
390
  key: 0,
351
- "html-for": __props.id ?? __props.name,
391
+ "html-for": inputId.value,
352
392
  error: __props.error
353
393
  }, {
354
394
  default: vue.withCtx(() => [
@@ -362,21 +402,30 @@ const _sfc_main$9 = /* @__PURE__ */ vue.defineComponent({
362
402
  key: 0,
363
403
  modelValue: modelValue.value,
364
404
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => modelValue.value = $event)
365
- }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"])) : (vue.openBlock(), vue.createBlock(_sfc_main$b, vue.mergeProps({
405
+ }, { ..._ctx.$attrs, ..._ctx.$props }, {
406
+ id: inputId.value,
407
+ invalid: Boolean(__props.error),
408
+ "described-by": hasError.value ? helpId.value : void 0
409
+ }), null, 16, ["modelValue", "id", "invalid", "described-by"])) : (vue.openBlock(), vue.createBlock(_sfc_main$b, vue.mergeProps({
366
410
  key: 1,
367
411
  modelValue: modelValue.value,
368
412
  "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => modelValue.value = $event)
369
- }, { ..._ctx.$attrs, ..._ctx.$props }), null, 16, ["modelValue"]))
413
+ }, { ..._ctx.$attrs, ..._ctx.$props }, {
414
+ id: inputId.value,
415
+ invalid: Boolean(__props.error),
416
+ "described-by": hasError.value ? helpId.value : void 0
417
+ }), null, 16, ["modelValue", "id", "invalid", "described-by"]))
370
418
  ]),
371
- __props.error && typeof __props.error === "string" ? (vue.openBlock(), vue.createBlock(_sfc_main$c, {
419
+ hasError.value ? (vue.openBlock(), vue.createBlock(_sfc_main$c, {
372
420
  key: 0,
421
+ id: helpId.value,
373
422
  error: true
374
423
  }, {
375
424
  default: vue.withCtx(() => [
376
425
  vue.createTextVNode(vue.toDisplayString(__props.error), 1)
377
426
  ]),
378
427
  _: 1
379
- })) : vue.createCommentVNode("", true)
428
+ }, 8, ["id"])) : vue.createCommentVNode("", true)
380
429
  ])
381
430
  ], 12, _hoisted_1$9);
382
431
  };
@@ -417,19 +466,13 @@ const _sfc_main$8 = /* @__PURE__ */ vue.defineComponent({
417
466
  };
418
467
  }
419
468
  });
420
- const _hoisted_1$7 = ["aria-checked", "disabled"];
469
+ const _hoisted_1$7 = ["id", "aria-checked", "aria-labelledby", "aria-describedby", "disabled"];
421
470
  const _hoisted_2$7 = {
422
471
  key: 0,
423
472
  class: "flex flex-col"
424
473
  };
425
- const _hoisted_3$7 = {
426
- key: 0,
427
- class: "text-sm font-medium text-gray-900 dark:text-white"
428
- };
429
- const _hoisted_4$5 = {
430
- key: 1,
431
- class: "text-sm text-gray-500 dark:text-gray-400"
432
- };
474
+ const _hoisted_3$7 = ["id"];
475
+ const _hoisted_4$5 = ["id"];
433
476
  const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
434
477
  __name: "Switch",
435
478
  props: {
@@ -437,12 +480,17 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
437
480
  label: {},
438
481
  description: {},
439
482
  disabled: { type: Boolean },
440
- size: { default: "md" }
483
+ size: { default: "md" },
484
+ id: {}
441
485
  },
442
486
  emits: ["update:modelValue"],
443
487
  setup(__props, { emit: __emit }) {
444
488
  const props = __props;
445
489
  const emit = __emit;
490
+ const { id: generatedId, related } = useId.useId({ prefix: "switch", id: props.id });
491
+ const switchId = vue.computed(() => props.id ?? generatedId.value);
492
+ const labelId = vue.computed(() => related("label"));
493
+ const descriptionId = vue.computed(() => related("description"));
446
494
  const toggle = () => {
447
495
  if (props.disabled) return;
448
496
  emit("update:modelValue", !props.modelValue);
@@ -467,9 +515,12 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
467
515
  class: vue.normalizeClass(["inline-flex items-start gap-3", __props.disabled ? "cursor-not-allowed opacity-50" : "cursor-pointer"])
468
516
  }, [
469
517
  vue.createElementVNode("button", {
518
+ id: switchId.value,
470
519
  type: "button",
471
520
  role: "switch",
472
521
  "aria-checked": __props.modelValue,
522
+ "aria-labelledby": __props.label ? labelId.value : void 0,
523
+ "aria-describedby": __props.description ? descriptionId.value : void 0,
473
524
  disabled: __props.disabled,
474
525
  class: vue.normalizeClass([
475
526
  "relative inline-flex shrink-0 items-center rounded-full transition-colors focus:outline-none focus:ring-2 focus:ring-primary focus:ring-offset-2",
@@ -483,12 +534,21 @@ const _sfc_main$7 = /* @__PURE__ */ vue.defineComponent({
483
534
  "inline-block transform rounded-full bg-white shadow-sm transition-transform",
484
535
  dotSizes[__props.size],
485
536
  __props.modelValue ? translateSizes[__props.size] : "translate-x-1"
486
- ])
537
+ ]),
538
+ "aria-hidden": "true"
487
539
  }, null, 2)
488
540
  ], 10, _hoisted_1$7),
489
541
  __props.label || __props.description ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2$7, [
490
- __props.label ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_3$7, vue.toDisplayString(__props.label), 1)) : vue.createCommentVNode("", true),
491
- __props.description ? (vue.openBlock(), vue.createElementBlock("span", _hoisted_4$5, vue.toDisplayString(__props.description), 1)) : vue.createCommentVNode("", true)
542
+ __props.label ? (vue.openBlock(), vue.createElementBlock("span", {
543
+ key: 0,
544
+ id: labelId.value,
545
+ class: "text-sm font-medium text-gray-900 dark:text-white"
546
+ }, vue.toDisplayString(__props.label), 9, _hoisted_3$7)) : vue.createCommentVNode("", true),
547
+ __props.description ? (vue.openBlock(), vue.createElementBlock("span", {
548
+ key: 1,
549
+ id: descriptionId.value,
550
+ class: "text-sm text-gray-500 dark:text-gray-400"
551
+ }, vue.toDisplayString(__props.description), 9, _hoisted_4$5)) : vue.createCommentVNode("", true)
492
552
  ])) : vue.createCommentVNode("", true)
493
553
  ], 2);
494
554
  };
@@ -503,7 +563,7 @@ const _hoisted_3$6 = { class: "text-gray-600 dark:text-gray-400" };
503
563
  const _hoisted_4$4 = { class: "font-medium text-gray-900 dark:text-white" };
504
564
  const _hoisted_5$4 = { class: "text-gray-600 dark:text-gray-400" };
505
565
  const _hoisted_6$4 = { class: "relative" };
506
- const _hoisted_7$3 = ["value", "min", "max", "step", "disabled"];
566
+ const _hoisted_7$4 = ["value", "min", "max", "step", "disabled"];
507
567
  const _hoisted_8$3 = { class: "pointer-events-none absolute inset-y-0 left-0 flex items-center" };
508
568
  const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
509
569
  __name: "Slider",
@@ -552,7 +612,7 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
552
612
  disabled: __props.disabled,
553
613
  class: "slider-input w-full cursor-pointer appearance-none bg-transparent disabled:cursor-not-allowed disabled:opacity-50",
554
614
  onInput: handleInput
555
- }, null, 40, _hoisted_7$3),
615
+ }, null, 40, _hoisted_7$4),
556
616
  vue.createElementVNode("div", _hoisted_8$3, [
557
617
  vue.createElementVNode("div", {
558
618
  class: "h-2 rounded-full bg-primary",
@@ -566,15 +626,24 @@ const _sfc_main$6 = /* @__PURE__ */ vue.defineComponent({
566
626
  });
567
627
  const Slider = /* @__PURE__ */ _pluginVue_exportHelper._export_sfc(_sfc_main$6, [["__scopeId", "data-v-a411f1b4"]]);
568
628
  const _hoisted_1$5 = { class: "relative" };
569
- const _hoisted_2$5 = ["disabled"];
629
+ const _hoisted_2$5 = ["id", "disabled", "aria-expanded", "aria-controls"];
570
630
  const _hoisted_3$5 = { class: "flex-1 truncate" };
571
631
  const _hoisted_4$3 = { class: "flex items-center gap-1" };
572
- const _hoisted_5$3 = { class: "mb-4 flex items-center justify-between" };
573
- const _hoisted_6$3 = { class: "font-medium text-gray-900 dark:text-white" };
574
- const _hoisted_7$2 = { class: "mb-2 grid grid-cols-7 gap-1" };
575
- const _hoisted_8$2 = { class: "grid grid-cols-7 gap-1" };
576
- const _hoisted_9$1 = ["disabled", "onClick"];
577
- const _hoisted_10$1 = { class: "mt-4 border-t border-gray-200 pt-3 dark:border-gray-700" };
632
+ const _hoisted_5$3 = ["id", "aria-label"];
633
+ const _hoisted_6$3 = { class: "mb-4 flex items-center justify-between" };
634
+ const _hoisted_7$3 = {
635
+ class: "font-medium text-gray-900 dark:text-white",
636
+ "aria-live": "polite",
637
+ "aria-atomic": "true"
638
+ };
639
+ const _hoisted_8$2 = {
640
+ class: "mb-2 grid grid-cols-7 gap-1",
641
+ role: "row"
642
+ };
643
+ const _hoisted_9$1 = ["abbr"];
644
+ const _hoisted_10$1 = ["id", "aria-label"];
645
+ const _hoisted_11$1 = ["aria-label", "aria-selected", "aria-disabled", "disabled", "onClick"];
646
+ const _hoisted_12 = { class: "mt-4 border-t border-gray-200 pt-3 dark:border-gray-700" };
578
647
  const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
579
648
  __name: "DatePicker",
580
649
  props: /* @__PURE__ */ vue.mergeModels({
@@ -584,7 +653,8 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
584
653
  disabled: { type: Boolean, default: false },
585
654
  minDate: {},
586
655
  maxDate: {},
587
- teleport: { type: Boolean, default: true }
656
+ teleport: { type: Boolean, default: true },
657
+ id: {}
588
658
  }, {
589
659
  "modelValue": { default: null },
590
660
  "modelModifiers": {}
@@ -592,6 +662,10 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
592
662
  emits: ["update:modelValue"],
593
663
  setup(__props) {
594
664
  const props = __props;
665
+ const { related } = useId.useId({ prefix: "datepicker", id: props.id });
666
+ const triggerId = vue.computed(() => related("trigger"));
667
+ const calendarId = vue.computed(() => related("calendar"));
668
+ const gridId = vue.computed(() => related("grid"));
595
669
  const modelValue = vue.useModel(__props, "modelValue");
596
670
  const triggerRef = vue.ref();
597
671
  const calendarRef = vue.ref();
@@ -684,13 +758,26 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
684
758
  const clear = () => {
685
759
  modelValue.value = null;
686
760
  };
761
+ const getDateLabel = (date) => {
762
+ const formatter = new Intl.DateTimeFormat(props.locale, {
763
+ weekday: "long",
764
+ year: "numeric",
765
+ month: "long",
766
+ day: "numeric"
767
+ });
768
+ return formatter.format(date);
769
+ };
687
770
  return (_ctx, _cache) => {
688
771
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1$5, [
689
772
  vue.createElementVNode("button", {
773
+ id: triggerId.value,
690
774
  ref_key: "triggerRef",
691
775
  ref: triggerRef,
692
776
  type: "button",
693
777
  disabled: __props.disabled,
778
+ "aria-expanded": vue.unref(isOpen),
779
+ "aria-haspopup": "dialog",
780
+ "aria-controls": calendarId.value,
694
781
  class: vue.normalizeClass([
695
782
  "flex w-full items-center justify-between gap-2 rounded-md border px-3 py-2 text-sm text-left transition",
696
783
  __props.disabled ? "cursor-not-allowed border-gray-200 bg-gray-50 text-gray-500 dark:border-gray-800 dark:bg-gray-950" : vue.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",
@@ -705,16 +792,19 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
705
792
  key: 0,
706
793
  type: "button",
707
794
  class: "rounded p-0.5 hover:bg-gray-100 dark:hover:bg-gray-800",
795
+ "aria-label": "Clear date",
708
796
  onClick: vue.withModifiers(clear, ["stop"])
709
797
  }, [
710
798
  vue.createVNode(vue.unref(vue$1.Icon), {
711
799
  icon: "lucide:x",
712
- class: "size-4 text-gray-400"
800
+ class: "size-4 text-gray-400",
801
+ "aria-hidden": "true"
713
802
  })
714
803
  ])) : vue.createCommentVNode("", true),
715
804
  vue.createVNode(vue.unref(vue$1.Icon), {
716
805
  icon: "lucide:calendar",
717
- class: "size-4 text-gray-400"
806
+ class: "size-4 text-gray-400",
807
+ "aria-hidden": "true"
718
808
  })
719
809
  ])
720
810
  ], 10, _hoisted_2$5),
@@ -733,47 +823,66 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
733
823
  default: vue.withCtx(() => [
734
824
  vue.unref(isOpen) ? (vue.openBlock(), vue.createElementBlock("div", {
735
825
  key: 0,
826
+ id: calendarId.value,
736
827
  ref_key: "calendarRef",
737
828
  ref: calendarRef,
829
+ role: "dialog",
830
+ "aria-modal": "true",
831
+ "aria-label": `Choose date, ${monthYear.value}`,
738
832
  style: vue.normalizeStyle(vue.unref(dropdownStyle)),
739
- class: "z-[9999] w-72 rounded-lg border border-gray-200 bg-white p-4 shadow-lg dark:border-gray-700 dark:bg-gray-800"
833
+ 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"
740
834
  }, [
741
- vue.createElementVNode("div", _hoisted_5$3, [
835
+ vue.createElementVNode("div", _hoisted_6$3, [
742
836
  vue.createElementVNode("button", {
743
837
  type: "button",
744
838
  class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
839
+ "aria-label": "Previous month",
745
840
  onClick: prevMonth
746
841
  }, [
747
842
  vue.createVNode(vue.unref(vue$1.Icon), {
748
843
  icon: "lucide:chevron-left",
749
- class: "size-5 text-gray-600 dark:text-gray-400"
844
+ class: "size-5 text-gray-600 dark:text-gray-400",
845
+ "aria-hidden": "true"
750
846
  })
751
847
  ]),
752
- vue.createElementVNode("span", _hoisted_6$3, vue.toDisplayString(monthYear.value), 1),
848
+ vue.createElementVNode("span", _hoisted_7$3, vue.toDisplayString(monthYear.value), 1),
753
849
  vue.createElementVNode("button", {
754
850
  type: "button",
755
851
  class: "rounded p-1 hover:bg-gray-100 dark:hover:bg-gray-700",
852
+ "aria-label": "Next month",
756
853
  onClick: nextMonth
757
854
  }, [
758
855
  vue.createVNode(vue.unref(vue$1.Icon), {
759
856
  icon: "lucide:chevron-right",
760
- class: "size-5 text-gray-600 dark:text-gray-400"
857
+ class: "size-5 text-gray-600 dark:text-gray-400",
858
+ "aria-hidden": "true"
761
859
  })
762
860
  ])
763
861
  ]),
764
- vue.createElementVNode("div", _hoisted_7$2, [
862
+ vue.createElementVNode("div", _hoisted_8$2, [
765
863
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(weekDays.value, (day) => {
766
864
  return vue.openBlock(), vue.createElementBlock("div", {
767
865
  key: day,
768
- class: "text-center text-xs font-medium text-gray-500 dark:text-gray-400"
769
- }, vue.toDisplayString(day), 1);
866
+ class: "text-center text-xs font-medium text-gray-500 dark:text-gray-400",
867
+ role: "columnheader",
868
+ abbr: day
869
+ }, vue.toDisplayString(day), 9, _hoisted_9$1);
770
870
  }), 128))
771
871
  ]),
772
- vue.createElementVNode("div", _hoisted_8$2, [
872
+ vue.createElementVNode("div", {
873
+ id: gridId.value,
874
+ class: "grid grid-cols-7 gap-1",
875
+ role: "grid",
876
+ "aria-label": monthYear.value
877
+ }, [
773
878
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(calendarDays.value, (day, index2) => {
774
879
  return vue.openBlock(), vue.createElementBlock("button", {
775
880
  key: index2,
776
881
  type: "button",
882
+ role: "gridcell",
883
+ "aria-label": getDateLabel(day.date),
884
+ "aria-selected": day.isSelected,
885
+ "aria-disabled": day.isDisabled || void 0,
777
886
  disabled: day.isDisabled,
778
887
  class: vue.normalizeClass([
779
888
  "h-8 w-8 rounded text-sm transition",
@@ -784,17 +893,17 @@ const _sfc_main$5 = /* @__PURE__ */ vue.defineComponent({
784
893
  day.isSelected && "bg-primary text-white font-semibold"
785
894
  ]),
786
895
  onClick: ($event) => selectDate(day)
787
- }, vue.toDisplayString(day.date.getDate()), 11, _hoisted_9$1);
896
+ }, vue.toDisplayString(day.date.getDate()), 11, _hoisted_11$1);
788
897
  }), 128))
789
- ]),
790
- vue.createElementVNode("div", _hoisted_10$1, [
898
+ ], 8, _hoisted_10$1),
899
+ vue.createElementVNode("div", _hoisted_12, [
791
900
  vue.createElementVNode("button", {
792
901
  type: "button",
793
902
  class: "w-full rounded py-1.5 text-sm font-medium text-primary hover:bg-primary/10",
794
903
  onClick: _cache[1] || (_cache[1] = ($event) => selectDate({ date: /* @__PURE__ */ new Date(), isDisabled: false }))
795
904
  }, " Today ")
796
905
  ])
797
- ], 4)) : vue.createCommentVNode("", true)
906
+ ], 12, _hoisted_5$3)) : vue.createCommentVNode("", true)
798
907
  ]),
799
908
  _: 1
800
909
  })
@@ -815,7 +924,7 @@ const _hoisted_6$2 = {
815
924
  key: 1,
816
925
  class: "text-xs text-gray-500 dark:text-gray-400"
817
926
  };
818
- const _hoisted_7$1 = {
927
+ const _hoisted_7$2 = {
819
928
  key: 0,
820
929
  class: "space-y-2"
821
930
  };
@@ -979,7 +1088,7 @@ const _sfc_main$4 = /* @__PURE__ */ vue.defineComponent({
979
1088
  __props.maxSize ? (vue.openBlock(), vue.createElementBlock("p", _hoisted_6$2, " Max size: " + vue.toDisplayString(formatSize(__props.maxSize)), 1)) : vue.createCommentVNode("", true)
980
1089
  ])
981
1090
  ], 34),
982
- files.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_7$1, [
1091
+ files.value.length > 0 ? (vue.openBlock(), vue.createElementBlock("ul", _hoisted_7$2, [
983
1092
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(files.value, (uploadedFile) => {
984
1093
  return vue.openBlock(), vue.createElementBlock("li", {
985
1094
  key: uploadedFile.id,
@@ -1128,7 +1237,7 @@ const _hoisted_3$2 = ["disabled"];
1128
1237
  const _hoisted_4$1 = { class: "text-sm font-mono text-gray-700 dark:text-gray-300" };
1129
1238
  const _hoisted_5$1 = { class: "grid grid-cols-5 gap-2 mb-3" };
1130
1239
  const _hoisted_6$1 = ["title", "onClick"];
1131
- const _hoisted_7 = {
1240
+ const _hoisted_7$1 = {
1132
1241
  key: 0,
1133
1242
  class: "flex items-center gap-2 pt-3 border-t border-gray-200 dark:border-gray-700"
1134
1243
  };
@@ -1261,7 +1370,7 @@ const _sfc_main$2 = /* @__PURE__ */ vue.defineComponent({
1261
1370
  ], 14, _hoisted_6$1);
1262
1371
  }), 128))
1263
1372
  ]),
1264
- __props.showInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7, [
1373
+ __props.showInput ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_7$1, [
1265
1374
  vue.createElementVNode("input", {
1266
1375
  type: "color",
1267
1376
  value: __props.modelValue,
@@ -1422,17 +1531,16 @@ const _sfc_main$1 = /* @__PURE__ */ vue.defineComponent({
1422
1531
  };
1423
1532
  }
1424
1533
  });
1425
- const _hoisted_1 = ["id", "name", "placeholder", "disabled"];
1426
- const _hoisted_2 = { class: "flex items-center gap-1" };
1427
- const _hoisted_3 = {
1428
- key: 0,
1429
- 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"
1430
- };
1431
- const _hoisted_4 = ["disabled", "onClick"];
1432
- const _hoisted_5 = { class: "flex-1" };
1433
- const _hoisted_6 = {
1534
+ const _hoisted_1 = ["aria-expanded", "aria-controls"];
1535
+ const _hoisted_2 = ["id", "name", "placeholder", "disabled", "aria-controls"];
1536
+ const _hoisted_3 = { class: "flex items-center gap-1" };
1537
+ const _hoisted_4 = ["id", "aria-label", "aria-multiselectable"];
1538
+ const _hoisted_5 = ["aria-selected", "aria-disabled", "disabled", "onClick"];
1539
+ const _hoisted_6 = { class: "flex-1" };
1540
+ const _hoisted_7 = {
1434
1541
  key: 1,
1435
- class: "px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400"
1542
+ class: "px-3 py-2 text-center text-sm text-gray-500 dark:text-gray-400",
1543
+ role: "status"
1436
1544
  };
1437
1545
  const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1438
1546
  __name: "Combobox",
@@ -1452,6 +1560,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1452
1560
  emits: ["update:modelValue"],
1453
1561
  setup(__props, { emit: __emit }) {
1454
1562
  const props = __props;
1563
+ const { id: generatedId, related } = useId.useId({ prefix: "combobox", id: props.id });
1564
+ const inputId = vue.computed(() => props.id ?? generatedId.value);
1565
+ const listboxId = vue.computed(() => related("listbox"));
1455
1566
  const teleportDisabled = vue.computed(() => props.teleport === false);
1456
1567
  const teleportTarget = vue.computed(() => props.teleport === false ? "body" : props.teleport);
1457
1568
  const emit = __emit;
@@ -1530,6 +1641,10 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1530
1641
  class: "relative"
1531
1642
  }, [
1532
1643
  vue.createElementVNode("div", {
1644
+ role: "combobox",
1645
+ "aria-expanded": isOpen.value,
1646
+ "aria-haspopup": "listbox",
1647
+ "aria-controls": listboxId.value,
1533
1648
  class: vue.normalizeClass([
1534
1649
  "flex min-h-[42px] w-full cursor-pointer items-center rounded-lg border bg-white px-3 py-2 transition-colors",
1535
1650
  "dark:bg-gray-900",
@@ -1545,7 +1660,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1545
1660
  ])
1546
1661
  }, vue.toDisplayString(displayValue.value || __props.placeholder), 3)) : vue.withDirectives((vue.openBlock(), vue.createElementBlock("input", {
1547
1662
  key: 1,
1548
- id: __props.id,
1663
+ id: inputId.value,
1549
1664
  ref_key: "inputRef",
1550
1665
  ref: inputRef,
1551
1666
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => search.value = $event),
@@ -1553,22 +1668,26 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1553
1668
  name: __props.name,
1554
1669
  placeholder: __props.searchPlaceholder,
1555
1670
  disabled: __props.disabled,
1671
+ "aria-autocomplete": "list",
1672
+ "aria-controls": listboxId.value,
1556
1673
  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",
1557
1674
  onClick: _cache[1] || (_cache[1] = vue.withModifiers(() => {
1558
1675
  }, ["stop"]))
1559
- }, null, 8, _hoisted_1)), [
1676
+ }, null, 8, _hoisted_2)), [
1560
1677
  [vue.vModelText, search.value]
1561
1678
  ]),
1562
- vue.createElementVNode("div", _hoisted_2, [
1679
+ vue.createElementVNode("div", _hoisted_3, [
1563
1680
  __props.clearable && selectedOptions.value.length > 0 && !__props.disabled ? (vue.openBlock(), vue.createElementBlock("button", {
1564
1681
  key: 0,
1565
1682
  type: "button",
1566
1683
  class: "rounded p-0.5 text-gray-400 hover:text-gray-600 dark:hover:text-gray-300",
1684
+ "aria-label": "Clear selection",
1567
1685
  onClick: vue.withModifiers(clear, ["stop"])
1568
1686
  }, [
1569
1687
  vue.createVNode(vue.unref(vue$1.Icon), {
1570
1688
  icon: "lucide:x",
1571
- class: "h-4 w-4"
1689
+ class: "h-4 w-4",
1690
+ "aria-hidden": "true"
1572
1691
  })
1573
1692
  ])) : vue.createCommentVNode("", true),
1574
1693
  vue.createVNode(vue.unref(vue$1.Icon), {
@@ -1576,10 +1695,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1576
1695
  class: vue.normalizeClass([
1577
1696
  "h-4 w-4 text-gray-400 transition-transform",
1578
1697
  isOpen.value && "rotate-180"
1579
- ])
1698
+ ]),
1699
+ "aria-hidden": "true"
1580
1700
  }, null, 8, ["class"])
1581
1701
  ])
1582
- ], 2),
1702
+ ], 10, _hoisted_1),
1583
1703
  (vue.openBlock(), vue.createBlock(vue.Teleport, {
1584
1704
  to: teleportTarget.value,
1585
1705
  disabled: teleportDisabled.value
@@ -1593,11 +1713,21 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1593
1713
  "leave-to-class": "transform scale-95 opacity-0"
1594
1714
  }, {
1595
1715
  default: vue.withCtx(() => [
1596
- isOpen.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_3, [
1716
+ isOpen.value ? (vue.openBlock(), vue.createElementBlock("div", {
1717
+ key: 0,
1718
+ id: listboxId.value,
1719
+ role: "listbox",
1720
+ "aria-label": __props.placeholder,
1721
+ "aria-multiselectable": __props.multiple || void 0,
1722
+ 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"
1723
+ }, [
1597
1724
  filteredOptions.value.length ? (vue.openBlock(true), vue.createElementBlock(vue.Fragment, { key: 0 }, vue.renderList(filteredOptions.value, (option) => {
1598
1725
  return vue.openBlock(), vue.createElementBlock("button", {
1599
1726
  key: option.value,
1600
1727
  type: "button",
1728
+ role: "option",
1729
+ "aria-selected": isSelected(option),
1730
+ "aria-disabled": option.disabled || void 0,
1601
1731
  disabled: option.disabled,
1602
1732
  class: vue.normalizeClass([
1603
1733
  "flex w-full items-center gap-2 px-3 py-2 text-left text-sm transition-colors",
@@ -1610,7 +1740,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1610
1740
  class: vue.normalizeClass([
1611
1741
  "flex h-4 w-4 items-center justify-center rounded border",
1612
1742
  isSelected(option) ? "border-primary bg-primary text-white" : "border-gray-300 dark:border-gray-600"
1613
- ])
1743
+ ]),
1744
+ "aria-hidden": "true"
1614
1745
  }, [
1615
1746
  isSelected(option) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1616
1747
  key: 0,
@@ -1618,15 +1749,16 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent({
1618
1749
  class: "h-3 w-3"
1619
1750
  })) : vue.createCommentVNode("", true)
1620
1751
  ], 2)) : vue.createCommentVNode("", true),
1621
- vue.createElementVNode("span", _hoisted_5, vue.toDisplayString(option.label), 1),
1752
+ vue.createElementVNode("span", _hoisted_6, vue.toDisplayString(option.label), 1),
1622
1753
  !__props.multiple && isSelected(option) ? (vue.openBlock(), vue.createBlock(vue.unref(vue$1.Icon), {
1623
1754
  key: 1,
1624
1755
  icon: "lucide:check",
1625
- class: "h-4 w-4 text-primary"
1756
+ class: "h-4 w-4 text-primary",
1757
+ "aria-hidden": "true"
1626
1758
  })) : vue.createCommentVNode("", true)
1627
- ], 10, _hoisted_4);
1628
- }), 128)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_6, vue.toDisplayString(__props.noResultsText), 1))
1629
- ])) : vue.createCommentVNode("", true)
1759
+ ], 10, _hoisted_5);
1760
+ }), 128)) : (vue.openBlock(), vue.createElementBlock("div", _hoisted_7, vue.toDisplayString(__props.noResultsText), 1))
1761
+ ], 8, _hoisted_4)) : vue.createCommentVNode("", true)
1630
1762
  ]),
1631
1763
  _: 1
1632
1764
  })
@@ -1649,4 +1781,4 @@ exports._sfc_main$6 = _sfc_main$7;
1649
1781
  exports._sfc_main$7 = _sfc_main$5;
1650
1782
  exports._sfc_main$8 = _sfc_main$4;
1651
1783
  exports._sfc_main$9 = _sfc_main$3;
1652
- //# sourceMappingURL=Combobox.vue_vue_type_script_setup_true_lang-FdUrjmSG.cjs.map
1784
+ //# sourceMappingURL=Combobox.vue_vue_type_script_setup_true_lang-BS_MitQQ.cjs.map