@eui/eds 22.0.0-alpha.33 → 22.0.0-alpha.35
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/docs/changelog.html +38 -0
- package/docs/components/EdsMultiselect.html +123 -1
- package/docs/components/EdsMultiselectOption.html +35 -1
- package/docs/js/search/search_index.js +2 -2
- package/docs/json/EdsMultiselect.md +4 -0
- package/docs/json/EdsMultiselectOption.md +1 -0
- package/docs/json/documentation.json +236 -75
- package/docs/llms.txt +6 -1
- package/docs/properties.html +1 -1
- package/fesm2022/eui-eds-eds-multiselect.mjs +59 -13
- package/fesm2022/eui-eds-eds-multiselect.mjs.map +1 -1
- package/fesm2022/eui-eds-shared.mjs +13 -15
- package/fesm2022/eui-eds-shared.mjs.map +1 -1
- package/package.json +1 -1
- package/types/eui-eds-eds-multiselect.d.ts +32 -3
- package/types/eui-eds-eds-multiselect.d.ts.map +1 -1
- package/types/eui-eds-shared.d.ts.map +1 -1
package/docs/llms.txt
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# eui documentation
|
|
2
2
|
|
|
3
|
-
> Generated by compodoc 2.0.0 at 2026-09-
|
|
3
|
+
> Generated by compodoc 2.0.0 at 2026-09-30T17:58:06.467Z, llm-md export.
|
|
4
4
|
|
|
5
5
|
## Components
|
|
6
6
|
|
|
@@ -2225,12 +2225,16 @@ Description: EDS Multiselect component — a combobox-style dropdown that allows
|
|
|
2225
2225
|
|
|
2226
2226
|
Inputs:
|
|
2227
2227
|
- `ariaLabel: string = 'Select options'` — Aria-label for the combobox trigger. 'Select options'
|
|
2228
|
+
- `cancelLabel: string = 'Cancel'` — Label for the panel-footer "Cancel" button. 'Cancel'
|
|
2229
|
+
- `confirmLabel: string = 'Confirm choice'` — Label for the panel-footer "Confirm choice" button. 'Confirm choice'
|
|
2228
2230
|
- `disabled: boolean = false` — Controls whether the multiselect is disabled. false
|
|
2229
2231
|
- `e2eAttr: string = 'eds-multiselect'` — Data attribute value for end-to-end testing identification. 'eds-multiselect'
|
|
2230
2232
|
- `isInvalid: boolean = false` — Controls whether the multiselect shows an invalid/error state. false
|
|
2231
2233
|
- `placeholder: string = 'Select options'` — Placeholder text displayed when no options are selected. 'Select options'
|
|
2232
2234
|
|
|
2233
2235
|
Outputs:
|
|
2236
|
+
- `cancelled: void` — Emits when the "Cancel" button is clicked (selection reverted to its pre-open state).
|
|
2237
|
+
- `confirmed: string[]` — Emits the confirmed selection when the "Confirm choice" button is clicked.
|
|
2234
2238
|
- `valueChange: string[]` — Emits the current selection whenever it changes.
|
|
2235
2239
|
|
|
2236
2240
|
Properties:
|
|
@@ -2255,6 +2259,7 @@ Description: An individual option within the EDS Multiselect dropdown. Supports
|
|
|
2255
2259
|
|
|
2256
2260
|
Inputs:
|
|
2257
2261
|
- `isDisabled: boolean = false` — Whether this option is disabled. false
|
|
2262
|
+
- `isGroup: boolean = false` — Whether this entry is a non-selectable group header. When true the entry renders as plain label text, is skipped by keyboard navigation, and cannot be selected. false
|
|
2258
2263
|
- `label: string` — The display label for this option.
|
|
2259
2264
|
- `value: string` — The value associated with this option.
|
|
2260
2265
|
|
package/docs/properties.html
CHANGED
|
@@ -8,6 +8,10 @@ import { ActiveDescendantKeyManager, A11yModule } from '@angular/cdk/a11y';
|
|
|
8
8
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
9
9
|
import * as i1 from '@eui/eds/eds-icon';
|
|
10
10
|
import { EDS_ICON } from '@eui/eds/eds-icon';
|
|
11
|
+
import * as i3 from '@eui/eds/eds-input-checkbox';
|
|
12
|
+
import { EDS_INPUT_CHECKBOX } from '@eui/eds/eds-input-checkbox';
|
|
13
|
+
import * as i4 from '@eui/eds/eds-button';
|
|
14
|
+
import { EDS_BUTTON } from '@eui/eds/eds-button';
|
|
11
15
|
|
|
12
16
|
/**
|
|
13
17
|
* @description
|
|
@@ -36,6 +40,13 @@ class EdsMultiselectOption {
|
|
|
36
40
|
* @default false
|
|
37
41
|
*/
|
|
38
42
|
this.isDisabled = input(false, { ...(ngDevMode ? { debugName: "isDisabled" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
43
|
+
/**
|
|
44
|
+
* Whether this entry is a non-selectable group header.
|
|
45
|
+
* When true the entry renders as plain label text, is skipped by keyboard
|
|
46
|
+
* navigation, and cannot be selected.
|
|
47
|
+
* @default false
|
|
48
|
+
*/
|
|
49
|
+
this.isGroup = input(false, { ...(ngDevMode ? { debugName: "isGroup" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
39
50
|
/** Whether this option is currently selected. */
|
|
40
51
|
this.selected = signal(false, /* @ts-ignore */
|
|
41
52
|
...(ngDevMode ? [{ debugName: "selected" }] : /* istanbul ignore next */ []));
|
|
@@ -49,9 +60,10 @@ class EdsMultiselectOption {
|
|
|
49
60
|
}
|
|
50
61
|
/**
|
|
51
62
|
* Required by Highlightable interface — reads the signal value.
|
|
63
|
+
* Group headers are treated as "disabled" so the key manager skips them.
|
|
52
64
|
*/
|
|
53
65
|
get disabled() {
|
|
54
|
-
return this.isDisabled();
|
|
66
|
+
return this.isDisabled() || this.isGroup();
|
|
55
67
|
}
|
|
56
68
|
// --- Highlightable interface ---
|
|
57
69
|
setActiveStyles() {
|
|
@@ -62,12 +74,12 @@ class EdsMultiselectOption {
|
|
|
62
74
|
}
|
|
63
75
|
// --- Interaction ---
|
|
64
76
|
onSelect() {
|
|
65
|
-
if (!this.isDisabled()) {
|
|
77
|
+
if (!this.isDisabled() && !this.isGroup()) {
|
|
66
78
|
this.selected.set(!this.selected());
|
|
67
79
|
}
|
|
68
80
|
}
|
|
69
81
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EdsMultiselectOption, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
70
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.2", type: EdsMultiselectOption, isStandalone: true, selector: "eds-multiselect-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "option" }, listeners: { "click": "onSelect()" }, properties: { "attr.selected": "selected() || null", "attr.active": "isActive() || null", "attr.disabled": "isDisabled() || null", "attr.aria-selected": "selected()", "attr.aria-disabled": "isDisabled() || null", "attr.data-e2e": "\"eds-multiselect-option\"", "id": "optionId()" }, classAttribute: "eds-multiselect-option" }, ngImport: i0, template: `
|
|
82
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.1.2", type: EdsMultiselectOption, isStandalone: true, selector: "eds-multiselect-option", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: true, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: true, transformFunction: null }, isDisabled: { classPropertyName: "isDisabled", publicName: "isDisabled", isSignal: true, isRequired: false, transformFunction: null }, isGroup: { classPropertyName: "isGroup", publicName: "isGroup", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "option" }, listeners: { "click": "onSelect()" }, properties: { "attr.selected": "selected() || null", "attr.active": "isActive() || null", "attr.disabled": "isDisabled() || null", "attr.aria-selected": "selected()", "attr.aria-disabled": "isDisabled() || null", "attr.data-e2e": "\"eds-multiselect-option\"", "id": "optionId()" }, classAttribute: "eds-multiselect-option" }, ngImport: i0, template: `
|
|
71
83
|
<span class="eds-multiselect-option__label">{{ label() }}</span>
|
|
72
84
|
<eds-icon
|
|
73
85
|
class="eds-multiselect-option__check"
|
|
@@ -97,7 +109,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
97
109
|
'[id]': 'optionId()',
|
|
98
110
|
'(click)': 'onSelect()',
|
|
99
111
|
}, styles: [".eui-21 :host{display:flex;align-items:center;gap:var(--eds-sp-s);padding:var(--eds-sp-xs) var(--eds-sp-s);cursor:pointer;font:var(--eds-f-paragraph-m);color:var(--eds-c-foreground-default);-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.eui-21 :host .eds-multiselect-option__label{flex:1}.eui-21 :host .eds-multiselect-option__check{opacity:0;font-size:16px;color:var(--eds-c-foreground-primary)}.eui-21 :host(:hover:not([disabled])){background-color:var(--eds-c-surface-hover)}.eui-21 :host([active]:not([disabled])){background-color:var(--eds-c-surface-hover)}.eui-21 :host([selected]) .eds-multiselect-option__check{opacity:1}.eui-21 :host([disabled]){color:var(--eds-c-foreground-subtler);cursor:not-allowed;pointer-events:none}\n"] }]
|
|
100
|
-
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }] } });
|
|
112
|
+
}], propDecorators: { value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], isDisabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "isDisabled", required: false }] }], isGroup: [{ type: i0.Input, args: [{ isSignal: true, alias: "isGroup", required: false }] }] } });
|
|
101
113
|
|
|
102
114
|
/**
|
|
103
115
|
* @description
|
|
@@ -161,10 +173,30 @@ class EdsMultiselect {
|
|
|
161
173
|
*/
|
|
162
174
|
this.ariaLabel = input('Select options', /* @ts-ignore */
|
|
163
175
|
...(ngDevMode ? [{ debugName: "ariaLabel" }] : /* istanbul ignore next */ []));
|
|
176
|
+
/**
|
|
177
|
+
* Label for the panel-footer "Cancel" button.
|
|
178
|
+
* @default 'Cancel'
|
|
179
|
+
*/
|
|
180
|
+
this.cancelLabel = input('Cancel', /* @ts-ignore */
|
|
181
|
+
...(ngDevMode ? [{ debugName: "cancelLabel" }] : /* istanbul ignore next */ []));
|
|
182
|
+
/**
|
|
183
|
+
* Label for the panel-footer "Confirm choice" button.
|
|
184
|
+
* @default 'Confirm choice'
|
|
185
|
+
*/
|
|
186
|
+
this.confirmLabel = input('Confirm choice', /* @ts-ignore */
|
|
187
|
+
...(ngDevMode ? [{ debugName: "confirmLabel" }] : /* istanbul ignore next */ []));
|
|
164
188
|
/**
|
|
165
189
|
* Emits the current selection whenever it changes.
|
|
166
190
|
*/
|
|
167
191
|
this.valueChange = output();
|
|
192
|
+
/**
|
|
193
|
+
* Emits the confirmed selection when the "Confirm choice" button is clicked.
|
|
194
|
+
*/
|
|
195
|
+
this.confirmed = output();
|
|
196
|
+
/**
|
|
197
|
+
* Emits when the "Cancel" button is clicked (selection reverted to its pre-open state).
|
|
198
|
+
*/
|
|
199
|
+
this.cancelled = output();
|
|
168
200
|
/** The projected option components. */
|
|
169
201
|
this.options = contentChildren(EdsMultiselectOption, /* @ts-ignore */
|
|
170
202
|
...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
@@ -180,6 +212,8 @@ class EdsMultiselect {
|
|
|
180
212
|
/** Internal selected values. */
|
|
181
213
|
this.internalValue = signal([], /* @ts-ignore */
|
|
182
214
|
...(ngDevMode ? [{ debugName: "internalValue" }] : /* istanbul ignore next */ []));
|
|
215
|
+
/** Snapshot of the selection taken when the dropdown opens, used to revert on Cancel. */
|
|
216
|
+
this.valueSnapshot = [];
|
|
183
217
|
/** Internal disabled state (supports CVA setDisabledState). */
|
|
184
218
|
this.internalDisabled = signal(false, /* @ts-ignore */
|
|
185
219
|
...(ngDevMode ? [{ debugName: "internalDisabled" }] : /* istanbul ignore next */ []));
|
|
@@ -291,7 +325,7 @@ class EdsMultiselect {
|
|
|
291
325
|
}
|
|
292
326
|
}
|
|
293
327
|
onOptionClick(option) {
|
|
294
|
-
if (option.isDisabled()) {
|
|
328
|
+
if (option.isDisabled() || option.isGroup()) {
|
|
295
329
|
return;
|
|
296
330
|
}
|
|
297
331
|
option.onSelect();
|
|
@@ -299,7 +333,17 @@ class EdsMultiselect {
|
|
|
299
333
|
this.keyManager?.setActiveItem(option);
|
|
300
334
|
this.updateActiveDescendant();
|
|
301
335
|
}
|
|
302
|
-
|
|
336
|
+
onConfirmClick() {
|
|
337
|
+
this.confirmed.emit(this.internalValue());
|
|
338
|
+
this.closeDropdown();
|
|
339
|
+
}
|
|
340
|
+
onCancelClick() {
|
|
341
|
+
// Revert selection to the snapshot taken when the dropdown opened.
|
|
342
|
+
this.internalValue.set([...this.valueSnapshot]);
|
|
343
|
+
this.syncOptionsFromValue();
|
|
344
|
+
this._onChange(this.valueSnapshot);
|
|
345
|
+
this.valueChange.emit(this.valueSnapshot);
|
|
346
|
+
this.cancelled.emit();
|
|
303
347
|
this.closeDropdown();
|
|
304
348
|
}
|
|
305
349
|
onPanelKeydown(event) {
|
|
@@ -354,6 +398,8 @@ class EdsMultiselect {
|
|
|
354
398
|
if (!triggerEl) {
|
|
355
399
|
return;
|
|
356
400
|
}
|
|
401
|
+
// Snapshot current selection so Cancel can revert to it.
|
|
402
|
+
this.valueSnapshot = [...this.internalValue()];
|
|
357
403
|
const positionStrategy = this.overlay
|
|
358
404
|
.position()
|
|
359
405
|
.flexibleConnectedTo(triggerEl)
|
|
@@ -464,7 +510,7 @@ class EdsMultiselect {
|
|
|
464
510
|
}
|
|
465
511
|
syncValueFromOptions() {
|
|
466
512
|
const selectedValues = this.options()
|
|
467
|
-
.filter(o => o.selected())
|
|
513
|
+
.filter(o => o.selected() && !o.isGroup())
|
|
468
514
|
.map(o => o.value());
|
|
469
515
|
this.internalValue.set(selectedValues);
|
|
470
516
|
this._onChange(selectedValues);
|
|
@@ -473,21 +519,21 @@ class EdsMultiselect {
|
|
|
473
519
|
syncOptionsFromValue() {
|
|
474
520
|
const currentValue = this.internalValue();
|
|
475
521
|
this.options().forEach(option => {
|
|
476
|
-
option.selected.set(currentValue.includes(option.value()));
|
|
522
|
+
option.selected.set(!option.isGroup() && currentValue.includes(option.value()));
|
|
477
523
|
});
|
|
478
524
|
}
|
|
479
525
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EdsMultiselect, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
480
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EdsMultiselect, isStandalone: true, selector: "eds-multiselect", inputs: { e2eAttr: { classPropertyName: "e2eAttr", publicName: "e2eAttr", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, isInvalid: { classPropertyName: "isInvalid", publicName: "isInvalid", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, host: { properties: { "attr.disabled": "internalDisabled() || null", "attr.invalid": "internalInvalid() || null", "attr.open": "isOpen() || null", "attr.data-e2e": "e2eAttr()" }, classAttribute: "eds-multiselect" }, providers: [
|
|
526
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.2", type: EdsMultiselect, isStandalone: true, selector: "eds-multiselect", inputs: { e2eAttr: { classPropertyName: "e2eAttr", publicName: "e2eAttr", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, isInvalid: { classPropertyName: "isInvalid", publicName: "isInvalid", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, cancelLabel: { classPropertyName: "cancelLabel", publicName: "cancelLabel", isSignal: true, isRequired: false, transformFunction: null }, confirmLabel: { classPropertyName: "confirmLabel", publicName: "confirmLabel", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange", confirmed: "confirmed", cancelled: "cancelled" }, host: { properties: { "attr.disabled": "internalDisabled() || null", "attr.invalid": "internalInvalid() || null", "attr.open": "isOpen() || null", "attr.data-e2e": "e2eAttr()" }, classAttribute: "eds-multiselect" }, providers: [
|
|
481
527
|
{
|
|
482
528
|
provide: NG_VALUE_ACCESSOR,
|
|
483
529
|
useExisting: EdsMultiselect,
|
|
484
530
|
multi: true,
|
|
485
531
|
},
|
|
486
|
-
], queries: [{ propertyName: "options", predicate: EdsMultiselectOption, isSignal: true }], viewQueries: [{ propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, isSignal: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n <div\n class=\"eds-multiselect-option\"\n
|
|
532
|
+
], queries: [{ propertyName: "options", predicate: EdsMultiselectOption, isSignal: true }], viewQueries: [{ propertyName: "dropdownTemplate", first: true, predicate: ["dropdownTemplate"], descendants: true, isSignal: true }, { propertyName: "triggerRef", first: true, predicate: ["triggerRef"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n @if (option.isGroup()) {\n <div\n class=\"eds-multiselect-group\"\n role=\"presentation\"\n [id]=\"option.optionId()\"\n >\n {{ option.label() }}\n </div>\n } @else {\n <div\n class=\"eds-multiselect-option\"\n [class.eds-multiselect-option--selected]=\"option.selected()\"\n [class.eds-multiselect-option--active]=\"option.isActive()\"\n [class.eds-multiselect-option--disabled]=\"option.isDisabled()\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"option.selected()\"\n [attr.aria-disabled]=\"option.isDisabled() || null\"\n [id]=\"option.optionId()\"\n (click)=\"onOptionClick(option)\"\n >\n <input\n class=\"eds-multiselect-option__checkbox\"\n edsInputCheckbox\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [checked]=\"option.selected()\"\n [disabled]=\"option.isDisabled()\"\n />\n <span class=\"eds-multiselect-option__label\">{{ option.label() }}</span>\n </div>\n }\n }\n </div>\n <div class=\"eds-multiselect__panel-footer\">\n <button\n edsButton\n type=\"button\"\n variant=\"tertiary\"\n size=\"s\"\n (click)=\"onCancelClick()\"\n >\n {{ cancelLabel() }}\n </button>\n <button\n edsButton\n type=\"button\"\n variant=\"secondary\"\n size=\"s\"\n (click)=\"onConfirmClick()\"\n >\n {{ confirmLabel() }}\n </button>\n </div>\n </div>\n</ng-template>\n", styles: [".eui-21 :host{display:block;position:relative;width:100%}.eui-21 :host .eds-multiselect__trigger{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:var(--eds-sp-xs);font:var(--eds-f-paragraph-m);appearance:none;background-color:var(--eds-c-surface-elevation);border:var(--eds-bw-xs) solid var(--eds-c-border-neutral);border-radius:var(--eds-br-s);box-shadow:none;color:var(--eds-c-foreground-default);min-height:var(--eds-si-3xl);padding:var(--eds-sp-xs) var(--eds-sp-s);width:100%;cursor:pointer;outline:none;transition:border-color .15s ease}.eui-21 :host .eds-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--eds-c-border-primary)}.eui-21 :host .eds-multiselect__trigger:focus-visible:not([aria-disabled=true]){outline:2px solid var(--eds-c-border-primary);outline-offset:-2px}.eui-21 :host .eds-multiselect__display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eui-21 :host .eds-multiselect__display--placeholder{color:var(--eds-c-foreground-subtler)}.eui-21 :host .eds-multiselect__caret{flex-shrink:0;font-size:20px;color:var(--eds-c-foreground-default);transition:transform .2s ease}.eui-21 :host([open]) .eds-multiselect__trigger{border-color:var(--eds-c-border-primary);outline:2px solid var(--eds-c-border-primary);outline-offset:-2px}.eui-21 :host([open]) .eds-multiselect__caret{transform:rotate(180deg)}.eui-21 :host([disabled]) .eds-multiselect__trigger{background-color:var(--eds-c-surface-disabled);border-color:var(--eds-c-border-disabled);color:var(--eds-c-foreground-subtler);cursor:not-allowed;pointer-events:none}.eui-21 :host([disabled]) .eds-multiselect__caret{color:var(--eds-c-foreground-subtler)}.eui-21 :host([invalid]) .eds-multiselect__trigger{border-color:var(--eds-c-border-critical)}.eui-21 :host([invalid]) .eds-multiselect__trigger:focus-visible{outline-color:var(--eds-c-border-critical)}.eds-multiselect__panel-wrapper{background-color:var(--eds-c-surface-elevation);border:var(--eds-bw-xs) solid var(--eds-c-border-neutral);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-1);display:flex;flex-direction:column;max-height:280px;min-width:100%;box-sizing:border-box;outline:none}.eds-multiselect__panel{flex:1;max-height:240px;overflow-y:auto;padding:var(--eds-sp-3xs) 0;outline:none}.eds-multiselect__panel .eds-multiselect-group{padding:var(--eds-sp-xs) var(--eds-sp-s);font:var(--eds-f-label-m-medium);color:var(--eds-c-foreground-subtle);cursor:default;-webkit-user-select:none;user-select:none}.eds-multiselect__panel .eds-multiselect-option{display:flex;align-items:center;gap:var(--eds-sp-s);padding:var(--eds-sp-xs) var(--eds-sp-s);cursor:pointer;font:var(--eds-f-paragraph-m);color:var(--eds-c-foreground-default);-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.eds-multiselect__panel .eds-multiselect-option .eds-multiselect-option__label{flex:1}.eds-multiselect__panel .eds-multiselect-option .eds-multiselect-option__checkbox{flex-shrink:0;pointer-events:none}.eds-multiselect__panel .eds-multiselect-option:hover:not(.eds-multiselect-option--disabled){background-color:var(--eds-c-surface-hover)}.eds-multiselect__panel .eds-multiselect-option--active:not(.eds-multiselect-option--disabled){outline:var(--eds-bw-s) solid var(--eds-c-border-primary);outline-offset:-2px}.eds-multiselect__panel .eds-multiselect-option--selected{background-color:var(--eds-c-surface-selected)}.eds-multiselect__panel .eds-multiselect-option--selected:hover:not(.eds-multiselect-option--disabled){background-color:var(--eds-c-surface-selected)}.eds-multiselect__panel .eds-multiselect-option--disabled{color:var(--eds-c-foreground-subtler);cursor:not-allowed;pointer-events:none}.eds-multiselect__panel-footer{display:flex;justify-content:space-between;align-items:center;gap:var(--eds-sp-xs);padding:var(--eds-sp-xs) var(--eds-sp-s);border-top:var(--eds-bw-xs) solid var(--eds-c-border-divider)}\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i1$1.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "component", type: i1.EdsIcon, selector: "eds-icon, span[edsIcon]", inputs: ["icon", "set", "color", "size", "ariaLabel", "ariaHidden", "rounded", "isLoading"] }, { kind: "component", type: i3.EdsInputCheckbox, selector: "input[edsInputCheckbox]", inputs: ["e2eAttr", "checked", "indeterminate", "disabled", "readonly", "isInvalid"], outputs: ["checkedChange", "indeterminateChange"] }, { kind: "component", type: i4.EdsButton, selector: "button[edsButton]", inputs: ["e2eAttr", "id", "variant", "color", "size", "disabled", "isBlock", "hasLineWrap", "isRounded", "isChecked"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
487
533
|
}
|
|
488
534
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImport: i0, type: EdsMultiselect, decorators: [{
|
|
489
535
|
type: Component,
|
|
490
|
-
args: [{ selector: 'eds-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, imports: [OverlayModule, A11yModule, ...EDS_ICON], providers: [
|
|
536
|
+
args: [{ selector: 'eds-multiselect', changeDetection: ChangeDetectionStrategy.OnPush, imports: [OverlayModule, A11yModule, ...EDS_ICON, ...EDS_INPUT_CHECKBOX, ...EDS_BUTTON], providers: [
|
|
491
537
|
{
|
|
492
538
|
provide: NG_VALUE_ACCESSOR,
|
|
493
539
|
useExisting: EdsMultiselect,
|
|
@@ -499,8 +545,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.2", ngImpor
|
|
|
499
545
|
'[attr.invalid]': 'internalInvalid() || null',
|
|
500
546
|
'[attr.open]': 'isOpen() || null',
|
|
501
547
|
'[attr.data-e2e]': 'e2eAttr()',
|
|
502
|
-
}, template: "<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n <div\n class=\"eds-multiselect-option\"\n
|
|
503
|
-
}], ctorParameters: () => [], propDecorators: { e2eAttr: [{ type: i0.Input, args: [{ isSignal: true, alias: "e2eAttr", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], isInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "isInvalid", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => EdsMultiselectOption), { isSignal: true }] }], dropdownTemplate: [{ type: i0.ViewChild, args: ['dropdownTemplate', { isSignal: true }] }], triggerRef: [{ type: i0.ViewChild, args: ['triggerRef', { isSignal: true }] }] } });
|
|
548
|
+
}, template: "<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n @if (option.isGroup()) {\n <div\n class=\"eds-multiselect-group\"\n role=\"presentation\"\n [id]=\"option.optionId()\"\n >\n {{ option.label() }}\n </div>\n } @else {\n <div\n class=\"eds-multiselect-option\"\n [class.eds-multiselect-option--selected]=\"option.selected()\"\n [class.eds-multiselect-option--active]=\"option.isActive()\"\n [class.eds-multiselect-option--disabled]=\"option.isDisabled()\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"option.selected()\"\n [attr.aria-disabled]=\"option.isDisabled() || null\"\n [id]=\"option.optionId()\"\n (click)=\"onOptionClick(option)\"\n >\n <input\n class=\"eds-multiselect-option__checkbox\"\n edsInputCheckbox\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [checked]=\"option.selected()\"\n [disabled]=\"option.isDisabled()\"\n />\n <span class=\"eds-multiselect-option__label\">{{ option.label() }}</span>\n </div>\n }\n }\n </div>\n <div class=\"eds-multiselect__panel-footer\">\n <button\n edsButton\n type=\"button\"\n variant=\"tertiary\"\n size=\"s\"\n (click)=\"onCancelClick()\"\n >\n {{ cancelLabel() }}\n </button>\n <button\n edsButton\n type=\"button\"\n variant=\"secondary\"\n size=\"s\"\n (click)=\"onConfirmClick()\"\n >\n {{ confirmLabel() }}\n </button>\n </div>\n </div>\n</ng-template>\n", styles: [".eui-21 :host{display:block;position:relative;width:100%}.eui-21 :host .eds-multiselect__trigger{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:flex;align-items:center;gap:var(--eds-sp-xs);font:var(--eds-f-paragraph-m);appearance:none;background-color:var(--eds-c-surface-elevation);border:var(--eds-bw-xs) solid var(--eds-c-border-neutral);border-radius:var(--eds-br-s);box-shadow:none;color:var(--eds-c-foreground-default);min-height:var(--eds-si-3xl);padding:var(--eds-sp-xs) var(--eds-sp-s);width:100%;cursor:pointer;outline:none;transition:border-color .15s ease}.eui-21 :host .eds-multiselect__trigger:hover:not([aria-disabled=true]){border-color:var(--eds-c-border-primary)}.eui-21 :host .eds-multiselect__trigger:focus-visible:not([aria-disabled=true]){outline:2px solid var(--eds-c-border-primary);outline-offset:-2px}.eui-21 :host .eds-multiselect__display{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.eui-21 :host .eds-multiselect__display--placeholder{color:var(--eds-c-foreground-subtler)}.eui-21 :host .eds-multiselect__caret{flex-shrink:0;font-size:20px;color:var(--eds-c-foreground-default);transition:transform .2s ease}.eui-21 :host([open]) .eds-multiselect__trigger{border-color:var(--eds-c-border-primary);outline:2px solid var(--eds-c-border-primary);outline-offset:-2px}.eui-21 :host([open]) .eds-multiselect__caret{transform:rotate(180deg)}.eui-21 :host([disabled]) .eds-multiselect__trigger{background-color:var(--eds-c-surface-disabled);border-color:var(--eds-c-border-disabled);color:var(--eds-c-foreground-subtler);cursor:not-allowed;pointer-events:none}.eui-21 :host([disabled]) .eds-multiselect__caret{color:var(--eds-c-foreground-subtler)}.eui-21 :host([invalid]) .eds-multiselect__trigger{border-color:var(--eds-c-border-critical)}.eui-21 :host([invalid]) .eds-multiselect__trigger:focus-visible{outline-color:var(--eds-c-border-critical)}.eds-multiselect__panel-wrapper{background-color:var(--eds-c-surface-elevation);border:var(--eds-bw-xs) solid var(--eds-c-border-neutral);border-radius:var(--eds-br-s);box-shadow:var(--eds-sh-1);display:flex;flex-direction:column;max-height:280px;min-width:100%;box-sizing:border-box;outline:none}.eds-multiselect__panel{flex:1;max-height:240px;overflow-y:auto;padding:var(--eds-sp-3xs) 0;outline:none}.eds-multiselect__panel .eds-multiselect-group{padding:var(--eds-sp-xs) var(--eds-sp-s);font:var(--eds-f-label-m-medium);color:var(--eds-c-foreground-subtle);cursor:default;-webkit-user-select:none;user-select:none}.eds-multiselect__panel .eds-multiselect-option{display:flex;align-items:center;gap:var(--eds-sp-s);padding:var(--eds-sp-xs) var(--eds-sp-s);cursor:pointer;font:var(--eds-f-paragraph-m);color:var(--eds-c-foreground-default);-webkit-user-select:none;user-select:none;transition:background-color .1s ease}.eds-multiselect__panel .eds-multiselect-option .eds-multiselect-option__label{flex:1}.eds-multiselect__panel .eds-multiselect-option .eds-multiselect-option__checkbox{flex-shrink:0;pointer-events:none}.eds-multiselect__panel .eds-multiselect-option:hover:not(.eds-multiselect-option--disabled){background-color:var(--eds-c-surface-hover)}.eds-multiselect__panel .eds-multiselect-option--active:not(.eds-multiselect-option--disabled){outline:var(--eds-bw-s) solid var(--eds-c-border-primary);outline-offset:-2px}.eds-multiselect__panel .eds-multiselect-option--selected{background-color:var(--eds-c-surface-selected)}.eds-multiselect__panel .eds-multiselect-option--selected:hover:not(.eds-multiselect-option--disabled){background-color:var(--eds-c-surface-selected)}.eds-multiselect__panel .eds-multiselect-option--disabled{color:var(--eds-c-foreground-subtler);cursor:not-allowed;pointer-events:none}.eds-multiselect__panel-footer{display:flex;justify-content:space-between;align-items:center;gap:var(--eds-sp-xs);padding:var(--eds-sp-xs) var(--eds-sp-s);border-top:var(--eds-bw-xs) solid var(--eds-c-border-divider)}\n"] }]
|
|
549
|
+
}], ctorParameters: () => [], propDecorators: { e2eAttr: [{ type: i0.Input, args: [{ isSignal: true, alias: "e2eAttr", required: false }] }], placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], isInvalid: [{ type: i0.Input, args: [{ isSignal: true, alias: "isInvalid", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "ariaLabel", required: false }] }], cancelLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "cancelLabel", required: false }] }], confirmLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "confirmLabel", required: false }] }], valueChange: [{ type: i0.Output, args: ["valueChange"] }], confirmed: [{ type: i0.Output, args: ["confirmed"] }], cancelled: [{ type: i0.Output, args: ["cancelled"] }], options: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => EdsMultiselectOption), { isSignal: true }] }], dropdownTemplate: [{ type: i0.ViewChild, args: ['dropdownTemplate', { isSignal: true }] }], triggerRef: [{ type: i0.ViewChild, args: ['triggerRef', { isSignal: true }] }] } });
|
|
504
550
|
|
|
505
551
|
/** Convenience array for importing all eds-multiselect components. */
|
|
506
552
|
const EDS_MULTISELECT = [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-eds-eds-multiselect.mjs","sources":["../../eds-multiselect/eds-multiselect-option.ts","../../eds-multiselect/eds-multiselect.ts","../../eds-multiselect/eds-multiselect.html","../../eds-multiselect/index.ts","../../eds-multiselect/eui-eds-eds-multiselect.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n input,\n signal,\n computed,\n booleanAttribute,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { Highlightable } from '@angular/cdk/a11y';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\n\n/**\n * @description\n * An individual option within the EDS Multiselect dropdown.\n * Supports selection state, disabled state, and keyboard navigation via CDK ActiveDescendantKeyManager.\n *\n * @usageNotes\n * ```html\n * <eds-multiselect-option value=\"opt1\" label=\"Option 1\" />\n * ```\n */\n@Component({\n selector: 'eds-multiselect-option',\n template: `\n <span class=\"eds-multiselect-option__label\">{{ label() }}</span>\n <eds-icon\n class=\"eds-multiselect-option__check\"\n [icon]=\"'check'\"\n aria-hidden=\"true\"\n />\n `,\n styleUrl: './eds-multiselect-option.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [...EDS_ICON],\n host: {\n class: 'eds-multiselect-option',\n '[attr.selected]': 'selected() || null',\n '[attr.active]': 'isActive() || null',\n '[attr.disabled]': 'isDisabled() || null',\n role: 'option',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.data-e2e]': '\"eds-multiselect-option\"',\n '[id]': 'optionId()',\n '(click)': 'onSelect()',\n },\n})\nexport class EdsMultiselectOption implements Highlightable {\n /**\n * The value associated with this option.\n */\n value = input.required<string>();\n\n /**\n * The display label for this option.\n */\n label = input.required<string>();\n\n /**\n * Whether this option is disabled.\n * @default false\n */\n isDisabled = input(false, { transform: booleanAttribute });\n\n /**\n * Required by Highlightable interface — reads the signal value.\n */\n get disabled(): boolean {\n return this.isDisabled();\n }\n\n /** Whether this option is currently selected. */\n selected = signal(false);\n\n /** Whether this option is the active descendant (highlighted via keyboard). */\n isActive = signal(false);\n\n /** Unique ID for the option element (used for aria-activedescendant). */\n optionId = computed(() => `eds-multiselect-option-${this.value()}`);\n\n readonly elementRef = inject(ElementRef);\n\n // --- Highlightable interface ---\n\n setActiveStyles(): void {\n this.isActive.set(true);\n }\n\n setInactiveStyles(): void {\n this.isActive.set(false);\n }\n\n // --- Interaction ---\n\n onSelect(): void {\n if (!this.isDisabled()) {\n this.selected.set(!this.selected());\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n signal,\n computed,\n contentChildren,\n viewChild,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n inject,\n booleanAttribute,\n effect,\n OnDestroy,\n AfterContentInit,\n DestroyRef,\n} from '@angular/core';\n/* eslint-disable @typescript-eslint/member-ordering */\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Overlay,\n OverlayRef,\n OverlayModule,\n FlexibleConnectedPositionStrategy,\n ConnectionPositionPair,\n} from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\n\nimport { EdsMultiselectOption } from './eds-multiselect-option';\n\n/**\n * @description\n * EDS Multiselect component — a combobox-style dropdown that allows multiple selections.\n * Implements the WAI-ARIA multiselect listbox pattern with full keyboard navigation.\n * Styled to match eds-input-text default/hover/focus/disabled states.\n *\n * Integrates with Angular Reactive Forms and Template-driven Forms via ControlValueAccessor.\n *\n * @usageNotes\n * ### Basic usage\n * ```html\n * <eds-multiselect placeholder=\"Select labels\" [(value)]=\"selectedLabels\">\n * <eds-multiselect-option value=\"important\" label=\"Important\" />\n * <eds-multiselect-option value=\"starred\" label=\"Starred\" />\n * <eds-multiselect-option value=\"work\" label=\"Work\" />\n * </eds-multiselect>\n * ```\n *\n * ### With Reactive Forms\n * ```html\n * <eds-multiselect placeholder=\"Select options\" [formControl]=\"myControl\">\n * <eds-multiselect-option value=\"a\" label=\"Option A\" />\n * <eds-multiselect-option value=\"b\" label=\"Option B\" />\n * </eds-multiselect>\n * ```\n *\n * ### Accessibility\n * - Implements ARIA combobox pattern with `role=\"combobox\"` on the trigger\n * - Listbox popup uses `role=\"listbox\"` with `aria-multiselectable=\"true\"`\n * - Arrow keys navigate options, Space toggles selection, Escape closes\n * - Active descendant pattern for screen reader announcements\n */\n@Component({\n selector: 'eds-multiselect',\n templateUrl: './eds-multiselect.html',\n styleUrl: './eds-multiselect.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [OverlayModule, A11yModule, ...EDS_ICON],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: EdsMultiselect,\n multi: true,\n },\n ],\n host: {\n class: 'eds-multiselect',\n '[attr.disabled]': 'internalDisabled() || null',\n '[attr.invalid]': 'internalInvalid() || null',\n '[attr.open]': 'isOpen() || null',\n '[attr.data-e2e]': 'e2eAttr()',\n },\n})\nexport class EdsMultiselect implements ControlValueAccessor, OnDestroy, AfterContentInit {\n /**\n * Data attribute value for end-to-end testing identification.\n * @default 'eds-multiselect'\n */\n e2eAttr = input('eds-multiselect');\n\n /**\n * Placeholder text displayed when no options are selected.\n * @default 'Select options'\n */\n placeholder = input('Select options');\n\n /**\n * Controls whether the multiselect is disabled.\n * @default false\n */\n disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Controls whether the multiselect shows an invalid/error state.\n * @default false\n */\n isInvalid = input(false, { transform: booleanAttribute });\n\n /**\n * Aria-label for the combobox trigger.\n * @default 'Select options'\n */\n ariaLabel = input('Select options');\n\n /**\n * Emits the current selection whenever it changes.\n */\n valueChange = output<string[]>();\n\n /** The projected option components. */\n readonly options = contentChildren(EdsMultiselectOption);\n\n /** Reference to the dropdown template for the overlay. */\n readonly dropdownTemplate = viewChild<TemplateRef<unknown>>('dropdownTemplate');\n\n /** Reference to the trigger element. */\n readonly triggerRef = viewChild<ElementRef<HTMLElement>>('triggerRef');\n\n /** Whether the dropdown popup is open. */\n isOpen = signal(false);\n\n /** Internal selected values. */\n protected internalValue = signal<string[]>([]);\n\n /** Internal disabled state (supports CVA setDisabledState). */\n protected internalDisabled = signal(false);\n\n /** Internal invalid state. */\n protected internalInvalid = signal(false);\n\n /** The display value shown in the trigger. */\n protected displayValue = computed(() => {\n const selected = this.internalValue();\n if (selected.length === 0) {\n return this.placeholder();\n }\n const opts = this.options();\n const firstLabel = opts.find(o => o.value() === selected[0])?.label() ?? selected[0];\n if (selected.length === 1) {\n return firstLabel;\n }\n return `${firstLabel} + ${selected.length - 1} more`;\n });\n\n /** Whether the placeholder is shown (no selection). */\n protected isPlaceholderShown = computed(() => this.internalValue().length === 0);\n\n /** The active descendant ID for screen readers. */\n protected activeDescendantId = signal<string | null>(null);\n\n private overlay = inject(Overlay);\n private viewContainerRef = inject(ViewContainerRef);\n private destroyRef = inject(DestroyRef);\n private overlayRef: OverlayRef | null = null;\n private templatePortal: TemplatePortal | null = null;\n private keyManager: ActiveDescendantKeyManager<EdsMultiselectOption> | null = null;\n\n constructor() {\n // Sync disabled input → internal state\n effect(() => {\n this.internalDisabled.set(this.disabled());\n });\n\n // Sync isInvalid input → internal state\n effect(() => {\n this.internalInvalid.set(this.isInvalid());\n });\n }\n\n private _onChange: (value: string[]) => void = () => { /* noop */ };\n private _onTouched: () => void = () => { /* noop */ };\n\n ngAfterContentInit(): void {\n // Sync option selected states from internalValue whenever options change\n this.syncOptionsFromValue();\n }\n\n ngOnDestroy(): void {\n this.closeDropdown();\n this.overlayRef?.dispose();\n this.overlayRef = null;\n }\n\n // --- ControlValueAccessor ---\n\n writeValue(value: string[]): void {\n this.internalValue.set(value ?? []);\n this.syncOptionsFromValue();\n }\n\n registerOnChange(fn: (value: string[]) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.internalDisabled.set(isDisabled);\n }\n\n // --- Trigger interactions ---\n\n protected onTriggerClick(): void {\n if (this.internalDisabled()) {\n return;\n }\n if (this.isOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.internalDisabled()) {\n return;\n }\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'Escape':\n event.preventDefault();\n if (this.isOpen()) {\n this.closeDropdown();\n }\n break;\n }\n }\n\n protected onOptionClick(option: EdsMultiselectOption): void {\n if (option.isDisabled()) {\n return;\n }\n option.onSelect();\n this.syncValueFromOptions();\n this.keyManager?.setActiveItem(option);\n this.updateActiveDescendant();\n }\n\n protected onDoneClick(): void {\n this.closeDropdown();\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.keyManager?.setNextItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.keyManager?.setPreviousItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'Home':\n event.preventDefault();\n this.keyManager?.setFirstItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'End':\n event.preventDefault();\n this.keyManager?.setLastItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.toggleActiveOption();\n break;\n case 'Escape':\n event.preventDefault();\n this.closeDropdown();\n break;\n default:\n // Type-ahead: single printable character moves focus to next matching option\n if (event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.handleTypeAhead(event.key);\n }\n break;\n }\n }\n\n // --- Dropdown management (private) ---\n\n private openDropdown(): void {\n if (this.isOpen() || !this.dropdownTemplate()) {\n return;\n }\n\n const triggerEl = this.triggerRef()?.nativeElement;\n if (!triggerEl) {\n return;\n }\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(triggerEl)\n .withPositions([\n new ConnectionPositionPair(\n { originX: 'start', originY: 'bottom' },\n { overlayX: 'start', overlayY: 'top' },\n ),\n new ConnectionPositionPair(\n { originX: 'start', originY: 'top' },\n { overlayX: 'start', overlayY: 'bottom' },\n ),\n ])\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const scrollStrategy = this.overlay.scrollStrategies.reposition();\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n width: triggerEl.offsetWidth,\n disposeOnNavigation: true,\n });\n\n this.templatePortal = new TemplatePortal(this.dropdownTemplate(), this.viewContainerRef);\n this.overlayRef.attach(this.templatePortal);\n\n // Focus the panel wrapper so keyboard events are captured\n const panelEl = this.overlayRef.overlayElement.querySelector<HTMLElement>('.eds-multiselect__panel-wrapper');\n panelEl?.focus();\n\n this.overlayRef.backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.closeDropdown());\n\n this.overlayRef.keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeDropdown();\n }\n });\n\n // Setup key manager\n const opts = this.options();\n if (opts.length > 0) {\n // Reset all active states from previous opening\n opts.forEach(o => o.setInactiveStyles());\n\n this.keyManager = new ActiveDescendantKeyManager(opts as unknown as EdsMultiselectOption[])\n .withVerticalOrientation(true)\n .withHomeAndEnd(true)\n .withWrap();\n\n // APG: If options are selected, focus first selected option; otherwise first option\n const firstSelectedIndex = opts.findIndex(o => o.selected());\n if (firstSelectedIndex >= 0) {\n this.keyManager.setActiveItem(firstSelectedIndex);\n } else {\n this.keyManager.setFirstItemActive();\n }\n this.updateActiveDescendant();\n }\n\n this.isOpen.set(true);\n }\n\n private closeDropdown(): void {\n if (!this.isOpen()) {\n return;\n }\n // Clear active styles on all options\n this.options().forEach(o => o.setInactiveStyles());\n\n this.overlayRef?.detach();\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.templatePortal = null;\n this.keyManager = null;\n this.activeDescendantId.set(null);\n this.isOpen.set(false);\n this._onTouched();\n this.triggerRef()?.nativeElement?.focus();\n }\n\n private toggleActiveOption(): void {\n const active = this.keyManager?.activeItem;\n if (active && !active.isDisabled()) {\n active.onSelect();\n this.syncValueFromOptions();\n }\n }\n\n private handleTypeAhead(char: string): void {\n const opts = this.options();\n const activeIndex = this.keyManager?.activeItemIndex ?? 0;\n const lowerChar = char.toLowerCase();\n\n // Search from after the active item, then wrap around\n for (let i = 1; i <= opts.length; i++) {\n const index = (activeIndex + i) % opts.length;\n const option = opts[index];\n if (!option.isDisabled() && option.label().toLowerCase().startsWith(lowerChar)) {\n this.keyManager?.setActiveItem(index);\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n }\n }\n }\n\n private scrollActiveOptionIntoView(): void {\n const activeId = this.activeDescendantId();\n if (!activeId || !this.overlayRef) {\n return;\n }\n const activeEl = this.overlayRef.overlayElement.querySelector<HTMLElement>(`#${activeId}`);\n if (activeEl && typeof activeEl.scrollIntoView === 'function') {\n activeEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private updateActiveDescendant(): void {\n const active = this.keyManager?.activeItem;\n this.activeDescendantId.set(active ? active.optionId() : null);\n }\n\n private syncValueFromOptions(): void {\n const selectedValues = this.options()\n .filter(o => o.selected())\n .map(o => o.value());\n this.internalValue.set(selectedValues);\n this._onChange(selectedValues);\n this.valueChange.emit(selectedValues);\n }\n\n private syncOptionsFromValue(): void {\n const currentValue = this.internalValue();\n this.options().forEach(option => {\n option.selected.set(currentValue.includes(option.value()));\n });\n }\n}\n","<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n <div\n class=\"eds-multiselect-option\"\n [class.eds-multiselect-option--selected]=\"option.selected()\"\n [class.eds-multiselect-option--active]=\"option.isActive()\"\n [class.eds-multiselect-option--disabled]=\"option.isDisabled()\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"option.selected()\"\n [attr.aria-disabled]=\"option.isDisabled() || null\"\n [id]=\"option.optionId()\"\n (click)=\"onOptionClick(option)\"\n >\n <eds-icon\n class=\"eds-multiselect-option__check\"\n [icon]=\"'check'\"\n edsSizeS\n aria-hidden=\"true\"\n />\n <span class=\"eds-multiselect-option__label\">{{ option.label() }}</span>\n </div>\n }\n </div>\n <div class=\"eds-multiselect__panel-footer\">\n <button\n type=\"button\"\n class=\"eds-multiselect__done-button\"\n (click)=\"onDoneClick()\"\n >\n Done\n </button>\n </div>\n </div>\n</ng-template>\n","import { EdsMultiselect } from './eds-multiselect';\nimport { EdsMultiselectOption } from './eds-multiselect-option';\n\nexport {\n EdsMultiselect,\n EdsMultiselectOption,\n};\n\n/** Convenience array for importing all eds-multiselect components. */\nexport const EDS_MULTISELECT = [\n EdsMultiselect,\n EdsMultiselectOption,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-eds-eds-multiselect.mjs","sources":["../../eds-multiselect/eds-multiselect-option.ts","../../eds-multiselect/eds-multiselect.ts","../../eds-multiselect/eds-multiselect.html","../../eds-multiselect/index.ts","../../eds-multiselect/eui-eds-eds-multiselect.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n input,\n signal,\n computed,\n booleanAttribute,\n ElementRef,\n inject,\n} from '@angular/core';\nimport { Highlightable } from '@angular/cdk/a11y';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\n\n/**\n * @description\n * An individual option within the EDS Multiselect dropdown.\n * Supports selection state, disabled state, and keyboard navigation via CDK ActiveDescendantKeyManager.\n *\n * @usageNotes\n * ```html\n * <eds-multiselect-option value=\"opt1\" label=\"Option 1\" />\n * ```\n */\n@Component({\n selector: 'eds-multiselect-option',\n template: `\n <span class=\"eds-multiselect-option__label\">{{ label() }}</span>\n <eds-icon\n class=\"eds-multiselect-option__check\"\n [icon]=\"'check'\"\n aria-hidden=\"true\"\n />\n `,\n styleUrl: './eds-multiselect-option.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [...EDS_ICON],\n host: {\n class: 'eds-multiselect-option',\n '[attr.selected]': 'selected() || null',\n '[attr.active]': 'isActive() || null',\n '[attr.disabled]': 'isDisabled() || null',\n role: 'option',\n '[attr.aria-selected]': 'selected()',\n '[attr.aria-disabled]': 'isDisabled() || null',\n '[attr.data-e2e]': '\"eds-multiselect-option\"',\n '[id]': 'optionId()',\n '(click)': 'onSelect()',\n },\n})\nexport class EdsMultiselectOption implements Highlightable {\n /**\n * The value associated with this option.\n */\n value = input.required<string>();\n\n /**\n * The display label for this option.\n */\n label = input.required<string>();\n\n /**\n * Whether this option is disabled.\n * @default false\n */\n isDisabled = input(false, { transform: booleanAttribute });\n\n /**\n * Whether this entry is a non-selectable group header.\n * When true the entry renders as plain label text, is skipped by keyboard\n * navigation, and cannot be selected.\n * @default false\n */\n isGroup = input(false, { transform: booleanAttribute });\n\n /**\n * Required by Highlightable interface — reads the signal value.\n * Group headers are treated as \"disabled\" so the key manager skips them.\n */\n get disabled(): boolean {\n return this.isDisabled() || this.isGroup();\n }\n\n /** Whether this option is currently selected. */\n selected = signal(false);\n\n /** Whether this option is the active descendant (highlighted via keyboard). */\n isActive = signal(false);\n\n /** Unique ID for the option element (used for aria-activedescendant). */\n optionId = computed(() => `eds-multiselect-option-${this.value()}`);\n\n readonly elementRef = inject(ElementRef);\n\n // --- Highlightable interface ---\n\n setActiveStyles(): void {\n this.isActive.set(true);\n }\n\n setInactiveStyles(): void {\n this.isActive.set(false);\n }\n\n // --- Interaction ---\n\n onSelect(): void {\n if (!this.isDisabled() && !this.isGroup()) {\n this.selected.set(!this.selected());\n }\n }\n}\n","import {\n Component,\n ChangeDetectionStrategy,\n input,\n output,\n signal,\n computed,\n contentChildren,\n viewChild,\n ElementRef,\n TemplateRef,\n ViewContainerRef,\n inject,\n booleanAttribute,\n effect,\n OnDestroy,\n AfterContentInit,\n DestroyRef,\n} from '@angular/core';\n/* eslint-disable @typescript-eslint/member-ordering */\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Overlay,\n OverlayRef,\n OverlayModule,\n FlexibleConnectedPositionStrategy,\n ConnectionPositionPair,\n} from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { ActiveDescendantKeyManager } from '@angular/cdk/a11y';\nimport { A11yModule } from '@angular/cdk/a11y';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { EDS_ICON } from '@eui/eds/eds-icon';\nimport { EDS_INPUT_CHECKBOX } from '@eui/eds/eds-input-checkbox';\nimport { EDS_BUTTON } from '@eui/eds/eds-button';\n\nimport { EdsMultiselectOption } from './eds-multiselect-option';\n\n/**\n * @description\n * EDS Multiselect component — a combobox-style dropdown that allows multiple selections.\n * Implements the WAI-ARIA multiselect listbox pattern with full keyboard navigation.\n * Styled to match eds-input-text default/hover/focus/disabled states.\n *\n * Integrates with Angular Reactive Forms and Template-driven Forms via ControlValueAccessor.\n *\n * @usageNotes\n * ### Basic usage\n * ```html\n * <eds-multiselect placeholder=\"Select labels\" [(value)]=\"selectedLabels\">\n * <eds-multiselect-option value=\"important\" label=\"Important\" />\n * <eds-multiselect-option value=\"starred\" label=\"Starred\" />\n * <eds-multiselect-option value=\"work\" label=\"Work\" />\n * </eds-multiselect>\n * ```\n *\n * ### With Reactive Forms\n * ```html\n * <eds-multiselect placeholder=\"Select options\" [formControl]=\"myControl\">\n * <eds-multiselect-option value=\"a\" label=\"Option A\" />\n * <eds-multiselect-option value=\"b\" label=\"Option B\" />\n * </eds-multiselect>\n * ```\n *\n * ### Accessibility\n * - Implements ARIA combobox pattern with `role=\"combobox\"` on the trigger\n * - Listbox popup uses `role=\"listbox\"` with `aria-multiselectable=\"true\"`\n * - Arrow keys navigate options, Space toggles selection, Escape closes\n * - Active descendant pattern for screen reader announcements\n */\n@Component({\n selector: 'eds-multiselect',\n templateUrl: './eds-multiselect.html',\n styleUrl: './eds-multiselect.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [OverlayModule, A11yModule, ...EDS_ICON, ...EDS_INPUT_CHECKBOX, ...EDS_BUTTON],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: EdsMultiselect,\n multi: true,\n },\n ],\n host: {\n class: 'eds-multiselect',\n '[attr.disabled]': 'internalDisabled() || null',\n '[attr.invalid]': 'internalInvalid() || null',\n '[attr.open]': 'isOpen() || null',\n '[attr.data-e2e]': 'e2eAttr()',\n },\n})\nexport class EdsMultiselect implements ControlValueAccessor, OnDestroy, AfterContentInit {\n /**\n * Data attribute value for end-to-end testing identification.\n * @default 'eds-multiselect'\n */\n e2eAttr = input('eds-multiselect');\n\n /**\n * Placeholder text displayed when no options are selected.\n * @default 'Select options'\n */\n placeholder = input('Select options');\n\n /**\n * Controls whether the multiselect is disabled.\n * @default false\n */\n disabled = input(false, { transform: booleanAttribute });\n\n /**\n * Controls whether the multiselect shows an invalid/error state.\n * @default false\n */\n isInvalid = input(false, { transform: booleanAttribute });\n\n /**\n * Aria-label for the combobox trigger.\n * @default 'Select options'\n */\n ariaLabel = input('Select options');\n\n /**\n * Label for the panel-footer \"Cancel\" button.\n * @default 'Cancel'\n */\n cancelLabel = input('Cancel');\n\n /**\n * Label for the panel-footer \"Confirm choice\" button.\n * @default 'Confirm choice'\n */\n confirmLabel = input('Confirm choice');\n\n /**\n * Emits the current selection whenever it changes.\n */\n valueChange = output<string[]>();\n\n /**\n * Emits the confirmed selection when the \"Confirm choice\" button is clicked.\n */\n confirmed = output<string[]>();\n\n /**\n * Emits when the \"Cancel\" button is clicked (selection reverted to its pre-open state).\n */\n cancelled = output<void>();\n\n /** The projected option components. */\n readonly options = contentChildren(EdsMultiselectOption);\n\n /** Reference to the dropdown template for the overlay. */\n readonly dropdownTemplate = viewChild<TemplateRef<unknown>>('dropdownTemplate');\n\n /** Reference to the trigger element. */\n readonly triggerRef = viewChild<ElementRef<HTMLElement>>('triggerRef');\n\n /** Whether the dropdown popup is open. */\n isOpen = signal(false);\n\n /** Internal selected values. */\n protected internalValue = signal<string[]>([]);\n\n /** Snapshot of the selection taken when the dropdown opens, used to revert on Cancel. */\n private valueSnapshot: string[] = [];\n\n /** Internal disabled state (supports CVA setDisabledState). */\n protected internalDisabled = signal(false);\n\n /** Internal invalid state. */\n protected internalInvalid = signal(false);\n\n /** The display value shown in the trigger. */\n protected displayValue = computed(() => {\n const selected = this.internalValue();\n if (selected.length === 0) {\n return this.placeholder();\n }\n const opts = this.options();\n const firstLabel = opts.find(o => o.value() === selected[0])?.label() ?? selected[0];\n if (selected.length === 1) {\n return firstLabel;\n }\n return `${firstLabel} + ${selected.length - 1} more`;\n });\n\n /** Whether the placeholder is shown (no selection). */\n protected isPlaceholderShown = computed(() => this.internalValue().length === 0);\n\n /** The active descendant ID for screen readers. */\n protected activeDescendantId = signal<string | null>(null);\n\n private overlay = inject(Overlay);\n private viewContainerRef = inject(ViewContainerRef);\n private destroyRef = inject(DestroyRef);\n private overlayRef: OverlayRef | null = null;\n private templatePortal: TemplatePortal | null = null;\n private keyManager: ActiveDescendantKeyManager<EdsMultiselectOption> | null = null;\n\n constructor() {\n // Sync disabled input → internal state\n effect(() => {\n this.internalDisabled.set(this.disabled());\n });\n\n // Sync isInvalid input → internal state\n effect(() => {\n this.internalInvalid.set(this.isInvalid());\n });\n }\n\n private _onChange: (value: string[]) => void = () => { /* noop */ };\n private _onTouched: () => void = () => { /* noop */ };\n\n ngAfterContentInit(): void {\n // Sync option selected states from internalValue whenever options change\n this.syncOptionsFromValue();\n }\n\n ngOnDestroy(): void {\n this.closeDropdown();\n this.overlayRef?.dispose();\n this.overlayRef = null;\n }\n\n // --- ControlValueAccessor ---\n\n writeValue(value: string[]): void {\n this.internalValue.set(value ?? []);\n this.syncOptionsFromValue();\n }\n\n registerOnChange(fn: (value: string[]) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.internalDisabled.set(isDisabled);\n }\n\n // --- Trigger interactions ---\n\n protected onTriggerClick(): void {\n if (this.internalDisabled()) {\n return;\n }\n if (this.isOpen()) {\n this.closeDropdown();\n } else {\n this.openDropdown();\n }\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.internalDisabled()) {\n return;\n }\n\n switch (event.key) {\n case 'Enter':\n case ' ':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'ArrowDown':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'ArrowUp':\n event.preventDefault();\n if (!this.isOpen()) {\n this.openDropdown();\n }\n break;\n case 'Escape':\n event.preventDefault();\n if (this.isOpen()) {\n this.closeDropdown();\n }\n break;\n }\n }\n\n protected onOptionClick(option: EdsMultiselectOption): void {\n if (option.isDisabled() || option.isGroup()) {\n return;\n }\n option.onSelect();\n this.syncValueFromOptions();\n this.keyManager?.setActiveItem(option);\n this.updateActiveDescendant();\n }\n\n protected onConfirmClick(): void {\n this.confirmed.emit(this.internalValue());\n this.closeDropdown();\n }\n\n protected onCancelClick(): void {\n // Revert selection to the snapshot taken when the dropdown opened.\n this.internalValue.set([...this.valueSnapshot]);\n this.syncOptionsFromValue();\n this._onChange(this.valueSnapshot);\n this.valueChange.emit(this.valueSnapshot);\n this.cancelled.emit();\n this.closeDropdown();\n }\n\n protected onPanelKeydown(event: KeyboardEvent): void {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n this.keyManager?.setNextItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.keyManager?.setPreviousItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'Home':\n event.preventDefault();\n this.keyManager?.setFirstItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'End':\n event.preventDefault();\n this.keyManager?.setLastItemActive();\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n case 'Enter':\n case ' ':\n event.preventDefault();\n this.toggleActiveOption();\n break;\n case 'Escape':\n event.preventDefault();\n this.closeDropdown();\n break;\n default:\n // Type-ahead: single printable character moves focus to next matching option\n if (event.key.length === 1 && !event.ctrlKey && !event.altKey && !event.metaKey) {\n this.handleTypeAhead(event.key);\n }\n break;\n }\n }\n\n // --- Dropdown management (private) ---\n\n private openDropdown(): void {\n if (this.isOpen() || !this.dropdownTemplate()) {\n return;\n }\n\n const triggerEl = this.triggerRef()?.nativeElement;\n if (!triggerEl) {\n return;\n }\n\n // Snapshot current selection so Cancel can revert to it.\n this.valueSnapshot = [...this.internalValue()];\n\n const positionStrategy = this.overlay\n .position()\n .flexibleConnectedTo(triggerEl)\n .withPositions([\n new ConnectionPositionPair(\n { originX: 'start', originY: 'bottom' },\n { overlayX: 'start', overlayY: 'top' },\n ),\n new ConnectionPositionPair(\n { originX: 'start', originY: 'top' },\n { overlayX: 'start', overlayY: 'bottom' },\n ),\n ])\n .withFlexibleDimensions(false)\n .withPush(true);\n\n const scrollStrategy = this.overlay.scrollStrategies.reposition();\n\n this.overlayRef = this.overlay.create({\n positionStrategy,\n scrollStrategy,\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n width: triggerEl.offsetWidth,\n disposeOnNavigation: true,\n });\n\n this.templatePortal = new TemplatePortal(this.dropdownTemplate(), this.viewContainerRef);\n this.overlayRef.attach(this.templatePortal);\n\n // Focus the panel wrapper so keyboard events are captured\n const panelEl = this.overlayRef.overlayElement.querySelector<HTMLElement>('.eds-multiselect__panel-wrapper');\n panelEl?.focus();\n\n this.overlayRef.backdropClick()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(() => this.closeDropdown());\n\n this.overlayRef.keydownEvents()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeDropdown();\n }\n });\n\n // Setup key manager\n const opts = this.options();\n if (opts.length > 0) {\n // Reset all active states from previous opening\n opts.forEach(o => o.setInactiveStyles());\n\n this.keyManager = new ActiveDescendantKeyManager(opts as unknown as EdsMultiselectOption[])\n .withVerticalOrientation(true)\n .withHomeAndEnd(true)\n .withWrap();\n\n // APG: If options are selected, focus first selected option; otherwise first option\n const firstSelectedIndex = opts.findIndex(o => o.selected());\n if (firstSelectedIndex >= 0) {\n this.keyManager.setActiveItem(firstSelectedIndex);\n } else {\n this.keyManager.setFirstItemActive();\n }\n this.updateActiveDescendant();\n }\n\n this.isOpen.set(true);\n }\n\n private closeDropdown(): void {\n if (!this.isOpen()) {\n return;\n }\n // Clear active styles on all options\n this.options().forEach(o => o.setInactiveStyles());\n\n this.overlayRef?.detach();\n this.overlayRef?.dispose();\n this.overlayRef = null;\n this.templatePortal = null;\n this.keyManager = null;\n this.activeDescendantId.set(null);\n this.isOpen.set(false);\n this._onTouched();\n this.triggerRef()?.nativeElement?.focus();\n }\n\n private toggleActiveOption(): void {\n const active = this.keyManager?.activeItem;\n if (active && !active.isDisabled()) {\n active.onSelect();\n this.syncValueFromOptions();\n }\n }\n\n private handleTypeAhead(char: string): void {\n const opts = this.options();\n const activeIndex = this.keyManager?.activeItemIndex ?? 0;\n const lowerChar = char.toLowerCase();\n\n // Search from after the active item, then wrap around\n for (let i = 1; i <= opts.length; i++) {\n const index = (activeIndex + i) % opts.length;\n const option = opts[index];\n if (!option.isDisabled() && option.label().toLowerCase().startsWith(lowerChar)) {\n this.keyManager?.setActiveItem(index);\n this.updateActiveDescendant();\n this.scrollActiveOptionIntoView();\n break;\n }\n }\n }\n\n private scrollActiveOptionIntoView(): void {\n const activeId = this.activeDescendantId();\n if (!activeId || !this.overlayRef) {\n return;\n }\n const activeEl = this.overlayRef.overlayElement.querySelector<HTMLElement>(`#${activeId}`);\n if (activeEl && typeof activeEl.scrollIntoView === 'function') {\n activeEl.scrollIntoView({ block: 'nearest' });\n }\n }\n\n private updateActiveDescendant(): void {\n const active = this.keyManager?.activeItem;\n this.activeDescendantId.set(active ? active.optionId() : null);\n }\n\n private syncValueFromOptions(): void {\n const selectedValues = this.options()\n .filter(o => o.selected() && !o.isGroup())\n .map(o => o.value());\n this.internalValue.set(selectedValues);\n this._onChange(selectedValues);\n this.valueChange.emit(selectedValues);\n }\n\n private syncOptionsFromValue(): void {\n const currentValue = this.internalValue();\n this.options().forEach(option => {\n option.selected.set(!option.isGroup() && currentValue.includes(option.value()));\n });\n }\n}\n","<!-- Combobox trigger -->\n<div\n #triggerRef\n class=\"eds-multiselect__trigger\"\n role=\"combobox\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-controls]=\"isOpen() ? 'eds-multiselect-listbox' : null\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n [attr.aria-disabled]=\"internalDisabled() || null\"\n [attr.tabindex]=\"internalDisabled() ? -1 : 0\"\n (click)=\"onTriggerClick()\"\n (keydown)=\"onTriggerKeydown($event)\"\n>\n <span\n class=\"eds-multiselect__display\"\n [class.eds-multiselect__display--placeholder]=\"isPlaceholderShown()\"\n >\n {{ displayValue() }}\n </span>\n <eds-icon\n class=\"eds-multiselect__caret\"\n [icon]=\"'caret-down'\"\n aria-hidden=\"true\"\n />\n</div>\n\n<!-- Dropdown panel (rendered in overlay) -->\n<ng-template #dropdownTemplate>\n <div class=\"eds-multiselect__panel-wrapper\" tabindex=\"-1\" cdkTrapFocus [cdkTrapFocusAutoCapture]=\"true\">\n <div\n class=\"eds-multiselect__panel\"\n id=\"eds-multiselect-listbox\"\n role=\"listbox\"\n aria-multiselectable=\"true\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-activedescendant]=\"activeDescendantId()\"\n tabindex=\"0\"\n (keydown)=\"onPanelKeydown($event)\"\n >\n @for (option of options(); track option.value()) {\n @if (option.isGroup()) {\n <div\n class=\"eds-multiselect-group\"\n role=\"presentation\"\n [id]=\"option.optionId()\"\n >\n {{ option.label() }}\n </div>\n } @else {\n <div\n class=\"eds-multiselect-option\"\n [class.eds-multiselect-option--selected]=\"option.selected()\"\n [class.eds-multiselect-option--active]=\"option.isActive()\"\n [class.eds-multiselect-option--disabled]=\"option.isDisabled()\"\n [attr.role]=\"'option'\"\n [attr.aria-selected]=\"option.selected()\"\n [attr.aria-disabled]=\"option.isDisabled() || null\"\n [id]=\"option.optionId()\"\n (click)=\"onOptionClick(option)\"\n >\n <input\n class=\"eds-multiselect-option__checkbox\"\n edsInputCheckbox\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [checked]=\"option.selected()\"\n [disabled]=\"option.isDisabled()\"\n />\n <span class=\"eds-multiselect-option__label\">{{ option.label() }}</span>\n </div>\n }\n }\n </div>\n <div class=\"eds-multiselect__panel-footer\">\n <button\n edsButton\n type=\"button\"\n variant=\"tertiary\"\n size=\"s\"\n (click)=\"onCancelClick()\"\n >\n {{ cancelLabel() }}\n </button>\n <button\n edsButton\n type=\"button\"\n variant=\"secondary\"\n size=\"s\"\n (click)=\"onConfirmClick()\"\n >\n {{ confirmLabel() }}\n </button>\n </div>\n </div>\n</ng-template>\n","import { EdsMultiselect } from './eds-multiselect';\nimport { EdsMultiselectOption } from './eds-multiselect-option';\n\nexport {\n EdsMultiselect,\n EdsMultiselectOption,\n};\n\n/** Convenience array for importing all eds-multiselect components. */\nexport const EDS_MULTISELECT = [\n EdsMultiselect,\n EdsMultiselectOption,\n] as const;\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2"],"mappings":"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"}
|
|
@@ -562,15 +562,11 @@ class EdsMaxlengthDirective {
|
|
|
562
562
|
this._renderer.setProperty(input, 'maxLength', this._calculateMaxLength());
|
|
563
563
|
if (this._maxLengthSpan) {
|
|
564
564
|
if (remaining <= 0) {
|
|
565
|
-
this._maxLengthSpan.style.backgroundColor = 'var(--eds-c-surface-warning)';
|
|
566
|
-
this._maxLengthSpan.style.borderColor = 'var(--eds-c-border-warning)';
|
|
567
565
|
this._maxLengthSpan.style.color = 'var(--eds-c-foreground-critical)';
|
|
568
566
|
this.maxLengthReached.emit(true);
|
|
569
567
|
}
|
|
570
568
|
else {
|
|
571
|
-
this._maxLengthSpan.style.
|
|
572
|
-
this._maxLengthSpan.style.borderColor = 'var(--eds-c-border-neutral)';
|
|
573
|
-
this._maxLengthSpan.style.color = 'var(--eds-c-foreground)';
|
|
569
|
+
this._maxLengthSpan.style.color = 'var(--eds-c-foreground-subtler)';
|
|
574
570
|
this.maxLengthReached.emit(false);
|
|
575
571
|
}
|
|
576
572
|
if (remaining < 0) {
|
|
@@ -580,10 +576,11 @@ class EdsMaxlengthDirective {
|
|
|
580
576
|
else {
|
|
581
577
|
input.value = input.value.substring(0, this._calculateMaxLength());
|
|
582
578
|
}
|
|
583
|
-
this._renderer.setProperty(this._maxLengthSpan, 'textContent',
|
|
579
|
+
this._renderer.setProperty(this._maxLengthSpan, 'textContent', `${maxLen} / ${maxLen}`);
|
|
584
580
|
}
|
|
585
581
|
else {
|
|
586
|
-
|
|
582
|
+
// Display current character count over the maximum, e.g. "12 / 100".
|
|
583
|
+
this._renderer.setProperty(this._maxLengthSpan, 'textContent', `${valueLength} / ${maxLen}`);
|
|
587
584
|
}
|
|
588
585
|
}
|
|
589
586
|
}
|
|
@@ -593,20 +590,21 @@ class EdsMaxlengthDirective {
|
|
|
593
590
|
}
|
|
594
591
|
this._maxLengthSpan = this._renderer.createElement('span');
|
|
595
592
|
this._renderer.addClass(this._maxLengthSpan, 'eds-maxlength');
|
|
596
|
-
|
|
597
|
-
|
|
593
|
+
const initialLength = Math.min(this._getValueLength(), this.edsMaxlength() || 0);
|
|
594
|
+
this._renderer.setProperty(this._maxLengthSpan, 'textContent', `${initialLength} / ${this.edsMaxlength() || 0}`);
|
|
595
|
+
// Inline styles (self-contained, no global stylesheet dependency).
|
|
596
|
+
// No border, no background — only the foreground color. The counter sits
|
|
597
|
+
// above the top-right corner of the element it is attached to.
|
|
598
598
|
this._maxLengthSpan.setAttribute('style', [
|
|
599
599
|
'font: var(--eds-f-microcopy-xs)',
|
|
600
|
-
'
|
|
601
|
-
'border: 1px solid var(--eds-c-border-neutral)',
|
|
602
|
-
'border-radius: var(--eds-br-xs)',
|
|
603
|
-
'color: var(--eds-c-foreground)',
|
|
600
|
+
'color: var(--eds-c-foreground-subtler)',
|
|
604
601
|
'padding: 0 var(--eds-sp-3xs)',
|
|
605
602
|
'position: absolute',
|
|
606
|
-
'right:
|
|
607
|
-
'
|
|
603
|
+
'right: 0',
|
|
604
|
+
'bottom: 100%',
|
|
608
605
|
'z-index: 1',
|
|
609
606
|
'line-height: 1.6',
|
|
607
|
+
'pointer-events: none',
|
|
610
608
|
].join(';'));
|
|
611
609
|
const nativeElement = this._el.nativeElement;
|
|
612
610
|
const parent = nativeElement.parentNode;
|