@nysds/nys-combobox 1.21.0 → 1.22.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.
- package/dist/nys-combobox.d.ts +51 -6
- package/dist/nys-combobox.js +180 -164
- package/dist/nys-combobox.js.map +1 -1
- package/package.json +8 -8
package/dist/nys-combobox.d.ts
CHANGED
|
@@ -3,6 +3,25 @@ import "@nysds/nys-label";
|
|
|
3
3
|
import "@nysds/nys-errormessage";
|
|
4
4
|
import "@nysds/nys-icon";
|
|
5
5
|
import "@nysds/nys-button";
|
|
6
|
+
/** Detail payload for the `nys-input` event. */
|
|
7
|
+
export interface NysComboboxInputDetail {
|
|
8
|
+
id: string;
|
|
9
|
+
name: string;
|
|
10
|
+
/** The committed value (the selected option's value), not the filter text. */
|
|
11
|
+
value: string;
|
|
12
|
+
/** The raw filter text the user has typed. */
|
|
13
|
+
query: string;
|
|
14
|
+
}
|
|
15
|
+
/** The `nys-input` event, fired on each keystroke while filtering. */
|
|
16
|
+
export type NysComboboxInputEvent = CustomEvent<NysComboboxInputDetail>;
|
|
17
|
+
/** Detail payload for the `nys-change` event. */
|
|
18
|
+
export interface NysComboboxChangeDetail {
|
|
19
|
+
id: string;
|
|
20
|
+
name: string;
|
|
21
|
+
value: string;
|
|
22
|
+
}
|
|
23
|
+
/** The `nys-change` event, fired when a selection is committed. */
|
|
24
|
+
export type NysComboboxChangeEvent = CustomEvent<NysComboboxChangeDetail>;
|
|
6
25
|
/**
|
|
7
26
|
* `<nys-combobox>` is a form-enabled combo box combining text input with a filterable dropdown.
|
|
8
27
|
*
|
|
@@ -19,11 +38,21 @@ import "@nysds/nys-button";
|
|
|
19
38
|
* @slot description - Optional custom description content below the label.
|
|
20
39
|
* @slot default - Options (<option>, <optgroup>) to populate the dropdown
|
|
21
40
|
*
|
|
22
|
-
* @
|
|
23
|
-
*
|
|
24
|
-
* @fires nys-
|
|
25
|
-
* @fires nys-
|
|
41
|
+
* @formControl value nys-change nys-input
|
|
42
|
+
*
|
|
43
|
+
* @fires {NysComboboxChangeEvent} nys-change - Fired when a selection is committed (option chosen or cleared). Detail: `{id, name, value}`.
|
|
44
|
+
* @fires {NysComboboxInputEvent} nys-input - Fired on each keystroke while filtering. Detail: `{id, name, value, query}`. `value` is the committed value; `query` is the current filter text.
|
|
45
|
+
* @fires {Event} nys-focus - Fired when the combobox gains focus.
|
|
46
|
+
* @fires {Event} nys-blur - Fired when the combobox loses focus. Triggers validation.
|
|
47
|
+
*
|
|
48
|
+
* @usagedos
|
|
49
|
+
* - Use when there are more than 15 options to choose from.
|
|
50
|
+
* - Use when screen real estate is limited.
|
|
51
|
+
* - Use when users can predict or recognize the value they're looking for.
|
|
26
52
|
*
|
|
53
|
+
* @usagedonts
|
|
54
|
+
* - Use when the number of options is small. Use `<nys-select>` or `<nys-radiobutton>` instead.
|
|
55
|
+
* - Use when options are unfamiliar to users and browsing the full list is necessary.
|
|
27
56
|
*
|
|
28
57
|
* @example Basic
|
|
29
58
|
* ```html
|
|
@@ -153,7 +182,7 @@ import "@nysds/nys-button";
|
|
|
153
182
|
* <option value="orange">Orange</option>
|
|
154
183
|
* <option value="strawberry">Strawberry</option>
|
|
155
184
|
* </nys-combobox>
|
|
156
|
-
* ```
|
|
185
|
+
* ```
|
|
157
186
|
*
|
|
158
187
|
* @example Description Slot
|
|
159
188
|
* ```html
|
|
@@ -198,19 +227,36 @@ export declare class NysCombobox extends NysFormControlElement {
|
|
|
198
227
|
serializable?: boolean;
|
|
199
228
|
slotAssignment?: SlotAssignmentMode;
|
|
200
229
|
};
|
|
230
|
+
/** Unique identifier. Auto-generated if not provided. */
|
|
201
231
|
id: string;
|
|
232
|
+
/** Name for form submission. */
|
|
202
233
|
name: string;
|
|
234
|
+
/** Visible label text. Required for accessibility. */
|
|
203
235
|
label: string;
|
|
236
|
+
/** Helper text below label. Use slot for custom HTML. */
|
|
204
237
|
description: string;
|
|
238
|
+
/** Current committed value: the selected option's value, not the typed filter text. */
|
|
205
239
|
value: string;
|
|
240
|
+
/** Prevents interaction. */
|
|
206
241
|
disabled: boolean;
|
|
242
|
+
/** Marks as required. Shows "Required" flag and validates on blur. */
|
|
207
243
|
required: boolean;
|
|
244
|
+
/** Shows "Optional" flag. Use when most fields are required. */
|
|
208
245
|
optional: boolean;
|
|
246
|
+
/** Tooltip text shown on hover/focus of info icon. */
|
|
209
247
|
tooltip: string;
|
|
248
|
+
/** Form `id` to associate with when the combobox is outside the form element. */
|
|
210
249
|
form: string | null;
|
|
250
|
+
/**
|
|
251
|
+
* Input width: `md` (200px), `lg` (384px), `full` (100%, default).
|
|
252
|
+
* @default "full"
|
|
253
|
+
*/
|
|
211
254
|
width: "md" | "lg" | "full";
|
|
255
|
+
/** Adjusts colors for dark backgrounds. */
|
|
212
256
|
inverted: boolean;
|
|
257
|
+
/** Shows error message when true. Set by validation or manually. */
|
|
213
258
|
showError: boolean;
|
|
259
|
+
/** Error message text. Shown only when `showError` is true. Never overwritten by internal validation. */
|
|
214
260
|
errorMessage: string;
|
|
215
261
|
private _isOpen;
|
|
216
262
|
private _filterText;
|
|
@@ -221,7 +267,6 @@ export declare class NysCombobox extends NysFormControlElement {
|
|
|
221
267
|
private _announcement;
|
|
222
268
|
private _input;
|
|
223
269
|
private _listbox?;
|
|
224
|
-
private _originalErrorMessage;
|
|
225
270
|
private _hasUserInteracted;
|
|
226
271
|
private _selectedLabel;
|
|
227
272
|
private _defaultValue;
|
package/dist/nys-combobox.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { LitElement as
|
|
2
|
-
import { property as
|
|
1
|
+
import { LitElement as x, unsafeCSS as k, html as p } from "lit";
|
|
2
|
+
import { property as d, state as u, query as g } from "lit/decorators.js";
|
|
3
3
|
import { ifDefined as y } from "lit/directives/if-defined.js";
|
|
4
4
|
import "@nysds/nys-label";
|
|
5
5
|
import "@nysds/nys-errormessage";
|
|
@@ -10,46 +10,57 @@ import "@nysds/nys-button";
|
|
|
10
10
|
* █ █ █ █▄▄▄█ ▀▀▀▄▄ █ █ ▀▀▀▄▄
|
|
11
11
|
* █ ▀█ █ █▄▄▄█ █▄▄▀ █▄▄▄█
|
|
12
12
|
*
|
|
13
|
-
* Combobox Component v1.
|
|
13
|
+
* Combobox Component v1.22.0
|
|
14
14
|
* Part of the New York State Design System
|
|
15
15
|
* Repository: https://github.com/its-hcd/nysds
|
|
16
16
|
* License: MIT
|
|
17
17
|
*/
|
|
18
18
|
/*!
|
|
19
|
-
* New York State Design System v1.
|
|
19
|
+
* New York State Design System v1.22.0
|
|
20
20
|
* Description: A design system for New York State's digital products.
|
|
21
21
|
* Repository: https://github.com/its-hcd/nysds
|
|
22
22
|
* License: MIT
|
|
23
23
|
*/
|
|
24
|
-
|
|
25
|
-
function
|
|
26
|
-
return `${
|
|
24
|
+
let $ = 0;
|
|
25
|
+
function O(l) {
|
|
26
|
+
return `${l}-${Date.now()}-${$++}`;
|
|
27
27
|
}
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
function v(l, o, s) {
|
|
29
|
+
l.dispatchEvent(
|
|
30
|
+
new CustomEvent(o, { detail: s, bubbles: !0, composed: !0 })
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
function m(l, o) {
|
|
34
|
+
l.dispatchEvent(
|
|
35
|
+
new Event(`nys-${o}`, { bubbles: !0, composed: !0 })
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
const V = (l) => {
|
|
39
|
+
class o extends l {
|
|
30
40
|
get idPrefix() {
|
|
31
41
|
return this.localName || "nys-element";
|
|
32
42
|
}
|
|
33
43
|
ensureId() {
|
|
34
|
-
this.id || (this.id =
|
|
44
|
+
this.id || (this.id = O(this.idPrefix));
|
|
35
45
|
}
|
|
36
46
|
connectedCallback() {
|
|
37
47
|
super.connectedCallback(), this.ensureId();
|
|
38
48
|
}
|
|
39
49
|
}
|
|
40
50
|
return o;
|
|
41
|
-
},
|
|
42
|
-
class o extends
|
|
43
|
-
constructor(
|
|
44
|
-
super(...
|
|
51
|
+
}, I = (l) => {
|
|
52
|
+
class o extends V(l) {
|
|
53
|
+
constructor() {
|
|
54
|
+
super(...arguments), this.__internals = null;
|
|
45
55
|
}
|
|
46
56
|
get internals() {
|
|
47
57
|
if (this.__internals) return this.__internals;
|
|
48
|
-
if (typeof this.attachInternals == "function")
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
58
|
+
if (typeof this.attachInternals == "function")
|
|
59
|
+
try {
|
|
60
|
+
this.__internals = this.attachInternals();
|
|
61
|
+
} catch {
|
|
62
|
+
this.__internals = null;
|
|
63
|
+
}
|
|
53
64
|
return this.__internals;
|
|
54
65
|
}
|
|
55
66
|
get defaultRole() {
|
|
@@ -61,8 +72,8 @@ var $ = (d) => {
|
|
|
61
72
|
i[e] = t;
|
|
62
73
|
return;
|
|
63
74
|
}
|
|
64
|
-
const
|
|
65
|
-
t === null ? this.removeAttribute(
|
|
75
|
+
const n = C(e);
|
|
76
|
+
t === null ? this.removeAttribute(n) : this.setAttribute(n, t);
|
|
66
77
|
}
|
|
67
78
|
reflectDefaultSemantics() {
|
|
68
79
|
const e = this.defaultRole;
|
|
@@ -74,21 +85,33 @@ var $ = (d) => {
|
|
|
74
85
|
}
|
|
75
86
|
return o;
|
|
76
87
|
};
|
|
77
|
-
function
|
|
78
|
-
if (
|
|
79
|
-
const o =
|
|
88
|
+
function C(l) {
|
|
89
|
+
if (l === "role") return "role";
|
|
90
|
+
const o = l.replace(/^aria/, "");
|
|
80
91
|
return "aria-" + o.charAt(0).toLowerCase() + o.slice(1);
|
|
81
92
|
}
|
|
82
|
-
|
|
83
|
-
const
|
|
93
|
+
const E = (l) => {
|
|
94
|
+
const o = class extends I(l) {
|
|
95
|
+
constructor() {
|
|
96
|
+
super(...arguments), this.__internalValidationMessage = "";
|
|
97
|
+
}
|
|
98
|
+
get internalValidationMessage() {
|
|
99
|
+
return this.__internalValidationMessage;
|
|
100
|
+
}
|
|
101
|
+
set internalValidationMessage(t) {
|
|
102
|
+
t !== this.__internalValidationMessage && (this.__internalValidationMessage = t, this.requestUpdate("internalValidationMessage"));
|
|
103
|
+
}
|
|
104
|
+
resolvedErrorMessage() {
|
|
105
|
+
return this.errorMessage || this.internalValidationMessage;
|
|
106
|
+
}
|
|
84
107
|
setFormValue(t) {
|
|
85
108
|
this.internals?.setFormValue(t ?? null);
|
|
86
109
|
}
|
|
87
|
-
setValidityFromState(t, i,
|
|
110
|
+
setValidityFromState(t, i, n) {
|
|
88
111
|
const c = this.internals;
|
|
89
112
|
if (!c) return;
|
|
90
113
|
const h = Object.values(t).some(Boolean);
|
|
91
|
-
h ? c.setValidity(t, i ?? "Invalid value",
|
|
114
|
+
h ? c.setValidity(t, i ?? "Invalid value", n) : c.setValidity({}), this.setHostAria("ariaInvalid", h ? "true" : "false");
|
|
92
115
|
}
|
|
93
116
|
clearValidity() {
|
|
94
117
|
this.internals?.setValidity({}), this.setHostAria("ariaInvalid", "false");
|
|
@@ -100,22 +123,19 @@ var V = (d) => {
|
|
|
100
123
|
return this.internals?.reportValidity() ?? !0;
|
|
101
124
|
}
|
|
102
125
|
formResetCallback() {
|
|
103
|
-
this.clearValidity();
|
|
126
|
+
this.internalValidationMessage = "", this.clearValidity();
|
|
104
127
|
}
|
|
105
128
|
};
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
for (var t = void 0, i = d.length - 1, r; i >= 0; i--)
|
|
113
|
-
(r = d[i]) && (t = r(o, s, t) || t);
|
|
114
|
-
return t && D(o, s, t), t;
|
|
129
|
+
return o.formAssociated = !0, o;
|
|
130
|
+
}, D = /* @__PURE__ */ E(x), M = ':host{--_nys-combobox-width: 100%;--_nys-combobox-height: var(--nys-size-500, 40px);--_nys-combobox-border-radius: var(--nys-radius-md, 4px);--_nys-combobox-border-width: var(--nys-border-width-sm, 1px);--_nys-combobox-border-color: var(--nys-color-neutral-400, #909395);--_nys-combobox-color: var( --nys-color-text, var(--nys-color-neutral-900, #1b1b1b) );--_nys-combobox-padding: var(--nys-space-100, 8px) var(--nys-space-150, 12px);--_nys-combobox-gap: var(--nys-space-50, 4px);--_nys-combobox-background-color: var( --nys-color-ink-reverse, var(--nys-color-white, #ffffff) );--_nys-combobox-outline-color--hover: var(--nys-color-neutral-900, #1b1b1b);--_nys-combobox-outline-width: var(--nys-border-width-sm, 1px);--_nys-combobox-outline-color--focus: var(--nys-color-focus, #004dd1);--_nys-combobox-background-color--disabled: var( --nys-color-neutral-10, #f6f6f6 );--_nys-combobox-border-color--disabled: var(--nys-color-neutral-200, #bec0c1);--_nys-combobox-color--disabled: var( --nys-color-text-disabled, var(--nys-color-neutral-200, #bec0c1) );--_nys-combobox-background-color--dropdown: var( --nys-color-ink-reverse, var(--nys-color-white, #ffffff) );--_nys-combobox-border-color--dropdown: var(--nys-color-neutral-400, #909395);--_nys-combobox-shadow--dropdown: var( --nys-shadow-lg, 0 4px 8px rgba(0, 0, 0, .1) );--_nys-combobox-max-height--dropdown: var(--nys-size-3000, 300px);--_nys-combobox-padding--option: var(--nys-space-100, 8px) var(--nys-space-150, 12px);--_nys-combobox-background-color--option--hover: var( --nys-color-neutral-10, #f6f6f6 );--_nys-combobox-background-color--option--active: var( --nys-color-neutral-50, #ededed );--_nys-combobox-background-color--option--disabled: var( --nys-color-white, #ffffff );--_nys-combobox-color--option--disabled: var( --nys-color-text-disabled, #bec0c1 );--_nys-combobox-background-color--option--selected: var( --nys-theme-weaker, #eff6fb );--_nys-combobox-border-color--option--selected: var( --nys-color-theme-mid, #457aa5 );--_nys-combobox-font-family: var( --nys-font-family-ui, var( --nys-font-family-sans, "Proxima Nova", "Helvetica Neue", "Helvetica", "Arial", sans-serif ) );--_nys-combobox-font-size: var(--nys-font-size-ui-md, 16px);--_nys-combobox-font-weight: var(--nys-font-weight-regular, 400);--_nys-combobox-line-height: var(--nys-font-lineheight-ui-md, 24px);--_nys-combobox-letter-spacing: var( --nys-font-letterspacing-ui-md, var(--nys-font-letterspacing-400, .044px) )}:host([width=sm]){--_nys-combobox-width: var(--nys-form-width-sm, 88px)}:host([width=md]){--_nys-combobox-width: var(--nys-form-width-md, 200px)}:host([width=lg]){--_nys-combobox-width: var(--nys-form-width-lg, 384px)}:host([width=full]){--_nys-combobox-width: 100%;flex:1}:host([showError]){--_nys-combobox-border-color: var(--nys-color-danger, #b52c2c)}:host([inverted]){--_nys-combobox-outline-color--focus: var(--nys-color-focus-reverse, #7aa5e7)}.nys-combobox{font-weight:var(--_nys-combobox-font-weight);font-family:var(--_nys-combobox-font-family);font-size:var(--_nys-combobox-font-size);line-height:var(--_nys-combobox-line-height);letter-spacing:var(--_nys-combobox-letter-spacing);color:var(--_nys-combobox-color);gap:var(--_nys-combobox-gap);display:flex;flex-direction:column;position:relative}.nys-combobox__container{width:var(--_nys-combobox-width);max-width:100%;position:relative}.nys-combobox__input-wrapper{position:relative;display:flex;align-items:center;background-color:var(--_nys-combobox-background-color);border-radius:var(--_nys-combobox-border-radius)}.nys-combobox__input{color:var(--_nys-combobox-color);border-radius:var(--_nys-combobox-border-radius);border:solid var(--_nys-combobox-border-color) var(--_nys-combobox-border-width);outline-color:transparent;outline-width:var(--_nys-combobox-outline-width);outline-style:solid;padding:var(--_nys-combobox-padding);padding-right:calc(var(--nys-size-400, 32px) + var(--nys-space-100, 8px));width:100%;height:var(--_nys-combobox-height);box-sizing:border-box;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;background-color:transparent;font:inherit;cursor:text}.nys-combobox__input:not(:placeholder-shown){padding-right:calc(var(--nys-size-400, 32px) * 2 + var(--nys-space-100, 8px))}.nys-combobox__input:hover:not(:disabled):not(:focus):not([readonly]){outline-color:var(--_nys-combobox-outline-color--hover);border-color:var(--_nys-combobox-outline-color--hover)}.nys-combobox__input:focus:not([readonly]){outline-color:var(--_nys-combobox-outline-color--focus);border-color:var(--_nys-combobox-outline-color--focus);caret-color:var(--_nys-combobox-outline-color--focus)}.nys-combobox__input:disabled{background-color:var(--_nys-combobox-background-color--disabled);border-color:var(--_nys-combobox-border-color--disabled);color:var(--_nys-combobox-color--disabled);cursor:not-allowed}.nys-combobox__buttons{display:flex;position:absolute;right:var(--nys-space-150, 12px);gap:var(--nys-space-150, 12px)}.nys-combobox__buttons nys-button{--_nys-button-padding--y: var(--nys-space-50, 4px);--_nys-button-padding--x: var(--nys-space-50, 4px);--_nys-button-height: var(--nys-size-300, 32px);--_nys-button-width: var(--nys-size-400, 32px)}.nys-combobox__buttons .nys-combobox__chevron{border-inline-start:solid var(--nys-color-neutral-200, #bec0c1) var(--nys-border-width-sm, 1px);padding-inline-start:var(--nys-space-150, 12px)}.nys-combobox__listbox{position:absolute;left:0;right:0;top:calc(100% + var(--nys-space-50, 4px));background-color:var(--_nys-combobox-background-color--dropdown);border:solid var(--_nys-combobox-border-color--dropdown) var(--_nys-combobox-border-width);border-radius:var(--_nys-combobox-border-radius);box-shadow:var(--_nys-combobox-shadow--dropdown);max-height:var(--_nys-combobox-max-height--dropdown);overflow-y:auto;z-index:1000;box-sizing:border-box}.nys-combobox__listbox--above{top:auto;bottom:calc(100% + var(--nys-space-50, 4px))}.nys-combobox__option{padding:var(--_nys-combobox-padding--option);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background-color .15s ease;border-bottom:var(--nys-border-width-sm, 1px) solid var(--nys-color-neutral-50, #ededed);background-color:var(--_nys-combobox-background-color)}.nys-combobox__option:hover:not([disabled]):not(.nys-combobox__option--selected){background-color:var(--_nys-combobox-background-color--option--hover)}.nys-combobox__option:active:not([disabled]):not(.nys-combobox__option--selected){background-color:var(--_nys-combobox-background-color--option--active)}.nys-combobox__option--selected:not([disabled]){background-color:var(--_nys-combobox-background-color--option--selected);border:var(--_nys-combobox-border-color--option--selected) solid 1px}.nys-combobox__option--focused:not([disabled]):not(:hover){outline:var(--_nys-combobox-outline-color--focus) solid 2px;outline-offset:-2px}.nys-combobox__option[disabled]{background-color:var(--_nys-combobox-background-color--option--disabled);color:var(--_nys-combobox-color--option--disabled);cursor:not-allowed}.nys-combobox__optgroup{padding:var(--nys-space-100, 8px) var(--nys-space-150, 12px);border-bottom:var(--nys-border-width-sm, 1px) solid var(--nys-color-neutral-50, #ededed);-webkit-user-select:none;user-select:none;color:var(--nys-color-text);font-family:var(--nys-font-family-ui, "Proxima Nova");font-size:var(--nys-font-size-ui-md, 16px);font-style:normal;font-weight:700;line-height:var(--nys-font-lineheight-ui-md, 24px);letter-spacing:var(--nys-font-letterspacing-ui-md, .044px)}.nys-combobox__optgroup~.nys-combobox__option{padding-left:var(--nys-space-300, 24px)}.nys-combobox__no-results{background-color:var(--_nys-combobox-background-color);padding:var(--_nys-combobox-padding--option);color:var(--_nys-combobox-color);cursor:not-allowed}.nys-combobox__listbox::-webkit-scrollbar{width:var(--nys-space-100, 8px)}.nys-combobox__listbox::-webkit-scrollbar-track{background:var(--nys-color-neutral-50, #eeeeee);border-radius:var(--_nys-combobox-border-radius)}.nys-combobox__listbox::-webkit-scrollbar-thumb{background:var(--nys-color-neutral-300, #a7a9ab);border-radius:var(--_nys-combobox-border-radius)}.nys-combobox__listbox::-webkit-scrollbar-thumb:hover{background:var(--nys-color-neutral-400, #909395)}';
|
|
131
|
+
var T = Object.defineProperty, a = (l, o, s, e) => {
|
|
132
|
+
for (var t = void 0, i = l.length - 1, n; i >= 0; i--)
|
|
133
|
+
(n = l[i]) && (t = n(o, s, t) || t);
|
|
134
|
+
return t && T(o, s, t), t;
|
|
115
135
|
};
|
|
116
|
-
const f = class f extends
|
|
136
|
+
const f = class f extends D {
|
|
117
137
|
constructor() {
|
|
118
|
-
super(...arguments), this.id = "", this.name = "", this.label = "", this.description = "", this.value = "", this.disabled = !1, this.required = !1, this.optional = !1, this.tooltip = "", this.form = null, this.width = "full", this.inverted = !1, this.showError = !1, this.errorMessage = "", this._isOpen = !1, this._filterText = "", this._highlightedIndex = -1, this._options = [], this._filteredOptions = [], this._dropdownAbove = !1, this._announcement = "", this.
|
|
138
|
+
super(...arguments), this.id = "", this.name = "", this.label = "", this.description = "", this.value = "", this.disabled = !1, this.required = !1, this.optional = !1, this.tooltip = "", this.form = null, this.width = "full", this.inverted = !1, this.showError = !1, this.errorMessage = "", this._isOpen = !1, this._filterText = "", this._highlightedIndex = -1, this._options = [], this._filteredOptions = [], this._dropdownAbove = !1, this._announcement = "", this._hasUserInteracted = !1, this._selectedLabel = "", this._defaultValue = "", this._hasResolvedSlottedValue = !1, this._handleDocumentClick = (o) => {
|
|
119
139
|
o.target === this || this.shadowRoot?.contains(o.target) || this._closeDropdown();
|
|
120
140
|
};
|
|
121
141
|
}
|
|
@@ -126,7 +146,7 @@ const f = class f extends E {
|
|
|
126
146
|
* NysFormControlElement (@nysds/internals).
|
|
127
147
|
*/
|
|
128
148
|
connectedCallback() {
|
|
129
|
-
super.connectedCallback(), this.
|
|
149
|
+
super.connectedCallback(), this.addEventListener("invalid", this._handleInvalid), document.addEventListener("click", this._handleDocumentClick);
|
|
130
150
|
}
|
|
131
151
|
disconnectedCallback() {
|
|
132
152
|
super.disconnectedCallback(), this.removeEventListener("invalid", this._handleInvalid), document.removeEventListener("click", this._handleDocumentClick);
|
|
@@ -143,7 +163,7 @@ const f = class f extends E {
|
|
|
143
163
|
}
|
|
144
164
|
}
|
|
145
165
|
updated(o) {
|
|
146
|
-
o.has("value") && this._setValue(), o.has("_isOpen") && this._isOpen && this.updateComplete.then(() => {
|
|
166
|
+
o.has("value") && this._setValue(), o.has("required") && !o.has("value") && this._manageRequire(), o.has("_isOpen") && this._isOpen && this.updateComplete.then(() => {
|
|
147
167
|
this._positionDropdown(), this._scrollToHighlighted();
|
|
148
168
|
});
|
|
149
169
|
}
|
|
@@ -160,28 +180,28 @@ const f = class f extends E {
|
|
|
160
180
|
let t = "";
|
|
161
181
|
if (s.forEach((i) => {
|
|
162
182
|
if (i.tagName === "OPTION") {
|
|
163
|
-
const
|
|
183
|
+
const n = i;
|
|
164
184
|
e.push({
|
|
165
|
-
value:
|
|
166
|
-
label:
|
|
167
|
-
disabled:
|
|
168
|
-
}),
|
|
185
|
+
value: n.value,
|
|
186
|
+
label: n.textContent?.trim() || n.value,
|
|
187
|
+
disabled: n.disabled
|
|
188
|
+
}), n.selected && !t && (t = n.value);
|
|
169
189
|
} else if (i.tagName === "OPTGROUP") {
|
|
170
|
-
const
|
|
171
|
-
Array.from(
|
|
190
|
+
const n = i, c = n.label;
|
|
191
|
+
Array.from(n.children).forEach((h) => {
|
|
172
192
|
if (h.tagName === "OPTION") {
|
|
173
193
|
const b = h;
|
|
174
194
|
e.push({
|
|
175
195
|
value: b.value,
|
|
176
196
|
label: b.textContent?.trim() || b.value,
|
|
177
|
-
disabled: b.disabled ||
|
|
197
|
+
disabled: b.disabled || n.disabled,
|
|
178
198
|
group: c
|
|
179
199
|
}), b.selected && !t && (t = b.value);
|
|
180
200
|
}
|
|
181
201
|
});
|
|
182
202
|
}
|
|
183
203
|
}), this._options = e, this._filteredOptions = e, this._hasResolvedSlottedValue || (this._hasResolvedSlottedValue = !0, !this.value && t && (this.value = t), this._defaultValue = this.value), this.value) {
|
|
184
|
-
const i = this._options.find((
|
|
204
|
+
const i = this._options.find((n) => n.value === this.value);
|
|
185
205
|
i && (this._selectedLabel = i.label, this._filterText = i.label);
|
|
186
206
|
}
|
|
187
207
|
}
|
|
@@ -193,13 +213,16 @@ const f = class f extends E {
|
|
|
193
213
|
this.setFormValue(this.value), this._manageRequire();
|
|
194
214
|
}
|
|
195
215
|
_manageRequire() {
|
|
196
|
-
|
|
197
|
-
|
|
216
|
+
this.required && (!this.value || this.value?.trim() === "") ? (this.internalValidationMessage = "This field is required", this.setValidityFromState(
|
|
217
|
+
{ valueMissing: !0 },
|
|
218
|
+
this.resolvedErrorMessage(),
|
|
219
|
+
this._input
|
|
220
|
+
)) : (this.internalValidationMessage = "", this.clearValidity(), this._hasUserInteracted = !1);
|
|
198
221
|
}
|
|
199
222
|
_setValidityMessage(o = "") {
|
|
200
|
-
this.showError = !!o, this.
|
|
223
|
+
this.showError = !!o, this.internalValidationMessage = o, o ? this.setValidityFromState(
|
|
201
224
|
{ customError: !0 },
|
|
202
|
-
this.
|
|
225
|
+
this.resolvedErrorMessage(),
|
|
203
226
|
this._input
|
|
204
227
|
) : this.clearValidity();
|
|
205
228
|
}
|
|
@@ -207,11 +230,11 @@ const f = class f extends E {
|
|
|
207
230
|
if (!this._input) return;
|
|
208
231
|
const o = this._input.validity;
|
|
209
232
|
let s = "";
|
|
210
|
-
const e = this._input && !this._options.some((t) => t.value === this.value);
|
|
233
|
+
const e = this._input && this.value && !this._options.some((t) => t.value === this.value);
|
|
211
234
|
o.valueMissing || e ? s = "This field is required" : s = this._input.validationMessage, this._setValidityMessage(s);
|
|
212
235
|
}
|
|
213
236
|
formResetCallback() {
|
|
214
|
-
this.value = this._defaultValue, this._filterText = this._defaultValue ? this._options.find((o) => o.value === this._defaultValue)?.label ?? "" : "", this._selectedLabel = this._filterText, this._input && (this._input.value = this._filterText), this.setFormValue(this.value), this.showError = !1, this.
|
|
237
|
+
this.value = this._defaultValue, this._filterText = this._defaultValue ? this._options.find((o) => o.value === this._defaultValue)?.label ?? "" : "", this._selectedLabel = this._filterText, this._input && (this._input.value = this._filterText), this.setFormValue(this.value), this.showError = !1, this.internalValidationMessage = "", this.clearValidity(), this.requestUpdate();
|
|
215
238
|
}
|
|
216
239
|
checkValidity() {
|
|
217
240
|
return this._input ? this._input.checkValidity() : !0;
|
|
@@ -283,10 +306,10 @@ const f = class f extends E {
|
|
|
283
306
|
for (e < 0 ? e = this._filteredOptions.length - 1 : e >= this._filteredOptions.length && (e = 0); this._filteredOptions[e]?.disabled; )
|
|
284
307
|
e += o, e < 0 && (e = this._filteredOptions.length - 1), e >= this._filteredOptions.length && (e = 0);
|
|
285
308
|
this._highlightedIndex = e, this._scrollToHighlighted();
|
|
286
|
-
const t = this._filteredOptions[e], i = this._filteredOptions[e - o],
|
|
309
|
+
const t = this._filteredOptions[e], i = this._filteredOptions[e - o], n = this._filteredOptions.filter(
|
|
287
310
|
(_) => !_.disabled
|
|
288
|
-
), c =
|
|
289
|
-
this._announcement = `${
|
|
311
|
+
), c = n.findIndex((_) => _.value === t.value) + 1, h = t.value === this.value ? "selected" : "unselected", w = t.group && t.group !== i?.group ? `${t.group}, ` : "";
|
|
312
|
+
this._announcement = `${w} ${t.label} ${c} of ${n.length}, ${h}`;
|
|
290
313
|
}
|
|
291
314
|
/**
|
|
292
315
|
* Event Handlers
|
|
@@ -296,24 +319,19 @@ const f = class f extends E {
|
|
|
296
319
|
const s = o.target;
|
|
297
320
|
this._filterText = s.value, this._filterOptions(this._filterText), this._isOpen || this._openDropdown(), this._highlightedIndex = 0;
|
|
298
321
|
const e = this._filteredOptions.filter((t) => !t.disabled).length;
|
|
299
|
-
this._announcement = e > 0 ? `${e} options available` : "No results found", this._hasUserInteracted && this._validate(), this
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
);
|
|
322
|
+
this._announcement = e > 0 ? `${e} options available` : "No results found", this._hasUserInteracted && this._validate(), v(this, "nys-input", {
|
|
323
|
+
id: this.id,
|
|
324
|
+
name: this.name,
|
|
325
|
+
value: this.value,
|
|
326
|
+
query: this._filterText
|
|
327
|
+
});
|
|
306
328
|
}
|
|
307
329
|
_handleFocus() {
|
|
308
|
-
this
|
|
309
|
-
new Event("nys-focus", { bubbles: !0, composed: !0 })
|
|
310
|
-
);
|
|
330
|
+
m(this, "focus");
|
|
311
331
|
}
|
|
312
332
|
_handleBlur(o) {
|
|
313
333
|
const s = o.relatedTarget;
|
|
314
|
-
s && this._listbox?.contains(s) || ((!this.value || this._filterText !== this._selectedLabel) && (this._filterText = this._selectedLabel, this._filterOptions("")), this._closeDropdown(), this._hasUserInteracted || (this._hasUserInteracted = !0), this._validate(), this
|
|
315
|
-
new Event("nys-blur", { bubbles: !0, composed: !0 })
|
|
316
|
-
));
|
|
334
|
+
s && this._listbox?.contains(s) || ((!this.value || this._filterText !== this._selectedLabel) && (this._filterText = this._selectedLabel, this._filterOptions("")), this._closeDropdown(), this._hasUserInteracted || (this._hasUserInteracted = !0), this._validate(), m(this, "blur"));
|
|
317
335
|
}
|
|
318
336
|
_handleIconClick() {
|
|
319
337
|
this.disabled || (this._isOpen ? this._closeDropdown() : (this._input.focus(), this._openDropdown()));
|
|
@@ -331,13 +349,11 @@ const f = class f extends E {
|
|
|
331
349
|
this.value = o.value, this._selectedLabel = o.label, this._filterText = o.label, this.setFormValue(this.value), this._input.focus(), this._closeDropdown(), this._filterOptions(""), this._setValidityMessage(""), this._hasUserInteracted && this._validate(), this._handleChange();
|
|
332
350
|
}
|
|
333
351
|
_handleChange() {
|
|
334
|
-
this
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
})
|
|
340
|
-
);
|
|
352
|
+
v(this, "nys-change", {
|
|
353
|
+
id: this.id,
|
|
354
|
+
name: this.name,
|
|
355
|
+
value: this.value
|
|
356
|
+
});
|
|
341
357
|
}
|
|
342
358
|
_openDropdown() {
|
|
343
359
|
this._isOpen = !0, this._highlightedIndex = this._filteredOptions.findIndex(
|
|
@@ -355,19 +371,19 @@ const f = class f extends E {
|
|
|
355
371
|
let o = "";
|
|
356
372
|
const s = [];
|
|
357
373
|
return this._filteredOptions.forEach((e, t) => {
|
|
358
|
-
e.group && e.group !== o && (o = e.group, s.push(
|
|
374
|
+
e.group && e.group !== o && (o = e.group, s.push(p`
|
|
359
375
|
<div class="nys-combobox__optgroup" role="presentation">
|
|
360
376
|
${e.group}
|
|
361
377
|
</div>
|
|
362
378
|
`));
|
|
363
|
-
const i = t === this._highlightedIndex,
|
|
364
|
-
s.push(
|
|
379
|
+
const i = t === this._highlightedIndex, n = e.value === this.value;
|
|
380
|
+
s.push(p`
|
|
365
381
|
<div
|
|
366
|
-
class="nys-combobox__option ${i ? "nys-combobox__option--focused" : ""} ${
|
|
382
|
+
class="nys-combobox__option ${i ? "nys-combobox__option--focused" : ""} ${n ? "nys-combobox__option--selected" : ""}"
|
|
367
383
|
role="option"
|
|
368
384
|
id="${this.id}--option-${t}"
|
|
369
385
|
data-index="${t}"
|
|
370
|
-
aria-selected="${
|
|
386
|
+
aria-selected="${n}"
|
|
371
387
|
aria-disabled="${e.disabled || !1}"
|
|
372
388
|
?disabled=${e.disabled}
|
|
373
389
|
@click=${() => this._handleOptionClick(e)}
|
|
@@ -376,14 +392,14 @@ const f = class f extends E {
|
|
|
376
392
|
${e.label}
|
|
377
393
|
</div>
|
|
378
394
|
`);
|
|
379
|
-
}), s.length === 0 ?
|
|
395
|
+
}), s.length === 0 ? p`
|
|
380
396
|
<div class="nys-combobox__no-results" role="option">
|
|
381
397
|
No results found
|
|
382
398
|
</div>
|
|
383
399
|
` : s;
|
|
384
400
|
}
|
|
385
401
|
render() {
|
|
386
|
-
return
|
|
402
|
+
return p`
|
|
387
403
|
<div class="nys-combobox">
|
|
388
404
|
<nys-label
|
|
389
405
|
id="${this.id}--label"
|
|
@@ -432,7 +448,7 @@ const f = class f extends E {
|
|
|
432
448
|
@keydown="${this._handleKeyDown}"
|
|
433
449
|
/>
|
|
434
450
|
<div class="nys-combobox__buttons">
|
|
435
|
-
${this.value ?
|
|
451
|
+
${this.value ? p`
|
|
436
452
|
<nys-button
|
|
437
453
|
class="nys-combobox__clear"
|
|
438
454
|
label="Clear selection"
|
|
@@ -466,7 +482,7 @@ const f = class f extends E {
|
|
|
466
482
|
</nys-button>
|
|
467
483
|
</div>
|
|
468
484
|
</div>
|
|
469
|
-
${this._isOpen ?
|
|
485
|
+
${this._isOpen ? p`
|
|
470
486
|
<div
|
|
471
487
|
class="nys-combobox__listbox ${this._dropdownAbove ? "nys-combobox__listbox--above" : ""}"
|
|
472
488
|
id="${this.id}--listbox"
|
|
@@ -484,7 +500,7 @@ const f = class f extends E {
|
|
|
484
500
|
<nys-errormessage
|
|
485
501
|
id=${this.id + "--error"}
|
|
486
502
|
?showError=${this.showError}
|
|
487
|
-
errorMessage=${this.
|
|
503
|
+
errorMessage=${this.resolvedErrorMessage()}
|
|
488
504
|
></nys-errormessage>
|
|
489
505
|
<div
|
|
490
506
|
aria-live="polite"
|
|
@@ -497,82 +513,82 @@ const f = class f extends E {
|
|
|
497
513
|
`;
|
|
498
514
|
}
|
|
499
515
|
};
|
|
500
|
-
f.styles =
|
|
501
|
-
...
|
|
516
|
+
f.styles = k(M), f.shadowRootOptions = {
|
|
517
|
+
...x.shadowRootOptions,
|
|
502
518
|
delegatesFocus: !0
|
|
503
519
|
};
|
|
504
|
-
let
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
],
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
],
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
],
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
],
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
],
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
],
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
],
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
],
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
],
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
],
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
],
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
],
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
],
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
],
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
],
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
],
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
],
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
],
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
],
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
],
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
],
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
],
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
],
|
|
574
|
-
customElements.get("nys-combobox") || customElements.define("nys-combobox",
|
|
520
|
+
let r = f;
|
|
521
|
+
a([
|
|
522
|
+
d({ type: String, reflect: !0 })
|
|
523
|
+
], r.prototype, "id");
|
|
524
|
+
a([
|
|
525
|
+
d({ type: String, reflect: !0 })
|
|
526
|
+
], r.prototype, "name");
|
|
527
|
+
a([
|
|
528
|
+
d({ type: String })
|
|
529
|
+
], r.prototype, "label");
|
|
530
|
+
a([
|
|
531
|
+
d({ type: String })
|
|
532
|
+
], r.prototype, "description");
|
|
533
|
+
a([
|
|
534
|
+
d({ type: String })
|
|
535
|
+
], r.prototype, "value");
|
|
536
|
+
a([
|
|
537
|
+
d({ type: Boolean, reflect: !0 })
|
|
538
|
+
], r.prototype, "disabled");
|
|
539
|
+
a([
|
|
540
|
+
d({ type: Boolean, reflect: !0 })
|
|
541
|
+
], r.prototype, "required");
|
|
542
|
+
a([
|
|
543
|
+
d({ type: Boolean, reflect: !0 })
|
|
544
|
+
], r.prototype, "optional");
|
|
545
|
+
a([
|
|
546
|
+
d({ type: String })
|
|
547
|
+
], r.prototype, "tooltip");
|
|
548
|
+
a([
|
|
549
|
+
d({ type: String, reflect: !0 })
|
|
550
|
+
], r.prototype, "form");
|
|
551
|
+
a([
|
|
552
|
+
d({ type: String, reflect: !0 })
|
|
553
|
+
], r.prototype, "width");
|
|
554
|
+
a([
|
|
555
|
+
d({ type: Boolean, reflect: !0 })
|
|
556
|
+
], r.prototype, "inverted");
|
|
557
|
+
a([
|
|
558
|
+
d({ type: Boolean, reflect: !0 })
|
|
559
|
+
], r.prototype, "showError");
|
|
560
|
+
a([
|
|
561
|
+
d({ type: String })
|
|
562
|
+
], r.prototype, "errorMessage");
|
|
563
|
+
a([
|
|
564
|
+
u()
|
|
565
|
+
], r.prototype, "_isOpen");
|
|
566
|
+
a([
|
|
567
|
+
u()
|
|
568
|
+
], r.prototype, "_filterText");
|
|
569
|
+
a([
|
|
570
|
+
u()
|
|
571
|
+
], r.prototype, "_highlightedIndex");
|
|
572
|
+
a([
|
|
573
|
+
u()
|
|
574
|
+
], r.prototype, "_options");
|
|
575
|
+
a([
|
|
576
|
+
u()
|
|
577
|
+
], r.prototype, "_filteredOptions");
|
|
578
|
+
a([
|
|
579
|
+
u()
|
|
580
|
+
], r.prototype, "_dropdownAbove");
|
|
581
|
+
a([
|
|
582
|
+
u()
|
|
583
|
+
], r.prototype, "_announcement");
|
|
584
|
+
a([
|
|
585
|
+
g("input")
|
|
586
|
+
], r.prototype, "_input");
|
|
587
|
+
a([
|
|
588
|
+
g(".nys-combobox__listbox")
|
|
589
|
+
], r.prototype, "_listbox");
|
|
590
|
+
customElements.get("nys-combobox") || customElements.define("nys-combobox", r);
|
|
575
591
|
export {
|
|
576
|
-
|
|
592
|
+
r as NysCombobox
|
|
577
593
|
};
|
|
578
594
|
//# sourceMappingURL=nys-combobox.js.map
|
package/dist/nys-combobox.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nys-combobox.js","sources":["../../internals/dist/index.js","../src/nys-combobox.ts"],"sourcesContent":["import { LitElement as u } from \"lit\";\n/*!\n * New York State Design System v1.21.0\n * Description: A design system for New York State's digital products.\n * Repository: https://github.com/its-hcd/nysds\n * License: MIT\n */\nvar y = 0;\nfunction f(e) {\n return `${e}-${Date.now()}-${y++}`;\n}\nvar p = {\n labelledby: \"ariaLabelledByElements\",\n describedby: \"ariaDescribedByElements\"\n}, v = {\n labelledby: \"ariaLabel\",\n describedby: \"ariaDescription\"\n};\nfunction A(e) {\n return \"ariaDescribedByElements\" in e;\n}\nfunction R(e) {\n return e === \"errormessage\" ? \"aria-errormessage\" : `aria-${e}`;\n}\nfunction d(e) {\n return e.filter((r) => !!r);\n}\nfunction _(e) {\n return e.map((r) => (r.id || (r.id = f(\"nys-ref\")), r.id));\n}\nfunction V(e, r, a) {\n const t = d(a), n = R(r);\n t.length ? e.setAttribute(n, _(t).join(\" \")) : e.removeAttribute(n);\n}\nfunction x(e, r, a, t, n) {\n const i = d(t), s = p[a], l = r;\n if (s && A(r)) {\n l[s] = i.length ? i : null;\n return;\n }\n const o = v[a];\n if (!o) return;\n const c = n ?? (i.length ? i.map((m) => m.textContent?.trim() ?? \"\").filter(Boolean).join(\" \") : \"\");\n o in l ? l[o] = c || null : c ? e.setAttribute(a === \"labelledby\" ? \"aria-label\" : \"aria-description\", c) : e.removeAttribute(a === \"labelledby\" ? \"aria-label\" : \"aria-description\");\n}\nvar E = {\n labelledby: \"ariaLabelledByElements\",\n describedby: \"ariaDescribedByElements\"\n}, C = {\n labelledby: \"aria-label\",\n describedby: \"aria-description\"\n};\nfunction L(e, r, a) {\n const t = d(a), n = E[r], i = C[r], s = e;\n if (n && n in e && (s[n] = t.length ? t : null), !i) return;\n const l = t.map((o) => o.textContent?.trim() ?? \"\").filter(Boolean).join(\" \");\n l ? e.setAttribute(i, l) : e.removeAttribute(i);\n}\nvar b = (e) => {\n class r extends e {\n get idPrefix() {\n return this.localName || \"nys-element\";\n }\n ensureId() {\n this.id || (this.id = f(this.idPrefix));\n }\n connectedCallback() {\n super.connectedCallback(), this.ensureId();\n }\n }\n return r;\n}, P = /* @__PURE__ */ b(u), h = (e) => {\n class r extends b(e) {\n constructor(...t) {\n super(...t), this.__internals = null;\n }\n get internals() {\n if (this.__internals) return this.__internals;\n if (typeof this.attachInternals == \"function\") try {\n this.__internals = this.attachInternals();\n } catch {\n this.__internals = null;\n }\n return this.__internals;\n }\n get defaultRole() {\n return null;\n }\n setHostAria(t, n) {\n const i = this.internals;\n if (i && t in i) {\n i[t] = n;\n return;\n }\n const s = g(t);\n n === null ? this.removeAttribute(s) : this.setAttribute(s, n);\n }\n reflectDefaultSemantics() {\n const t = this.defaultRole;\n t && this.setHostAria(\"role\", t);\n }\n connectedCallback() {\n super.connectedCallback(), this.reflectDefaultSemantics();\n }\n }\n return r;\n};\nfunction g(e) {\n if (e === \"role\") return \"role\";\n const r = e.replace(/^aria/, \"\");\n return \"aria-\" + r.charAt(0).toLowerCase() + r.slice(1);\n}\nvar T = /* @__PURE__ */ h(u), I = (e) => {\n class r extends h(e) {\n static {\n this.formAssociated = !0;\n }\n setFormValue(t) {\n this.internals?.setFormValue(t ?? null);\n }\n setValidityFromState(t, n, i) {\n const s = this.internals;\n if (!s) return;\n const l = Object.values(t).some(Boolean);\n l ? s.setValidity(t, n ?? \"Invalid value\", i) : s.setValidity({}), this.setHostAria(\"ariaInvalid\", l ? \"true\" : \"false\");\n }\n clearValidity() {\n this.internals?.setValidity({}), this.setHostAria(\"ariaInvalid\", \"false\");\n }\n checkValidity() {\n return this.internals?.checkValidity() ?? !0;\n }\n reportValidity() {\n return this.internals?.reportValidity() ?? !0;\n }\n formResetCallback() {\n this.clearValidity();\n }\n }\n return r;\n}, w = /* @__PURE__ */ I(u);\nfunction O(e) {\n const r = e.tagName.toLowerCase(), a = /* @__PURE__ */ new Set(), t = (n) => {\n n.querySelectorAll(\"*\").forEach((i) => {\n const s = i.tagName.toLowerCase();\n s.startsWith(\"nys-\") && s !== r && !customElements.get(s) && a.add(s), i.shadowRoot && t(i.shadowRoot);\n });\n };\n return e.shadowRoot && t(e.shadowRoot), t(e), [...a].sort();\n}\nexport {\n I as FormControlMixin,\n b as IdentifiedMixin,\n P as NysElement,\n w as NysFormControlElement,\n T as NysReflectsAriaElement,\n h as ReflectsAriaMixin,\n V as associateControl,\n L as associateControlRefs,\n x as associateHost,\n O as findUnregisteredChildren,\n f as generateId,\n A as supportsElementRefs\n};\n\n//# sourceMappingURL=index.js.map","import { LitElement, html, unsafeCSS } from \"lit\";\nimport { property, state, query } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport { NysFormControlElement } from \"@nysds/internals\";\n// These internal elements are rendered inside this component's shadow DOM, so\n// they must be registered whenever nys-combobox is used. Importing them here\n// (intentional side effect) guarantees the visible label and error message —\n// which the accessible name/error association depends on — always render. It\n// also guarantees the clear/toggle nys-buttons upgrade, since their accessible\n// name lands on nys-button's real inner <button>, which only exists once\n// nys-button renders.\nimport \"@nysds/nys-label\";\nimport \"@nysds/nys-errormessage\";\nimport \"@nysds/nys-icon\";\nimport \"@nysds/nys-button\";\n// @ts-ignore: SCSS module imported via bundler as inline\nimport styles from \"./nys-combobox.scss?inline\";\n\ninterface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n group?: string;\n}\n\n/**\n * `<nys-combobox>` is a form-enabled combo box combining text input with a filterable dropdown.\n *\n * Features:\n * - Type to filter options\n * - Keyboard navigation (Arrow keys, Enter, Escape)\n * - Mouse and keyboard interaction\n * - Clears non-selected text on blur\n * - Clear button when value is selected\n * - Integrates with forms via ElementInternals\n * - Supports native <option> and <optgroup> elements\n * - Accessible per W3C ARIA Authoring Practices\n *\n * @slot description - Optional custom description content below the label.\n * @slot default - Options (<option>, <optgroup>) to populate the dropdown\n *\n * @fires nys-change - Fired when selection changes. Detail: `{ id, value }`.\n * @fires nys-input - Fired on input change. Detail: `{ id, value }`.\n * @fires nys-focus - Fired when combobox receives focus.\n * @fires nys-blur - Fired when combobox loses focus.\n *\n *\n * @example Basic\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"cherry\">Cherry</option>\n * <option value=\"date\">Date</option>\n * <option value=\"elderberry\">Elderberry</option>\n * <option value=\"fig\">Fig</option>\n * <option value=\"grape\">Grape</option>\n * <option value=\"honeydew\">Honeydew</option>\n * <option value=\"kiwi\">Kiwi</option>\n * <option value=\"lemon\">Lemon</option>\n * <option value=\"mango\">Mango</option>\n * <option value=\"nectarine\">Nectarine</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"papaya\">Papaya</option>\n * <option value=\"quince\">Quince</option>\n * <option value=\"raspberry\">Raspberry</option>\n * <option value=\"strawberry\">Strawberry</option>\n * <option value=\"tangerine\">Tangerine</option>\n * <option value=\"watermelon\">Watermelon</option>\n * </nys-combobox>\n * ```\n *\n * @example Default Value\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" value=\"mango\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"mango\" selected>Mango</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Option Group\n * ```html\n * <nys-combobox label=\"Select a fruit\" description=\"Fruits organized by category\">\n * <optgroup label=\"Citrus\">\n * <option value=\"lemon\">Lemon</option>\n * <option value=\"lime\">Lime</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"grapefruit\">Grapefruit</option>\n * <option value=\"tangerine\">Tangerine</option>\n * </optgroup>\n * <optgroup label=\"Berries\">\n * <option value=\"strawberry\">Strawberry</option>\n * <option value=\"blueberry\">Blueberry</option>\n * <option value=\"raspberry\">Raspberry</option>\n * <option value=\"blackberry\">Blackberry</option>\n * <option value=\"cranberry\">Cranberry</option>\n * </optgroup>\n * <optgroup label=\"Tropical\">\n * <option value=\"mango\">Mango</option>\n * <option value=\"pineapple\">Pineapple</option>\n * <option value=\"papaya\">Papaya</option>\n * <option value=\"coconut\">Coconut</option>\n * <option value=\"passionfruit\">Passionfruit</option>\n * </optgroup>\n * <optgroup label=\"Stone Fruits\">\n * <option value=\"peach\">Peach</option>\n * <option value=\"plum\">Plum</option>\n * <option value=\"cherry\">Cherry</option>\n * <option value=\"apricot\">Apricot</option>\n * <option value=\"nectarine\">Nectarine</option>\n * </optgroup>\n * </nys-combobox>\n * ```\n *\n * @example Disabled\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" disabled>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Required\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" required>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Optional\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" optional>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Width Medium\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" width=\"md\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Width Large\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" width=\"lg\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Description\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" description=\"Choose from the list of available fruits.\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```d\n *\n * @example Description Slot\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\">\n * <label slot=\"description\">This is a description slot</label>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Error Message\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" showError errorMessage=\"Please select a fruit\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Disabled Options\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" description=\"Some fruits are out of season\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"cherry\" disabled>Cherry (Out of season)</option>\n * <option value=\"mango\">Mango</option>\n * <option value=\"strawberry\" disabled>Strawberry (Out of season)</option>\n * <option value=\"orange\">Orange</option>\n * </nys-combobox>\n * ```\n */\nexport class NysCombobox extends NysFormControlElement {\n static styles = unsafeCSS(styles);\n static shadowRootOptions = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n @property({ type: String, reflect: true }) id = \"\";\n @property({ type: String, reflect: true }) name = \"\";\n @property({ type: String }) label = \"\";\n @property({ type: String }) description = \"\";\n @property({ type: String }) value = \"\";\n @property({ type: Boolean, reflect: true }) disabled = false;\n @property({ type: Boolean, reflect: true }) required = false;\n @property({ type: Boolean, reflect: true }) optional = false;\n @property({ type: String }) tooltip = \"\";\n @property({ type: String, reflect: true }) form: string | null = null;\n @property({ type: String, reflect: true }) width: \"md\" | \"lg\" | \"full\" =\n \"full\";\n @property({ type: Boolean, reflect: true }) inverted = false;\n @property({ type: Boolean, reflect: true }) showError = false;\n @property({ type: String }) errorMessage = \"\";\n\n @state() private _isOpen = false;\n @state() private _filterText = \"\";\n @state() private _highlightedIndex = -1;\n @state() private _options: ComboboxOption[] = [];\n @state() private _filteredOptions: ComboboxOption[] = [];\n @state() private _dropdownAbove = false;\n @state() private _announcement = \"\";\n\n @query(\"input\") private _input!: HTMLInputElement;\n @query(\".nys-combobox__listbox\") private _listbox?: HTMLElement;\n\n private _originalErrorMessage = \"\";\n private _hasUserInteracted = false;\n private _selectedLabel = \"\";\n private _defaultValue = \"\";\n private _hasResolvedSlottedValue = false;\n\n /**\n * Lifecycle methods\n * --------------------------------------------------------------------------\n * Form association, ElementInternals, and id generation are provided by\n * NysFormControlElement (@nysds/internals).\n */\n connectedCallback() {\n // super.connectedCallback() (NysFormControlElement) assigns an id when one\n // is not provided and reflects default semantics.\n super.connectedCallback();\n this._originalErrorMessage = this.errorMessage ?? \"\";\n this.addEventListener(\"invalid\", this._handleInvalid);\n document.addEventListener(\"click\", this._handleDocumentClick);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"invalid\", this._handleInvalid);\n document.removeEventListener(\"click\", this._handleDocumentClick);\n }\n\n firstUpdated() {\n // Slotted options are read in `_handleSlotChange`, which the slot's\n // `slotchange` event fires once its nodes are assigned. It also resolves an\n // option marked `selected` into `value` and captures `_defaultValue`.\n this._setValue();\n this._defaultValue = this.value;\n }\n\n // Derive display state from `value` before rendering, not after, so Lit\n // doesn't have to schedule a second update (see lit.dev/msg/change-in-update).\n willUpdate(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has(\"value\")) {\n const option = this._options.find((opt) => opt.value === this.value);\n this._selectedLabel = option ? option.label : \"\";\n this._filterText = this._selectedLabel;\n }\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has(\"value\")) {\n this._setValue();\n }\n\n if (changedProperties.has(\"_isOpen\") && this._isOpen) {\n // Positioning measures the rendered listbox, so it has to wait for this\n // update to settle before it may flip `_dropdownAbove`.\n this.updateComplete.then(() => {\n this._positionDropdown();\n this._scrollToHighlighted();\n });\n }\n }\n\n /**\n * Slot handling\n * --------------------------------------------------------------------------\n */\n private _handleSlotChange() {\n const slot = this.shadowRoot?.querySelector(\n 'slot:not([name=\"description\"])',\n ) as HTMLSlotElement | null;\n\n if (!slot) return;\n\n const assignedElements = slot.assignedElements({ flatten: true });\n const options: ComboboxOption[] = [];\n let markupSelected = \"\";\n\n assignedElements.forEach((node) => {\n if (node.tagName === \"OPTION\") {\n const option = node as HTMLOptionElement;\n options.push({\n value: option.value,\n label: option.textContent?.trim() || option.value,\n disabled: option.disabled,\n });\n if (option.selected && !markupSelected) {\n markupSelected = option.value;\n }\n } else if (node.tagName === \"OPTGROUP\") {\n const group = node as HTMLOptGroupElement;\n const groupLabel = group.label;\n\n Array.from(group.children).forEach((child) => {\n if (child.tagName === \"OPTION\") {\n const option = child as HTMLOptionElement;\n options.push({\n value: option.value,\n label: option.textContent?.trim() || option.value,\n disabled: option.disabled || group.disabled,\n group: groupLabel,\n });\n if (option.selected && !markupSelected) {\n markupSelected = option.value;\n }\n }\n });\n }\n });\n\n this._options = options;\n this._filteredOptions = options;\n\n // The first time options arrive, adopt an option marked `selected` unless\n // an explicit value was already set, and use the result as the reset baseline.\n if (!this._hasResolvedSlottedValue) {\n this._hasResolvedSlottedValue = true;\n\n if (!this.value && markupSelected) {\n this.value = markupSelected;\n }\n this._defaultValue = this.value;\n }\n\n // Set initial display text if value exists\n if (this.value) {\n const option = this._options.find((opt) => opt.value === this.value);\n if (option) {\n this._selectedLabel = option.label;\n this._filterText = option.label;\n }\n }\n }\n\n /**\n * Form Integration\n * --------------------------------------------------------------------------\n */\n private _setValue() {\n this.setFormValue(this.value);\n this._manageRequire();\n }\n\n private _manageRequire() {\n const message = this.errorMessage || \"This field is required\";\n const isInvalid =\n this.required && (!this.value || this.value?.trim() === \"\");\n\n if (isInvalid) {\n this.setValidityFromState({ valueMissing: true }, message, this._input);\n } else {\n this.clearValidity();\n this._hasUserInteracted = false;\n }\n }\n\n private _setValidityMessage(message: string = \"\") {\n this.showError = !!message;\n\n if (this._originalErrorMessage?.trim() && message !== \"\") {\n this.errorMessage = this._originalErrorMessage;\n } else {\n this.errorMessage = message;\n }\n\n if (message) {\n this.setValidityFromState(\n { customError: true },\n this.errorMessage,\n this._input,\n );\n } else {\n this.clearValidity();\n }\n }\n\n private _validate() {\n if (!this._input) return;\n\n const validity = this._input.validity;\n let message = \"\";\n\n const isInvalid =\n this._input && !this._options.some((opt) => opt.value === this.value);\n\n if (validity.valueMissing || isInvalid) {\n message = \"This field is required\";\n } else {\n message = this._input.validationMessage;\n }\n\n this._setValidityMessage(message);\n }\n\n formResetCallback() {\n this.value = this._defaultValue;\n this._filterText = this._defaultValue\n ? (this._options.find((opt) => opt.value === this._defaultValue)?.label ??\n \"\")\n : \"\";\n this._selectedLabel = this._filterText;\n\n if (this._input) {\n this._input.value = this._filterText;\n }\n\n this.setFormValue(this.value);\n\n // Reset validation UI\n this.showError = false;\n this.errorMessage = \"\";\n this.clearValidity();\n\n this.requestUpdate();\n }\n checkValidity(): boolean {\n return this._input ? this._input.checkValidity() : true;\n }\n\n private _handleInvalid(event: Event) {\n event.preventDefault();\n this._hasUserInteracted = true;\n this._validate();\n\n if (this._input) {\n const form = this.internals?.form;\n if (form) {\n const elements = Array.from(form.elements) as Array<\n HTMLElement & { checkValidity?: () => boolean }\n >;\n const firstInvalidElement = elements.find(\n (element) =>\n typeof element.checkValidity === \"function\" &&\n !element.checkValidity(),\n );\n if (firstInvalidElement === this) {\n this._input.focus();\n }\n } else {\n this._input.focus();\n }\n }\n }\n\n /**\n * Dropdown positioning\n * --------------------------------------------------------------------------\n */\n private _positionDropdown() {\n if (!this._listbox || !this._input) return;\n\n const inputRect = this._input.getBoundingClientRect();\n const listboxHeight = this._listbox.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - inputRect.bottom;\n const spaceAbove = inputRect.top;\n\n // Show above if not enough space below and more space above\n this._dropdownAbove = spaceBelow < listboxHeight && spaceAbove > spaceBelow;\n }\n\n /**\n * Filtering\n * --------------------------------------------------------------------------\n */\n private _filterOptions(searchText: string) {\n if (!searchText) {\n this._filteredOptions = this._options;\n return;\n }\n\n const search = searchText.toLowerCase();\n this._filteredOptions = this._options.filter((option) =>\n option.label.toLowerCase().includes(search),\n );\n }\n\n /**\n * Keyboard navigation\n * --------------------------------------------------------------------------\n */\n private _scrollToHighlighted() {\n if (!this._listbox || this._highlightedIndex < 0) return;\n\n const highlighted = this._listbox.querySelector(\n `[data-index=\"${this._highlightedIndex}\"]`,\n ) as HTMLElement;\n\n if (highlighted) {\n highlighted.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!this._isOpen) {\n this._openDropdown();\n } else {\n this._moveHighlight(1);\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n if (!this._isOpen) {\n this._openDropdown();\n } else {\n this._moveHighlight(-1);\n }\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (this._isOpen && this._highlightedIndex >= 0) {\n this._selectOption(this._filteredOptions[this._highlightedIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n this._closeDropdown();\n this._filterText = this._selectedLabel;\n break;\n\n case \"Tab\":\n if (this._isOpen) {\n this._closeDropdown();\n this._filterText = this._selectedLabel;\n }\n break;\n }\n }\n\n private _moveHighlight(direction: number) {\n const enabledOptions = this._filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length === 0) return;\n\n let newIndex = this._highlightedIndex + direction;\n\n // Wrap around\n if (newIndex < 0) {\n newIndex = this._filteredOptions.length - 1;\n } else if (newIndex >= this._filteredOptions.length) {\n newIndex = 0;\n }\n\n // Skip disabled options\n while (this._filteredOptions[newIndex]?.disabled) {\n newIndex += direction;\n if (newIndex < 0) newIndex = this._filteredOptions.length - 1;\n if (newIndex >= this._filteredOptions.length) newIndex = 0;\n }\n\n this._highlightedIndex = newIndex;\n this._scrollToHighlighted();\n\n const option = this._filteredOptions[newIndex];\n const prevOption = this._filteredOptions[newIndex - direction];\n const enabledFiltered = this._filteredOptions.filter(\n (opt) => !opt.disabled,\n );\n const position =\n enabledFiltered.findIndex((opt) => opt.value === option.value) + 1;\n const isSelected = option.value === this.value ? \"selected\" : \"unselected\";\n const groupChanged = option.group && option.group !== prevOption?.group;\n const groupPrefix = groupChanged ? `${option.group}, ` : \"\";\n this._announcement = `${groupPrefix} ${option.label} ${position} of ${enabledFiltered.length}, ${isSelected}`;\n }\n\n /**\n * Event Handlers\n * --------------------------------------------------------------------------\n */\n private _handleInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._filterText = input.value;\n this._filterOptions(this._filterText);\n\n if (!this._isOpen) {\n this._openDropdown();\n }\n\n this._highlightedIndex = 0;\n\n const count = this._filteredOptions.filter((opt) => !opt.disabled).length;\n this._announcement =\n count > 0 ? `${count} options available` : \"No results found\";\n\n if (this._hasUserInteracted) {\n this._validate();\n }\n\n this.dispatchEvent(\n new CustomEvent(\"nys-input\", {\n detail: { id: this.id, value: this._filterText },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _handleFocus() {\n this.dispatchEvent(\n new Event(\"nys-focus\", { bubbles: true, composed: true }),\n );\n }\n\n private _handleBlur(event: FocusEvent) {\n // Check if focus moved to the listbox\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (relatedTarget && this._listbox?.contains(relatedTarget)) {\n return;\n }\n\n // If no valid selection, clear the input\n if (!this.value || this._filterText !== this._selectedLabel) {\n this._filterText = this._selectedLabel;\n this._filterOptions(\"\");\n }\n\n this._closeDropdown();\n\n if (!this._hasUserInteracted) {\n this._hasUserInteracted = true;\n }\n this._validate();\n\n this.dispatchEvent(\n new Event(\"nys-blur\", { bubbles: true, composed: true }),\n );\n }\n\n private _handleDocumentClick = (event: MouseEvent) => {\n // Don't close if click is on the combobox host element or inside shadow DOM\n if (\n event.target === this ||\n this.shadowRoot?.contains(event.target as Node)\n ) {\n return;\n }\n this._closeDropdown();\n };\n\n private _handleIconClick() {\n if (this.disabled) return;\n\n if (this._isOpen) {\n this._closeDropdown();\n } else {\n this._input.focus();\n this._openDropdown();\n }\n }\n\n private _handleClearClick(event: Event) {\n event.stopPropagation();\n this.value = \"\";\n this._filterText = \"\";\n this._selectedLabel = \"\";\n this._filterOptions(\"\");\n this.setFormValue(\"\");\n this._closeDropdown();\n this._input.focus();\n\n this._handleChange();\n }\n\n private _handleOptionClick(option: ComboboxOption) {\n if (option.disabled) return;\n this._selectOption(option);\n }\n\n private _handleOptionMouseEnter(index: number) {\n this._highlightedIndex = index;\n }\n\n private _selectOption(option: ComboboxOption) {\n this.value = option.value;\n this._selectedLabel = option.label;\n this._filterText = option.label;\n this.setFormValue(this.value);\n this._input.focus();\n this._closeDropdown();\n this._filterOptions(\"\");\n\n this._setValidityMessage(\"\");\n\n if (this._hasUserInteracted) {\n this._validate();\n }\n\n this._handleChange();\n }\n\n private _handleChange() {\n this.dispatchEvent(\n new CustomEvent(\"nys-change\", {\n detail: { id: this.id, value: this.value },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private _openDropdown() {\n this._isOpen = true;\n this._highlightedIndex = this._filteredOptions.findIndex(\n (opt) => opt.value === this.value,\n );\n if (this._highlightedIndex < 0) this._highlightedIndex = 0;\n }\n\n private _closeDropdown() {\n this._isOpen = false;\n this._highlightedIndex = -1;\n }\n\n /**\n * Render helpers\n * --------------------------------------------------------------------------\n */\n private _renderOptions() {\n let currentGroup = \"\";\n const elements: any[] = [];\n\n this._filteredOptions.forEach((option, index) => {\n if (option.group && option.group !== currentGroup) {\n currentGroup = option.group;\n elements.push(html`\n <div class=\"nys-combobox__optgroup\" role=\"presentation\">\n ${option.group}\n </div>\n `);\n }\n\n const isFocused = index === this._highlightedIndex;\n const isSelected = option.value === this.value;\n\n elements.push(html`\n <div\n class=\"nys-combobox__option ${isFocused\n ? \"nys-combobox__option--focused\"\n : \"\"} ${isSelected ? \"nys-combobox__option--selected\" : \"\"}\"\n role=\"option\"\n id=\"${this.id}--option-${index}\"\n data-index=\"${index}\"\n aria-selected=\"${isSelected}\"\n aria-disabled=\"${option.disabled || false}\"\n ?disabled=${option.disabled}\n @click=${() => this._handleOptionClick(option)}\n @mouseenter=${() => this._handleOptionMouseEnter(index)}\n >\n ${option.label}\n </div>\n `);\n });\n\n if (elements.length === 0) {\n return html`\n <div class=\"nys-combobox__no-results\" role=\"option\">\n No results found\n </div>\n `;\n }\n\n return elements;\n }\n\n render() {\n return html`\n <div class=\"nys-combobox\">\n <nys-label\n id=\"${this.id}--label\"\n label=${this.label}\n description=${this.description}\n flag=${this.required ? \"required\" : this.optional ? \"optional\" : \"\"}\n tooltip=${this.tooltip}\n ?inverted=${this.inverted}\n >\n <slot name=\"description\" slot=\"description\">${this.description}</slot>\n </nys-label>\n <div\n class=\"nys-combobox__container ${this._isOpen\n ? \"nys-combobox__container--open\"\n : \"\"}\"\n >\n <div class=\"nys-combobox__input-wrapper\">\n <input\n class=\"nys-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"${this._isOpen}\"\n aria-controls=\"${this.id}--listbox\"\n aria-activedescendant=\"${this._highlightedIndex >= 0\n ? `${this.id}--option-${this._highlightedIndex}`\n : \"\"}\"\n name=${this.name}\n id=${this.id + \"--native\"}\n ?disabled=${this.disabled}\n ?required=${this.required}\n aria-required=${this.required}\n aria-disabled=\"${this.disabled}\"\n aria-labelledby=${ifDefined(\n this.label ? this.id + \"--label\" : undefined,\n )}\n aria-label=${ifDefined(\n !this.label && this.description ? this.description : undefined,\n )}\n aria-invalid=${this.showError ? \"true\" : \"false\"}\n aria-errormessage=${this.id + \"--error\"}\n aria-describedby=${ifDefined(\n this.showError ? this.id + \"--error\" : undefined,\n )}\n .value=${this._filterText}\n form=${ifDefined(this.form || undefined)}\n @input=${this._handleInput}\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n @keydown=\"${this._handleKeyDown}\"\n />\n <div class=\"nys-combobox__buttons\">\n ${this.value\n ? html`\n <nys-button\n class=\"nys-combobox__clear\"\n label=\"Clear selection\"\n variant=\"ghost\"\n size=\"sm\"\n circle\n @nys-click=${this._handleClearClick}\n ?disabled=${this.disabled}\n >\n <nys-icon\n slot=\"suffix-icon\"\n size=\"20\"\n name=\"close\"\n ></nys-icon>\n </nys-button>\n `\n : \"\"}\n <nys-button\n class=\"nys-combobox__chevron\"\n label=\"Toggle dropdown\"\n variant=\"ghost\"\n size=\"sm\"\n circle\n @nys-click=${this._handleIconClick}\n ?disabled=${this.disabled}\n >\n <nys-icon\n slot=\"suffix-icon\"\n size=\"20\"\n name=\"chevron_down\"\n ></nys-icon>\n </nys-button>\n </div>\n </div>\n ${this._isOpen\n ? html`\n <div\n class=\"nys-combobox__listbox ${this._dropdownAbove\n ? \"nys-combobox__listbox--above\"\n : \"\"}\"\n id=\"${this.id}--listbox\"\n role=\"listbox\"\n tabindex=\"-1\"\n >\n ${this._renderOptions()}\n </div>\n `\n : \"\"}\n </div>\n <slot\n style=\"display: none;\"\n @slotchange=${this._handleSlotChange}\n ></slot>\n <nys-errormessage\n id=${this.id + \"--error\"}\n ?showError=${this.showError}\n errorMessage=${this.errorMessage}\n ></nys-errormessage>\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;\"\n >\n ${this._announcement}\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get(\"nys-combobox\")) {\n customElements.define(\"nys-combobox\", NysCombobox);\n}\n"],"names":["LitElement","unsafeCSS","html","property","state","query","ifDefined","y","f","e","b","r","h","t","n","s","g","I","_r","i","l","w","u","_NysCombobox","NysFormControlElement","event","changedProperties","option","opt","slot","assignedElements","options","markupSelected","node","group","groupLabel","child","message","validity","isInvalid","form","element","inputRect","listboxHeight","spaceBelow","spaceAbove","searchText","search","highlighted","direction","newIndex","prevOption","enabledFiltered","position","isSelected","groupPrefix","input","count","relatedTarget","index","currentGroup","elements","isFocused","styles","NysCombobox","__decorateClass"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nys-combobox.js","sources":["../../internals/dist/index.js","../src/nys-combobox.ts"],"sourcesContent":["import { LitElement as u } from \"lit\";\n/*!\n * New York State Design System v1.22.0\n * Description: A design system for New York State's digital products.\n * Repository: https://github.com/its-hcd/nysds\n * License: MIT\n */\nlet y = 0;\nfunction f(e) {\n return `${e}-${Date.now()}-${y++}`;\n}\nfunction N(e, t, s) {\n e.dispatchEvent(\n new CustomEvent(t, { detail: s, bubbles: !0, composed: !0 })\n );\n}\nfunction I(e, t) {\n e.dispatchEvent(\n new Event(`nys-${t}`, { bubbles: !0, composed: !0 })\n );\n}\nconst p = {\n labelledby: \"ariaLabelledByElements\",\n describedby: \"ariaDescribedByElements\"\n}, g = {\n labelledby: \"ariaLabel\",\n describedby: \"ariaDescription\"\n};\nfunction _(e) {\n return \"ariaDescribedByElements\" in e;\n}\nfunction E(e) {\n return e === \"errormessage\" ? \"aria-errormessage\" : `aria-${e}`;\n}\nfunction d(e) {\n return e.filter((t) => !!t);\n}\nfunction A(e) {\n return e.map((t) => (t.id || (t.id = f(\"nys-ref\")), t.id));\n}\nfunction w(e, t, s) {\n const n = d(s), i = E(t);\n n.length ? e.setAttribute(i, A(n).join(\" \")) : e.removeAttribute(i);\n}\nfunction x(e, t, s, n, i) {\n const r = d(n), a = p[s], l = t;\n if (a && _(t)) {\n l[a] = r.length ? r : null;\n return;\n }\n const o = g[s];\n if (!o) return;\n const c = i ?? (r.length ? r.map((m) => m.textContent?.trim() ?? \"\").filter(Boolean).join(\" \") : \"\");\n o in l ? l[o] = c || null : c ? e.setAttribute(\n s === \"labelledby\" ? \"aria-label\" : \"aria-description\",\n c\n ) : e.removeAttribute(\n s === \"labelledby\" ? \"aria-label\" : \"aria-description\"\n );\n}\nconst R = {\n labelledby: \"ariaLabelledByElements\",\n describedby: \"ariaDescribedByElements\"\n}, V = {\n labelledby: \"aria-label\",\n describedby: \"aria-description\"\n};\nfunction L(e, t, s) {\n const n = d(s), i = R[t], r = V[t], a = e;\n if (i && i in e && (a[i] = n.length ? n : null), !r) return;\n const l = n.map((o) => o.textContent?.trim() ?? \"\").filter(Boolean).join(\" \");\n l ? e.setAttribute(r, l) : e.removeAttribute(r);\n}\nconst h = (e) => {\n class t extends e {\n get idPrefix() {\n return this.localName || \"nys-element\";\n }\n ensureId() {\n this.id || (this.id = f(this.idPrefix));\n }\n connectedCallback() {\n super.connectedCallback(), this.ensureId();\n }\n }\n return t;\n}, P = /* @__PURE__ */ h(u), b = (e) => {\n class t extends h(e) {\n constructor() {\n super(...arguments), this.__internals = null;\n }\n get internals() {\n if (this.__internals) return this.__internals;\n if (typeof this.attachInternals == \"function\")\n try {\n this.__internals = this.attachInternals();\n } catch {\n this.__internals = null;\n }\n return this.__internals;\n }\n get defaultRole() {\n return null;\n }\n setHostAria(n, i) {\n const r = this.internals;\n if (r && n in r) {\n r[n] = i;\n return;\n }\n const a = v(n);\n i === null ? this.removeAttribute(a) : this.setAttribute(a, i);\n }\n reflectDefaultSemantics() {\n const n = this.defaultRole;\n n && this.setHostAria(\"role\", n);\n }\n connectedCallback() {\n super.connectedCallback(), this.reflectDefaultSemantics();\n }\n }\n return t;\n};\nfunction v(e) {\n if (e === \"role\") return \"role\";\n const t = e.replace(/^aria/, \"\");\n return \"aria-\" + t.charAt(0).toLowerCase() + t.slice(1);\n}\nconst T = /* @__PURE__ */ b(u), C = (e) => {\n const s = class s extends b(e) {\n constructor() {\n super(...arguments), this.__internalValidationMessage = \"\";\n }\n get internalValidationMessage() {\n return this.__internalValidationMessage;\n }\n set internalValidationMessage(i) {\n i !== this.__internalValidationMessage && (this.__internalValidationMessage = i, this.requestUpdate(\"internalValidationMessage\"));\n }\n resolvedErrorMessage() {\n return this.errorMessage || this.internalValidationMessage;\n }\n setFormValue(i) {\n this.internals?.setFormValue(i ?? null);\n }\n setValidityFromState(i, r, a) {\n const l = this.internals;\n if (!l) return;\n const o = Object.values(i).some(Boolean);\n o ? l.setValidity(i, r ?? \"Invalid value\", a) : l.setValidity({}), this.setHostAria(\"ariaInvalid\", o ? \"true\" : \"false\");\n }\n clearValidity() {\n this.internals?.setValidity({}), this.setHostAria(\"ariaInvalid\", \"false\");\n }\n checkValidity() {\n return this.internals?.checkValidity() ?? !0;\n }\n reportValidity() {\n return this.internals?.reportValidity() ?? !0;\n }\n formResetCallback() {\n this.internalValidationMessage = \"\", this.clearValidity();\n }\n };\n s.formAssociated = !0;\n let t = s;\n return t;\n}, O = /* @__PURE__ */ C(u);\nfunction B(e) {\n const t = e.tagName.toLowerCase(), s = /* @__PURE__ */ new Set(), n = (i) => {\n i.querySelectorAll(\"*\").forEach((r) => {\n const a = r.tagName.toLowerCase();\n a.startsWith(\"nys-\") && a !== t && !customElements.get(a) && s.add(a), r.shadowRoot && n(r.shadowRoot);\n });\n };\n return e.shadowRoot && n(e.shadowRoot), n(e), [...s].sort();\n}\nexport {\n C as FormControlMixin,\n h as IdentifiedMixin,\n P as NysElement,\n O as NysFormControlElement,\n T as NysReflectsAriaElement,\n b as ReflectsAriaMixin,\n w as associateControl,\n L as associateControlRefs,\n x as associateHost,\n N as dispatchNysEvent,\n I as dispatchNysFocusBlur,\n B as findUnregisteredChildren,\n f as generateId,\n _ as supportsElementRefs\n};\n//# sourceMappingURL=index.js.map\n","import { LitElement, html, unsafeCSS } from \"lit\";\nimport { property, state, query } from \"lit/decorators.js\";\nimport { ifDefined } from \"lit/directives/if-defined.js\";\nimport {\n NysFormControlElement,\n dispatchNysEvent,\n dispatchNysFocusBlur,\n} from \"@nysds/internals\";\n// These internal elements are rendered inside this component's shadow DOM, so\n// they must be registered whenever nys-combobox is used. Importing them here\n// (intentional side effect) guarantees the visible label and error message —\n// which the accessible name/error association depends on — always render. It\n// also guarantees the clear/toggle nys-buttons upgrade, since their accessible\n// name lands on nys-button's real inner <button>, which only exists once\n// nys-button renders.\nimport \"@nysds/nys-label\";\nimport \"@nysds/nys-errormessage\";\nimport \"@nysds/nys-icon\";\nimport \"@nysds/nys-button\";\n// @ts-ignore: SCSS module imported via bundler as inline\nimport styles from \"./nys-combobox.scss?inline\";\n\ninterface ComboboxOption {\n value: string;\n label: string;\n disabled?: boolean;\n group?: string;\n}\n\n/** Detail payload for the `nys-input` event. */\nexport interface NysComboboxInputDetail {\n id: string;\n name: string;\n /** The committed value (the selected option's value), not the filter text. */\n value: string;\n /** The raw filter text the user has typed. */\n query: string;\n}\n\n/** The `nys-input` event, fired on each keystroke while filtering. */\nexport type NysComboboxInputEvent = CustomEvent<NysComboboxInputDetail>;\n\n/** Detail payload for the `nys-change` event. */\nexport interface NysComboboxChangeDetail {\n id: string;\n name: string;\n value: string;\n}\n\n/** The `nys-change` event, fired when a selection is committed. */\nexport type NysComboboxChangeEvent = CustomEvent<NysComboboxChangeDetail>;\n\n/**\n * `<nys-combobox>` is a form-enabled combo box combining text input with a filterable dropdown.\n *\n * Features:\n * - Type to filter options\n * - Keyboard navigation (Arrow keys, Enter, Escape)\n * - Mouse and keyboard interaction\n * - Clears non-selected text on blur\n * - Clear button when value is selected\n * - Integrates with forms via ElementInternals\n * - Supports native <option> and <optgroup> elements\n * - Accessible per W3C ARIA Authoring Practices\n *\n * @slot description - Optional custom description content below the label.\n * @slot default - Options (<option>, <optgroup>) to populate the dropdown\n *\n * @formControl value nys-change nys-input\n *\n * @fires {NysComboboxChangeEvent} nys-change - Fired when a selection is committed (option chosen or cleared). Detail: `{id, name, value}`.\n * @fires {NysComboboxInputEvent} nys-input - Fired on each keystroke while filtering. Detail: `{id, name, value, query}`. `value` is the committed value; `query` is the current filter text.\n * @fires {Event} nys-focus - Fired when the combobox gains focus.\n * @fires {Event} nys-blur - Fired when the combobox loses focus. Triggers validation.\n *\n * @usagedos\n * - Use when there are more than 15 options to choose from.\n * - Use when screen real estate is limited.\n * - Use when users can predict or recognize the value they're looking for.\n *\n * @usagedonts\n * - Use when the number of options is small. Use `<nys-select>` or `<nys-radiobutton>` instead.\n * - Use when options are unfamiliar to users and browsing the full list is necessary.\n *\n * @example Basic\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"cherry\">Cherry</option>\n * <option value=\"date\">Date</option>\n * <option value=\"elderberry\">Elderberry</option>\n * <option value=\"fig\">Fig</option>\n * <option value=\"grape\">Grape</option>\n * <option value=\"honeydew\">Honeydew</option>\n * <option value=\"kiwi\">Kiwi</option>\n * <option value=\"lemon\">Lemon</option>\n * <option value=\"mango\">Mango</option>\n * <option value=\"nectarine\">Nectarine</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"papaya\">Papaya</option>\n * <option value=\"quince\">Quince</option>\n * <option value=\"raspberry\">Raspberry</option>\n * <option value=\"strawberry\">Strawberry</option>\n * <option value=\"tangerine\">Tangerine</option>\n * <option value=\"watermelon\">Watermelon</option>\n * </nys-combobox>\n * ```\n *\n * @example Default Value\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" value=\"mango\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"mango\" selected>Mango</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Option Group\n * ```html\n * <nys-combobox label=\"Select a fruit\" description=\"Fruits organized by category\">\n * <optgroup label=\"Citrus\">\n * <option value=\"lemon\">Lemon</option>\n * <option value=\"lime\">Lime</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"grapefruit\">Grapefruit</option>\n * <option value=\"tangerine\">Tangerine</option>\n * </optgroup>\n * <optgroup label=\"Berries\">\n * <option value=\"strawberry\">Strawberry</option>\n * <option value=\"blueberry\">Blueberry</option>\n * <option value=\"raspberry\">Raspberry</option>\n * <option value=\"blackberry\">Blackberry</option>\n * <option value=\"cranberry\">Cranberry</option>\n * </optgroup>\n * <optgroup label=\"Tropical\">\n * <option value=\"mango\">Mango</option>\n * <option value=\"pineapple\">Pineapple</option>\n * <option value=\"papaya\">Papaya</option>\n * <option value=\"coconut\">Coconut</option>\n * <option value=\"passionfruit\">Passionfruit</option>\n * </optgroup>\n * <optgroup label=\"Stone Fruits\">\n * <option value=\"peach\">Peach</option>\n * <option value=\"plum\">Plum</option>\n * <option value=\"cherry\">Cherry</option>\n * <option value=\"apricot\">Apricot</option>\n * <option value=\"nectarine\">Nectarine</option>\n * </optgroup>\n * </nys-combobox>\n * ```\n *\n * @example Disabled\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" disabled>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Required\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" required>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Optional\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" optional>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Width Medium\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" width=\"md\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Width Large\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" width=\"lg\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Description\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" description=\"Choose from the list of available fruits.\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Description Slot\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\">\n * <label slot=\"description\">This is a description slot</label>\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Error Message\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" showError errorMessage=\"Please select a fruit\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"orange\">Orange</option>\n * <option value=\"strawberry\">Strawberry</option>\n * </nys-combobox>\n * ```\n *\n * @example Disabled Options\n * ```html\n * <nys-combobox label=\"Select your favorite fruit\" description=\"Some fruits are out of season\">\n * <option value=\"apple\">Apple</option>\n * <option value=\"banana\">Banana</option>\n * <option value=\"cherry\" disabled>Cherry (Out of season)</option>\n * <option value=\"mango\">Mango</option>\n * <option value=\"strawberry\" disabled>Strawberry (Out of season)</option>\n * <option value=\"orange\">Orange</option>\n * </nys-combobox>\n * ```\n */\nexport class NysCombobox extends NysFormControlElement {\n static styles = unsafeCSS(styles);\n static shadowRootOptions = {\n ...LitElement.shadowRootOptions,\n delegatesFocus: true,\n };\n\n /** Unique identifier. Auto-generated if not provided. */\n @property({ type: String, reflect: true }) id = \"\";\n\n /** Name for form submission. */\n @property({ type: String, reflect: true }) name = \"\";\n\n /** Visible label text. Required for accessibility. */\n @property({ type: String }) label = \"\";\n\n /** Helper text below label. Use slot for custom HTML. */\n @property({ type: String }) description = \"\";\n\n /** Current committed value: the selected option's value, not the typed filter text. */\n @property({ type: String }) value = \"\";\n\n /** Prevents interaction. */\n @property({ type: Boolean, reflect: true }) disabled = false;\n\n /** Marks as required. Shows \"Required\" flag and validates on blur. */\n @property({ type: Boolean, reflect: true }) required = false;\n\n /** Shows \"Optional\" flag. Use when most fields are required. */\n @property({ type: Boolean, reflect: true }) optional = false;\n\n /** Tooltip text shown on hover/focus of info icon. */\n @property({ type: String }) tooltip = \"\";\n\n /** Form `id` to associate with when the combobox is outside the form element. */\n @property({ type: String, reflect: true }) form: string | null = null;\n\n /**\n * Input width: `md` (200px), `lg` (384px), `full` (100%, default).\n * @default \"full\"\n */\n @property({ type: String, reflect: true }) width: \"md\" | \"lg\" | \"full\" =\n \"full\";\n\n /** Adjusts colors for dark backgrounds. */\n @property({ type: Boolean, reflect: true }) inverted = false;\n\n /** Shows error message when true. Set by validation or manually. */\n @property({ type: Boolean, reflect: true }) showError = false;\n\n /** Error message text. Shown only when `showError` is true. Never overwritten by internal validation. */\n @property({ type: String }) errorMessage = \"\";\n\n @state() private _isOpen = false;\n @state() private _filterText = \"\";\n @state() private _highlightedIndex = -1;\n @state() private _options: ComboboxOption[] = [];\n @state() private _filteredOptions: ComboboxOption[] = [];\n @state() private _dropdownAbove = false;\n @state() private _announcement = \"\";\n\n @query(\"input\") private _input!: HTMLInputElement;\n @query(\".nys-combobox__listbox\") private _listbox?: HTMLElement;\n\n private _hasUserInteracted = false;\n private _selectedLabel = \"\";\n private _defaultValue = \"\";\n private _hasResolvedSlottedValue = false;\n\n /**\n * Lifecycle methods\n * --------------------------------------------------------------------------\n * Form association, ElementInternals, and id generation are provided by\n * NysFormControlElement (@nysds/internals).\n */\n connectedCallback() {\n // super.connectedCallback() (NysFormControlElement) assigns an id when one\n // is not provided and reflects default semantics.\n super.connectedCallback();\n this.addEventListener(\"invalid\", this._handleInvalid);\n document.addEventListener(\"click\", this._handleDocumentClick);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n this.removeEventListener(\"invalid\", this._handleInvalid);\n document.removeEventListener(\"click\", this._handleDocumentClick);\n }\n\n firstUpdated() {\n // Slotted options are read in `_handleSlotChange`, which the slot's\n // `slotchange` event fires once its nodes are assigned. It also resolves an\n // option marked `selected` into `value` and captures `_defaultValue`.\n this._setValue();\n this._defaultValue = this.value;\n }\n\n // Derive display state from `value` before rendering, not after, so Lit\n // doesn't have to schedule a second update (see lit.dev/msg/change-in-update).\n willUpdate(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has(\"value\")) {\n const option = this._options.find((opt) => opt.value === this.value);\n this._selectedLabel = option ? option.label : \"\";\n this._filterText = this._selectedLabel;\n }\n }\n\n updated(changedProperties: Map<string | number | symbol, unknown>) {\n if (changedProperties.has(\"value\")) {\n this._setValue();\n }\n\n // Re-sync ElementInternals: `required` can arrive as a late property\n // write (e.g. a framework wrapper setting it post-hydration) with no\n // accompanying `value` change, so the branch above alone wouldn't catch\n // it. The `?required=${...}` template binding already keeps the native\n // input's attribute in sync declaratively; without this, ElementInternals\n // would still report valid, the native `invalid` event would never fire\n // on submit, and showError would never flip even though the field is\n // genuinely required and empty.\n if (changedProperties.has(\"required\") && !changedProperties.has(\"value\")) {\n this._manageRequire();\n }\n\n if (changedProperties.has(\"_isOpen\") && this._isOpen) {\n // Positioning measures the rendered listbox, so it has to wait for this\n // update to settle before it may flip `_dropdownAbove`.\n this.updateComplete.then(() => {\n this._positionDropdown();\n this._scrollToHighlighted();\n });\n }\n }\n\n /**\n * Slot handling\n * --------------------------------------------------------------------------\n */\n private _handleSlotChange() {\n const slot = this.shadowRoot?.querySelector(\n 'slot:not([name=\"description\"])',\n ) as HTMLSlotElement | null;\n\n if (!slot) return;\n\n const assignedElements = slot.assignedElements({ flatten: true });\n const options: ComboboxOption[] = [];\n let markupSelected = \"\";\n\n assignedElements.forEach((node) => {\n if (node.tagName === \"OPTION\") {\n const option = node as HTMLOptionElement;\n options.push({\n value: option.value,\n label: option.textContent?.trim() || option.value,\n disabled: option.disabled,\n });\n if (option.selected && !markupSelected) {\n markupSelected = option.value;\n }\n } else if (node.tagName === \"OPTGROUP\") {\n const group = node as HTMLOptGroupElement;\n const groupLabel = group.label;\n\n Array.from(group.children).forEach((child) => {\n if (child.tagName === \"OPTION\") {\n const option = child as HTMLOptionElement;\n options.push({\n value: option.value,\n label: option.textContent?.trim() || option.value,\n disabled: option.disabled || group.disabled,\n group: groupLabel,\n });\n if (option.selected && !markupSelected) {\n markupSelected = option.value;\n }\n }\n });\n }\n });\n\n this._options = options;\n this._filteredOptions = options;\n\n // The first time options arrive, adopt an option marked `selected` unless\n // an explicit value was already set, and use the result as the reset baseline.\n if (!this._hasResolvedSlottedValue) {\n this._hasResolvedSlottedValue = true;\n\n if (!this.value && markupSelected) {\n this.value = markupSelected;\n }\n this._defaultValue = this.value;\n }\n\n // Set initial display text if value exists\n if (this.value) {\n const option = this._options.find((opt) => opt.value === this.value);\n if (option) {\n this._selectedLabel = option.label;\n this._filterText = option.label;\n }\n }\n }\n\n /**\n * Form Integration\n * --------------------------------------------------------------------------\n */\n private _setValue() {\n this.setFormValue(this.value);\n this._manageRequire();\n }\n\n private _manageRequire() {\n const isInvalid =\n this.required && (!this.value || this.value?.trim() === \"\");\n\n if (isInvalid) {\n this.internalValidationMessage = \"This field is required\";\n this.setValidityFromState(\n { valueMissing: true },\n this.resolvedErrorMessage(),\n this._input,\n );\n } else {\n this.internalValidationMessage = \"\";\n this.clearValidity();\n this._hasUserInteracted = false;\n }\n }\n\n private _setValidityMessage(message: string = \"\") {\n this.showError = !!message;\n // Store the component's own validation text; a consumer-supplied\n // errorMessage always wins via resolvedErrorMessage().\n this.internalValidationMessage = message;\n\n if (message) {\n this.setValidityFromState(\n { customError: true },\n this.resolvedErrorMessage(),\n this._input,\n );\n } else {\n this.clearValidity();\n }\n }\n\n private _validate() {\n if (!this._input) return;\n\n const validity = this._input.validity;\n let message = \"\";\n\n const isInvalid =\n this._input &&\n this.value &&\n !this._options.some((opt) => opt.value === this.value);\n\n if (validity.valueMissing || isInvalid) {\n message = \"This field is required\";\n } else {\n message = this._input.validationMessage;\n }\n\n this._setValidityMessage(message);\n }\n\n formResetCallback() {\n this.value = this._defaultValue;\n this._filterText = this._defaultValue\n ? (this._options.find((opt) => opt.value === this._defaultValue)?.label ??\n \"\")\n : \"\";\n this._selectedLabel = this._filterText;\n\n if (this._input) {\n this._input.value = this._filterText;\n }\n\n this.setFormValue(this.value);\n\n // Reset validation UI. Clears only the component's own validation text;\n // a consumer-supplied errorMessage is never touched.\n this.showError = false;\n this.internalValidationMessage = \"\";\n this.clearValidity();\n\n this.requestUpdate();\n }\n checkValidity(): boolean {\n return this._input ? this._input.checkValidity() : true;\n }\n\n private _handleInvalid(event: Event) {\n event.preventDefault();\n this._hasUserInteracted = true;\n this._validate();\n\n if (this._input) {\n const form = this.internals?.form;\n if (form) {\n const elements = Array.from(form.elements) as Array<\n HTMLElement & { checkValidity?: () => boolean }\n >;\n const firstInvalidElement = elements.find(\n (element) =>\n typeof element.checkValidity === \"function\" &&\n !element.checkValidity(),\n );\n if (firstInvalidElement === this) {\n this._input.focus();\n }\n } else {\n this._input.focus();\n }\n }\n }\n\n /**\n * Dropdown positioning\n * --------------------------------------------------------------------------\n */\n private _positionDropdown() {\n if (!this._listbox || !this._input) return;\n\n const inputRect = this._input.getBoundingClientRect();\n const listboxHeight = this._listbox.offsetHeight;\n const viewportHeight = window.innerHeight;\n const spaceBelow = viewportHeight - inputRect.bottom;\n const spaceAbove = inputRect.top;\n\n // Show above if not enough space below and more space above\n this._dropdownAbove = spaceBelow < listboxHeight && spaceAbove > spaceBelow;\n }\n\n /**\n * Filtering\n * --------------------------------------------------------------------------\n */\n private _filterOptions(searchText: string) {\n if (!searchText) {\n this._filteredOptions = this._options;\n return;\n }\n\n const search = searchText.toLowerCase();\n this._filteredOptions = this._options.filter((option) =>\n option.label.toLowerCase().includes(search),\n );\n }\n\n /**\n * Keyboard navigation\n * --------------------------------------------------------------------------\n */\n private _scrollToHighlighted() {\n if (!this._listbox || this._highlightedIndex < 0) return;\n\n const highlighted = this._listbox.querySelector(\n `[data-index=\"${this._highlightedIndex}\"]`,\n ) as HTMLElement;\n\n if (highlighted) {\n highlighted.scrollIntoView({ block: \"nearest\" });\n }\n }\n\n private _handleKeyDown(event: KeyboardEvent) {\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n if (!this._isOpen) {\n this._openDropdown();\n } else {\n this._moveHighlight(1);\n }\n break;\n\n case \"ArrowUp\":\n event.preventDefault();\n if (!this._isOpen) {\n this._openDropdown();\n } else {\n this._moveHighlight(-1);\n }\n break;\n\n case \"Enter\":\n event.preventDefault();\n if (this._isOpen && this._highlightedIndex >= 0) {\n this._selectOption(this._filteredOptions[this._highlightedIndex]);\n }\n break;\n\n case \"Escape\":\n event.preventDefault();\n this._closeDropdown();\n this._filterText = this._selectedLabel;\n break;\n\n case \"Tab\":\n if (this._isOpen) {\n this._closeDropdown();\n this._filterText = this._selectedLabel;\n }\n break;\n }\n }\n\n private _moveHighlight(direction: number) {\n const enabledOptions = this._filteredOptions.filter((opt) => !opt.disabled);\n if (enabledOptions.length === 0) return;\n\n let newIndex = this._highlightedIndex + direction;\n\n // Wrap around\n if (newIndex < 0) {\n newIndex = this._filteredOptions.length - 1;\n } else if (newIndex >= this._filteredOptions.length) {\n newIndex = 0;\n }\n\n // Skip disabled options\n while (this._filteredOptions[newIndex]?.disabled) {\n newIndex += direction;\n if (newIndex < 0) newIndex = this._filteredOptions.length - 1;\n if (newIndex >= this._filteredOptions.length) newIndex = 0;\n }\n\n this._highlightedIndex = newIndex;\n this._scrollToHighlighted();\n\n const option = this._filteredOptions[newIndex];\n const prevOption = this._filteredOptions[newIndex - direction];\n const enabledFiltered = this._filteredOptions.filter(\n (opt) => !opt.disabled,\n );\n const position =\n enabledFiltered.findIndex((opt) => opt.value === option.value) + 1;\n const isSelected = option.value === this.value ? \"selected\" : \"unselected\";\n const groupChanged = option.group && option.group !== prevOption?.group;\n const groupPrefix = groupChanged ? `${option.group}, ` : \"\";\n this._announcement = `${groupPrefix} ${option.label} ${position} of ${enabledFiltered.length}, ${isSelected}`;\n }\n\n /**\n * Event Handlers\n * --------------------------------------------------------------------------\n */\n private _handleInput(event: Event) {\n const input = event.target as HTMLInputElement;\n this._filterText = input.value;\n this._filterOptions(this._filterText);\n\n if (!this._isOpen) {\n this._openDropdown();\n }\n\n this._highlightedIndex = 0;\n\n const count = this._filteredOptions.filter((opt) => !opt.disabled).length;\n this._announcement =\n count > 0 ? `${count} options available` : \"No results found\";\n\n if (this._hasUserInteracted) {\n this._validate();\n }\n\n // `value` carries the committed value (empty until an option is chosen);\n // `query` carries the raw filter text the user has typed.\n dispatchNysEvent<NysComboboxInputDetail>(this, \"nys-input\", {\n id: this.id,\n name: this.name,\n value: this.value,\n query: this._filterText,\n });\n }\n\n private _handleFocus() {\n dispatchNysFocusBlur(this, \"focus\");\n }\n\n private _handleBlur(event: FocusEvent) {\n // Check if focus moved to the listbox\n const relatedTarget = event.relatedTarget as HTMLElement;\n if (relatedTarget && this._listbox?.contains(relatedTarget)) {\n return;\n }\n\n // If no valid selection, clear the input\n if (!this.value || this._filterText !== this._selectedLabel) {\n this._filterText = this._selectedLabel;\n this._filterOptions(\"\");\n }\n\n this._closeDropdown();\n\n if (!this._hasUserInteracted) {\n this._hasUserInteracted = true;\n }\n this._validate();\n\n dispatchNysFocusBlur(this, \"blur\");\n }\n\n private _handleDocumentClick = (event: MouseEvent) => {\n // Don't close if click is on the combobox host element or inside shadow DOM\n if (\n event.target === this ||\n this.shadowRoot?.contains(event.target as Node)\n ) {\n return;\n }\n this._closeDropdown();\n };\n\n private _handleIconClick() {\n if (this.disabled) return;\n\n if (this._isOpen) {\n this._closeDropdown();\n } else {\n this._input.focus();\n this._openDropdown();\n }\n }\n\n private _handleClearClick(event: Event) {\n event.stopPropagation();\n this.value = \"\";\n this._filterText = \"\";\n this._selectedLabel = \"\";\n this._filterOptions(\"\");\n this.setFormValue(\"\");\n this._closeDropdown();\n this._input.focus();\n\n this._handleChange();\n }\n\n private _handleOptionClick(option: ComboboxOption) {\n if (option.disabled) return;\n this._selectOption(option);\n }\n\n private _handleOptionMouseEnter(index: number) {\n this._highlightedIndex = index;\n }\n\n private _selectOption(option: ComboboxOption) {\n this.value = option.value;\n this._selectedLabel = option.label;\n this._filterText = option.label;\n this.setFormValue(this.value);\n this._input.focus();\n this._closeDropdown();\n this._filterOptions(\"\");\n\n this._setValidityMessage(\"\");\n\n if (this._hasUserInteracted) {\n this._validate();\n }\n\n this._handleChange();\n }\n\n private _handleChange() {\n dispatchNysEvent<NysComboboxChangeDetail>(this, \"nys-change\", {\n id: this.id,\n name: this.name,\n value: this.value,\n });\n }\n\n private _openDropdown() {\n this._isOpen = true;\n this._highlightedIndex = this._filteredOptions.findIndex(\n (opt) => opt.value === this.value,\n );\n if (this._highlightedIndex < 0) this._highlightedIndex = 0;\n }\n\n private _closeDropdown() {\n this._isOpen = false;\n this._highlightedIndex = -1;\n }\n\n /**\n * Render helpers\n * --------------------------------------------------------------------------\n */\n private _renderOptions() {\n let currentGroup = \"\";\n const elements: any[] = [];\n\n this._filteredOptions.forEach((option, index) => {\n if (option.group && option.group !== currentGroup) {\n currentGroup = option.group;\n elements.push(html`\n <div class=\"nys-combobox__optgroup\" role=\"presentation\">\n ${option.group}\n </div>\n `);\n }\n\n const isFocused = index === this._highlightedIndex;\n const isSelected = option.value === this.value;\n\n elements.push(html`\n <div\n class=\"nys-combobox__option ${isFocused\n ? \"nys-combobox__option--focused\"\n : \"\"} ${isSelected ? \"nys-combobox__option--selected\" : \"\"}\"\n role=\"option\"\n id=\"${this.id}--option-${index}\"\n data-index=\"${index}\"\n aria-selected=\"${isSelected}\"\n aria-disabled=\"${option.disabled || false}\"\n ?disabled=${option.disabled}\n @click=${() => this._handleOptionClick(option)}\n @mouseenter=${() => this._handleOptionMouseEnter(index)}\n >\n ${option.label}\n </div>\n `);\n });\n\n if (elements.length === 0) {\n return html`\n <div class=\"nys-combobox__no-results\" role=\"option\">\n No results found\n </div>\n `;\n }\n\n return elements;\n }\n\n render() {\n return html`\n <div class=\"nys-combobox\">\n <nys-label\n id=\"${this.id}--label\"\n label=${this.label}\n description=${this.description}\n flag=${this.required ? \"required\" : this.optional ? \"optional\" : \"\"}\n tooltip=${this.tooltip}\n ?inverted=${this.inverted}\n >\n <slot name=\"description\" slot=\"description\">${this.description}</slot>\n </nys-label>\n <div\n class=\"nys-combobox__container ${this._isOpen\n ? \"nys-combobox__container--open\"\n : \"\"}\"\n >\n <div class=\"nys-combobox__input-wrapper\">\n <input\n class=\"nys-combobox__input\"\n type=\"text\"\n role=\"combobox\"\n aria-autocomplete=\"list\"\n aria-expanded=\"${this._isOpen}\"\n aria-controls=\"${this.id}--listbox\"\n aria-activedescendant=\"${this._highlightedIndex >= 0\n ? `${this.id}--option-${this._highlightedIndex}`\n : \"\"}\"\n name=${this.name}\n id=${this.id + \"--native\"}\n ?disabled=${this.disabled}\n ?required=${this.required}\n aria-required=${this.required}\n aria-disabled=\"${this.disabled}\"\n aria-labelledby=${ifDefined(\n this.label ? this.id + \"--label\" : undefined,\n )}\n aria-label=${ifDefined(\n !this.label && this.description ? this.description : undefined,\n )}\n aria-invalid=${this.showError ? \"true\" : \"false\"}\n aria-errormessage=${this.id + \"--error\"}\n aria-describedby=${ifDefined(\n this.showError ? this.id + \"--error\" : undefined,\n )}\n .value=${this._filterText}\n form=${ifDefined(this.form || undefined)}\n @input=${this._handleInput}\n @focus=\"${this._handleFocus}\"\n @blur=\"${this._handleBlur}\"\n @keydown=\"${this._handleKeyDown}\"\n />\n <div class=\"nys-combobox__buttons\">\n ${this.value\n ? html`\n <nys-button\n class=\"nys-combobox__clear\"\n label=\"Clear selection\"\n variant=\"ghost\"\n size=\"sm\"\n circle\n @nys-click=${this._handleClearClick}\n ?disabled=${this.disabled}\n >\n <nys-icon\n slot=\"suffix-icon\"\n size=\"20\"\n name=\"close\"\n ></nys-icon>\n </nys-button>\n `\n : \"\"}\n <nys-button\n class=\"nys-combobox__chevron\"\n label=\"Toggle dropdown\"\n variant=\"ghost\"\n size=\"sm\"\n circle\n @nys-click=${this._handleIconClick}\n ?disabled=${this.disabled}\n >\n <nys-icon\n slot=\"suffix-icon\"\n size=\"20\"\n name=\"chevron_down\"\n ></nys-icon>\n </nys-button>\n </div>\n </div>\n ${this._isOpen\n ? html`\n <div\n class=\"nys-combobox__listbox ${this._dropdownAbove\n ? \"nys-combobox__listbox--above\"\n : \"\"}\"\n id=\"${this.id}--listbox\"\n role=\"listbox\"\n tabindex=\"-1\"\n >\n ${this._renderOptions()}\n </div>\n `\n : \"\"}\n </div>\n <slot\n style=\"display: none;\"\n @slotchange=${this._handleSlotChange}\n ></slot>\n <nys-errormessage\n id=${this.id + \"--error\"}\n ?showError=${this.showError}\n errorMessage=${this.resolvedErrorMessage()}\n ></nys-errormessage>\n <div\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0;\"\n >\n ${this._announcement}\n </div>\n </div>\n `;\n }\n}\n\nif (!customElements.get(\"nys-combobox\")) {\n customElements.define(\"nys-combobox\", NysCombobox);\n}\n"],"names":["LitElement","unsafeCSS","html","property","state","query","ifDefined","y","f","e","N","t","I","h","b","n","i","r","a","v","C","s","l","o","O","u","_NysCombobox","NysFormControlElement","event","changedProperties","option","opt","slot","assignedElements","options","markupSelected","node","group","groupLabel","child","message","validity","isInvalid","form","element","inputRect","listboxHeight","spaceBelow","spaceAbove","searchText","search","highlighted","direction","newIndex","prevOption","enabledFiltered","position","isSelected","groupPrefix","input","count","dispatchNysEvent","dispatchNysFocusBlur","relatedTarget","index","currentGroup","elements","isFocused","styles","NysCombobox","__decorateClass"],"mappings":"AACA,SAAA,cAAAA,GAAA,aAAAC,GAAA,QAAAC,SAAA;AAAA,SAAA,YAAAC,GAAA,SAAAC,GAAA,SAAAC,SAAA;AAAA,SAAA,aAAAC,SAAA;AAAA,OAAA;AAAA,OAAA;AAAA,OAAA;AAAA,OAAA;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,IAAIC,IAAI;AACR,SAASC,EAAEC,GAAG;AACZ,SAAO,GAAGA,CAAC,IAAI,KAAK,KAAK,IAAIF,GAAG;AAClC;AACA,SAASG,EAAED,GAAGE,GAAG,GAAG;AAClB,EAAAF,EAAE;AAAA,IACA,IAAI,YAAYE,GAAG,EAAE,QAAQ,GAAG,SAAS,IAAI,UAAU,GAAE,CAAE;AAAA,EAC/D;AACA;AACA,SAASC,EAAEH,GAAGE,GAAG;AACf,EAAAF,EAAE;AAAA,IACA,IAAI,MAAM,OAAOE,CAAC,IAAI,EAAE,SAAS,IAAI,UAAU,GAAE,CAAE;AAAA,EACvD;AACA;AAqDK,MAACE,IAAI,CAACJ,MAAM;AAAA,EACf,MAAME,UAAUF,EAAE;AAAA,IAChB,IAAI,WAAW;AACb,aAAO,KAAK,aAAa;AAAA,IAC3B;AAAA,IACA,WAAW;AACT,WAAK,OAAO,KAAK,KAAKD,EAAE,KAAK,QAAQ;AAAA,IACvC;AAAA,IACA,oBAAoB;AAClB,YAAM,kBAAiB,GAAI,KAAK,SAAQ;AAAA,IAC1C;AAAA,EACJ;AACE,SAAOG;AACT,GAA6BG,IAAI,CAACL,MAAM;AAAA,EACtC,MAAME,UAAUE,EAAEJ,CAAC,EAAE;AAAA,IACnB,cAAc;AACZ,YAAM,GAAG,SAAS,GAAG,KAAK,cAAc;AAAA,IAC1C;AAAA,IACA,IAAI,YAAY;AACd,UAAI,KAAK,YAAa,QAAO,KAAK;AAClC,UAAI,OAAO,KAAK,mBAAmB;AACjC,YAAI;AACF,eAAK,cAAc,KAAK,gBAAe;AAAA,QACzC,QAAQ;AACN,eAAK,cAAc;AAAA,QACrB;AACF,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,cAAc;AAChB,aAAO;AAAA,IACT;AAAA,IACA,YAAYM,GAAGC,GAAG;AAChB,YAAMC,IAAI,KAAK;AACf,UAAIA,KAAKF,KAAKE,GAAG;AACf,QAAAA,EAAEF,CAAC,IAAIC;AACP;AAAA,MACF;AACA,YAAME,IAAIC,EAAEJ,CAAC;AACb,MAAAC,MAAM,OAAO,KAAK,gBAAgBE,CAAC,IAAI,KAAK,aAAaA,GAAGF,CAAC;AAAA,IAC/D;AAAA,IACA,0BAA0B;AACxB,YAAMD,IAAI,KAAK;AACf,MAAAA,KAAK,KAAK,YAAY,QAAQA,CAAC;AAAA,IACjC;AAAA,IACA,oBAAoB;AAClB,YAAM,kBAAiB,GAAI,KAAK,wBAAuB;AAAA,IACzD;AAAA,EACJ;AACE,SAAOJ;AACT;AACA,SAASQ,EAAEV,GAAG;AACZ,MAAIA,MAAM,OAAQ,QAAO;AACzB,QAAME,IAAIF,EAAE,QAAQ,SAAS,EAAE;AAC/B,SAAO,UAAUE,EAAE,OAAO,CAAC,EAAE,gBAAgBA,EAAE,MAAM,CAAC;AACxD;AACK,MAA2BS,IAAI,CAACX,MAAM;AACzC,QAAMY,IAAI,cAAgBP,EAAEL,CAAC,EAAE;AAAA,IAC7B,cAAc;AACZ,YAAM,GAAG,SAAS,GAAG,KAAK,8BAA8B;AAAA,IAC1D;AAAA,IACA,IAAI,4BAA4B;AAC9B,aAAO,KAAK;AAAA,IACd;AAAA,IACA,IAAI,0BAA0BO,GAAG;AAC/B,MAAAA,MAAM,KAAK,gCAAgC,KAAK,8BAA8BA,GAAG,KAAK,cAAc,2BAA2B;AAAA,IACjI;AAAA,IACA,uBAAuB;AACrB,aAAO,KAAK,gBAAgB,KAAK;AAAA,IACnC;AAAA,IACA,aAAaA,GAAG;AACd,WAAK,WAAW,aAAaA,KAAK,IAAI;AAAA,IACxC;AAAA,IACA,qBAAqBA,GAAGC,GAAGC,GAAG;AAC5B,YAAMI,IAAI,KAAK;AACf,UAAI,CAACA,EAAG;AACR,YAAMC,IAAI,OAAO,OAAOP,CAAC,EAAE,KAAK,OAAO;AACvC,MAAAO,IAAID,EAAE,YAAYN,GAAGC,KAAK,iBAAiBC,CAAC,IAAII,EAAE,YAAY,CAAA,CAAE,GAAG,KAAK,YAAY,eAAeC,IAAI,SAAS,OAAO;AAAA,IACzH;AAAA,IACA,gBAAgB;AACd,WAAK,WAAW,YAAY,CAAA,CAAE,GAAG,KAAK,YAAY,eAAe,OAAO;AAAA,IAC1E;AAAA,IACA,gBAAgB;AACd,aAAO,KAAK,WAAW,cAAa,KAAM;AAAA,IAC5C;AAAA,IACA,iBAAiB;AACf,aAAO,KAAK,WAAW,eAAc,KAAM;AAAA,IAC7C;AAAA,IACA,oBAAoB;AAClB,WAAK,4BAA4B,IAAI,KAAK,cAAa;AAAA,IACzD;AAAA,EACJ;AACE,SAAAF,EAAE,iBAAiB,IACXA;AAEV,GAAGG,IAAoB,gBAAAJ,EAAEK,CAAC;;;;;;ACgFnB,MAAMC,IAAN,MAAMA,UAAoBC,EAAsB;AAAA,EAAhD,cAAA;AAAA,UAAA,GAAA,SAAA,GAQsC,KAAA,KAAK,IAGL,KAAA,OAAO,IAGtB,KAAA,QAAQ,IAGR,KAAA,cAAc,IAGd,KAAA,QAAQ,IAGQ,KAAA,WAAW,IAGX,KAAA,WAAW,IAGX,KAAA,WAAW,IAG3B,KAAA,UAAU,IAGK,KAAA,OAAsB,MAMtB,KAAA,QACzC,QAG0C,KAAA,WAAW,IAGX,KAAA,YAAY,IAG5B,KAAA,eAAe,IAElC,KAAQ,UAAU,IAClB,KAAQ,cAAc,IACtB,KAAQ,oBAAoB,IAC5B,KAAQ,WAA6B,CAAA,GACrC,KAAQ,mBAAqC,CAAA,GAC7C,KAAQ,iBAAiB,IACzB,KAAQ,gBAAgB,IAKjC,KAAQ,qBAAqB,IAC7B,KAAQ,iBAAiB,IACzB,KAAQ,gBAAgB,IACxB,KAAQ,2BAA2B,IAwbnC,KAAQ,uBAAuB,CAACC,MAAsB;AAEpD,MACEA,EAAM,WAAW,QACjB,KAAK,YAAY,SAASA,EAAM,MAAc,KAIhD,KAAK,eAAA;AAAA,IACP;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAzbA,oBAAoB;AAGlB,UAAM,kBAAA,GACN,KAAK,iBAAiB,WAAW,KAAK,cAAc,GACpD,SAAS,iBAAiB,SAAS,KAAK,oBAAoB;AAAA,EAC9D;AAAA,EAEA,uBAAuB;AACrB,UAAM,qBAAA,GACN,KAAK,oBAAoB,WAAW,KAAK,cAAc,GACvD,SAAS,oBAAoB,SAAS,KAAK,oBAAoB;AAAA,EACjE;AAAA,EAEA,eAAe;AAIb,SAAK,UAAA,GACL,KAAK,gBAAgB,KAAK;AAAA,EAC5B;AAAA;AAAA;AAAA,EAIA,WAAWC,GAA2D;AACpE,QAAIA,EAAkB,IAAI,OAAO,GAAG;AAClC,YAAMC,IAAS,KAAK,SAAS,KAAK,CAACC,MAAQA,EAAI,UAAU,KAAK,KAAK;AACnE,WAAK,iBAAiBD,IAASA,EAAO,QAAQ,IAC9C,KAAK,cAAc,KAAK;AAAA,IAC1B;AAAA,EACF;AAAA,EAEA,QAAQD,GAA2D;AACjE,IAAIA,EAAkB,IAAI,OAAO,KAC/B,KAAK,UAAA,GAWHA,EAAkB,IAAI,UAAU,KAAK,CAACA,EAAkB,IAAI,OAAO,KACrE,KAAK,eAAA,GAGHA,EAAkB,IAAI,SAAS,KAAK,KAAK,WAG3C,KAAK,eAAe,KAAK,MAAM;AAC7B,WAAK,kBAAA,GACL,KAAK,qBAAA;AAAA,IACP,CAAC;AAAA,EAEL;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB;AAC1B,UAAMG,IAAO,KAAK,YAAY;AAAA,MAC5B;AAAA,IAAA;AAGF,QAAI,CAACA,EAAM;AAEX,UAAMC,IAAmBD,EAAK,iBAAiB,EAAE,SAAS,IAAM,GAC1DE,IAA4B,CAAA;AAClC,QAAIC,IAAiB;AAiDrB,QA/CAF,EAAiB,QAAQ,CAACG,MAAS;AACjC,UAAIA,EAAK,YAAY,UAAU;AAC7B,cAAMN,IAASM;AACf,QAAAF,EAAQ,KAAK;AAAA,UACX,OAAOJ,EAAO;AAAA,UACd,OAAOA,EAAO,aAAa,KAAA,KAAUA,EAAO;AAAA,UAC5C,UAAUA,EAAO;AAAA,QAAA,CAClB,GACGA,EAAO,YAAY,CAACK,MACtBA,IAAiBL,EAAO;AAAA,MAE5B,WAAWM,EAAK,YAAY,YAAY;AACtC,cAAMC,IAAQD,GACRE,IAAaD,EAAM;AAEzB,cAAM,KAAKA,EAAM,QAAQ,EAAE,QAAQ,CAACE,MAAU;AAC5C,cAAIA,EAAM,YAAY,UAAU;AAC9B,kBAAMT,IAASS;AACf,YAAAL,EAAQ,KAAK;AAAA,cACX,OAAOJ,EAAO;AAAA,cACd,OAAOA,EAAO,aAAa,KAAA,KAAUA,EAAO;AAAA,cAC5C,UAAUA,EAAO,YAAYO,EAAM;AAAA,cACnC,OAAOC;AAAA,YAAA,CACR,GACGR,EAAO,YAAY,CAACK,MACtBA,IAAiBL,EAAO;AAAA,UAE5B;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,CAAC,GAED,KAAK,WAAWI,GAChB,KAAK,mBAAmBA,GAInB,KAAK,6BACR,KAAK,2BAA2B,IAE5B,CAAC,KAAK,SAASC,MACjB,KAAK,QAAQA,IAEf,KAAK,gBAAgB,KAAK,QAIxB,KAAK,OAAO;AACd,YAAML,IAAS,KAAK,SAAS,KAAK,CAACC,MAAQA,EAAI,UAAU,KAAK,KAAK;AACnE,MAAID,MACF,KAAK,iBAAiBA,EAAO,OAC7B,KAAK,cAAcA,EAAO;AAAA,IAE9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,YAAY;AAClB,SAAK,aAAa,KAAK,KAAK,GAC5B,KAAK,eAAA;AAAA,EACP;AAAA,EAEQ,iBAAiB;AAIvB,IAFE,KAAK,aAAa,CAAC,KAAK,SAAS,KAAK,OAAO,KAAA,MAAW,OAGxD,KAAK,4BAA4B,0BACjC,KAAK;AAAA,MACH,EAAE,cAAc,GAAA;AAAA,MAChB,KAAK,qBAAA;AAAA,MACL,KAAK;AAAA,IAAA,MAGP,KAAK,4BAA4B,IACjC,KAAK,cAAA,GACL,KAAK,qBAAqB;AAAA,EAE9B;AAAA,EAEQ,oBAAoBU,IAAkB,IAAI;AAChD,SAAK,YAAY,CAAC,CAACA,GAGnB,KAAK,4BAA4BA,GAE7BA,IACF,KAAK;AAAA,MACH,EAAE,aAAa,GAAA;AAAA,MACf,KAAK,qBAAA;AAAA,MACL,KAAK;AAAA,IAAA,IAGP,KAAK,cAAA;AAAA,EAET;AAAA,EAEQ,YAAY;AAClB,QAAI,CAAC,KAAK,OAAQ;AAElB,UAAMC,IAAW,KAAK,OAAO;AAC7B,QAAID,IAAU;AAEd,UAAME,IACJ,KAAK,UACL,KAAK,SACL,CAAC,KAAK,SAAS,KAAK,CAACX,MAAQA,EAAI,UAAU,KAAK,KAAK;AAEvD,IAAIU,EAAS,gBAAgBC,IAC3BF,IAAU,2BAEVA,IAAU,KAAK,OAAO,mBAGxB,KAAK,oBAAoBA,CAAO;AAAA,EAClC;AAAA,EAEA,oBAAoB;AAClB,SAAK,QAAQ,KAAK,eAClB,KAAK,cAAc,KAAK,gBACnB,KAAK,SAAS,KAAK,CAACT,MAAQA,EAAI,UAAU,KAAK,aAAa,GAAG,SAChE,KACA,IACJ,KAAK,iBAAiB,KAAK,aAEvB,KAAK,WACP,KAAK,OAAO,QAAQ,KAAK,cAG3B,KAAK,aAAa,KAAK,KAAK,GAI5B,KAAK,YAAY,IACjB,KAAK,4BAA4B,IACjC,KAAK,cAAA,GAEL,KAAK,cAAA;AAAA,EACP;AAAA,EACA,gBAAyB;AACvB,WAAO,KAAK,SAAS,KAAK,OAAO,kBAAkB;AAAA,EACrD;AAAA,EAEQ,eAAeH,GAAc;AAKnC,QAJAA,EAAM,eAAA,GACN,KAAK,qBAAqB,IAC1B,KAAK,UAAA,GAED,KAAK,QAAQ;AACf,YAAMe,IAAO,KAAK,WAAW;AAC7B,MAAIA,IACe,MAAM,KAAKA,EAAK,QAAQ,EAGJ;AAAA,QACnC,CAACC,MACC,OAAOA,EAAQ,iBAAkB,cACjC,CAACA,EAAQ,cAAA;AAAA,MAAc,MAEC,QAC1B,KAAK,OAAO,MAAA,IAGd,KAAK,OAAO,MAAA;AAAA,IAEhB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB;AAC1B,QAAI,CAAC,KAAK,YAAY,CAAC,KAAK,OAAQ;AAEpC,UAAMC,IAAY,KAAK,OAAO,sBAAA,GACxBC,IAAgB,KAAK,SAAS,cAE9BC,IADiB,OAAO,cACMF,EAAU,QACxCG,IAAaH,EAAU;AAG7B,SAAK,iBAAiBE,IAAaD,KAAiBE,IAAaD;AAAA,EACnE;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,eAAeE,GAAoB;AACzC,QAAI,CAACA,GAAY;AACf,WAAK,mBAAmB,KAAK;AAC7B;AAAA,IACF;AAEA,UAAMC,IAASD,EAAW,YAAA;AAC1B,SAAK,mBAAmB,KAAK,SAAS;AAAA,MAAO,CAACnB,MAC5CA,EAAO,MAAM,YAAA,EAAc,SAASoB,CAAM;AAAA,IAAA;AAAA,EAE9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,uBAAuB;AAC7B,QAAI,CAAC,KAAK,YAAY,KAAK,oBAAoB,EAAG;AAElD,UAAMC,IAAc,KAAK,SAAS;AAAA,MAChC,gBAAgB,KAAK,iBAAiB;AAAA,IAAA;AAGxC,IAAIA,KACFA,EAAY,eAAe,EAAE,OAAO,UAAA,CAAW;AAAA,EAEnD;AAAA,EAEQ,eAAevB,GAAsB;AAC3C,YAAQA,EAAM,KAAA;AAAA,MACZ,KAAK;AACH,QAAAA,EAAM,eAAA,GACD,KAAK,UAGR,KAAK,eAAe,CAAC,IAFrB,KAAK,cAAA;AAIP;AAAA,MAEF,KAAK;AACH,QAAAA,EAAM,eAAA,GACD,KAAK,UAGR,KAAK,eAAe,EAAE,IAFtB,KAAK,cAAA;AAIP;AAAA,MAEF,KAAK;AACH,QAAAA,EAAM,eAAA,GACF,KAAK,WAAW,KAAK,qBAAqB,KAC5C,KAAK,cAAc,KAAK,iBAAiB,KAAK,iBAAiB,CAAC;AAElE;AAAA,MAEF,KAAK;AACH,QAAAA,EAAM,eAAA,GACN,KAAK,eAAA,GACL,KAAK,cAAc,KAAK;AACxB;AAAA,MAEF,KAAK;AACH,QAAI,KAAK,YACP,KAAK,eAAA,GACL,KAAK,cAAc,KAAK;AAE1B;AAAA,IAAA;AAAA,EAEN;AAAA,EAEQ,eAAewB,GAAmB;AAExC,QADuB,KAAK,iBAAiB,OAAO,CAACrB,MAAQ,CAACA,EAAI,QAAQ,EACvD,WAAW,EAAG;AAEjC,QAAIsB,IAAW,KAAK,oBAAoBD;AAUxC,SAPIC,IAAW,IACbA,IAAW,KAAK,iBAAiB,SAAS,IACjCA,KAAY,KAAK,iBAAiB,WAC3CA,IAAW,IAIN,KAAK,iBAAiBA,CAAQ,GAAG;AACtC,MAAAA,KAAYD,GACRC,IAAW,MAAGA,IAAW,KAAK,iBAAiB,SAAS,IACxDA,KAAY,KAAK,iBAAiB,WAAQA,IAAW;AAG3D,SAAK,oBAAoBA,GACzB,KAAK,qBAAA;AAEL,UAAMvB,IAAS,KAAK,iBAAiBuB,CAAQ,GACvCC,IAAa,KAAK,iBAAiBD,IAAWD,CAAS,GACvDG,IAAkB,KAAK,iBAAiB;AAAA,MAC5C,CAACxB,MAAQ,CAACA,EAAI;AAAA,IAAA,GAEVyB,IACJD,EAAgB,UAAU,CAACxB,MAAQA,EAAI,UAAUD,EAAO,KAAK,IAAI,GAC7D2B,IAAa3B,EAAO,UAAU,KAAK,QAAQ,aAAa,cAExD4B,IADe5B,EAAO,SAASA,EAAO,UAAUwB,GAAY,QAC/B,GAAGxB,EAAO,KAAK,OAAO;AACzD,SAAK,gBAAgB,GAAG4B,CAAW,IAAI5B,EAAO,KAAK,IAAI0B,CAAQ,OAAOD,EAAgB,MAAM,KAAKE,CAAU;AAAA,EAC7G;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,aAAa7B,GAAc;AACjC,UAAM+B,IAAQ/B,EAAM;AACpB,SAAK,cAAc+B,EAAM,OACzB,KAAK,eAAe,KAAK,WAAW,GAE/B,KAAK,WACR,KAAK,cAAA,GAGP,KAAK,oBAAoB;AAEzB,UAAMC,IAAQ,KAAK,iBAAiB,OAAO,CAAC7B,MAAQ,CAACA,EAAI,QAAQ,EAAE;AACnE,SAAK,gBACH6B,IAAQ,IAAI,GAAGA,CAAK,uBAAuB,oBAEzC,KAAK,sBACP,KAAK,UAAA,GAKPC,EAAyC,MAAM,aAAa;AAAA,MAC1D,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,MACZ,OAAO,KAAK;AAAA,IAAA,CACb;AAAA,EACH;AAAA,EAEQ,eAAe;AACrBC,IAAAA,EAAqB,MAAM,OAAO;AAAA,EACpC;AAAA,EAEQ,YAAYlC,GAAmB;AAErC,UAAMmC,IAAgBnC,EAAM;AAC5B,IAAImC,KAAiB,KAAK,UAAU,SAASA,CAAa,OAKtD,CAAC,KAAK,SAAS,KAAK,gBAAgB,KAAK,oBAC3C,KAAK,cAAc,KAAK,gBACxB,KAAK,eAAe,EAAE,IAGxB,KAAK,eAAA,GAEA,KAAK,uBACR,KAAK,qBAAqB,KAE5B,KAAK,UAAA,GAELD,EAAqB,MAAM,MAAM;AAAA,EACnC;AAAA,EAaQ,mBAAmB;AACzB,IAAI,KAAK,aAEL,KAAK,UACP,KAAK,eAAA,KAEL,KAAK,OAAO,MAAA,GACZ,KAAK,cAAA;AAAA,EAET;AAAA,EAEQ,kBAAkBlC,GAAc;AACtC,IAAAA,EAAM,gBAAA,GACN,KAAK,QAAQ,IACb,KAAK,cAAc,IACnB,KAAK,iBAAiB,IACtB,KAAK,eAAe,EAAE,GACtB,KAAK,aAAa,EAAE,GACpB,KAAK,eAAA,GACL,KAAK,OAAO,MAAA,GAEZ,KAAK,cAAA;AAAA,EACP;AAAA,EAEQ,mBAAmBE,GAAwB;AACjD,IAAIA,EAAO,YACX,KAAK,cAAcA,CAAM;AAAA,EAC3B;AAAA,EAEQ,wBAAwBkC,GAAe;AAC7C,SAAK,oBAAoBA;AAAA,EAC3B;AAAA,EAEQ,cAAclC,GAAwB;AAC5C,SAAK,QAAQA,EAAO,OACpB,KAAK,iBAAiBA,EAAO,OAC7B,KAAK,cAAcA,EAAO,OAC1B,KAAK,aAAa,KAAK,KAAK,GAC5B,KAAK,OAAO,MAAA,GACZ,KAAK,eAAA,GACL,KAAK,eAAe,EAAE,GAEtB,KAAK,oBAAoB,EAAE,GAEvB,KAAK,sBACP,KAAK,UAAA,GAGP,KAAK,cAAA;AAAA,EACP;AAAA,EAEQ,gBAAgB;AACtB+B,IAAAA,EAA0C,MAAM,cAAc;AAAA,MAC5D,IAAI,KAAK;AAAA,MACT,MAAM,KAAK;AAAA,MACX,OAAO,KAAK;AAAA,IAAA,CACb;AAAA,EACH;AAAA,EAEQ,gBAAgB;AACtB,SAAK,UAAU,IACf,KAAK,oBAAoB,KAAK,iBAAiB;AAAA,MAC7C,CAAC9B,MAAQA,EAAI,UAAU,KAAK;AAAA,IAAA,GAE1B,KAAK,oBAAoB,MAAG,KAAK,oBAAoB;AAAA,EAC3D;AAAA,EAEQ,iBAAiB;AACvB,SAAK,UAAU,IACf,KAAK,oBAAoB;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,iBAAiB;AACvB,QAAIkC,IAAe;AACnB,UAAMC,IAAkB,CAAA;AAkCxB,WAhCA,KAAK,iBAAiB,QAAQ,CAACpC,GAAQkC,MAAU;AAC/C,MAAIlC,EAAO,SAASA,EAAO,UAAUmC,MACnCA,IAAenC,EAAO,OACtBoC,EAAS,KAAKhE;AAAA;AAAA,cAER4B,EAAO,KAAK;AAAA;AAAA,SAEjB;AAGH,YAAMqC,IAAYH,MAAU,KAAK,mBAC3BP,IAAa3B,EAAO,UAAU,KAAK;AAEzC,MAAAoC,EAAS,KAAKhE;AAAA;AAAA,wCAEoBiE,IAC1B,kCACA,EAAE,IAAIV,IAAa,mCAAmC,EAAE;AAAA;AAAA,gBAEtD,KAAK,EAAE,YAAYO,CAAK;AAAA,wBAChBA,CAAK;AAAA,2BACFP,CAAU;AAAA,2BACV3B,EAAO,YAAY,EAAK;AAAA,sBAC7BA,EAAO,QAAQ;AAAA,mBAClB,MAAM,KAAK,mBAAmBA,CAAM,CAAC;AAAA,wBAChC,MAAM,KAAK,wBAAwBkC,CAAK,CAAC;AAAA;AAAA,YAErDlC,EAAO,KAAK;AAAA;AAAA,OAEjB;AAAA,IACH,CAAC,GAEGoC,EAAS,WAAW,IACfhE;AAAA;AAAA;AAAA;AAAA,UAOFgE;AAAA,EACT;AAAA,EAEA,SAAS;AACP,WAAOhE;AAAA;AAAA;AAAA,gBAGK,KAAK,EAAE;AAAA,kBACL,KAAK,KAAK;AAAA,wBACJ,KAAK,WAAW;AAAA,iBACvB,KAAK,WAAW,aAAa,KAAK,WAAW,aAAa,EAAE;AAAA,oBACzD,KAAK,OAAO;AAAA,sBACV,KAAK,QAAQ;AAAA;AAAA,wDAEqB,KAAK,WAAW;AAAA;AAAA;AAAA,2CAG7B,KAAK,UAClC,kCACA,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,+BAQe,KAAK,OAAO;AAAA,+BACZ,KAAK,EAAE;AAAA,uCACC,KAAK,qBAAqB,IAC/C,GAAG,KAAK,EAAE,YAAY,KAAK,iBAAiB,KAC5C,EAAE;AAAA,qBACC,KAAK,IAAI;AAAA,mBACX,KAAK,KAAK,UAAU;AAAA,0BACb,KAAK,QAAQ;AAAA,0BACb,KAAK,QAAQ;AAAA,8BACT,KAAK,QAAQ;AAAA,+BACZ,KAAK,QAAQ;AAAA,gCACZI;AAAA,MAChB,KAAK,QAAQ,KAAK,KAAK,YAAY;AAAA,IAAA,CACpC;AAAA,2BACYA;AAAA,MACX,CAAC,KAAK,SAAS,KAAK,cAAc,KAAK,cAAc;AAAA,IAAA,CACtD;AAAA,6BACc,KAAK,YAAY,SAAS,OAAO;AAAA,kCAC5B,KAAK,KAAK,SAAS;AAAA,iCACpBA;AAAA,MACjB,KAAK,YAAY,KAAK,KAAK,YAAY;AAAA,IAAA,CACxC;AAAA,uBACQ,KAAK,WAAW;AAAA,qBAClBA,EAAU,KAAK,QAAQ,MAAS,CAAC;AAAA,uBAC/B,KAAK,YAAY;AAAA,wBAChB,KAAK,YAAY;AAAA,uBAClB,KAAK,WAAW;AAAA,0BACb,KAAK,cAAc;AAAA;AAAA;AAAA,gBAG7B,KAAK,QACHJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,mCAOiB,KAAK,iBAAiB;AAAA,kCACvB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAS7B,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6BAOS,KAAK,gBAAgB;AAAA,4BACtB,KAAK,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAU7B,KAAK,UACHA;AAAA;AAAA,iDAEmC,KAAK,iBAChC,iCACA,EAAE;AAAA,wBACA,KAAK,EAAE;AAAA;AAAA;AAAA;AAAA,oBAIX,KAAK,gBAAgB;AAAA;AAAA,kBAG3B,EAAE;AAAA;AAAA;AAAA;AAAA,wBAIQ,KAAK,iBAAiB;AAAA;AAAA;AAAA,eAG/B,KAAK,KAAK,SAAS;AAAA,uBACX,KAAK,SAAS;AAAA,yBACZ,KAAK,sBAAsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAOxC,KAAK,aAAa;AAAA;AAAA;AAAA;AAAA,EAI5B;AACF;AA5vBEwB,EAAO,SAASzB,EAAUmE,CAAM,GAChC1C,EAAO,oBAAoB;AAAA,EACzB,GAAG1B,EAAW;AAAA,EACd,gBAAgB;AAAA;AAJb,IAAMqE,IAAN3C;AAQsC4C,EAAA;AAAA,EAA1CnE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAR9BkE,EAQgC,WAAA,IAAA;AAGAC,EAAA;AAAA,EAA1CnE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAX9BkE,EAWgC,WAAA,MAAA;AAGfC,EAAA;AAAA,EAA3BnE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAdfkE,EAciB,WAAA,OAAA;AAGAC,EAAA;AAAA,EAA3BnE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAjBfkE,EAiBiB,WAAA,aAAA;AAGAC,EAAA;AAAA,EAA3BnE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GApBfkE,EAoBiB,WAAA,OAAA;AAGgBC,EAAA;AAAA,EAA3CnE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAvB/BkE,EAuBiC,WAAA,UAAA;AAGAC,EAAA;AAAA,EAA3CnE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA1B/BkE,EA0BiC,WAAA,UAAA;AAGAC,EAAA;AAAA,EAA3CnE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA7B/BkE,EA6BiC,WAAA,UAAA;AAGhBC,EAAA;AAAA,EAA3BnE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAhCfkE,EAgCiB,WAAA,SAAA;AAGeC,EAAA;AAAA,EAA1CnE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAnC9BkE,EAmCgC,WAAA,MAAA;AAMAC,EAAA;AAAA,EAA1CnE,EAAS,EAAE,MAAM,QAAQ,SAAS,IAAM;AAAA,GAzC9BkE,EAyCgC,WAAA,OAAA;AAICC,EAAA;AAAA,EAA3CnE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GA7C/BkE,EA6CiC,WAAA,UAAA;AAGAC,EAAA;AAAA,EAA3CnE,EAAS,EAAE,MAAM,SAAS,SAAS,IAAM;AAAA,GAhD/BkE,EAgDiC,WAAA,WAAA;AAGhBC,EAAA;AAAA,EAA3BnE,EAAS,EAAE,MAAM,OAAA,CAAQ;AAAA,GAnDfkE,EAmDiB,WAAA,cAAA;AAEXC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GArDIiE,EAqDM,WAAA,SAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GAtDIiE,EAsDM,WAAA,aAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GAvDIiE,EAuDM,WAAA,mBAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GAxDIiE,EAwDM,WAAA,UAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GAzDIiE,EAyDM,WAAA,kBAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GA1DIiE,EA0DM,WAAA,gBAAA;AACAC,EAAA;AAAA,EAAhBlE,EAAA;AAAM,GA3DIiE,EA2DM,WAAA,eAAA;AAEOC,EAAA;AAAA,EAAvBjE,EAAM,OAAO;AAAA,GA7DHgE,EA6Da,WAAA,QAAA;AACiBC,EAAA;AAAA,EAAxCjE,EAAM,wBAAwB;AAAA,GA9DpBgE,EA8D8B,WAAA,UAAA;AAisBtC,eAAe,IAAI,cAAc,KACpC,eAAe,OAAO,gBAAgBA,CAAW;"}
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nysds/nys-combobox",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.22.0",
|
|
4
4
|
"description": "The Combobox component from the NYS Design System.",
|
|
5
5
|
"module": "dist/nys-combobox.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"exports": {
|
|
8
8
|
".": {
|
|
9
|
-
"
|
|
10
|
-
"
|
|
9
|
+
"types": "./dist/index.d.ts",
|
|
10
|
+
"import": "./dist/nys-combobox.js"
|
|
11
11
|
}
|
|
12
12
|
},
|
|
13
13
|
"type": "module",
|
|
@@ -23,13 +23,13 @@
|
|
|
23
23
|
"lit-analyze": "lit-analyzer 'src/**/*.ts'"
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
|
-
"@nysds/nys-label": "^1.
|
|
27
|
-
"@nysds/nys-errormessage": "^1.
|
|
28
|
-
"@nysds/nys-icon": "^1.
|
|
29
|
-
"@nysds/nys-button": "^1.
|
|
26
|
+
"@nysds/nys-label": "^1.22.0",
|
|
27
|
+
"@nysds/nys-errormessage": "^1.22.0",
|
|
28
|
+
"@nysds/nys-icon": "^1.22.0",
|
|
29
|
+
"@nysds/nys-button": "^1.22.0"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@nysds/internals": "^1.
|
|
32
|
+
"@nysds/internals": "^1.22.0",
|
|
33
33
|
"lit": "^3.3.1",
|
|
34
34
|
"typescript": "^5.9.3",
|
|
35
35
|
"vite": "^7.3.1"
|