@threadlabs/looma 0.9.2 → 0.10.0

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 (43) hide show
  1. package/components/shared/form-reset.js +21 -0
  2. package/components/ui-checkbox/ui-checkbox.html +17 -4
  3. package/components/ui-checkbox/ui-checkbox.js +9 -0
  4. package/components/ui-combobox/ui-combobox.html +23 -11
  5. package/components/ui-combobox/ui-combobox.js +31 -12
  6. package/components/ui-editable/ui-editable.html +3 -1
  7. package/components/ui-editable/ui-editable.js +7 -6
  8. package/components/ui-input/ui-input.html +2 -2
  9. package/components/ui-input/ui-input.js +5 -2
  10. package/components/ui-radio/ui-radio.html +3 -1
  11. package/components/ui-radio/ui-radio.js +11 -0
  12. package/components/ui-radio-group/ui-radio-group.html +7 -5
  13. package/components/ui-radio-group/ui-radio-group.js +16 -3
  14. package/components/ui-search-result-row/ui-search-result-row.html +3 -3
  15. package/components/ui-select/ui-select.html +3 -1
  16. package/components/ui-select/ui-select.js +5 -2
  17. package/components/ui-switch/ui-switch.html +7 -4
  18. package/components/ui-switch/ui-switch.js +9 -0
  19. package/components/ui-textarea/ui-textarea.html +2 -2
  20. package/components/ui-textarea/ui-textarea.js +5 -2
  21. package/components/ui-tree-item/ui-tree-item.html +2 -2
  22. package/dist/index.js +1 -1
  23. package/package.json +1 -1
  24. package/vanilla/UiCheckbox.d.ts +1 -0
  25. package/vanilla/UiCheckbox.js +7 -4
  26. package/vanilla/UiCombobox.js +113 -99
  27. package/vanilla/UiRadioGroup.js +7 -1
  28. package/vanilla/UiSearchResultRow.js +4 -1
  29. package/vanilla/UiSwitch.d.ts +1 -0
  30. package/vanilla/UiSwitch.js +7 -4
  31. package/vue/UiCheckbox.d.ts +2 -0
  32. package/vue/UiCheckbox.vue +3 -0
  33. package/vue/UiCombobox.vue +27 -4
  34. package/vue/UiRadioGroup.vue +2 -0
  35. package/vue/UiSearchResultRow.vue +1 -0
  36. package/vue/UiSwitch.d.ts +2 -0
  37. package/vue/UiSwitch.vue +3 -0
  38. package/vue/chunks/UiCheckbox.js +4 -1
  39. package/vue/chunks/UiCombobox.js +67 -39
  40. package/vue/chunks/UiRadioGroup.js +8 -2
  41. package/vue/chunks/UiSearchResultRow.js +7 -2
  42. package/vue/chunks/UiSwitch.js +4 -1
  43. package/vue/components.css +89 -89
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-radio-group/ui-radio-group.js";
4
4
  import "../styles/ui-radio-group.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-radio-group","props":{"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"label":{"type":"string","required":false,"target":{"attribute":"label"},"default":"Options"},"name":{"type":"string","required":false,"target":{"attribute":"name"},"default":""},"orientation":{"type":{"enum":["horizontal","vertical"]},"required":false,"target":{"attribute":"orientation"},"default":"horizontal"},"required":{"type":"boolean","required":false,"target":{"attribute":"required"},"default":false},"value":{"type":"string","required":false,"target":{"attribute":"value"},"default":""}}},"template":{"kind":"element","name":"fieldset","attributes":[{"kind":"literal","name":"role","value":"radiogroup"}],"children":[{"kind":"element","name":"legend","attributes":[],"children":[{"kind":"element","name":"template","attributes":[{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[]}]},{"kind":"slot"}]},"declarations":[{"kind":"state","name":"internalValue","expression":{"source":"''","ast":{"kind":"literal","value":""},"dependencies":[]}},{"kind":"event","name":"select","type":"object({ value: string, previousValue: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"change","type":"object({ checked: boolean, value: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"fieldset","choices":["fieldset"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-radio-group","props":{"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"label":{"type":"string","required":false,"target":{"attribute":"label"},"default":"Options"},"name":{"type":"string","required":false,"target":{"attribute":"name"},"default":""},"orientation":{"type":{"enum":["horizontal","vertical"]},"required":false,"target":{"attribute":"orientation"},"default":"horizontal"},"required":{"type":"boolean","required":false,"target":{"attribute":"aria-required"},"default":false},"value":{"type":"string","required":false,"target":{"attribute":"value"},"default":""}}},"template":{"kind":"element","name":"fieldset","attributes":[{"kind":"literal","name":"role","value":"radiogroup"},{"kind":"attribute","name":"aria-required","expression":"required","expressionPlan":{"source":"required","ast":{"kind":"id","name":"required"},"dependencies":["required"]}},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}}],"children":[{"kind":"element","name":"legend","attributes":[],"children":[{"kind":"element","name":"template","attributes":[{"kind":"directive","name":"value","expression":"label","expressionPlan":{"source":"label","ast":{"kind":"id","name":"label"},"dependencies":["label"]}}],"children":[]}]},{"kind":"slot"}]},"declarations":[{"kind":"state","name":"internalValue","expression":{"source":"''","ast":{"kind":"literal","value":""},"dependencies":[]}},{"kind":"event","name":"select","type":"object({ value: string, previousValue: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false},{"kind":"event","name":"change","type":"object({ checked: boolean, value: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"fieldset","choices":["fieldset"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiRadioGroup(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, as, ...componentProps } = options;
@@ -14,6 +14,12 @@ export function createUiRadioGroup(options = {}) {
14
14
  element.setAttribute(name, value === true ? "" : String(value));
15
15
  }
16
16
  if (!element.hasAttribute("role")) element.setAttribute("role", "radiogroup");
17
+ const value0 = componentProps["required"] === undefined ? false : componentProps["required"];
18
+ if (typeof value0 === "boolean") element.setAttribute("aria-required", String(value0));
19
+ else element.removeAttribute("aria-required");
20
+ const value1 = componentProps["disabled"] === undefined ? false : componentProps["disabled"];
21
+ if (value1 === true) element.setAttribute("disabled", "");
22
+ else element.removeAttribute("disabled");
17
23
  element.setAttribute("data-component", "ui-radio-group");
18
24
  const element0 = document.createElement("legend");
19
25
  const element1 = document.createElement("template");
@@ -2,7 +2,7 @@
2
2
  import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import "../styles/ui-search-result-row.css";
4
4
 
5
- const definition = {...{"contract":{"tag":"ui-search-result-row","props":{"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"selected"},"default":false}}},"template":{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"title"}],"children":[{"kind":"slot","fallback":[],"name":"title"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"meta"}],"children":[{"kind":"slot","fallback":[],"name":"meta"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"excerpt"}],"children":[{"kind":"slot","fallback":[],"name":"excerpt"}]}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"trailing"}],"children":[{"kind":"slot","fallback":[],"name":"trailing"}]}]},"declarations":[],"root":{"kind":"native","element":"button","choices":["button"]}},source:{file:import.meta.url},css:""};
5
+ const definition = {...{"contract":{"tag":"ui-search-result-row","props":{"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"selected":{"type":"boolean","required":false,"target":{"attribute":"aria-current"},"default":false}}},"template":{"kind":"element","name":"button","attributes":[{"kind":"literal","name":"type","value":"button"},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"aria-current","expression":"selected","expressionPlan":{"source":"selected","ast":{"kind":"id","name":"selected"},"dependencies":["selected"]}}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"leading"}],"children":[{"kind":"slot","fallback":[],"name":"leading"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"content"}],"children":[{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"title"}],"children":[{"kind":"slot","fallback":[],"name":"title"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"meta"}],"children":[{"kind":"slot","fallback":[],"name":"meta"}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"excerpt"}],"children":[{"kind":"slot","fallback":[],"name":"excerpt"}]}]},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"trailing"}],"children":[{"kind":"slot","fallback":[],"name":"trailing"}]}]},"declarations":[],"root":{"kind":"native","element":"button","choices":["button"]}},source:{file:import.meta.url},css:""};
6
6
 
7
7
  export function createUiSearchResultRow(options = {}) {
8
8
  const { attributes = {}, children = [], slots = {}, as, ...componentProps } = options;
@@ -16,6 +16,9 @@ export function createUiSearchResultRow(options = {}) {
16
16
  const value0 = componentProps["disabled"] === undefined ? false : componentProps["disabled"];
17
17
  if (value0 === true) element.setAttribute("disabled", "");
18
18
  else element.removeAttribute("disabled");
19
+ const value1 = componentProps["selected"] === undefined ? false : componentProps["selected"];
20
+ if (typeof value1 === "boolean") element.setAttribute("aria-current", String(value1));
21
+ else element.removeAttribute("aria-current");
19
22
  element.setAttribute("data-component", "ui-search-result-row");
20
23
  const element0 = document.createElement("span");
21
24
  element0.setAttribute("class", "leading");
@@ -9,6 +9,7 @@ export interface UiSwitchElement extends HTMLLabelElement {
9
9
  export interface UiSwitchProps {
10
10
  checked?: boolean | null;
11
11
  disabled?: boolean | null;
12
+ name?: string | null;
12
13
  required?: boolean | null;
13
14
  value?: string | null;
14
15
  attributes?: Readonly<Record<string, string | number | boolean | null | undefined>>;
@@ -3,7 +3,7 @@ import { manageComponentLifecycle } from "@nextwebwg/html-next/runtime";
3
3
  import * as controller from "../components/ui-switch/ui-switch.js";
4
4
  import "../styles/ui-switch.css";
5
5
 
6
- const definition = {...{"contract":{"tag":"ui-switch","props":{"checked":{"type":"boolean","required":false,"target":{"attribute":"checked"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"required":{"type":"boolean","required":false,"target":{"attribute":"required"},"default":false},"value":{"type":"string","required":false,"target":{"attribute":"value"},"default":"on"}}},"template":{"kind":"element","name":"label","attributes":[],"children":[{"kind":"element","name":"input","attributes":[{"kind":"literal","name":"type","value":"checkbox"},{"kind":"literal","name":"role","value":"switch"},{"kind":"property","key":"checked","name":"checked","expression":"internalChecked","expressionPlan":{"source":"internalChecked","ast":{"kind":"id","name":"internalChecked"},"dependencies":["internalChecked"]}},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"required","expression":"required","expressionPlan":{"source":"required","ast":{"kind":"id","name":"required"},"dependencies":["required"]}},{"kind":"attribute","name":"value","expression":"value","expressionPlan":{"source":"value","ast":{"kind":"id","name":"value"},"dependencies":["value"]}}],"children":[],"ref":"input"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label"}],"children":[{"kind":"slot"}]}]},"declarations":[{"kind":"state","name":"internalChecked","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"change","type":"object({ checked: boolean, value: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"label","choices":["label"]}},source:{file:import.meta.url},css:""};
6
+ const definition = {...{"contract":{"tag":"ui-switch","props":{"checked":{"type":"boolean","required":false,"target":{"attribute":"checked"},"default":false},"disabled":{"type":"boolean","required":false,"target":{"attribute":"disabled"},"default":false},"name":{"type":"string","required":false,"target":{"attribute":"name"},"default":""},"required":{"type":"boolean","required":false,"target":{"attribute":"required"},"default":false},"value":{"type":"string","required":false,"target":{"attribute":"value"},"default":"on"}}},"template":{"kind":"element","name":"label","attributes":[],"children":[{"kind":"element","name":"input","attributes":[{"kind":"literal","name":"type","value":"checkbox"},{"kind":"literal","name":"role","value":"switch"},{"kind":"property","key":"checked","name":"checked","expression":"internalChecked","expressionPlan":{"source":"internalChecked","ast":{"kind":"id","name":"internalChecked"},"dependencies":["internalChecked"]}},{"kind":"attribute","name":"disabled","expression":"disabled","expressionPlan":{"source":"disabled","ast":{"kind":"id","name":"disabled"},"dependencies":["disabled"]}},{"kind":"attribute","name":"required","expression":"required","expressionPlan":{"source":"required","ast":{"kind":"id","name":"required"},"dependencies":["required"]}},{"kind":"attribute","name":"name","expression":"name","expressionPlan":{"source":"name","ast":{"kind":"id","name":"name"},"dependencies":["name"]}},{"kind":"attribute","name":"value","expression":"value","expressionPlan":{"source":"value","ast":{"kind":"id","name":"value"},"dependencies":["value"]}}],"children":[],"ref":"input"},{"kind":"element","name":"span","attributes":[{"kind":"literal","name":"class","value":"label"}],"children":[{"kind":"slot"}]}]},"declarations":[{"kind":"state","name":"internalChecked","expression":{"source":"false","ast":{"kind":"literal","value":false},"dependencies":[]}},{"kind":"event","name":"change","type":"object({ checked: boolean, value: string, trigger: keyboard | pointer | programmatic })","bubbles":true,"composed":true,"cancelable":false}],"root":{"kind":"native","element":"label","choices":["label"]}},source:{file:import.meta.url},css:""};
7
7
 
8
8
  export function createUiSwitch(options = {}) {
9
9
  const { attributes = {}, children = [], slots = {}, as, ...componentProps } = options;
@@ -23,9 +23,12 @@ export function createUiSwitch(options = {}) {
23
23
  const value1 = componentProps["required"] === undefined ? false : componentProps["required"];
24
24
  if (value1 === true) element0.setAttribute("required", "");
25
25
  else element0.removeAttribute("required");
26
- const value2 = componentProps["value"] === undefined ? "on" : componentProps["value"];
27
- if (value2 === null || value2 === undefined) element0.removeAttribute("value");
28
- else element0.setAttribute("value", String(value2));
26
+ const value2 = componentProps["name"] === undefined ? "" : componentProps["name"];
27
+ if (value2 === null || value2 === undefined) element0.removeAttribute("name");
28
+ else element0.setAttribute("name", String(value2));
29
+ const value3 = componentProps["value"] === undefined ? "on" : componentProps["value"];
30
+ if (value3 === null || value3 === undefined) element0.removeAttribute("value");
31
+ else element0.setAttribute("value", String(value3));
29
32
  element.append(element0);
30
33
  const element1 = document.createElement("span");
31
34
  element1.setAttribute("class", "label");
@@ -2,6 +2,7 @@ type __VLS_Props = {
2
2
  checked?: boolean;
3
3
  disabled?: boolean;
4
4
  indeterminate?: boolean;
5
+ name?: string;
5
6
  required?: boolean;
6
7
  value?: string;
7
8
  };
@@ -26,6 +27,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
26
27
  "onUpdate:checked"?: ((value: boolean) => any) | undefined;
27
28
  "onUpdate:value"?: ((value: string) => any) | undefined;
28
29
  }>, {
30
+ name: string;
29
31
  value: string;
30
32
  disabled: boolean;
31
33
  checked: boolean;
@@ -11,6 +11,7 @@ const props = withDefaults(
11
11
  checked?: boolean
12
12
  disabled?: boolean
13
13
  indeterminate?: boolean
14
+ name?: string
14
15
  required?: boolean
15
16
  value?: string
16
17
  }>(),
@@ -18,6 +19,7 @@ const props = withDefaults(
18
19
  checked: false,
19
20
  disabled: false,
20
21
  indeterminate: false,
22
+ name: '',
21
23
  required: false,
22
24
  value: 'on',
23
25
  },
@@ -81,6 +83,7 @@ useComponentHost(controllerModule.default, {
81
83
  :indeterminate.prop="indeterminate"
82
84
  :disabled="disabled"
83
85
  :required="required"
86
+ :name="name"
84
87
  :value="value"
85
88
  ref="input"
86
89
  >
@@ -208,6 +208,7 @@ const validation = ref<
208
208
  }
209
209
  >({ status: 'pristine', touched: false, dirty: false, issues: [] })
210
210
  const uid = ref('')
211
+ const submitted = ref('')
211
212
  const groups = ref<
212
213
  {
213
214
  name: string
@@ -455,6 +456,7 @@ const { host, ready } = useComponentHost(controllerModule.default, {
455
456
  lookupError,
456
457
  validation,
457
458
  uid,
459
+ submitted,
458
460
  groups,
459
461
  creatable,
460
462
  createIndex,
@@ -518,13 +520,33 @@ defineExpose({
518
520
  :aria-busy="validationStatus === 'pending'"
519
521
  :value.prop="display"
520
522
  :placeholder="placeholder"
521
- :name="name"
522
523
  :disabled="disabled"
523
524
  :readonly="readonly"
524
- :required="required"
525
+ :required="required && !(multiple && internalItems[0])"
525
526
  ref="input"
526
527
  >
527
- <button v-if="clearable" type="button" data-combobox-action="clear" aria-label="Clear">
528
+ <input
529
+ v-if="name && !multiple"
530
+ type="hidden"
531
+ :name="name"
532
+ :value="submitted"
533
+ :disabled="disabled"
534
+ >
535
+ <template v-if="name && multiple"><input
536
+ v-for="item in internalItems"
537
+ :key="item.id"
538
+ type="hidden"
539
+ :name="name"
540
+ :value="item.value"
541
+ :disabled="disabled"
542
+ ></template>
543
+ <button
544
+ v-if="clearable"
545
+ type="button"
546
+ data-combobox-action="clear"
547
+ aria-label="Clear"
548
+ :disabled="disabled || readonly"
549
+ >
528
550
  <svg
529
551
  class="affordance-icon"
530
552
  aria-hidden="true"
@@ -544,6 +566,7 @@ defineExpose({
544
566
  tabindex="-1"
545
567
  aria-label="Show suggestions"
546
568
  :aria-controls="`${uid}-listbox`"
569
+ :disabled="disabled || readonly"
547
570
  >
548
571
  <svg
549
572
  class="affordance-icon"
@@ -630,7 +653,7 @@ defineExpose({
630
653
  </div>
631
654
  <slot name="footer" />
632
655
  </div>
633
- <div class="message" :id="`${uid}-validation`" :hidden="!validation.issues.length">
656
+ <div class="message" :id="`${uid}-validation`" :hidden="!(validation.issues[0])">
634
657
  <div v-for="(issue, index) in validation.issues" :key="index">{{ issue.message }}</div>
635
658
  </div>
636
659
  <div class="sr-only" role="status" aria-live="polite" aria-atomic="true">{{ statusText }}</div>
@@ -91,6 +91,8 @@ useComponentHost(controllerModule.default, {
91
91
  data-component="ui-radio-group"
92
92
  role="radiogroup"
93
93
  v-bind="$attrs"
94
+ :aria-required="required"
95
+ :disabled="disabled"
94
96
  :data-ui-radio-group-state="hostState || undefined"
95
97
  ref="root"
96
98
  >
@@ -29,6 +29,7 @@ const hostState = computed(() =>
29
29
  type="button"
30
30
  v-bind="$attrs"
31
31
  :disabled="disabled"
32
+ :aria-current="selected"
32
33
  :data-ui-search-result-row-state="hostState || undefined"
33
34
  >
34
35
  <span class="leading"><slot name="leading" /></span>
package/vue/UiSwitch.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  type __VLS_Props = {
2
2
  checked?: boolean;
3
3
  disabled?: boolean;
4
+ name?: string;
4
5
  required?: boolean;
5
6
  value?: string;
6
7
  };
@@ -25,6 +26,7 @@ declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {},
25
26
  "onUpdate:checked"?: ((value: boolean) => any) | undefined;
26
27
  "onUpdate:value"?: ((value: string) => any) | undefined;
27
28
  }>, {
29
+ name: string;
28
30
  value: string;
29
31
  disabled: boolean;
30
32
  checked: boolean;
package/vue/UiSwitch.vue CHANGED
@@ -10,12 +10,14 @@ const props = withDefaults(
10
10
  defineProps<{
11
11
  checked?: boolean
12
12
  disabled?: boolean
13
+ name?: string
13
14
  required?: boolean
14
15
  value?: string
15
16
  }>(),
16
17
  {
17
18
  checked: false,
18
19
  disabled: false,
20
+ name: '',
19
21
  required: false,
20
22
  value: 'on',
21
23
  },
@@ -79,6 +81,7 @@ useComponentHost(controllerModule.default, {
79
81
  :checked.prop="internalChecked"
80
82
  :disabled="disabled"
81
83
  :required="required"
84
+ :name="name"
82
85
  :value="value"
83
86
  ref="input"
84
87
  >
@@ -9,6 +9,7 @@ var _hoisted_2 = [
9
9
  ".indeterminate",
10
10
  "disabled",
11
11
  "required",
12
+ "name",
12
13
  "value"
13
14
  ];
14
15
  var _hoisted_3 = { class: "label" };
@@ -30,6 +31,7 @@ var UiCheckbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
30
31
  type: Boolean,
31
32
  default: false
32
33
  },
34
+ name: { default: "" },
33
35
  required: {
34
36
  type: Boolean,
35
37
  default: false
@@ -76,11 +78,12 @@ var UiCheckbox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
76
78
  ".indeterminate": __props.indeterminate,
77
79
  disabled: __props.disabled,
78
80
  required: __props.required,
81
+ name: __props.name,
79
82
  value: __props.value,
80
83
  ref: "input"
81
84
  }, null, 40, _hoisted_2), createElementVNode("span", _hoisted_3, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])], 16, _hoisted_1);
82
85
  };
83
86
  }
84
- }), [["__scopeId", "data-v-964081a0"]]);
87
+ }), [["__scopeId", "data-v-44d93832"]]);
85
88
  //#endregion
86
89
  export { UiCheckbox_default as t };
@@ -25,50 +25,54 @@ var _hoisted_6 = [
25
25
  "aria-busy",
26
26
  ".value",
27
27
  "placeholder",
28
- "name",
29
28
  "disabled",
30
29
  "readonly",
31
30
  "required"
32
31
  ];
33
- var _hoisted_7 = {
34
- key: 1,
35
- type: "button",
36
- "data-combobox-action": "clear",
37
- "aria-label": "Clear"
38
- };
39
- var _hoisted_8 = ["aria-controls"];
40
- var _hoisted_9 = ["id", "disabled"];
41
- var _hoisted_10 = ["hidden"];
42
- var _hoisted_11 = [
32
+ var _hoisted_7 = [
33
+ "name",
34
+ "value",
35
+ "disabled"
36
+ ];
37
+ var _hoisted_8 = [
38
+ "name",
39
+ "value",
40
+ "disabled"
41
+ ];
42
+ var _hoisted_9 = ["disabled"];
43
+ var _hoisted_10 = ["aria-controls", "disabled"];
44
+ var _hoisted_11 = ["id", "disabled"];
45
+ var _hoisted_12 = ["hidden"];
46
+ var _hoisted_13 = [
43
47
  "id",
44
48
  "aria-label",
45
49
  "aria-busy"
46
50
  ];
47
- var _hoisted_12 = ["role", "aria-label"];
48
- var _hoisted_13 = {
51
+ var _hoisted_14 = ["role", "aria-label"];
52
+ var _hoisted_15 = {
49
53
  key: 0,
50
54
  class: "group"
51
55
  };
52
- var _hoisted_14 = [
56
+ var _hoisted_16 = [
53
57
  "id",
54
58
  "aria-selected",
55
59
  "aria-disabled",
56
60
  "data-index"
57
61
  ];
58
- var _hoisted_15 = { class: "primary" };
59
- var _hoisted_16 = ["id", "data-index"];
60
- var _hoisted_17 = {
62
+ var _hoisted_17 = { class: "primary" };
63
+ var _hoisted_18 = ["id", "data-index"];
64
+ var _hoisted_19 = {
61
65
  key: 1,
62
66
  class: "message"
63
67
  };
64
- var _hoisted_18 = ["id", "hidden"];
65
- var _hoisted_19 = {
68
+ var _hoisted_20 = ["id", "hidden"];
69
+ var _hoisted_21 = {
66
70
  class: "sr-only",
67
71
  role: "status",
68
72
  "aria-live": "polite",
69
73
  "aria-atomic": "true"
70
74
  };
71
- var _hoisted_20 = {
75
+ var _hoisted_22 = {
72
76
  class: "authored-options",
73
77
  hidden: "",
74
78
  "aria-hidden": "true",
@@ -162,6 +166,7 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
162
166
  issues: []
163
167
  });
164
168
  const uid = ref("");
169
+ const submitted = ref("");
165
170
  const groups = ref([]);
166
171
  const creatable = ref(false);
167
172
  const createIndex = ref(0);
@@ -280,6 +285,7 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
280
285
  lookupError,
281
286
  validation,
282
287
  uid,
288
+ submitted,
283
289
  groups,
284
290
  creatable,
285
291
  createIndex,
@@ -335,13 +341,34 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
335
341
  "aria-busy": validationStatus.value === "pending",
336
342
  ".value": display.value,
337
343
  placeholder: __props.placeholder,
338
- name: __props.name,
339
344
  disabled: __props.disabled,
340
345
  readonly: __props.readonly,
341
- required: __props.required,
346
+ required: __props.required && !(__props.multiple && internalItems.value[0]),
342
347
  ref: "input"
343
348
  }, null, 40, _hoisted_6),
344
- __props.clearable ? (openBlock(), createElementBlock("button", _hoisted_7, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
349
+ __props.name && !__props.multiple ? (openBlock(), createElementBlock("input", {
350
+ key: 1,
351
+ type: "hidden",
352
+ name: __props.name,
353
+ value: submitted.value,
354
+ disabled: __props.disabled
355
+ }, null, 8, _hoisted_7)) : createCommentVNode("v-if", true),
356
+ __props.name && __props.multiple ? (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(internalItems.value, (item) => {
357
+ return openBlock(), createElementBlock("input", {
358
+ key: item.id,
359
+ type: "hidden",
360
+ name: __props.name,
361
+ value: item.value,
362
+ disabled: __props.disabled
363
+ }, null, 8, _hoisted_8);
364
+ }), 128)) : createCommentVNode("v-if", true),
365
+ __props.clearable ? (openBlock(), createElementBlock("button", {
366
+ key: 3,
367
+ type: "button",
368
+ "data-combobox-action": "clear",
369
+ "aria-label": "Clear",
370
+ disabled: __props.disabled || __props.readonly
371
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("svg", {
345
372
  class: "affordance-icon",
346
373
  "aria-hidden": "true",
347
374
  viewBox: "0 0 24 24",
@@ -349,14 +376,15 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
349
376
  stroke: "currentColor",
350
377
  "stroke-width": "2",
351
378
  "stroke-linecap": "round"
352
- }, [createElementVNode("path", { d: "M7 7l10 10M17 7 7 17" })], -1)])])) : createCommentVNode("v-if", true),
379
+ }, [createElementVNode("path", { d: "M7 7l10 10M17 7 7 17" })], -1)])], 8, _hoisted_9)) : createCommentVNode("v-if", true),
353
380
  __props.disclosure ? (openBlock(), createElementBlock("button", {
354
- key: 2,
381
+ key: 4,
355
382
  type: "button",
356
383
  "data-combobox-action": "disclosure",
357
384
  tabindex: "-1",
358
385
  "aria-label": "Show suggestions",
359
- "aria-controls": `${uid.value}-listbox`
386
+ "aria-controls": `${uid.value}-listbox`,
387
+ disabled: __props.disabled || __props.readonly
360
388
  }, [..._cache[1] || (_cache[1] = [createElementVNode("svg", {
361
389
  class: "affordance-icon",
362
390
  "aria-hidden": "true",
@@ -366,7 +394,7 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
366
394
  "stroke-width": "2.25",
367
395
  "stroke-linecap": "round",
368
396
  "stroke-linejoin": "round"
369
- }, [createElementVNode("path", { d: "m6 9 6 6 6-6" })], -1)])], 8, _hoisted_8)) : createCommentVNode("v-if", true)
397
+ }, [createElementVNode("path", { d: "m6 9 6 6 6-6" })], -1)])], 8, _hoisted_10)) : createCommentVNode("v-if", true)
370
398
  ], 512), __props.help ? (openBlock(), createElementBlock("button", {
371
399
  key: 0,
372
400
  class: "help",
@@ -391,7 +419,7 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
391
419
  }),
392
420
  createElementVNode("path", { d: "M9.1 9a3 3 0 0 1 5.8 1c0 2-3 3-3 3" }),
393
421
  createElementVNode("path", { d: "M12 17h.01" })
394
- ], -1)])], 8, _hoisted_9)) : createCommentVNode("v-if", true)]),
422
+ ], -1)])], 8, _hoisted_11)) : createCommentVNode("v-if", true)]),
395
423
  __props.help ? (openBlock(), createBlock(UiTooltip_default, {
396
424
  key: 0,
397
425
  trigger: "click",
@@ -417,7 +445,7 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
417
445
  key: group.name,
418
446
  role: group.role,
419
447
  "aria-label": group.label ?? void 0
420
- }, [group.name ? (openBlock(), createElementBlock("div", _hoisted_13, toDisplayString(group.name), 1)) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(group.rows, (row) => {
448
+ }, [group.name ? (openBlock(), createElementBlock("div", _hoisted_15, toDisplayString(group.name), 1)) : createCommentVNode("v-if", true), (openBlock(true), createElementBlock(Fragment, null, renderList(group.rows, (row) => {
421
449
  return openBlock(), createElementBlock("div", {
422
450
  key: row.id,
423
451
  class: normalizeClass(["option", { active: row.index === active.value }]),
@@ -426,8 +454,8 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
426
454
  "aria-selected": row.selected,
427
455
  "aria-disabled": row.disabled,
428
456
  "data-index": row.index
429
- }, [renderSlot(_ctx.$slots, `option-${row.id}`, {}, () => [createElementVNode("span", _hoisted_15, toDisplayString(row.label), 1)], true)], 10, _hoisted_14);
430
- }), 128))], 8, _hoisted_12);
457
+ }, [renderSlot(_ctx.$slots, `option-${row.id}`, {}, () => [createElementVNode("span", _hoisted_17, toDisplayString(row.label), 1)], true)], 10, _hoisted_16);
458
+ }), 128))], 8, _hoisted_14);
431
459
  }), 128)),
