@rcarls/rc-combobox 0.5.0 → 0.7.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.
@@ -0,0 +1,371 @@
1
+ import { css as v, nothing as a, html as c } from "lit";
2
+ import { property as b, query as g, state as f } from "lit/decorators.js";
3
+ import { resolveMessages as x, inlineArrowKeys as h, resolveFlow as u, bidiIsolate as m } from "@rcarls/rc-common";
4
+ import { RCSelect as _, DEFAULT_SELECT_MESSAGES as $ } from "@rcarls/rc-select";
5
+ const y = v`:host{display:inline-block}#anchor{align-items:center;gap:var(--rc-combobox-gap,var(--rc-control-gap,.25em));min-block-size:var(--rc-combobox-control-block-size,var(--rc-control-block-size,auto));padding:var(--rc-combobox-padding-block,var(--rc-control-padding-block,1px)) var(--rc-combobox-padding-inline,var(--rc-control-padding-inline,4px));cursor:text;border:var(--rc-combobox-border,var(--rc-border,1px solid var(--rc-border-color,ButtonBorder)));border-radius:var(--rc-combobox-radius,var(--rc-control-radius,var(--rc-radius-sm,.125em)));background:var(--rc-field,Field);min-width:8em;color:var(--rc-field-text,FieldText);font-family:var(--rc-font-family,inherit);font-size:var(--rc-font-size,inherit);line-height:var(--rc-line-height,normal);transition:background-color var(--rc-motion-duration,.12s), border-color var(--rc-motion-duration,.12s), box-shadow var(--rc-motion-duration,.12s);outline:none;grid-template-columns:minmax(0,1fr) auto;display:grid;&:focus-within{outline:var(--rc-focus-ring,auto);outline-offset:var(--rc-focus-ring-offset,0)}}.value{align-items:center;gap:var(--rc-combobox-gap,var(--rc-control-gap,.25em));flex-wrap:wrap;min-inline-size:0;display:flex}[part=chips]{--rc-chip-group-column-gap:var(--rc-combobox-gap,var(--rc-control-gap,.25em));--rc-chip-group-row-gap:calc(var(--rc-chip-touch-target-overlap-block-start,0px) + var(--rc-chip-touch-target-overlap-block-end,0px));flex:0 auto;min-inline-size:0;max-inline-size:100%}[part=chip]{align-items:center;gap:var(--rc-combobox-chip-gap,calc(var(--rc-control-gap,.25em) * .8));padding-block:var(--rc-combobox-chip-padding-block,.1em);border:var(--rc-combobox-chip-border,var(--rc-border,1px solid var(--rc-border-color,ButtonBorder)));border-radius:var(--rc-combobox-chip-radius,var(--rc-radius-md,.25em));background:var(--rc-button-bg,ButtonFace);color:var(--rc-button-text,ButtonText);font:inherit;cursor:pointer;padding-inline-start:var(--rc-combobox-chip-padding-inline-start,.3em);padding-inline-end:var(--rc-combobox-chip-padding-inline-end,calc(var(--rc-chip-remove-target-size,1.5rem) + var(--rc-chip-remove-offset-inline,.125rem)));font-size:.875em;display:inline-flex;&:hover{background:var(--rc-highlight,Highlight);color:var(--rc-highlight-text,HighlightText)}&:focus-visible{outline:var(--rc-focus-ring,auto);outline-offset:var(--rc-focus-ring-offset,0)}}[part=chip-remove]{pointer-events:none;justify-content:center;align-items:center;width:1em;font-size:.85em;display:inline-flex}#trigger,[part~=dialog-input]{min-width:0;color:inherit;font:inherit;cursor:text;background:0 0;border:none;outline:none;flex:1;padding:0}#trigger::placeholder,[part~=dialog-input]::placeholder{color:var(--rc-text-disabled,GrayText)}#toggle{inline-size:var(--rc-combobox-toggle-size,1.1em);color:inherit;cursor:default;font:inherit;background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;display:inline-flex;&:focus-visible{outline:var(--rc-focus-ring,auto);outline-offset:var(--rc-focus-ring-offset,0)}}slot:not([name]){display:none}rc-listbox{overflow-block:auto;background:var(--rc-combobox-listbox-background,var(--rc-popup-background,var(--rc-surface,Canvas)));border:var(--rc-combobox-listbox-border,var(--rc-popup-border,var(--rc-border,1px solid var(--rc-border-color,ButtonBorder))));border-radius:var(--rc-combobox-listbox-radius,var(--rc-popup-radius,var(--rc-radius-sm,0)));box-shadow:var(--rc-combobox-shadow,var(--rc-popup-shadow,var(--rc-shadow,0 2px 8px color-mix(in srgb, CanvasText 15%, transparent))));color:var(--rc-combobox-listbox-color,var(--rc-popup-color,var(--rc-field-text,FieldText)));padding-block:var(--rc-combobox-listbox-padding-block,var(--rc-popup-padding-block,var(--rc-control-padding-block,.25em)));--rc-listbox-option-gap:var(--rc-item-gap,.4em);--rc-listbox-option-padding-block:var(--rc-item-padding-block,.3em);--rc-listbox-option-padding-inline:var(--rc-item-padding-inline,.75em);--rc-listbox-hover-bg:var(--rc-highlight,Highlight);--rc-listbox-hover-color:var(--rc-highlight-text,HighlightText);--rc-listbox-active-bg:var(--rc-highlight,Highlight);--rc-listbox-active-color:var(--rc-highlight-text,HighlightText);--rc-listbox-selected-bg:var(--rc-highlight,Highlight);--rc-listbox-selected-color:var(--rc-highlight-text,HighlightText);--rc-listbox-disabled-opacity:var(--rc-disabled-opacity,.5);overflow-y:auto}[part=listbox]{max-inline-size:var(--rc-anchor-viewport-inline-size,none);max-block-size:min(var(--rc-combobox-max-height,20em), var(--rc-anchor-viewport-block-size,20em))}@media (prefers-reduced-motion:no-preference){[part=listbox]:popover-open{opacity:1;transition:opacity var(--rc-combobox-listbox-duration,.15s) var(--rc-motion-effects-easing-enter,ease-out), overlay var(--rc-combobox-listbox-duration,.15s) allow-discrete, display var(--rc-combobox-listbox-duration,.15s) allow-discrete}[part=listbox]:not(:popover-open){opacity:0;transition:opacity var(--rc-combobox-listbox-duration,.15s) var(--rc-motion-effects-easing-exit,ease-in), overlay var(--rc-combobox-listbox-duration,.15s) allow-discrete, display var(--rc-combobox-listbox-duration,.15s) allow-discrete}@starting-style{[part=listbox]:popover-open{opacity:0}}}[part=listbox]:not(:popover-open){display:none}rc-dialog[variant=fullscreen]{display:contents}[part~=dialog]{box-sizing:border-box;background:var(--rc-surface,Canvas);color:var(--rc-field-text,CanvasText);font-family:var(--rc-font-family,inherit);&[open]{gap:var(--rc-combobox-dialog-gap,1rem);flex-direction:column;display:flex}}[part~=dialog-header]{align-items:center;gap:var(--rc-combobox-dialog-header-gap,.5rem);grid-template-columns:auto minmax(0,1fr) auto;display:grid}[part~=dialog-header]>[part~=dialog-title]:first-child{grid-column:1/3}[part~=dialog-title]{text-overflow:ellipsis;white-space:nowrap;min-inline-size:0;font:inherit;margin:0;overflow:hidden}[part~=dialog-cancel],[part~=dialog-confirm]{min-block-size:2.75rem;min-inline-size:2.75rem}[part~=dialog-cancel]{justify-content:center;align-items:center;padding:0;display:inline-flex}[part~=dialog-cancel-icon]{fill:currentColor}[part~=dialog-selected]{max-block-size:30%;overflow:auto}[part~=dialog-search]{gap:var(--rc-combobox-dialog-search-gap,.25rem);display:grid}[part~=dialog-input]{box-sizing:border-box;inline-size:100%;min-block-size:var(--rc-control-block-size,2.75rem);padding:var(--rc-control-padding-block,.5rem) var(--rc-control-padding-inline,.75rem);border:var(--rc-combobox-dialog-input-border,var(--rc-border,1px solid var(--rc-border-color,ButtonBorder)));border-radius:var(--rc-combobox-dialog-input-radius,var(--rc-control-radius,var(--rc-radius-sm,.125em)));background:var(--rc-combobox-dialog-input-background,var(--rc-field,Field));&:focus-visible{outline:var(--rc-focus-ring,auto);outline-offset:var(--rc-focus-ring-offset,0)}}[part~=dialog-listbox]{min-block-size:0;max-block-size:none;box-shadow:none;flex:1}rc-listbox [part~=option][hidden]{display:none}rc-listbox [part~=option][data-active]:not([aria-disabled=true]){outline:var(--rc-focus-ring,2px solid var(--rc-accent,Highlight));outline-offset:-2px}rc-listbox [part~=option][aria-disabled=true]{cursor:not-allowed}rc-listbox [part~=option-checkmark]{text-align:center;visibility:hidden;flex-shrink:0;width:1em;font-size:.85em}rc-listbox [part~=option][aria-selected=true] [part~=option-checkmark]{visibility:visible}rc-listbox [part~=create-option]{border-top:1px solid var(--rc-border-color,ButtonBorder);margin-top:.25em;padding-top:.3em;font-style:italic}`;
6
+ var k = Object.defineProperty, s = (l, t, e, o) => {
7
+ for (var i = void 0, n = l.length - 1, d; n >= 0; n--)
8
+ (d = l[n]) && (i = d(t, e, i) || i);
9
+ return i && k(t, e, i), i;
10
+ };
11
+ const w = Object.freeze({
12
+ ...$,
13
+ search: (l) => `Search ${m(l)}`
14
+ }), p = class p extends _ {
15
+ constructor() {
16
+ super(...arguments), this.allowCreate = !1, this.filterStrategy = "contains", this._filterText = "", this._closingPopup = !1, this._provisionalOptions = /* @__PURE__ */ new Map(), this._preDialogOptions = null;
17
+ }
18
+ get _text() {
19
+ return x(this, "rc-combobox", w, this.messages, {
20
+ inherit: "rc-select"
21
+ });
22
+ }
23
+ get _$filterInput() {
24
+ return this._activePopupMode === "dialog" ? this._$dialogInput ?? null : this._$trigger instanceof HTMLInputElement ? this._$trigger : null;
25
+ }
26
+ get _$activeDescendantHost() {
27
+ return this._$filterInput;
28
+ }
29
+ openPopup() {
30
+ super.openPopup(), this._activePopupMode === "popover" && this._$listbox?.filterOptions(this._filterText);
31
+ }
32
+ closePopup(t = !0) {
33
+ this.open && (this._filterText = "", this._$listbox?.clearFilter(), this._$listbox?.setCreateOption(null), this._closingPopup = !0, super.closePopup(t), setTimeout(() => {
34
+ this._closingPopup = !1;
35
+ }, 0));
36
+ }
37
+ _handleInput(t) {
38
+ this._filterText = t.target.value, !this.open && this._filterText && this.openPopup(), this._$listbox?.filterOptions(this._filterText), this._updateCreateOption(), this._$listbox?.navigableItems.length ? this._activeDescendantCtrl.navigateToFirst() : this._activeDescendantCtrl.clear();
39
+ }
40
+ _handleInputFocus() {
41
+ this.popupMode === "popover" && !this.open && !this._closingPopup && this.openPopup();
42
+ }
43
+ _handleToggleClick(t) {
44
+ t.stopPropagation(), this.open ? this.closePopup() : (this.openPopup(), this._$trigger?.focus());
45
+ }
46
+ _handleAnchorClick(t) {
47
+ const e = t.target;
48
+ e.closest('[part~="chip"]') || e.id === "toggle" || this._$filterInput?.focus();
49
+ }
50
+ _handleDialogAnchorClick(t) {
51
+ t.target.closest('[part~="chip"]') || this.openPopup();
52
+ }
53
+ _handleDialogTriggerKeyDown(t) {
54
+ switch (t.key) {
55
+ case " ":
56
+ case "Enter":
57
+ case "ArrowDown":
58
+ t.preventDefault(), this.openPopup();
59
+ break;
60
+ default:
61
+ t.key === h(u(this)).prev && this.multiple && this._selectedValues.size > 0 && (t.preventDefault(), this._focusLastChipRemove());
62
+ break;
63
+ }
64
+ }
65
+ _updateCreateOption() {
66
+ if (!this.allowCreate || !this._filterText.trim()) {
67
+ this._$listbox?.setCreateOption(null);
68
+ return;
69
+ }
70
+ const t = this._filterText.trim().toLowerCase(), e = this._$listbox?.allOptions.some((o) => o.label.toLowerCase() === t) ?? !1;
71
+ this._$listbox?.setCreateOption(e ? null : this._filterText.trim());
72
+ }
73
+ _handleListboxChange(t) {
74
+ const e = t.detail;
75
+ if (e.reason === "action" && e.action === "create") {
76
+ t.stopPropagation(), this._activateCreate(this._filterText.trim());
77
+ return;
78
+ }
79
+ super._handleListboxChange(t), !this.multiple && this._activePopupMode === "popover" ? this._syncInputToSelection() : (this._filterText = "", this._$filterInput && (this._$filterInput.value = ""), this._$listbox?.clearFilter(), this._updateCreateOption());
80
+ }
81
+ async _activateCreate(t) {
82
+ if (!t)
83
+ return;
84
+ if (this._activePopupMode === "dialog") {
85
+ const o = { value: t, label: t };
86
+ this._preDialogOptions ??= [...this._options], this._provisionalOptions.set(t, o), this._syncOptions([...this._preDialogOptions, ...this._provisionalOptions.values()]);
87
+ const i = new Set(this._pendingSelectedValues ?? this._selectedValues);
88
+ this.multiple || i.clear(), i.add(t), this._pendingSelectedValues = i, this._$listbox?.setSelectedValues([...i]), this._filterText = "", this._$filterInput && (this._$filterInput.value = ""), this._$listbox?.clearFilter(), this._$listbox?.setCreateOption(null), this.requestUpdate();
89
+ return;
90
+ }
91
+ const e = new CustomEvent("rc-combobox-create", {
92
+ bubbles: !0,
93
+ composed: !0,
94
+ cancelable: !0,
95
+ detail: { text: t }
96
+ });
97
+ if (this.dispatchEvent(e)) {
98
+ if (this._addOption({ value: t, label: t }), this.multiple) {
99
+ this._$listbox?.toggleOption(t), this._filterText = "", this._$filterInput && (this._$filterInput.value = ""), this._$listbox?.clearFilter(), this._$listbox?.setCreateOption(null);
100
+ return;
101
+ }
102
+ this._applySelection([t], !0), this._syncInputToSelection(), this.closePopup(!0), this._dispatchChange();
103
+ }
104
+ }
105
+ set value(t) {
106
+ super.value = t, this._syncInputToSelection();
107
+ }
108
+ get value() {
109
+ return super.value;
110
+ }
111
+ _syncInputToSelection() {
112
+ if (this.multiple)
113
+ return;
114
+ const t = this.selectedValues[0], e = t ? this._labelFor(t) : "";
115
+ this._filterText = e, this._$filterInput && (this._$filterInput.value = e);
116
+ }
117
+ _handleInputKeyDown(t) {
118
+ switch (t.key) {
119
+ case "ArrowDown":
120
+ t.preventDefault(), this.open ? this._activeDescendantCtrl.navigate(1) : (this.openPopup(), this._activeDescendantCtrl.navigateToFirst());
121
+ break;
122
+ case "ArrowUp":
123
+ t.preventDefault(), this.open && this._activeDescendantCtrl.navigate(-1);
124
+ break;
125
+ case "Home":
126
+ this.open && (t.preventDefault(), this._activeDescendantCtrl.navigateToFirst());
127
+ break;
128
+ case "End":
129
+ this.open && (t.preventDefault(), this._activeDescendantCtrl.navigateToLast());
130
+ break;
131
+ case "Enter": {
132
+ t.preventDefault();
133
+ const e = this._activeDescendantCtrl.activeItem;
134
+ e ? e.dispatchEvent(
135
+ new PointerEvent("pointerdown", { bubbles: !0, cancelable: !0 })
136
+ ) : this.open && this._$listbox?.navigableItems.length && this._$listbox.navigableItems[0]?.dispatchEvent(
137
+ new PointerEvent("pointerdown", { bubbles: !0, cancelable: !0 })
138
+ );
139
+ break;
140
+ }
141
+ case "Tab":
142
+ if (this.open && this._activePopupMode === "popover") {
143
+ const e = this._$listbox?.navigableItems[0];
144
+ e && e.dispatchEvent(
145
+ new PointerEvent("pointerdown", { bubbles: !0, cancelable: !0 })
146
+ ), this.closePopup(!1);
147
+ }
148
+ break;
149
+ case "Escape":
150
+ t.preventDefault(), this._filterText = "", this._$filterInput && (this._$filterInput.value = ""), this.closePopup();
151
+ break;
152
+ case "Backspace":
153
+ this._filterText === "" && this.multiple && this._selectedValues.size > 0 && (t.preventDefault(), this._focusLastChipRemove());
154
+ break;
155
+ default:
156
+ t.key === h(u(this)).prev && t.target.selectionStart === 0 && this.multiple && this._selectedValues.size > 0 && (t.preventDefault(), this._focusLastChipRemove());
157
+ break;
158
+ }
159
+ }
160
+ _focusLastChipRemove() {
161
+ const t = this._$chipButtons();
162
+ t[t.length - 1]?.focus();
163
+ }
164
+ get _inputPlaceholder() {
165
+ const t = this._activePopupMode === "dialog" ? this._dialogSelectedValues.length : this._selectedValues.size;
166
+ return this.multiple && t > 0 ? "" : this.placeholder;
167
+ }
168
+ _syncAccessibleName(t) {
169
+ const e = t.getAttribute("aria-label") ?? t.labels?.[0]?.textContent?.trim() ?? "";
170
+ this._accessibleName = e, super._syncAccessibleName(t);
171
+ }
172
+ _focusDialogContent() {
173
+ this._$listbox?.filterOptions(this._filterText), this._$dialogInput?.focus();
174
+ }
175
+ _prepareDialogCommit() {
176
+ const t = this._preDialogOptions ?? [...this._options], e = new Set(this._dialogSelectedValues);
177
+ this._syncOptions(t);
178
+ for (const o of this._provisionalOptions.values()) {
179
+ if (!e.has(o.value))
180
+ continue;
181
+ const i = new CustomEvent("rc-combobox-create", {
182
+ bubbles: !0,
183
+ composed: !0,
184
+ cancelable: !0,
185
+ detail: { text: o.label }
186
+ });
187
+ this.dispatchEvent(i) ? this._addOption(o) : e.delete(o.value);
188
+ }
189
+ this._pendingSelectedValues = e, this._provisionalOptions.clear(), this._preDialogOptions = null;
190
+ }
191
+ _commitDialogSelection() {
192
+ super._commitDialogSelection(), this._syncInputToSelection();
193
+ }
194
+ _discardDialogSelection() {
195
+ this._preDialogOptions && this._syncOptions(this._preDialogOptions), this._provisionalOptions.clear(), this._preDialogOptions = null, super._discardDialogSelection();
196
+ }
197
+ _finishDialogClose(t) {
198
+ this._filterText = "", this._$listbox?.clearFilter(), this._$listbox?.setCreateOption(null), super._finishDialogClose(t);
199
+ }
200
+ _renderDialogBody() {
201
+ const t = this._text;
202
+ return c`
203
+ <label part="dialog-search">
204
+ <span>${t.search(this._accessibleName || t.options)}</span>
205
+ <input
206
+ id="dialog-input"
207
+ part="dialog-input"
208
+ type="text"
209
+ role="combobox"
210
+ aria-haspopup="listbox"
211
+ aria-expanded="true"
212
+ aria-controls="dialog-listbox"
213
+ aria-autocomplete="list"
214
+ aria-required=${this.required ? "true" : "false"}
215
+ ?disabled=${this.disabled}
216
+ placeholder=${this._inputPlaceholder}
217
+ .value=${this._filterText}
218
+ autocomplete="off"
219
+ spellcheck="false"
220
+ @input=${this._handleInput}
221
+ @keydown=${this._handleInputKeyDown}
222
+ />
223
+ </label>
224
+
225
+ <rc-listbox
226
+ lang=${this.getAttribute("lang") ?? a}
227
+ id="dialog-listbox"
228
+ part="listbox dialog-listbox"
229
+ tabindex="-1"
230
+ ?multiple=${this.multiple}
231
+ checkmark
232
+ .options=${this._options}
233
+ .filterStrategy=${this.filterStrategy}
234
+ @rc-listbox-change=${this._handleListboxChange}
235
+ ></rc-listbox>
236
+ `;
237
+ }
238
+ render() {
239
+ const t = this.multiple && this._selectedValues.size > 0;
240
+ return (this.open ? this._activePopupMode : this.popupMode) === "dialog" ? c`
241
+ <div id="anchor" part="anchor" @click=${this._handleDialogAnchorClick}>
242
+ <div class="value">
243
+ ${t ? this._renderChips() : a}
244
+
245
+ <div
246
+ id="trigger"
247
+ part="input"
248
+ role="combobox"
249
+ tabindex=${this.disabled ? "-1" : "0"}
250
+ aria-label=${this._accessibleName || a}
251
+ aria-haspopup="dialog"
252
+ aria-expanded=${this.open ? "true" : "false"}
253
+ aria-controls="dialog"
254
+ aria-required=${this.required ? "true" : "false"}
255
+ aria-disabled=${this.disabled ? "true" : "false"}
256
+ @keydown=${this._handleDialogTriggerKeyDown}
257
+ >
258
+ ${this._displayLabel}
259
+ </div>
260
+ </div>
261
+
262
+ <span id="toggle" part="toggle" aria-hidden="true">
263
+ <slot name="toggle-icon">
264
+ <svg
265
+ width="10"
266
+ height="6"
267
+ viewBox="0 0 10 6"
268
+ fill="none"
269
+ stroke="currentColor"
270
+ stroke-width="1.5"
271
+ stroke-linecap="round"
272
+ stroke-linejoin="round"
273
+ >
274
+ <polyline points="1,1 5,5 9,1"></polyline>
275
+ </svg>
276
+ </slot>
277
+ </span>
278
+ </div>
279
+
280
+ ${this._renderDialogPopup()}
281
+ <slot @slotchange=${this._handleSelectSlotChange}></slot>
282
+ ` : c`
283
+ <div id="anchor" part="anchor" @click=${this._handleAnchorClick}>
284
+ <div class="value">
285
+ ${t ? this._renderChips() : a}
286
+
287
+ <input
288
+ id="trigger"
289
+ part="input"
290
+ type="text"
291
+ role="combobox"
292
+ aria-label=${this._accessibleName || a}
293
+ aria-haspopup="listbox"
294
+ aria-expanded=${this.open ? "true" : "false"}
295
+ aria-controls="listbox"
296
+ aria-autocomplete="list"
297
+ aria-required=${this.required ? "true" : "false"}
298
+ ?disabled=${this.disabled}
299
+ placeholder=${this._inputPlaceholder}
300
+ .value=${this._filterText}
301
+ autocomplete="off"
302
+ spellcheck="false"
303
+ @input=${this._handleInput}
304
+ @keydown=${this._handleInputKeyDown}
305
+ @focus=${this._handleInputFocus}
306
+ />
307
+ </div>
308
+
309
+ <button
310
+ id="toggle"
311
+ type="button"
312
+ part="toggle"
313
+ aria-hidden="true"
314
+ tabindex="-1"
315
+ @click=${this._handleToggleClick}
316
+ >
317
+ <slot name="toggle-icon">
318
+ <svg
319
+ width="10"
320
+ height="6"
321
+ viewBox="0 0 10 6"
322
+ fill="none"
323
+ stroke="currentColor"
324
+ stroke-width="1.5"
325
+ stroke-linecap="round"
326
+ stroke-linejoin="round"
327
+ >
328
+ <polyline points="1,1 5,5 9,1" />
329
+ </svg>
330
+ </slot>
331
+ </button>
332
+ </div>
333
+
334
+ <rc-listbox
335
+ lang=${this.getAttribute("lang") ?? a}
336
+ id="listbox"
337
+ part="listbox"
338
+ popover="manual"
339
+ ?multiple=${this.multiple}
340
+ checkmark
341
+ .filterStrategy=${this.filterStrategy}
342
+ .options=${this._options}
343
+ @rc-listbox-change=${this._handleListboxChange}
344
+ ></rc-listbox>
345
+
346
+ <slot @slotchange=${this._handleSelectSlotChange}></slot>
347
+ `;
348
+ }
349
+ };
350
+ p.styles = y;
351
+ let r = p;
352
+ s([
353
+ b({ type: Boolean, attribute: "allow-create" })
354
+ ], r.prototype, "allowCreate");
355
+ s([
356
+ b({ attribute: "filter-strategy", reflect: !1 })
357
+ ], r.prototype, "filterStrategy");
358
+ s([
359
+ g("#trigger")
360
+ ], r.prototype, "_$trigger");
361
+ s([
362
+ g("#dialog-input")
363
+ ], r.prototype, "_$dialogInput");
364
+ s([
365
+ f()
366
+ ], r.prototype, "_filterText");
367
+ export {
368
+ w as D,
369
+ r as R
370
+ };
371
+ //# sourceMappingURL=rc-combobox-8jDCwAe_.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rc-combobox-8jDCwAe_.js","sources":["../src/rc-combobox.styles.ts","../src/rc-combobox.ts"],"sourcesContent":["import { css } from 'lit';\n\nexport const comboboxStyles = css`\n :host {\n display: inline-block;\n }\n\n #anchor {\n display: grid;\n grid-template-columns: minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rc-combobox-gap, var(--rc-control-gap, 0.25em));\n min-block-size: var(--rc-combobox-control-block-size, var(--rc-control-block-size, auto));\n padding: var(--rc-combobox-padding-block, var(--rc-control-padding-block, 1px))\n var(--rc-combobox-padding-inline, var(--rc-control-padding-inline, 4px));\n min-width: 8em;\n cursor: text;\n border: var(\n --rc-combobox-border,\n var(--rc-border, 1px solid var(--rc-border-color, ButtonBorder))\n );\n border-radius: var(\n --rc-combobox-radius,\n var(--rc-control-radius, var(--rc-radius-sm, 0.125em))\n );\n background: var(--rc-field, Field);\n color: var(--rc-field-text, FieldText);\n font-family: var(--rc-font-family, inherit);\n font-size: var(--rc-font-size, inherit);\n line-height: var(--rc-line-height, normal);\n transition:\n background-color var(--rc-motion-duration, 120ms),\n border-color var(--rc-motion-duration, 120ms),\n box-shadow var(--rc-motion-duration, 120ms);\n\n /* Focus ring — anchor shows the ring when the internal input is focused */\n outline: none;\n &:focus-within {\n outline: var(--rc-focus-ring, auto);\n outline-offset: var(--rc-focus-ring-offset, 0);\n }\n }\n\n .value {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--rc-combobox-gap, var(--rc-control-gap, 0.25em));\n min-inline-size: 0;\n }\n\n [part='chips'] {\n flex: 0 1 auto;\n max-inline-size: 100%;\n min-inline-size: 0;\n --rc-chip-group-column-gap: var(--rc-combobox-gap, var(--rc-control-gap, 0.25em));\n /*\n * Chip touch-target overlap tokens inherit to every chip, but they are\n * only meant to reach into the field's own block padding. Returning the\n * same space between rows keeps interior rows on the full touch-target\n * pitch instead of collapsing them onto each other.\n */\n --rc-chip-group-row-gap: calc(\n var(--rc-chip-touch-target-overlap-block-start, 0px) +\n var(--rc-chip-touch-target-overlap-block-end, 0px)\n );\n }\n\n /* Input-chip chrome; rc-chip keeps the native button as the removal action. */\n [part='chip'] {\n display: inline-flex;\n align-items: center;\n gap: var(--rc-combobox-chip-gap, calc(var(--rc-control-gap, 0.25em) * 0.8));\n padding-block: var(--rc-combobox-chip-padding-block, 0.1em);\n padding-inline-start: var(--rc-combobox-chip-padding-inline-start, 0.3em);\n padding-inline-end: var(\n --rc-combobox-chip-padding-inline-end,\n calc(\n var(--rc-chip-remove-target-size, 1.5rem) + var(--rc-chip-remove-offset-inline, 0.125rem)\n )\n );\n border: var(\n --rc-combobox-chip-border,\n var(--rc-border, 1px solid var(--rc-border-color, ButtonBorder))\n );\n border-radius: var(--rc-combobox-chip-radius, var(--rc-radius-md, 0.25em));\n background: var(--rc-button-bg, ButtonFace);\n color: var(--rc-button-text, ButtonText);\n font: inherit;\n font-size: 0.875em;\n cursor: pointer;\n\n &:hover {\n background: var(--rc-highlight, Highlight);\n color: var(--rc-highlight-text, HighlightText);\n }\n\n &:focus-visible {\n outline: var(--rc-focus-ring, auto);\n outline-offset: var(--rc-focus-ring-offset, 0);\n }\n }\n\n /* Decorative × icon inside the chip — no interaction, aria-hidden. */\n [part='chip-remove'] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 1em;\n font-size: 0.85em;\n pointer-events: none;\n }\n\n #trigger,\n [part~='dialog-input'] {\n flex: 1;\n min-width: 0;\n border: none;\n background: transparent;\n color: inherit;\n font: inherit;\n outline: none;\n padding: 0;\n cursor: text;\n }\n\n #trigger::placeholder,\n [part~='dialog-input']::placeholder {\n color: var(--rc-text-disabled, GrayText);\n }\n\n #toggle {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n inline-size: var(--rc-combobox-toggle-size, 1.1em);\n border: none;\n background: transparent;\n color: inherit;\n cursor: default;\n font: inherit;\n\n &:focus-visible {\n outline: var(--rc-focus-ring, auto);\n outline-offset: var(--rc-focus-ring-offset, 0);\n }\n }\n\n /* Hide the default slot — visually suppresses the slotted native <select> */\n slot:not([name]) {\n display: none;\n }\n\n /* Listbox popup — positioned by AnchorController via adoptedStyleSheets */\n rc-listbox {\n overflow-y: auto;\n overflow-block: auto;\n background: var(\n --rc-combobox-listbox-background,\n var(--rc-popup-background, var(--rc-surface, Canvas))\n );\n border: var(\n --rc-combobox-listbox-border,\n var(--rc-popup-border, var(--rc-border, 1px solid var(--rc-border-color, ButtonBorder)))\n );\n border-radius: var(\n --rc-combobox-listbox-radius,\n var(--rc-popup-radius, var(--rc-radius-sm, 0))\n );\n box-shadow: var(\n --rc-combobox-shadow,\n var(\n --rc-popup-shadow,\n var(--rc-shadow, 0 2px 8px color-mix(in srgb, CanvasText 15%, transparent))\n )\n );\n color: var(--rc-combobox-listbox-color, var(--rc-popup-color, var(--rc-field-text, FieldText)));\n padding-block: var(\n --rc-combobox-listbox-padding-block,\n var(--rc-popup-padding-block, var(--rc-control-padding-block, 0.25em))\n );\n --rc-listbox-option-gap: var(--rc-item-gap, 0.4em);\n --rc-listbox-option-padding-block: var(--rc-item-padding-block, 0.3em);\n --rc-listbox-option-padding-inline: var(--rc-item-padding-inline, 0.75em);\n --rc-listbox-hover-bg: var(--rc-highlight, Highlight);\n --rc-listbox-hover-color: var(--rc-highlight-text, HighlightText);\n --rc-listbox-active-bg: var(--rc-highlight, Highlight);\n --rc-listbox-active-color: var(--rc-highlight-text, HighlightText);\n --rc-listbox-selected-bg: var(--rc-highlight, Highlight);\n --rc-listbox-selected-color: var(--rc-highlight-text, HighlightText);\n --rc-listbox-disabled-opacity: var(--rc-disabled-opacity, 0.5);\n }\n\n [part='listbox'] {\n max-inline-size: var(--rc-anchor-viewport-inline-size, none);\n max-block-size: min(\n var(--rc-combobox-max-height, 20em),\n var(--rc-anchor-viewport-block-size, 20em)\n );\n }\n\n /*\n * Opacity only, deliberately not a scale/slide transform: AnchorController\n * (see rc-common) positions this listbox and applies its own\n * viewport-clamping translate to it, tracked against\n * getBoundingClientRect() to compute the next correction. A second,\n * CSS-driven transform on the same element and property would fight that\n * math on every open.\n *\n * display and overlay join the transition list, allow-discrete: without\n * them, this listbox's own separate display: none on :not(:popover-open)\n * (still needed for reduced motion, see below) would apply instantly, and\n * a transition on a property of an element with no box doesn't render at\n * all. Confirmed directly against rc-select's identical structure: an\n * opacity-only version of this rule measured display: none within 300ms\n * of a 2-second exit fade that should still have been running.\n */\n @media (prefers-reduced-motion: no-preference) {\n [part='listbox']:popover-open {\n opacity: 1;\n transition:\n opacity var(--rc-combobox-listbox-duration, 150ms)\n var(--rc-motion-effects-easing-enter, ease-out),\n overlay var(--rc-combobox-listbox-duration, 150ms) allow-discrete,\n display var(--rc-combobox-listbox-duration, 150ms) allow-discrete;\n }\n\n [part='listbox']:not(:popover-open) {\n opacity: 0;\n transition:\n opacity var(--rc-combobox-listbox-duration, 150ms)\n var(--rc-motion-effects-easing-exit, ease-in),\n overlay var(--rc-combobox-listbox-duration, 150ms) allow-discrete,\n display var(--rc-combobox-listbox-duration, 150ms) allow-discrete;\n }\n\n @starting-style {\n [part='listbox']:popover-open {\n opacity: 0;\n }\n }\n }\n\n [part='listbox']:not(:popover-open) {\n display: none;\n }\n\n rc-dialog[variant='fullscreen'] {\n display: contents;\n }\n\n [part~='dialog'] {\n box-sizing: border-box;\n background: var(--rc-surface, Canvas);\n color: var(--rc-field-text, CanvasText);\n font-family: var(--rc-font-family, inherit);\n\n &[open] {\n display: flex;\n flex-direction: column;\n gap: var(--rc-combobox-dialog-gap, 1rem);\n }\n }\n\n [part~='dialog-header'] {\n display: grid;\n grid-template-columns: auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--rc-combobox-dialog-header-gap, 0.5rem);\n }\n\n [part~='dialog-header'] > [part~='dialog-title']:first-child {\n grid-column: 1 / 3;\n }\n\n [part~='dialog-title'] {\n min-inline-size: 0;\n margin: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font: inherit;\n }\n\n [part~='dialog-cancel'],\n [part~='dialog-confirm'] {\n min-inline-size: 2.75rem;\n min-block-size: 2.75rem;\n }\n\n [part~='dialog-cancel'] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n padding: 0;\n }\n\n [part~='dialog-cancel-icon'] {\n fill: currentColor;\n }\n\n [part~='dialog-selected'] {\n max-block-size: 30%;\n overflow: auto;\n }\n\n [part~='dialog-search'] {\n display: grid;\n gap: var(--rc-combobox-dialog-search-gap, 0.25rem);\n }\n\n [part~='dialog-input'] {\n box-sizing: border-box;\n inline-size: 100%;\n min-block-size: var(--rc-control-block-size, 2.75rem);\n padding: var(--rc-control-padding-block, 0.5rem) var(--rc-control-padding-inline, 0.75rem);\n border: var(\n --rc-combobox-dialog-input-border,\n var(--rc-border, 1px solid var(--rc-border-color, ButtonBorder))\n );\n border-radius: var(\n --rc-combobox-dialog-input-radius,\n var(--rc-control-radius, var(--rc-radius-sm, 0.125em))\n );\n background: var(--rc-combobox-dialog-input-background, var(--rc-field, Field));\n\n &:focus-visible {\n outline: var(--rc-focus-ring, auto);\n outline-offset: var(--rc-focus-ring-offset, 0);\n }\n }\n\n [part~='dialog-listbox'] {\n flex: 1;\n min-block-size: 0;\n max-block-size: none;\n box-shadow: none;\n }\n\n rc-listbox [part~='option'][hidden] {\n display: none;\n }\n\n rc-listbox [part~='option'][data-active]:not([aria-disabled='true']) {\n outline: var(--rc-focus-ring, 2px solid var(--rc-accent, Highlight));\n outline-offset: -2px;\n }\n\n rc-listbox [part~='option'][aria-disabled='true'] {\n cursor: not-allowed;\n }\n\n rc-listbox [part~='option-checkmark'] {\n flex-shrink: 0;\n width: 1em;\n text-align: center;\n font-size: 0.85em;\n visibility: hidden;\n }\n\n rc-listbox [part~='option'][aria-selected='true'] [part~='option-checkmark'] {\n visibility: visible;\n }\n\n rc-listbox [part~='create-option'] {\n font-style: italic;\n border-top: 1px solid var(--rc-border-color, ButtonBorder);\n margin-top: 0.25em;\n padding-top: 0.3em;\n }\n`;\n\nexport default comboboxStyles;\n","import { html, nothing } from 'lit';\nimport { property, query, state } from 'lit/decorators.js';\n\nimport { bidiIsolate, inlineArrowKeys, resolveFlow, resolveMessages } from '@rcarls/rc-common';\nimport {\n DEFAULT_SELECT_MESSAGES,\n RCSelect,\n type RCSelectMessages,\n type RCSelectPopupMode,\n} from '@rcarls/rc-select';\nimport type { FilterStrategy, RCListboxChangeEvent } from '@rcarls/rc-listbox';\n\nimport { comboboxStyles } from './rc-combobox.styles.js';\n\nexport interface RCComboboxCreateEvent {\n /** The text typed by the user that didn't match any existing option. */\n text: string;\n}\n\nexport type RCComboboxPopupMode = RCSelectPopupMode;\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'rc-combobox': RCCombobox;\n }\n}\n\n/**\n * Built-in text of `rc-combobox`: everything `rc-select` has, plus the\n * dialog search label. The \"Create\" option's text belongs to `rc-listbox`.\n */\nexport interface RCComboboxMessages extends RCSelectMessages {\n /** Visible label of the dialog search input. */\n search: (name: string) => string;\n}\n\nexport const DEFAULT_COMBOBOX_MESSAGES: Readonly<RCComboboxMessages> = Object.freeze({\n ...DEFAULT_SELECT_MESSAGES,\n search: (name: string) => `Search ${bidiIsolate(name)}`,\n});\n\ndeclare module '@rcarls/rc-common' {\n interface RcMessageCatalog {\n 'rc-combobox': RCComboboxMessages;\n }\n}\n\n/**\n * Editable combobox with filtering and optional allow-create behavior, configured from\n * native option data and following the WAI-ARIA Combobox pattern.\n *\n * Extends `rc-select` by replacing the trigger `<div>` with a text `<input>`\n * and adding: live filtering of the listbox, keyboard navigation from input,\n * and an optional \"Create '{text}'\" option for new entries.\n *\n * @see {@link https://richardcarls.github.io/rc-webcomponents/components/rc-combobox rc-combobox docs}\n * @see {@link https://www.w3.org/WAI/ARIA/apg/patterns/combobox/ WAI-ARIA Combobox pattern}\n *\n * @slot - Required. A native `<select>` element for form submission.\n * @slot toggle-icon - Optional. Replaces the default chevron icon.\n *\n * @fires rc-select-change - Inherited selection change event.\n * @fires rc-combobox-create - When the \"Create\" option is activated.\n * `detail: { text: string }`. Cancelable — call `preventDefault()` to stop\n * the default insertion of the new option.\n *\n * @csspart anchor - Outer container (includes chips + input + toggle).\n * @csspart chips - The chip group container (multiple mode).\n * @csspart chip - Individual chip (multiple mode).\n * @csspart chip-label - Text label inside a chip.\n * @csspart chip-remove - Remove button inside a chip.\n * @csspart input - The text input element.\n * @csspart toggle - The chevron toggle button.\n * @csspart listbox - The `<rc-listbox>` popup element.\n * @csspart dialog - Dialog popup surface.\n * @csspart dialog-header - Dialog title and action row.\n * @csspart dialog-title - Visible dialog title.\n * @csspart dialog-selected - Scrollable selected-chip region.\n * @csspart dialog-search - Dialog search field wrapper.\n * @csspart dialog-input - Dialog search input.\n * @csspart dialog-listbox - Dialog option list.\n * @csspart dialog-actions - Dialog action group.\n * @csspart dialog-confirm - Commits pending dialog selection and closes the dialog.\n * @csspart dialog-cancel - Discards pending dialog selection and closes the dialog.\n *\n * Built-in text follows the element's own `lang`, else `<html lang>`: per\n * element through `messages`, or for every combobox through\n * `registerMessages()` from `@rcarls/rc-common` under `rc-combobox`. Text\n * registered under `rc-select` applies too, below the combobox's own. The\n * \"Create\" option reads `rc-listbox`.\n *\n * @attr allow-create - When present, shows a \"Create 'X'\" option for unmatched input.\n * @attr required - Inherited from `rc-select`; mirrors the slotted native `<select>`'s own\n * `required`, for `aria-required` on the input trigger.\n * @attr filter-strategy - How option labels are matched against typed input: `'contains'`\n * (default), `'prefix'`, or a custom predicate set via the `filterStrategy` JS property.\n * @attr popup-mode - Presents options in an anchored `popover` (default) or modal `dialog`.\n *\n * @cssprop [--rc-combobox-max-height=20em] - Maximum popup height.\n * @cssprop [--rc-combobox-control-block-size=var(--rc-control-block-size)] - Anchor block size.\n * @cssprop [--rc-combobox-padding-block=calc(var(--rc-control-padding-block) / 2)] - Anchor block-axis padding.\n * @cssprop [--rc-combobox-padding-inline=calc(var(--rc-control-padding-inline) / 2)] - Anchor inline-axis padding.\n * @cssprop [--rc-combobox-gap=var(--rc-control-gap)] - Gap between chips, input, and toggle.\n * @cssprop [--rc-combobox-radius=var(--rc-control-radius)] - Anchor border radius.\n * @cssprop [--rc-combobox-border=var(--rc-border)] - Anchor border.\n * @cssprop [--rc-combobox-listbox-radius=var(--rc-popup-radius)] - Popup listbox border radius.\n * @cssprop [--rc-combobox-listbox-duration=150ms] - Popup listbox open/close fade transition duration.\n * @cssprop [--rc-combobox-listbox-border=var(--rc-popup-border)] - Popup listbox border.\n * @cssprop [--rc-combobox-listbox-background=var(--rc-popup-background)] - Popup listbox background.\n * @cssprop [--rc-combobox-listbox-color=var(--rc-popup-color)] - Popup listbox text color.\n * @cssprop [--rc-combobox-shadow=var(--rc-popup-shadow)] - Popup listbox box shadow.\n * @cssprop [--rc-combobox-listbox-padding-block=var(--rc-popup-padding-block)] - Popup listbox block padding.\n * @cssprop [--rc-combobox-dialog-input-border=var(--rc-border)] - Dialog search input border.\n * @cssprop [--rc-combobox-dialog-input-radius=var(--rc-control-radius)] - Dialog search input radius.\n * @cssprop [--rc-combobox-dialog-input-background=var(--rc-field)] - Dialog search input background.\n * @cssprop [--rc-combobox-dialog-gap=1rem] - Gap between fullscreen dialog regions.\n * @cssprop [--rc-combobox-dialog-header-gap=0.5rem] - Gap between fullscreen dialog header slots.\n * @cssprop [--rc-combobox-dialog-search-gap=0.25rem] - Gap between the dialog search label and input.\n * @cssprop [--rc-anchor-viewport-inline-size] - Visual-viewport inline space supplied by the anchor controller.\n * @cssprop [--rc-anchor-viewport-block-size] - Visual-viewport block space supplied by the anchor controller.\n * @cssprop [--rc-combobox-chip-radius=var(--rc-radius-md)] - Multi-select chip border radius.\n * @cssprop [--rc-combobox-chip-padding-block=0.1em] - Multi-select chip block-axis padding.\n * @cssprop [--rc-combobox-chip-padding-inline-start=0.3em] - Multi-select chip leading padding.\n * @cssprop [--rc-combobox-chip-padding-inline-end=calc(var(--rc-chip-remove-target-size, 1.5rem) + var(--rc-chip-remove-offset-inline, 0.125rem))] - Multi-select chip trailing padding, including the remove affordance.\n * @cssprop [--rc-combobox-chip-gap=calc(var(--rc-control-gap, 0.25em) * 0.8)] - Gap between chip\n * content items.\n * @cssprop [--rc-combobox-chip-border=var(--rc-border)] - Multi-select chip border.\n * @cssprop [--rc-chip-remove-target-size=1.5rem] - Inherited remove-target width reserved by\n * generated multi-select chips.\n * @cssprop [--rc-chip-remove-offset-inline=0.125rem] - Inherited edge offset reserved by\n * generated multi-select chips.\n * @cssprop [--rc-chip-touch-target-overlap-block-start=0px] - Space returned between wrapped chip rows after a touch target overlaps the field's leading padding.\n * @cssprop [--rc-chip-touch-target-overlap-block-end=0px] - Space returned between wrapped chip rows after a touch target overlaps the field's trailing padding.\n * @cssprop [--rc-combobox-toggle-size=1.1em] - Inline size of the toggle button's icon area.\n */\nexport class RCCombobox extends RCSelect {\n static override styles = comboboxStyles;\n\n /** Built-in text overrides; unset keys fall back to registered text, then English. */\n declare messages: Partial<RCComboboxMessages> | undefined;\n\n protected override get _text(): RCComboboxMessages {\n return resolveMessages(this, 'rc-combobox', DEFAULT_COMBOBOX_MESSAGES, this.messages, {\n inherit: 'rc-select',\n });\n }\n\n /** When set, shows a \"Create '{text}'\" option for text that has no exact match. */\n @property({ type: Boolean, attribute: 'allow-create' })\n allowCreate = false;\n\n /**\n * How option labels are matched against typed input.\n *\n * - Forwarded to the internal `rc-listbox`.\n * - Defaults to `'contains'` (substring).\n * - Set to `'prefix'` for starts-with matching, or\n * - Pass a custom `(label, query) => boolean` predicate.\n *\n * Function values are JS-only; string values may be set via the `filter-strategy` attribute.\n */\n @property({ attribute: 'filter-strategy', reflect: false })\n filterStrategy: FilterStrategy = 'contains';\n\n @query('#trigger')\n protected override _$trigger!: HTMLElement;\n\n @query('#dialog-input')\n private _$dialogInput?: HTMLInputElement;\n\n @state()\n private _filterText = '';\n\n // Guard against _handleInputFocus re-opening the popup immediately after close.\n private _closingPopup = false;\n\n private _provisionalOptions = new Map<string, { value: string; label: string }>();\n private _preDialogOptions: typeof this._options | null = null;\n\n private get _$filterInput(): HTMLInputElement | null {\n if (this._activePopupMode === 'dialog') {\n return this._$dialogInput ?? null;\n }\n\n return this._$trigger instanceof HTMLInputElement ? this._$trigger : null;\n }\n\n protected override get _$activeDescendantHost(): HTMLElement | null {\n return this._$filterInput;\n }\n\n override openPopup() {\n super.openPopup();\n\n if (this._activePopupMode === 'popover') {\n this._$listbox?.filterOptions(this._filterText);\n }\n }\n\n override closePopup(_returnFocus = true) {\n if (!this.open) {\n return;\n }\n\n this._filterText = '';\n this._$listbox?.clearFilter();\n this._$listbox?.setCreateOption(null);\n this._closingPopup = true;\n\n super.closePopup(_returnFocus);\n\n // Deferred past any native focus-return from hidePopover() in Firefox\n setTimeout(() => {\n this._closingPopup = false;\n }, 0);\n }\n\n private _handleInput(e: InputEvent) {\n this._filterText = (e.target as HTMLInputElement).value;\n\n if (!this.open && this._filterText) {\n this.openPopup();\n }\n\n this._$listbox?.filterOptions(this._filterText);\n this._updateCreateOption();\n\n if (this._$listbox?.navigableItems.length) {\n this._activeDescendantCtrl.navigateToFirst();\n } else {\n this._activeDescendantCtrl.clear();\n }\n }\n\n private _handleInputFocus() {\n if (this.popupMode === 'popover' && !this.open && !this._closingPopup) {\n this.openPopup();\n }\n }\n\n private _handleToggleClick(e: MouseEvent) {\n e.stopPropagation();\n\n if (this.open) {\n this.closePopup();\n } else {\n this.openPopup();\n this._$trigger?.focus();\n }\n }\n\n private _handleAnchorClick(e: MouseEvent) {\n const $target = e.target as HTMLElement;\n\n if (\n $target.closest('[part~=\"chip\"]') ||\n ($target as HTMLElement & { id?: string }).id === 'toggle'\n ) {\n return;\n }\n\n this._$filterInput?.focus();\n }\n\n private _handleDialogAnchorClick(e: MouseEvent): void {\n const $target = e.target as HTMLElement;\n\n if ($target.closest('[part~=\"chip\"]')) {\n return;\n }\n\n this.openPopup();\n }\n\n private _handleDialogTriggerKeyDown(e: KeyboardEvent): void {\n switch (e.key) {\n case ' ':\n case 'Enter':\n case 'ArrowDown':\n e.preventDefault();\n this.openPopup();\n\n break;\n\n default:\n // Chips sit before the trigger along the inline axis, so the arrow\n // toward the inline start reaches them: ArrowRight in RTL.\n if (\n e.key === inlineArrowKeys(resolveFlow(this)).prev &&\n this.multiple &&\n this._selectedValues.size > 0\n ) {\n e.preventDefault();\n this._focusLastChipRemove();\n }\n\n break;\n }\n }\n\n private _updateCreateOption() {\n if (!this.allowCreate || !this._filterText.trim()) {\n this._$listbox?.setCreateOption(null);\n\n return;\n }\n\n const trimmed = this._filterText.trim().toLowerCase();\n const hasExact =\n this._$listbox?.allOptions.some((o) => o.label.toLowerCase() === trimmed) ?? false;\n\n this._$listbox?.setCreateOption(hasExact ? null : this._filterText.trim());\n }\n\n protected override _handleListboxChange(e: CustomEvent) {\n const detail = e.detail as RCListboxChangeEvent;\n\n if (detail.reason === 'action' && detail.action === 'create') {\n e.stopPropagation();\n void this._activateCreate(this._filterText.trim());\n\n return;\n }\n\n super._handleListboxChange(e);\n\n if (!this.multiple && this._activePopupMode === 'popover') {\n this._syncInputToSelection();\n } else {\n this._filterText = '';\n\n if (this._$filterInput) {\n this._$filterInput.value = '';\n }\n\n this._$listbox?.clearFilter();\n this._updateCreateOption();\n }\n }\n\n private async _activateCreate(text: string) {\n if (!text) {\n return;\n }\n\n if (this._activePopupMode === 'dialog') {\n const option = { value: text, label: text };\n\n this._preDialogOptions ??= [...this._options];\n this._provisionalOptions.set(text, option);\n this._syncOptions([...this._preDialogOptions, ...this._provisionalOptions.values()]);\n\n const next = new Set(this._pendingSelectedValues ?? this._selectedValues);\n\n if (!this.multiple) {\n next.clear();\n }\n\n next.add(text);\n this._pendingSelectedValues = next;\n this._$listbox?.setSelectedValues([...next]);\n this._filterText = '';\n\n if (this._$filterInput) {\n this._$filterInput.value = '';\n }\n\n this._$listbox?.clearFilter();\n this._$listbox?.setCreateOption(null);\n this.requestUpdate();\n\n return;\n }\n\n const createEvent = new CustomEvent<RCComboboxCreateEvent>('rc-combobox-create', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { text },\n });\n\n if (!this.dispatchEvent(createEvent)) {\n return;\n }\n\n this._addOption({ value: text, label: text });\n\n if (this.multiple) {\n this._$listbox?.toggleOption(text);\n this._filterText = '';\n\n if (this._$filterInput) {\n this._$filterInput.value = '';\n }\n\n this._$listbox?.clearFilter();\n this._$listbox?.setCreateOption(null);\n\n return;\n }\n\n this._applySelection([text], true);\n this._syncInputToSelection();\n this.closePopup(true);\n this._dispatchChange();\n }\n\n override set value(value: string | string[] | undefined) {\n super.value = value;\n this._syncInputToSelection();\n }\n\n override get value(): string | string[] {\n return super.value;\n }\n\n private _syncInputToSelection(): void {\n if (this.multiple) {\n return;\n }\n\n const value = this.selectedValues[0];\n const label = value ? this._labelFor(value) : '';\n\n this._filterText = label;\n\n if (this._$filterInput) {\n this._$filterInput.value = label;\n }\n }\n\n private _handleInputKeyDown(e: KeyboardEvent) {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n\n if (!this.open) {\n this.openPopup();\n this._activeDescendantCtrl.navigateToFirst();\n } else {\n this._activeDescendantCtrl.navigate(1);\n }\n\n break;\n\n case 'ArrowUp':\n e.preventDefault();\n\n if (this.open) {\n this._activeDescendantCtrl.navigate(-1);\n }\n\n break;\n\n case 'Home':\n if (this.open) {\n e.preventDefault();\n\n this._activeDescendantCtrl.navigateToFirst();\n }\n break;\n\n case 'End':\n if (this.open) {\n e.preventDefault();\n\n this._activeDescendantCtrl.navigateToLast();\n }\n break;\n\n case 'Enter': {\n e.preventDefault();\n\n const active = this._activeDescendantCtrl.activeItem;\n\n if (active) {\n active.dispatchEvent(\n new PointerEvent('pointerdown', { bubbles: true, cancelable: true }),\n );\n } else if (this.open && this._$listbox?.navigableItems.length) {\n const $first = this._$listbox.navigableItems[0];\n\n $first?.dispatchEvent(\n new PointerEvent('pointerdown', { bubbles: true, cancelable: true }),\n );\n }\n\n break;\n }\n\n case 'Tab':\n if (this.open && this._activePopupMode === 'popover') {\n const $first = this._$listbox?.navigableItems[0];\n\n if ($first) {\n $first.dispatchEvent(\n new PointerEvent('pointerdown', { bubbles: true, cancelable: true }),\n );\n }\n\n this.closePopup(false);\n }\n\n break;\n\n case 'Escape':\n e.preventDefault();\n this._filterText = '';\n\n if (this._$filterInput) {\n this._$filterInput.value = '';\n }\n\n this.closePopup();\n break;\n\n case 'Backspace':\n if (this._filterText === '' && this.multiple && this._selectedValues.size > 0) {\n e.preventDefault();\n this._focusLastChipRemove();\n }\n\n break;\n\n default:\n // With the caret at the text's logical start, the arrow toward the\n // inline start moves on to the chips before the input.\n if (\n e.key === inlineArrowKeys(resolveFlow(this)).prev &&\n (e.target as HTMLInputElement).selectionStart === 0 &&\n this.multiple &&\n this._selectedValues.size > 0\n ) {\n e.preventDefault();\n this._focusLastChipRemove();\n }\n\n break;\n }\n }\n\n private _focusLastChipRemove() {\n const $buttons = this._$chipButtons();\n\n $buttons[$buttons.length - 1]?.focus();\n }\n\n private get _inputPlaceholder(): string {\n const selectedCount =\n this._activePopupMode === 'dialog'\n ? this._dialogSelectedValues.length\n : this._selectedValues.size;\n\n if (this.multiple && selectedCount > 0) {\n return '';\n }\n\n return this.placeholder;\n }\n\n protected override _syncAccessibleName($select: HTMLSelectElement): void {\n const accessibleName =\n $select.getAttribute('aria-label') ?? $select.labels?.[0]?.textContent?.trim() ?? '';\n\n this._accessibleName = accessibleName;\n super._syncAccessibleName($select);\n }\n\n protected override _focusDialogContent(): void {\n this._$listbox?.filterOptions(this._filterText);\n this._$dialogInput?.focus();\n }\n\n protected override _prepareDialogCommit(): void {\n const baseOptions = this._preDialogOptions ?? [...this._options];\n const pending = new Set(this._dialogSelectedValues);\n\n this._syncOptions(baseOptions);\n\n for (const option of this._provisionalOptions.values()) {\n if (!pending.has(option.value)) {\n continue;\n }\n\n const createEvent = new CustomEvent<RCComboboxCreateEvent>('rc-combobox-create', {\n bubbles: true,\n composed: true,\n cancelable: true,\n detail: { text: option.label },\n });\n\n if (this.dispatchEvent(createEvent)) {\n this._addOption(option);\n } else {\n pending.delete(option.value);\n }\n }\n\n this._pendingSelectedValues = pending;\n this._provisionalOptions.clear();\n this._preDialogOptions = null;\n }\n\n protected override _commitDialogSelection(): void {\n super._commitDialogSelection();\n this._syncInputToSelection();\n }\n\n protected override _discardDialogSelection(): void {\n if (this._preDialogOptions) {\n this._syncOptions(this._preDialogOptions);\n }\n\n this._provisionalOptions.clear();\n this._preDialogOptions = null;\n super._discardDialogSelection();\n }\n\n protected override _finishDialogClose(returnFocus: boolean): void {\n this._filterText = '';\n this._$listbox?.clearFilter();\n this._$listbox?.setCreateOption(null);\n super._finishDialogClose(returnFocus);\n }\n\n protected override _renderDialogBody() {\n const text = this._text;\n\n return html`\n <label part=\"dialog-search\">\n <span>${text.search(this._accessibleName || text.options)}</span>\n <input\n id=\"dialog-input\"\n part=\"dialog-input\"\n type=\"text\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n aria-expanded=\"true\"\n aria-controls=\"dialog-listbox\"\n aria-autocomplete=\"list\"\n aria-required=${this.required ? 'true' : 'false'}\n ?disabled=${this.disabled}\n placeholder=${this._inputPlaceholder}\n .value=${this._filterText}\n autocomplete=\"off\"\n spellcheck=\"false\"\n @input=${this._handleInput}\n @keydown=${this._handleInputKeyDown}\n />\n </label>\n\n <rc-listbox\n lang=${this.getAttribute('lang') ?? nothing}\n id=\"dialog-listbox\"\n part=\"listbox dialog-listbox\"\n tabindex=\"-1\"\n ?multiple=${this.multiple}\n checkmark\n .options=${this._options}\n .filterStrategy=${this.filterStrategy}\n @rc-listbox-change=${this._handleListboxChange}\n ></rc-listbox>\n `;\n }\n\n protected override render() {\n const showChips = this.multiple && this._selectedValues.size > 0;\n const popupMode = this.open ? this._activePopupMode : this.popupMode;\n\n if (popupMode === 'dialog') {\n return html`\n <div id=\"anchor\" part=\"anchor\" @click=${this._handleDialogAnchorClick}>\n <div class=\"value\">\n ${showChips ? this._renderChips() : nothing}\n\n <div\n id=\"trigger\"\n part=\"input\"\n role=\"combobox\"\n tabindex=${this.disabled ? '-1' : '0'}\n aria-label=${this._accessibleName || nothing}\n aria-haspopup=\"dialog\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=\"dialog\"\n aria-required=${this.required ? 'true' : 'false'}\n aria-disabled=${this.disabled ? 'true' : 'false'}\n @keydown=${this._handleDialogTriggerKeyDown}\n >\n ${this._displayLabel}\n </div>\n </div>\n\n <span id=\"toggle\" part=\"toggle\" aria-hidden=\"true\">\n <slot name=\"toggle-icon\">\n <svg\n width=\"10\"\n height=\"6\"\n viewBox=\"0 0 10 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"1,1 5,5 9,1\"></polyline>\n </svg>\n </slot>\n </span>\n </div>\n\n ${this._renderDialogPopup()}\n <slot @slotchange=${this._handleSelectSlotChange}></slot>\n `;\n }\n\n return html`\n <div id=\"anchor\" part=\"anchor\" @click=${this._handleAnchorClick}>\n <div class=\"value\">\n ${showChips ? this._renderChips() : nothing}\n\n <input\n id=\"trigger\"\n part=\"input\"\n type=\"text\"\n role=\"combobox\"\n aria-label=${this._accessibleName || nothing}\n aria-haspopup=\"listbox\"\n aria-expanded=${this.open ? 'true' : 'false'}\n aria-controls=\"listbox\"\n aria-autocomplete=\"list\"\n aria-required=${this.required ? 'true' : 'false'}\n ?disabled=${this.disabled}\n placeholder=${this._inputPlaceholder}\n .value=${this._filterText}\n autocomplete=\"off\"\n spellcheck=\"false\"\n @input=${this._handleInput}\n @keydown=${this._handleInputKeyDown}\n @focus=${this._handleInputFocus}\n />\n </div>\n\n <button\n id=\"toggle\"\n type=\"button\"\n part=\"toggle\"\n aria-hidden=\"true\"\n tabindex=\"-1\"\n @click=${this._handleToggleClick}\n >\n <slot name=\"toggle-icon\">\n <svg\n width=\"10\"\n height=\"6\"\n viewBox=\"0 0 10 6\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n >\n <polyline points=\"1,1 5,5 9,1\" />\n </svg>\n </slot>\n </button>\n </div>\n\n <rc-listbox\n lang=${this.getAttribute('lang') ?? nothing}\n id=\"listbox\"\n part=\"listbox\"\n popover=\"manual\"\n ?multiple=${this.multiple}\n checkmark\n .filterStrategy=${this.filterStrategy}\n .options=${this._options}\n @rc-listbox-change=${this._handleListboxChange}\n ></rc-listbox>\n\n <slot @slotchange=${this._handleSelectSlotChange}></slot>\n `;\n }\n}\n\nexport default RCCombobox;\n"],"names":["comboboxStyles","css","DEFAULT_COMBOBOX_MESSAGES","DEFAULT_SELECT_MESSAGES","name","bidiIsolate","_RCCombobox","RCSelect","resolveMessages","_returnFocus","e","$target","inlineArrowKeys","resolveFlow","trimmed","hasExact","detail","text","option","next","createEvent","value","label","active","$first","$buttons","selectedCount","$select","accessibleName","baseOptions","pending","returnFocus","html","nothing","showChips","RCCombobox","__decorateClass","property","query","state"],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  import "@rcarls/rc-listbox/define";
2
- import { R as o } from "./rc-combobox-BfEg1DVi.js";
2
+ import { R as o } from "./rc-combobox-8jDCwAe_.js";
3
+ import { D as b } from "./rc-combobox-8jDCwAe_.js";
3
4
  customElements.get("rc-combobox") || customElements.define("rc-combobox", o);