432
460
  creatable.value ? (openBlock(), createElementBlock("div", {
433
461
  key: 0,
@@ -436,21 +464,21 @@ var UiCombobox_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__P
436
464
  "aria-selected": "false",
437
465
  id: `${uid.value}-option-${createIndex.value}`,
438
466
  "data-index": createIndex.value
439
- }, toDisplayString(`Create “${raw.value}”`), 11, _hoisted_16)) : createCommentVNode("v-if", true),
440
- message.value ? (openBlock(), createElementBlock("div", _hoisted_17, toDisplayString(message.value), 1)) : createCommentVNode("v-if", true)
441
- ], 8, _hoisted_11), renderSlot(_ctx.$slots, "footer", {}, void 0, true)], 8, _hoisted_10),
467
+ }, toDisplayString(`Create “${raw.value}”`), 11, _hoisted_18)) : createCommentVNode("v-if", true),
468
+ message.value ? (openBlock(), createElementBlock("div", _hoisted_19, toDisplayString(message.value), 1)) : createCommentVNode("v-if", true)
469
+ ], 8, _hoisted_13), renderSlot(_ctx.$slots, "footer", {}, void 0, true)], 8, _hoisted_12),
442
470
  createElementVNode("div", {
443
471
  class: "message",
444
472
  id: `${uid.value}-validation`,
445
- hidden: !validation.value.issues.length
473
+ hidden: !validation.value.issues[0]
446
474
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(validation.value.issues, (issue, index) => {
447
475
  return openBlock(), createElementBlock("div", { key: index }, toDisplayString(issue.message), 1);
448
- }), 128))], 8, _hoisted_18),
449
- createElementVNode("div", _hoisted_19, toDisplayString(statusText.value), 1),
450
- createElementVNode("div", _hoisted_20, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 512)
476
+ }), 128))], 8, _hoisted_20),
477
+ createElementVNode("div", _hoisted_21, toDisplayString(statusText.value), 1),
478
+ createElementVNode("div", _hoisted_22, [renderSlot(_ctx.$slots, "default", {}, void 0, true)], 512)
451
479
  ], 16, _hoisted_1);
452
480
  };
453
481
  }
454
- }), [["__scopeId", "data-v-3b8b0ecf"]]);
482
+ }), [["__scopeId", "data-v-cd33b9b7"]]);
455
483
  //#endregion
456
484
  export { UiCombobox_default as t };
@@ -3,7 +3,11 @@ import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-hel
3
3
  import { computed, createElementBlock, createElementVNode, defineComponent, mergeProps, openBlock, ref, renderSlot, toDisplayString } from "vue";
4
4
  import * as controllerModule from "@threadlabs/looma/components/ui-radio-group/ui-radio-group.js";
5
5
  //#region .build/vue/UiRadioGroup.vue?vue&type=script&setup=true&lang.ts
6
- var _hoisted_1 = ["data-ui-radio-group-state"];
6
+ var _hoisted_1 = [
7
+ "aria-required",
8
+ "disabled",
9
+ "data-ui-radio-group-state"
10
+ ];
7
11
  //#endregion
8
12
  //#region .build/vue/UiRadioGroup.vue
9
13
  var UiRadioGroup_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
@@ -63,12 +67,14 @@ var UiRadioGroup_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @_
63
67
  "data-component": "ui-radio-group",
64
68
  role: "radiogroup"
65
69
  }, _ctx.$attrs, {
70
+ "aria-required": __props.required,
71
+ disabled: __props.disabled,
66
72
  "data-ui-radio-group-state": hostState.value || void 0,
67
73
  ref_key: "root",
68
74
  ref: root
69
75
  }), [createElementVNode("legend", null, toDisplayString(__props.label), 1), renderSlot(_ctx.$slots, "default", {}, void 0, true)], 16, _hoisted_1);