4
5
  export {
6
+ b as DEFAULT_COMBOBOX_MESSAGES,
5
7
  o as RCCombobox
6
8
  };
7
9
  //# sourceMappingURL=rc-combobox-define.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rc-combobox-define.js","sources":["../src/define.ts"],"sourcesContent":["import '@rcarls/rc-listbox/define';\nimport { RCCombobox } from './index.js';\n\ncustomElements.get('rc-combobox') || customElements.define('rc-combobox', RCCombobox);\n\nexport * from './index.js';\n"],"names":["RCCombobox"],"mappings":";;AAGA,eAAe,IAAI,aAAa,KAAK,eAAe,OAAO,eAAeA,CAAU;"}
1
+ {"version":3,"file":"rc-combobox-define.js","sources":["../src/define.ts"],"sourcesContent":["import '@rcarls/rc-listbox/define';\nimport { RCCombobox } from './index.js';\n\ncustomElements.get('rc-combobox') || customElements.define('rc-combobox', RCCombobox);\n\nexport * from './index.js';\n"],"names":["RCCombobox"],"mappings":";;;AAGA,eAAe,IAAI,aAAa,KAAK,eAAe,OAAO,eAAeA,CAAU;"}
@@ -1,5 +1,6 @@
1
- import { R as m } from "./rc-combobox-BfEg1DVi.js";
1
+ import { D as E, R as O } from "./rc-combobox-8jDCwAe_.js";
2
2
  export {
3
- m as RCCombobox
3
+ E as DEFAULT_COMBOBOX_MESSAGES,
4
+ O as RCCombobox
4
5
  };
5
6
  //# sourceMappingURL=rc-combobox.js.map