70
76
  };
71
77
  }
72
- }), [["__scopeId", "data-v-cd639df6"]]);
78
+ }), [["__scopeId", "data-v-f54344c6"]]);
73
79
  //#endregion
74
80
  export { UiRadioGroup_default as t };
@@ -1,7 +1,11 @@
1
1
  import { t as _plugin_vue_export_helper_default } from "./_plugin-vue_export-helper.js";
2
2
  import { computed, createElementBlock, createElementVNode, defineComponent, mergeProps, openBlock, renderSlot } from "vue";
3
3
  //#region .build/vue/UiSearchResultRow.vue?vue&type=script&setup=true&lang.ts
4
- var _hoisted_1 = ["disabled", "data-ui-search-result-row-state"];
4
+ var _hoisted_1 = [
5
+ "disabled",
6
+ "aria-current",
7
+ "data-ui-search-result-row-state"
8
+ ];
5
9
  var _hoisted_2 = { class: "leading" };
6
10
  var _hoisted_3 = { class: "content" };
7
11
  var _hoisted_4 = { class: "title" };
@@ -33,6 +37,7 @@ var UiSearchResultRow_default = /*#__PURE__*/ _plugin_vue_export_helper_default(
33
37
  type: "button"
34
38
  }, _ctx.$attrs, {
35
39
  disabled: __props.disabled,
40
+ "aria-current": __props.selected,
36
41
  "data-ui-search-result-row-state": hostState.value || void 0
37
42
  }), [
38
43
  createElementVNode("span", _hoisted_2, [renderSlot(_ctx.$slots, "leading")]),
@@ -45,6 +50,6 @@ var UiSearchResultRow_default = /*#__PURE__*/ _plugin_vue_export_helper_default(
45
50
  ], 16, _hoisted_1);
46
51
  };
47
52
  }
48
- }), [["__scopeId", "data-v-9f29c4b0"]]);
53
+ }), [["__scopeId", "data-v-c2562cce"]]);
49
54
  //#endregion
50
55
  export { UiSearchResultRow_default as t };
@@ -8,6 +8,7 @@ var _hoisted_2 = [
8
8
  ".checked",
9
9
  "disabled",
10
10
  "required",
11
+ "name",
11
12
  "value"
12
13
  ];
13
14
  var _hoisted_3 = { class: "label" };
@@ -25,6 +26,7 @@ var UiSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
25
26
  type: Boolean,
26
27
  default: false
27
28
  },
29
+ name: { default: "" },
28
30
  required: {
29
31
  type: Boolean,
30
32
  default: false
@@ -71,11 +73,12 @@ var UiSwitch_default = /*#__PURE__*/ _plugin_vue_export_helper_default(/* @__PUR
71
73
  ".checked": internalChecked.value,
72
74
  disabled: __props.disabled,
73
75
  required: __props.required,
76
+ name: __props.name,
74
77
  value: __props.value,
75
78
  ref: "input"
76
79
  }, null, 40, _hoisted_2), createElementVNode("span", _hoisted_3, [renderSlot(_ctx.$slots, "default", {}, void 0, true)])], 16, _hoisted_1);
77
80
  };
78
81
  }
79
- }), [["__scopeId", "data-v-529fe437"]]);
82
+ }), [["__scopeId", "data-v-aeb44053"]]);
80
83
  //#endregion
81
84
  export { UiSwitch_default as t };