@kirbydesign/designsystem 11.11.4 → 11.12.0-dev-cf90e46
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/README.md +7 -0
- package/fesm2022/kirbydesign-designsystem-accordion.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-accordion.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-action-group.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-avatar.mjs +10 -2
- package/fesm2022/kirbydesign-designsystem-avatar.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-badge.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-badge.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-button.mjs +3 -4
- package/fesm2022/kirbydesign-designsystem-button.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-calendar.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-calendar.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-card.mjs +41 -9
- package/fesm2022/kirbydesign-designsystem-card.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-checkbox.mjs +15 -3
- package/fesm2022/kirbydesign-designsystem-checkbox.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-divider.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-divider.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-dropdown.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-empty-state.mjs +15 -2
- package/fesm2022/kirbydesign-designsystem-empty-state.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-fab-sheet.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-flag.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-flag.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-form-field.mjs +8 -8
- package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-header.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-header.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-icon.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-icon.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-item-sliding.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-item-sliding.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-item.mjs +4 -4
- package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-list.mjs +18 -8
- package/fesm2022/kirbydesign-designsystem-list.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-loading-overlay.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-menu.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-menu.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-modal.mjs +16 -11
- package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-page.mjs +4 -4
- package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-popover.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-popover.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-progress-circle.mjs +4 -4
- package/fesm2022/kirbydesign-designsystem-progress-circle.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-radio.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-range.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-range.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-router-outlet.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-router-outlet.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-section-header.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-section-header.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-segmented-control.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-segmented-control.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-slide-button.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-slide-button.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-slide.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-slide.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-spinner.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-spinner.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs +4 -4
- package/fesm2022/kirbydesign-designsystem-tab-navigation.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-tabs.mjs +4 -4
- package/fesm2022/kirbydesign-designsystem-tabs.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-testing-base.mjs +5 -3
- package/fesm2022/kirbydesign-designsystem-testing-base.mjs.map +1 -1
- package/fesm2022/kirbydesign-designsystem-toggle.mjs +2 -2
- package/fesm2022/kirbydesign-designsystem-toggle.mjs.map +1 -1
- package/package.json +2 -2
- package/types/kirbydesign-designsystem-avatar.d.ts +5 -1
- package/types/kirbydesign-designsystem-avatar.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-button.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-card.d.ts +12 -2
- package/types/kirbydesign-designsystem-card.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-checkbox.d.ts +7 -1
- package/types/kirbydesign-designsystem-checkbox.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-empty-state.d.ts +8 -1
- package/types/kirbydesign-designsystem-empty-state.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-list.d.ts +10 -0
- package/types/kirbydesign-designsystem-list.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-modal.d.ts +2 -1
- package/types/kirbydesign-designsystem-modal.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-page.d.ts.map +1 -1
- package/types/kirbydesign-designsystem-testing-base.d.ts +10 -9
- package/types/kirbydesign-designsystem-testing-base.d.ts.map +1 -1
|
@@ -7,6 +7,18 @@ import { IonCheckbox } from '@ionic/angular/standalone';
|
|
|
7
7
|
import { inheritAriaLabelText, setAccessibleLabel } from '@kirbydesign/designsystem/shared';
|
|
8
8
|
|
|
9
9
|
class CheckboxComponent {
|
|
10
|
+
/**
|
|
11
|
+
* @deprecated Since v12.0.0, attention levels 1 and 2 now look the same, so this input no longer has any effect.
|
|
12
|
+
* This input will be removed in a future major version.
|
|
13
|
+
*/
|
|
14
|
+
set attentionLevel(value) {
|
|
15
|
+
console.warn(`[Kirby Checkbox] The 'attentionLevel' input is deprecated and no longer has any effect.
|
|
16
|
+
Attention levels 1 and 2 now look the same. This input will be removed in a future major version.`);
|
|
17
|
+
this._attentionLevel = value;
|
|
18
|
+
}
|
|
19
|
+
get attentionLevel() {
|
|
20
|
+
return this._attentionLevel;
|
|
21
|
+
}
|
|
10
22
|
get _isDisabled() {
|
|
11
23
|
return this.disabled ? 'disabled' : null;
|
|
12
24
|
}
|
|
@@ -22,7 +34,7 @@ class CheckboxComponent {
|
|
|
22
34
|
this.cdr = cdr;
|
|
23
35
|
this.checked = false;
|
|
24
36
|
this.indeterminate = false;
|
|
25
|
-
this.
|
|
37
|
+
this._attentionLevel = '2';
|
|
26
38
|
this.size = 'md';
|
|
27
39
|
this.hasError = false;
|
|
28
40
|
this.disabled = false;
|
|
@@ -118,7 +130,7 @@ class CheckboxComponent {
|
|
|
118
130
|
useExisting: forwardRef((() => CheckboxComponent)),
|
|
119
131
|
multi: true,
|
|
120
132
|
},
|
|
121
|
-
], viewQueries: [{ propertyName: "ionCheckboxElement", first: true, predicate: IonCheckbox, descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host
|
|
133
|
+
], viewQueries: [{ propertyName: "ionCheckboxElement", first: true, predicate: IonCheckbox, descendants: true, read: ElementRef, static: true }], ngImport: i0, template: "<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-checkbox::part(label-text-wrapper),:host[disabled] ion-checkbox::part(native-wrapper){opacity:var(--kirby-opacity-40)}:host:has(ion-checkbox.in-item.checkbox-justify-space-between){width:100%}:host.xs ion-checkbox:not(.in-item)::part(label){padding-block:4px}:host.sm ion-checkbox:not(.in-item)::part(label){padding-block:10px}:host.md ion-checkbox:not(.in-item)::part(label){padding-block:16px}:host.xs ion-checkbox::part(label){line-height:var(--kirby-relative-size-s);font-size:var(--kirby-font-size-s)}:host.xs ion-checkbox{--size: 16px;--border-radius: var(--kirby-spacing-xxxs);--kirby-checkbox-container-padding: var(--kirby-spacing-xxxxs)}:host.xs ion-checkbox::part(container){padding:var(--kirby-checkbox-container-padding)}:host.xs ion-checkbox::part(native-wrapper){height:var(--kirby-relative-size-s)}@media(hover:hover){:host ion-checkbox:hover{--checkbox-background: var(--kirby-color-fill-raised-hover);--checkbox-background-checked: var(--kirby-color-fill-engaged-hover);--checkmark-color: var(--kirby-color-content-engaged-hover);--border-color: var(--kirby-color-border-raised-hover);--border-color-checked: var(--kirby-color-border-engaged-hover)}}:host ion-checkbox:active{--checkbox-background: var(--kirby-color-fill-raised-active);--checkbox-background-checked: var(--kirby-color-fill-engaged-active);--checkmark-color: var(--kirby-color-content-engaged-active);--border-color: var(--kirby-color-border-raised-active);--border-color-checked: var(--kirby-color-border-engaged-active)}:host ion-checkbox:focus-visible{outline:none;--border-color: var(--kirby-color-border-focus);--border-color-checked: var(--kirby-color-border-focus)}:host ion-checkbox:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host ion-checkbox{--transition: border-color 80ms linear, background-color 80ms linear;--size: 24px;--checkmark-width: var(--kirby-spacing-xxxs);--kirby-checkbox-container-padding: var(--kirby-spacing-xxxs);--checkbox-background: var(--kirby-color-fill-raised);--checkbox-background-checked: var(--kirby-color-fill-engaged);--checkmark-color: var(--kirby-color-content-engaged);--border-width: var(--kirby-stroke-xs);--border-color: var(--kirby-color-border-raised);--border-color-checked: var(--kirby-color-border-engaged);--border-radius: 6px}:host ion-checkbox::part(container){padding:var(--kirby-checkbox-container-padding)}:host ion-checkbox::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}:host ion-checkbox::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}:host ion-checkbox::part(native-wrapper){height:var(--kirby-relative-size-m)}:host ion-checkbox.in-item::part(label){align-items:center;padding-inline:0}:host ion-checkbox.in-item::part(label-text-wrapper){margin-block:0}:host ion-checkbox.in-item.checkbox-label-placement-start::part(label-text-wrapper){margin-inline:0 12px}:host ion-checkbox.in-item.checkbox-label-placement-end::part(label-text-wrapper){margin-inline:12px 0}:host.has-hidden-label:has(ion-checkbox.in-item){position:initial}:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox{position:initial}:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox.checkbox-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox.checkbox-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-checkbox{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.error ion-checkbox{--border-color: var(--kirby-color-border-raised-danger);--border-color-checked: var(--kirby-color-border-raised-danger)}:host.error ion-checkbox::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}:host.error ion-checkbox:focus-visible{--border-color: var(--kirby-color-border-focus);--border-color-checked: var(--kirby-color-border-focus)}:host.error ion-checkbox:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host :host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host :host-context(kirby-item) ion-checkbox{margin:0}:host :host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"], dependencies: [{ kind: "component", type: IonCheckbox, selector: "ion-checkbox", inputs: ["checked", "color", "disabled", "errorText", "helperText", "indeterminate", "justify", "labelPlacement", "mode", "name", "value"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
122
134
|
}
|
|
123
135
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: CheckboxComponent, decorators: [{
|
|
124
136
|
type: Component,
|
|
@@ -129,7 +141,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
|
|
|
129
141
|
useExisting: forwardRef((() => CheckboxComponent)),
|
|
130
142
|
multi: true,
|
|
131
143
|
},
|
|
132
|
-
], template: "<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host
|
|
144
|
+
], template: "<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host{display:flex}:host[disabled] ion-checkbox::part(label-text-wrapper),:host[disabled] ion-checkbox::part(native-wrapper){opacity:var(--kirby-opacity-40)}:host:has(ion-checkbox.in-item.checkbox-justify-space-between){width:100%}:host.xs ion-checkbox:not(.in-item)::part(label){padding-block:4px}:host.sm ion-checkbox:not(.in-item)::part(label){padding-block:10px}:host.md ion-checkbox:not(.in-item)::part(label){padding-block:16px}:host.xs ion-checkbox::part(label){line-height:var(--kirby-relative-size-s);font-size:var(--kirby-font-size-s)}:host.xs ion-checkbox{--size: 16px;--border-radius: var(--kirby-spacing-xxxs);--kirby-checkbox-container-padding: var(--kirby-spacing-xxxxs)}:host.xs ion-checkbox::part(container){padding:var(--kirby-checkbox-container-padding)}:host.xs ion-checkbox::part(native-wrapper){height:var(--kirby-relative-size-s)}@media(hover:hover){:host ion-checkbox:hover{--checkbox-background: var(--kirby-color-fill-raised-hover);--checkbox-background-checked: var(--kirby-color-fill-engaged-hover);--checkmark-color: var(--kirby-color-content-engaged-hover);--border-color: var(--kirby-color-border-raised-hover);--border-color-checked: var(--kirby-color-border-engaged-hover)}}:host ion-checkbox:active{--checkbox-background: var(--kirby-color-fill-raised-active);--checkbox-background-checked: var(--kirby-color-fill-engaged-active);--checkmark-color: var(--kirby-color-content-engaged-active);--border-color: var(--kirby-color-border-raised-active);--border-color-checked: var(--kirby-color-border-engaged-active)}:host ion-checkbox:focus-visible{outline:none;--border-color: var(--kirby-color-border-focus);--border-color-checked: var(--kirby-color-border-focus)}:host ion-checkbox:focus-visible::part(container){transition:box-shadow 80ms linear;box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host ion-checkbox{--transition: border-color 80ms linear, background-color 80ms linear;--size: 24px;--checkmark-width: var(--kirby-spacing-xxxs);--kirby-checkbox-container-padding: var(--kirby-spacing-xxxs);--checkbox-background: var(--kirby-color-fill-raised);--checkbox-background-checked: var(--kirby-color-fill-engaged);--checkmark-color: var(--kirby-color-content-engaged);--border-width: var(--kirby-stroke-xs);--border-color: var(--kirby-color-border-raised);--border-color-checked: var(--kirby-color-border-engaged);--border-radius: 6px}:host ion-checkbox::part(container){padding:var(--kirby-checkbox-container-padding)}:host ion-checkbox::part(label){align-items:start;padding-inline:16px;line-height:var(--kirby-line-height-n)}:host ion-checkbox::part(label-text-wrapper){margin-inline:12px 0;white-space:pre-line}:host ion-checkbox::part(native-wrapper){height:var(--kirby-relative-size-m)}:host ion-checkbox.in-item::part(label){align-items:center;padding-inline:0}:host ion-checkbox.in-item::part(label-text-wrapper){margin-block:0}:host ion-checkbox.in-item.checkbox-label-placement-start::part(label-text-wrapper){margin-inline:0 12px}:host ion-checkbox.in-item.checkbox-label-placement-end::part(label-text-wrapper){margin-inline:12px 0}:host.has-hidden-label:has(ion-checkbox.in-item){position:initial}:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox{position:initial}:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox.checkbox-label-placement-start::part(label-text-wrapper),:host.has-hidden-label:has(ion-checkbox.in-item) ion-checkbox.checkbox-label-placement-end::part(label-text-wrapper){margin-inline:0}:host.has-hidden-label[slot=end] ion-checkbox{margin-inline-start:12px}:host.has-hidden-label .hidden-label{position:absolute;inset:0;opacity:0}:host.error ion-checkbox{--border-color: var(--kirby-color-border-raised-danger);--border-color-checked: var(--kirby-color-border-raised-danger)}:host.error ion-checkbox::part(container){box-shadow:var(--kirby-error-ring-combined-inset)}:host.error ion-checkbox:focus-visible{--border-color: var(--kirby-color-border-focus);--border-color-checked: var(--kirby-color-border-focus)}:host.error ion-checkbox:focus-visible::part(container){box-shadow:var(--kirby-focus-ring-sm-combined-inset)}:host :host-context(kirby-item){z-index:var(--kirby-z-index-default)}:host :host-context(kirby-item) ion-checkbox{margin:0}:host :host-context(kirby-item)[slot=start]{margin-block:0;margin-inline-end:12px}\n"] }]
|
|
133
145
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.IonicElementPartHelper }, { type: i0.ChangeDetectorRef }], propDecorators: { ionCheckboxElement: [{
|
|
134
146
|
type: ViewChild,
|
|
135
147
|
args: [IonCheckbox, { read: ElementRef, static: true }]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kirbydesign-designsystem-checkbox.mjs","sources":["../../checkbox/src/checkbox.component.ts","../../checkbox/src/checkbox.component.html","../../checkbox/src/kirbydesign-designsystem-checkbox.ts"],"sourcesContent":["import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { IonicElementPartHelper } from '@kirbydesign/designsystem/helpers';\nimport { IonCheckbox } from '@ionic/angular/standalone';\nimport { inheritAriaLabelText, setAccessibleLabel } from '@kirbydesign/designsystem/shared';\n\n@Component({\n imports: [IonCheckbox],\n selector: 'kirby-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n IonicElementPartHelper,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n})\nexport class CheckboxComponent\n implements AfterViewInit, ControlValueAccessor, OnInit, AfterContentInit\n{\n @ViewChild(IonCheckbox, { read: ElementRef, static: true })\n private ionCheckboxElement?: ElementRef<HTMLIonCheckboxElement>;\n\n @Input() checked: boolean = false;\n @Input() indeterminate: boolean = false;\n @Input() attentionLevel: '1' | '2' = '2';\n\n @Input()\n text: string;\n\n @HostBinding('class')\n @Input()\n size: 'xs' | 'sm' | 'md' = 'md';\n\n @HostBinding('class.error')\n @Input()\n hasError: boolean = false;\n\n @Input() disabled = false;\n @HostBinding('attr.disabled')\n get _isDisabled() {\n return this.disabled ? 'disabled' : null;\n }\n\n @HostBinding('class.attention-level1') get isAttentionLevel1() {\n return this.attentionLevel === '1';\n }\n @HostBinding('class.attention-level2') get isAttentionLevel2() {\n return this.attentionLevel === '2';\n }\n\n @HostBinding('class.has-hidden-label') _labelText: string;\n\n @Output() checkedChange = new EventEmitter<boolean>();\n\n _justify: 'start' | 'end' | 'space-between' = 'start';\n _labelPlacement: 'end' | 'fixed' | 'stacked' | 'start' = 'end';\n _hasSlottedContent: boolean;\n\n constructor(\n private element: ElementRef<HTMLElement>,\n private ionicElementPartHelper: IonicElementPartHelper,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n /**\n * We cannot query ion-checkbox for slotted content at this point as the slot has not been rendered.\n * But we need to know if content is slotted to set justify and labelPlacement BEFORE ion-checkbox is rendered.\n * So it has to be done by querying an additional wrapper around the default content slot like this.\n */\n this._hasSlottedContent = this.element.nativeElement\n .querySelector('.default-content')\n .hasChildNodes();\n\n const slot = this.element.nativeElement.getAttribute('slot');\n if (slot === 'end' && this._hasSlottedContent) {\n this._justify = 'space-between';\n this._labelPlacement = 'start';\n }\n }\n\n ngAfterViewInit(): void {\n this.ionicElementPartHelper.setPart('label', this.ionCheckboxElement, '.checkbox-wrapper');\n this.ionicElementPartHelper.setPart(\n 'label-text-wrapper',\n this.ionCheckboxElement,\n '.label-text-wrapper'\n );\n this.ionicElementPartHelper.setPart(\n 'native-wrapper',\n this.ionCheckboxElement,\n '.native-wrapper'\n );\n }\n\n ngAfterContentInit(): void {\n this._labelText = inheritAriaLabelText(this.element.nativeElement);\n\n if (!this.text && !this._labelText && !this._hasSlottedContent) {\n // if no label has been set try to find a label in an item and use its text content\n this._labelText = setAccessibleLabel(this.element.nativeElement);\n }\n }\n\n onChecked(checked: boolean): void {\n this.checked = checked;\n this._onChange(this.checked);\n this.checkedChange.emit(this.checked);\n }\n\n onBlur() {\n this._onTouched();\n }\n\n // Initialize default ControlValueAccessor callback functions (noop)\n // eslint-disable-next-line no-empty-function\n private _onChange: (value: boolean) => void = () => {};\n // eslint-disable-next-line no-empty-function\n private _onTouched = () => {};\n\n /**\n * Sets the checkbox's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value: boolean): void {\n this.checked = value;\n this.cdr.markForCheck();\n }\n\n /**\n * Saves a callback function to be invoked when the checkbox's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n /**\n * Saves a callback function to be invoked when the checkbox is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /**\n * Disables the checkbox. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n}\n","<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kirbydesign-designsystem-checkbox.mjs","sources":["../../checkbox/src/checkbox.component.ts","../../checkbox/src/checkbox.component.html","../../checkbox/src/kirbydesign-designsystem-checkbox.ts"],"sourcesContent":["import {\n AfterContentInit,\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n Input,\n OnInit,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { IonicElementPartHelper } from '@kirbydesign/designsystem/helpers';\nimport { IonCheckbox } from '@ionic/angular/standalone';\nimport { inheritAriaLabelText, setAccessibleLabel } from '@kirbydesign/designsystem/shared';\n\n@Component({\n imports: [IonCheckbox],\n selector: 'kirby-checkbox',\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n providers: [\n IonicElementPartHelper,\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CheckboxComponent),\n multi: true,\n },\n ],\n})\nexport class CheckboxComponent\n implements AfterViewInit, ControlValueAccessor, OnInit, AfterContentInit\n{\n @ViewChild(IonCheckbox, { read: ElementRef, static: true })\n private ionCheckboxElement?: ElementRef<HTMLIonCheckboxElement>;\n\n @Input() checked: boolean = false;\n @Input() indeterminate: boolean = false;\n\n private _attentionLevel: '1' | '2' = '2';\n /**\n * @deprecated Since v12.0.0, attention levels 1 and 2 now look the same, so this input no longer has any effect.\n * This input will be removed in a future major version.\n */\n @Input() set attentionLevel(value: '1' | '2') {\n console.warn(\n `[Kirby Checkbox] The 'attentionLevel' input is deprecated and no longer has any effect.\n Attention levels 1 and 2 now look the same. This input will be removed in a future major version.`\n );\n this._attentionLevel = value;\n }\n get attentionLevel(): '1' | '2' {\n return this._attentionLevel;\n }\n\n @Input()\n text: string;\n\n @HostBinding('class')\n @Input()\n size: 'xs' | 'sm' | 'md' = 'md';\n\n @HostBinding('class.error')\n @Input()\n hasError: boolean = false;\n\n @Input() disabled = false;\n @HostBinding('attr.disabled')\n get _isDisabled() {\n return this.disabled ? 'disabled' : null;\n }\n\n @HostBinding('class.attention-level1') get isAttentionLevel1() {\n return this.attentionLevel === '1';\n }\n @HostBinding('class.attention-level2') get isAttentionLevel2() {\n return this.attentionLevel === '2';\n }\n\n @HostBinding('class.has-hidden-label') _labelText: string;\n\n @Output() checkedChange = new EventEmitter<boolean>();\n\n _justify: 'start' | 'end' | 'space-between' = 'start';\n _labelPlacement: 'end' | 'fixed' | 'stacked' | 'start' = 'end';\n _hasSlottedContent: boolean;\n\n constructor(\n private element: ElementRef<HTMLElement>,\n private ionicElementPartHelper: IonicElementPartHelper,\n private cdr: ChangeDetectorRef\n ) {}\n\n ngOnInit(): void {\n /**\n * We cannot query ion-checkbox for slotted content at this point as the slot has not been rendered.\n * But we need to know if content is slotted to set justify and labelPlacement BEFORE ion-checkbox is rendered.\n * So it has to be done by querying an additional wrapper around the default content slot like this.\n */\n this._hasSlottedContent = this.element.nativeElement\n .querySelector('.default-content')\n .hasChildNodes();\n\n const slot = this.element.nativeElement.getAttribute('slot');\n if (slot === 'end' && this._hasSlottedContent) {\n this._justify = 'space-between';\n this._labelPlacement = 'start';\n }\n }\n\n ngAfterViewInit(): void {\n this.ionicElementPartHelper.setPart('label', this.ionCheckboxElement, '.checkbox-wrapper');\n this.ionicElementPartHelper.setPart(\n 'label-text-wrapper',\n this.ionCheckboxElement,\n '.label-text-wrapper'\n );\n this.ionicElementPartHelper.setPart(\n 'native-wrapper',\n this.ionCheckboxElement,\n '.native-wrapper'\n );\n }\n\n ngAfterContentInit(): void {\n this._labelText = inheritAriaLabelText(this.element.nativeElement);\n\n if (!this.text && !this._labelText && !this._hasSlottedContent) {\n // if no label has been set try to find a label in an item and use its text content\n this._labelText = setAccessibleLabel(this.element.nativeElement);\n }\n }\n\n onChecked(checked: boolean): void {\n this.checked = checked;\n this._onChange(this.checked);\n this.checkedChange.emit(this.checked);\n }\n\n onBlur() {\n this._onTouched();\n }\n\n // Initialize default ControlValueAccessor callback functions (noop)\n // eslint-disable-next-line no-empty-function\n private _onChange: (value: boolean) => void = () => {};\n // eslint-disable-next-line no-empty-function\n private _onTouched = () => {};\n\n /**\n * Sets the checkbox's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value: boolean): void {\n this.checked = value;\n this.cdr.markForCheck();\n }\n\n /**\n * Saves a callback function to be invoked when the checkbox's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n /**\n * Saves a callback function to be invoked when the checkbox is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /**\n * Disables the checkbox. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n}\n","<ion-checkbox\n mode=\"md\"\n [checked]=\"checked\"\n [disabled]=\"disabled\"\n [indeterminate]=\"indeterminate\"\n (ionChange)=\"onChecked($event.detail.checked)\"\n (ionBlur)=\"onBlur()\"\n [labelPlacement]=\"_labelPlacement\"\n [justify]=\"_justify\"\n>\n @if (_labelText) {\n <span class=\"hidden-label\">{{ _labelText }}</span>\n }\n @if (text) {\n <span [attr.aria-hidden]=\"_labelText ? true : undefined\">{{ text }}</span>\n }\n <span class=\"default-content\" [attr.aria-hidden]=\"_labelText ? true : undefined\">\n <ng-content></ng-content>\n </span>\n</ion-checkbox>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,11 +3,11 @@ import { Input, ChangeDetectionStrategy, Component } from '@angular/core';
|
|
|
3
3
|
|
|
4
4
|
class DividerComponent {
|
|
5
5
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DividerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
6
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: DividerComponent, isStandalone: true, selector: "kirby-divider", inputs: { hasMargin: "hasMargin" }, ngImport: i0, template: "<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n", styles: ["
|
|
6
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.18", type: DividerComponent, isStandalone: true, selector: "kirby-divider", inputs: { hasMargin: "hasMargin" }, ngImport: i0, template: "<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n", styles: ["hr{margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-spacing-xxs);border:0;border-top:var(--kirby-stroke-xs) solid var(--kirby-color-border-base-silent)}hr.no-margin{margin-top:0;margin-bottom:0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7
7
|
}
|
|
8
8
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DividerComponent, decorators: [{
|
|
9
9
|
type: Component,
|
|
10
|
-
args: [{ selector: 'kirby-divider', changeDetection: ChangeDetectionStrategy.OnPush, template: "<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n", styles: ["
|
|
10
|
+
args: [{ selector: 'kirby-divider', changeDetection: ChangeDetectionStrategy.OnPush, template: "<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n", styles: ["hr{margin-top:var(--kirby-spacing-xxs);margin-bottom:var(--kirby-spacing-xxs);border:0;border-top:var(--kirby-stroke-xs) solid var(--kirby-color-border-base-silent)}hr.no-margin{margin-top:0;margin-bottom:0}\n"] }]
|
|
11
11
|
}], propDecorators: { hasMargin: [{
|
|
12
12
|
type: Input
|
|
13
13
|
}] } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kirbydesign-designsystem-divider.mjs","sources":["../../divider/src/divider.component.ts","../../divider/src/divider.component.html","../../divider/src/kirbydesign-designsystem-divider.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'kirby-divider',\n templateUrl: './divider.component.html',\n styleUrls: ['./divider.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DividerComponent {\n @Input()\n hasMargin: boolean;\n}\n","<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;MAQa,gBAAgB,CAAA;kIAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,6GCR7B,iEACA,EAAA,MAAA,EAAA,CAAA,
|
|
1
|
+
{"version":3,"file":"kirbydesign-designsystem-divider.mjs","sources":["../../divider/src/divider.component.ts","../../divider/src/divider.component.html","../../divider/src/kirbydesign-designsystem-divider.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, Input } from '@angular/core';\n\n@Component({\n selector: 'kirby-divider',\n templateUrl: './divider.component.html',\n styleUrls: ['./divider.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class DividerComponent {\n @Input()\n hasMargin: boolean;\n}\n","<hr role=\"presentation\" [class.no-margin]=\"!hasMargin\" />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;MAQa,gBAAgB,CAAA;kIAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA;AAAhB,uBAAA,SAAA,IAAA,CAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,gBAAgB,6GCR7B,iEACA,EAAA,MAAA,EAAA,CAAA,mNAAA,CAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA,CAAA;;4FDOa,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAN5B,SAAS;+BACE,eAAe,EAAA,eAAA,EAGR,uBAAuB,CAAC,MAAM,EAAA,QAAA,EAAA,iEAAA,EAAA,MAAA,EAAA,CAAA,mNAAA,CAAA,EAAA;;sBAG9C;;;AETH;;AAEG;;;;"}
|
|
@@ -570,7 +570,7 @@ class DropdownComponent {
|
|
|
570
570
|
multi: true,
|
|
571
571
|
},
|
|
572
572
|
{ provide: FORM_FIELD_CONTROL, useExisting: forwardRef((() => DropdownComponent)) },
|
|
573
|
-
], queries: [{ propertyName: "itemTemplate", first: true, predicate: ListItemTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "slottedItems", predicate: ListItemTemplateDirective, read: ElementRef }, { propertyName: "kirbyItemsSlotted", predicate: ItemComponent, read: ElementRef }], viewQueries: [{ propertyName: "cardElement", first: true, predicate: CardComponent, descendants: true, read: ElementRef }, { propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "buttonElement", first: true, predicate: ButtonComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "kirbyItemsDefault", predicate: ItemComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset);outline:none;border-radius:
|
|
573
|
+
], queries: [{ propertyName: "itemTemplate", first: true, predicate: ListItemTemplateDirective, descendants: true, read: TemplateRef, static: true }, { propertyName: "slottedItems", predicate: ListItemTemplateDirective, read: ElementRef }, { propertyName: "kirbyItemsSlotted", predicate: ItemComponent, read: ElementRef }], viewQueries: [{ propertyName: "cardElement", first: true, predicate: CardComponent, descendants: true, read: ElementRef }, { propertyName: "popover", first: true, predicate: PopoverComponent, descendants: true }, { propertyName: "buttonElement", first: true, predicate: ButtonComponent, descendants: true, read: ElementRef, static: true }, { propertyName: "kirbyItemsDefault", predicate: ItemComponent, descendants: true, read: ElementRef }], ngImport: i0, template: "<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset);outline:none;border-radius:var(--kirby-border-radius-pill)}:host{display:inline-block;position:relative;max-width:min(100vw - calc(2 * var(--kirby-spacing-s)),100%)}:host.clicked{box-shadow:none}:host.expand{display:block}:host.expand kirby-card{width:100%;min-width:initial;max-width:initial}:host.error:not(.is-open)>button,:host.ng-touched.ng-invalid:not(.is-open)>button{--kirby-button-border-color: var(--kirby-color-border-raised-danger);box-shadow:var(--kirby-error-ring-combined-inset)}:host.error:not(.is-open)>button:focus-visible,:host.ng-touched.ng-invalid:not(.is-open)>button:focus-visible{box-shadow:var(--kirby-focus-ring-md-combined-inset)}:host>button{position:relative;margin:0;width:100%;min-width:0}:host>button .text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host.is-open>button{box-shadow:var(--kirby-elevation-4);border-color:var(--kirby-button-border-color)}kirby-popover{--max-height: 352px}kirby-card{max-height:352px;overflow-y:auto;box-shadow:var(--kirby-elevation-4);max-width:calc(100vw - calc(2 * var(--kirby-spacing-s)));min-width:calc(320px - calc(2 * var(--kirby-spacing-s)))}@media(min-width:321px){kirby-card{min-width:calc(375px - calc(2 * var(--kirby-spacing-s)))}}:host-context(kirby-calendar)>button{font-weight:var(--kirby-font-weight-bold);font-size:initial}:host-context(kirby-calendar).is-open>button{box-shadow:none}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopoverComponent, selector: "kirby-popover", inputs: ["popout", "target"], outputs: ["willHide"] }, { kind: "component", type: CardComponent, selector: "kirby-card", inputs: ["title", "subtitle", "backgroundImageUrl", "hasPadding", "sizes", "variant"] }, { kind: "component", type: ItemComponent, selector: "kirby-item", inputs: ["disabled", "selected", "disclosure", "selectable", "reorderable", "size", "href", "rotateIcon"] }, { kind: "component", type: IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }] }); }
|
|
574
574
|
}
|
|
575
575
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: DropdownComponent, decorators: [{
|
|
576
576
|
type: Component,
|
|
@@ -588,7 +588,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImpo
|
|
|
588
588
|
CardComponent,
|
|
589
589
|
ItemComponent,
|
|
590
590
|
IconComponent,
|
|
591
|
-
], template: "<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset);outline:none;border-radius:
|
|
591
|
+
], template: "<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n", styles: [".kirby-line-clamp{display:-webkit-box;-webkit-line-clamp:var(--line-clamp, none);-webkit-box-orient:vertical;overflow:hidden}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:var(--kirby-focus-ring-md-inset);outline:none;border-radius:var(--kirby-border-radius-pill)}:host{display:inline-block;position:relative;max-width:min(100vw - calc(2 * var(--kirby-spacing-s)),100%)}:host.clicked{box-shadow:none}:host.expand{display:block}:host.expand kirby-card{width:100%;min-width:initial;max-width:initial}:host.error:not(.is-open)>button,:host.ng-touched.ng-invalid:not(.is-open)>button{--kirby-button-border-color: var(--kirby-color-border-raised-danger);box-shadow:var(--kirby-error-ring-combined-inset)}:host.error:not(.is-open)>button:focus-visible,:host.ng-touched.ng-invalid:not(.is-open)>button:focus-visible{box-shadow:var(--kirby-focus-ring-md-combined-inset)}:host>button{position:relative;margin:0;width:100%;min-width:0}:host>button .text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host.is-open>button{box-shadow:var(--kirby-elevation-4);border-color:var(--kirby-button-border-color)}kirby-popover{--max-height: 352px}kirby-card{max-height:352px;overflow-y:auto;box-shadow:var(--kirby-elevation-4);max-width:calc(100vw - calc(2 * var(--kirby-spacing-s)));min-width:calc(320px - calc(2 * var(--kirby-spacing-s)))}@media(min-width:321px){kirby-card{min-width:calc(375px - calc(2 * var(--kirby-spacing-s)))}}:host-context(kirby-calendar)>button{font-weight:var(--kirby-font-weight-bold);font-size:initial}:host-context(kirby-calendar).is-open>button{box-shadow:none}\n"] }]
|
|
592
592
|
}], ctorParameters: () => [{ type: i0.Renderer2 }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: KeyboardHandlerService }, { type: i2.ResizeObserverService }], propDecorators: { items: [{
|
|
593
593
|
type: Input
|
|
594
594
|
}], selectedIndex: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"kirbydesign-designsystem-dropdown.mjs","sources":["../../dropdown/src/dropdown.types.ts","../../dropdown/src/keyboard-handler.service.ts","../../dropdown/src/dropdown.component.ts","../../dropdown/src/dropdown.component.html","../../dropdown/src/dropdown.module.ts","../../dropdown/src/kirbydesign-designsystem-dropdown.ts"],"sourcesContent":["export enum OpenState {\n closed,\n opening,\n open,\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardHandlerService {\n handle(event: KeyboardEvent, selectedIndex: number, maxIndex: number, cyclicIndex = false) {\n let newIndex = -1;\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n if (selectedIndex === 0 && cyclicIndex) {\n newIndex = maxIndex;\n } else {\n // Select previous item:\n newIndex = selectedIndex - 1;\n }\n break;\n case 'ArrowDown':\n case 'ArrowRight':\n if (selectedIndex === undefined || (selectedIndex === maxIndex && cyclicIndex)) {\n // None selected, select first item:\n newIndex = 0;\n } else if (selectedIndex < maxIndex) {\n // Select next item:\n newIndex = selectedIndex + 1;\n }\n break;\n case 'Home':\n // Select first item:\n newIndex = 0;\n break;\n case 'End':\n // Select last item:\n newIndex = maxIndex;\n break;\n default:\n break;\n }\n return newIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Input,\n OnDestroy,\n Output,\n QueryList,\n Renderer2,\n RendererStyleFlags2,\n TemplateRef,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CardComponent } from '@kirbydesign/designsystem/card';\nimport { StringSearchHelper, UniqueIdGenerator } from '@kirbydesign/designsystem/helpers';\nimport { ItemComponent } from '@kirbydesign/designsystem/item';\nimport { ListItemTemplateDirective } from '@kirbydesign/designsystem/list';\nimport { HorizontalDirection, PopoverComponent } from '@kirbydesign/designsystem/popover';\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport {\n EventListenerDisposeFn,\n FORM_FIELD_CONTROL,\n FormFieldControl,\n} from '@kirbydesign/designsystem/types';\nimport { forwardAttributes, ResizeObserverService } from '@kirbydesign/designsystem/shared';\n\nimport { IconComponent } from '@kirbydesign/designsystem/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { OpenState } from './dropdown.types';\nimport { KeyboardHandlerService } from './keyboard-handler.service';\n\n@Component({\n selector: 'kirby-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrls: ['./dropdown.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DropdownComponent),\n multi: true,\n },\n { provide: FORM_FIELD_CONTROL, useExisting: forwardRef(() => DropdownComponent) },\n ],\n imports: [\n ButtonComponent,\n NgTemplateOutlet,\n PopoverComponent,\n CardComponent,\n ItemComponent,\n IconComponent,\n ],\n})\nexport class DropdownComponent\n implements AfterViewInit, OnDestroy, ControlValueAccessor, FormFieldControl\n{\n static readonly OPEN_DELAY_IN_MS = 100;\n private state = OpenState.closed;\n private _popout: HorizontalDirection | `${HorizontalDirection}` = HorizontalDirection.right;\n private _attributesToForward = ['aria-label', 'aria-labelledby'];\n\n _listboxId = UniqueIdGenerator.scopedTo('kirby-dropdown').next();\n _comboboxId = UniqueIdGenerator.scopedTo('kirby-button').next();\n\n private _items: string[] | any[] = [];\n\n get items(): string[] | any[] {\n return this._items;\n }\n\n @Input() set items(value: string[] | any[]) {\n this._items = value;\n this._value = this.items[this.selectedIndex] || null;\n }\n\n private _selectedIndex: number = -1;\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n @Input() set selectedIndex(value: number) {\n if (value !== undefined && this._selectedIndex != value) {\n this._selectedIndex = value;\n this.focusedIndex = this._selectedIndex;\n this._value = this.items[this.selectedIndex] || null;\n }\n }\n\n // _focusedIndex keeps track of which element has focus and will be selected\n // if it is activated (by pressing ENTER or SPACE key)\n private _focusedIndex: number = 0;\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n @Input() set focusedIndex(value: number) {\n if (this._focusedIndex !== value) {\n this._focusedIndex = value;\n this.scrollItemIntoView(this._focusedIndex);\n }\n }\n\n @Input()\n itemTextProperty = 'text';\n\n @Input()\n placeholder = 'Please select:';\n\n @Input() set popout(direction: HorizontalDirection | `${HorizontalDirection}`) {\n this._popout = direction || HorizontalDirection.right;\n }\n\n get popout() {\n return this._popout;\n }\n\n @Input()\n attentionLevel: '1' | '2' | '3' = '3';\n\n @Input()\n expand?: 'block';\n\n @Input()\n disabled = false;\n\n @HostBinding('attr.disabled')\n get _isDisabled() {\n return this.disabled ? 'disabled' : null;\n }\n\n @Output() hasErrorChange = new EventEmitter<boolean>();\n\n private _hasError: boolean;\n @HostBinding('class.error')\n @Input()\n get hasError(): boolean {\n return this._hasError;\n }\n\n set hasError(value: boolean) {\n if (this._hasError !== value) {\n this._hasError = value;\n this.hasErrorChange.emit(this._hasError);\n }\n }\n\n @Input()\n size: 'sm' | 'md' = 'md';\n\n // Tabindex defaults to 0 instead of no value to align tabbing behavior in Safari\n // with other browsers and the default select behavior: https://mayank.co/blog/safari-focus/\n @Input()\n tabindex = 0;\n\n /**\n * @deprecated This input is no longer needed. The dropdown now always uses popover positioning.\n * This input will be removed in a future major version.\n */\n @Input() set usePopover(_value: boolean) {\n console.warn(\n `[Kirby Dropdown] The 'usePopover' input is deprecated and no longer has any effect.\n The dropdown now always uses popover positioning. This input will be removed in a future major version.`\n );\n }\n\n get _tabindex() {\n return this.disabled ? -1 : this.tabindex;\n }\n\n // Prevent Ionic blur on scroll\n @HostBinding('attr.no-blur')\n get _noBlurOnScroll() {\n return true;\n }\n\n /**\n * Emitted when an item is selected (tap on mobile, click/keypress on web)\n */\n @Output() change: EventEmitter<string | any> = new EventEmitter<string | any>();\n\n private _value: string | any = null;\n get value(): string | any {\n return this._value;\n }\n\n get selectedText(): string {\n return this.getTextFromItem(this.value);\n }\n\n @HostBinding('class.expand')\n get _isBlockLevel() {\n return this.expand === 'block';\n }\n\n @HostBinding('class.is-opening')\n get _isOpening(): boolean {\n return this.state === OpenState.opening;\n }\n\n @HostBinding('class.is-open')\n get isOpen(): boolean {\n return this.state === OpenState.open;\n }\n\n /* The 'clicked' class is applied through Hostbinding to prevent the dropdown from getting a focus ring on click.\n There is a bug that causes the dropdown to get a focus ring on click, if it is the first element that is interacted with\n after the page is loaded. If the user interacts with any other element before, then the dropdown won't get a focus ring.\n See issue: https://github.com/kirbydesign/designsystem/issues/2477.\n\n This solution can potentially be refactored, when popover is not experimental anymore. Then it could be possible\n to close the dropdown when the popover backdrop is clicked, instead of relying on the blur event, which is utilized\n by this line below: this.elementRef.nativeElement.focus(). Right now this forces the blur event to be triggered, when\n clicking outside of the dropdown.\n */\n @HostBinding('class.clicked')\n clicked = false;\n\n @ContentChild(ListItemTemplateDirective, { static: true, read: TemplateRef })\n itemTemplate: TemplateRef<any>;\n @ContentChildren(ListItemTemplateDirective, { read: ElementRef })\n slottedItems: QueryList<ElementRef<HTMLElement>>;\n @ViewChild(CardComponent, { read: ElementRef })\n cardElement: ElementRef<HTMLElement>;\n @ViewChild(PopoverComponent)\n popover: PopoverComponent;\n @ViewChild(ButtonComponent, { static: true, read: ElementRef })\n buttonElement: ElementRef<HTMLElement>;\n\n get interactiveElement(): HTMLElement {\n return this.buttonElement.nativeElement;\n }\n\n private forwardAriaLabelToDropdownButton() {\n forwardAttributes(\n this.elementRef.nativeElement,\n this._attributesToForward,\n this.renderer,\n this.buttonElement.nativeElement\n );\n }\n @ViewChildren(ItemComponent, { read: ElementRef })\n kirbyItemsDefault: QueryList<ElementRef<HTMLElement>>;\n\n _kirbyItemsSlotted: QueryList<ElementRef<HTMLElement>>;\n @ContentChildren(ItemComponent, { read: ElementRef })\n set kirbyItemsSlotted(kirbyItems: QueryList<ElementRef<HTMLElement>>) {\n const hasSlottedItems = this.disposeItemClickListeners?.length > 0;\n if (hasSlottedItems) {\n this.unlistenAllSlottedItems();\n }\n\n // Setup a click listener for each new slotted items\n kirbyItems.forEach((kirbyItem) => {\n this.renderer.setAttribute(kirbyItem.nativeElement, 'role', 'option');\n const disposeClickListener: EventListenerDisposeFn = this.renderer.listen(\n kirbyItem.nativeElement,\n 'click',\n () => {\n this.onItemSelect(this.domIndexOf(kirbyItem));\n }\n );\n\n this.disposeItemClickListeners.push(disposeClickListener);\n });\n\n this._kirbyItemsSlotted = kirbyItems;\n }\n\n get kirbyItemsSlotted(): QueryList<ElementRef<HTMLElement>> {\n return this._kirbyItemsSlotted;\n }\n\n private disposeItemClickListeners: EventListenerDisposeFn[] = [];\n private searchBuffer: string = '';\n private searchBufferTimeout: ReturnType<typeof setTimeout>;\n private SEARCH_BUFFER_DELAY = 500; // ms\n\n constructor(\n private renderer: Renderer2,\n private elementRef: ElementRef<HTMLElement>,\n private cdr: ChangeDetectorRef,\n private keyboardHandlerService: KeyboardHandlerService,\n private resizeObserverService: ResizeObserverService\n ) {}\n\n onToggle(event: MouseEvent) {\n event.stopPropagation();\n\n this.clicked = true;\n\n this.toggle();\n }\n\n toggle() {\n if (this.disabled) {\n return;\n }\n this.isOpen ? this.close() : this.open();\n }\n\n /* Utility that makes it easier to set styles on card element */\n private setPopoverCardStyle(style: string, value: string) {\n this.renderer.setStyle(\n this.cardElement.nativeElement,\n style,\n value,\n RendererStyleFlags2.DashCase\n );\n }\n\n ngAfterViewInit() {\n if (this.expand === 'block') {\n const { width: initialWidth } = this.elementRef.nativeElement.getBoundingClientRect();\n this.setPopoverCardStyle('max-width', 'initial');\n this.setPopoverCardStyle('min-width', 'initial');\n // Ensure initial width is set even if the resize observer callback also fires initially:\n this.setPopoverCardStyle('--kirby-card-width', `${initialWidth}px`);\n\n this.resizeObserverService.observe(this.elementRef, (entry) => {\n const newWidth = entry.contentRect.width;\n if (newWidth > 0) {\n this.setPopoverCardStyle('--kirby-card-width', `${newWidth}px`);\n }\n });\n }\n this.forwardAriaLabelToDropdownButton();\n }\n\n open() {\n if (this.disabled) {\n return;\n }\n\n if (!this.isOpen) {\n this.state = OpenState.opening;\n // ensures that the dropdown is opened in case the IntersectionObserverCallback isn't invoked\n setTimeout(() => this.showDropdown(), DropdownComponent.OPEN_DELAY_IN_MS);\n\n // Move focus to selected item (if any) or first item\n this.focusedIndex = this.selectedIndex > -1 ? this.selectedIndex : 0;\n }\n }\n\n private showDropdown() {\n if (this.state === OpenState.opening) {\n this.state = OpenState.open;\n this.popover?.show();\n this.scrollItemIntoView(this.focusedIndex);\n this.cdr.markForCheck();\n }\n }\n\n close() {\n if (this.disabled) {\n return;\n }\n if (this.isOpen) {\n this.state = OpenState.closed;\n this.popover?.hide();\n }\n }\n\n onItemSelect(index: number) {\n this.selectItem(index);\n this.close();\n }\n\n private _onChange: (value: any) => void = () => {};\n private _onTouched = () => {};\n\n /**\n * Sets the select's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value: any): void {\n this._selectItemByValue(value);\n this.cdr.markForCheck();\n }\n\n /**\n * Saves a callback function to be invoked when the select's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n /**\n * Saves a callback function to be invoked when the select is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /**\n * Disables the select. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n private selectItem(index: number) {\n if (index != this.selectedIndex) {\n this.selectedIndex = index;\n this.focusedIndex = index;\n this.change.emit(this.value);\n this._onChange(this.value);\n }\n }\n\n private _selectItemByValue(value: string | any) {\n this.selectedIndex = this.items.indexOf(value);\n }\n\n getTextFromItem(item: string | any) {\n if (!item) {\n return null;\n }\n return typeof item === 'string' ? item : item[this.itemTextProperty];\n }\n\n scrollItemIntoView(index: number) {\n const kirbyItems =\n this.kirbyItemsSlotted && this.kirbyItemsSlotted.length\n ? this.kirbyItemsSlotted\n : this.kirbyItemsDefault;\n if (kirbyItems && kirbyItems.length) {\n const selectedKirbyItem = kirbyItems.toArray()[index];\n if (selectedKirbyItem && selectedKirbyItem.nativeElement) {\n const itemElement = selectedKirbyItem.nativeElement;\n itemElement.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n @HostListener('keydown.tab')\n @HostListener('keydown.shift.tab')\n _onTab() {\n if (this.isOpen) {\n this.selectItem(this.focusedIndex);\n this.close();\n }\n\n if (this.clicked) {\n // Remove the 'clicked' class (Hostbinding) if the user has previously opened the dropdown by clicking,\n // since the class prevents the focus ring from showing,\n // which is expected to happen, when using the tab key\n this.clicked = false;\n }\n }\n\n private preventDefaultAndStopImmediatePropagation(event: KeyboardEvent) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n\n private addToSearchBuffer(char: string) {\n clearTimeout(this.searchBufferTimeout);\n this.searchBuffer += char;\n this.searchBufferTimeout = setTimeout(() => {\n this.resetSearchBuffer();\n }, this.SEARCH_BUFFER_DELAY);\n }\n private resetSearchBuffer() {\n this.searchBuffer = '';\n }\n\n @HostListener('keydown', ['$event'])\n _onKeydown(event: KeyboardEvent) {\n const key = event.key;\n\n if (this.items.length === 0) {\n console.warn('[Kirby] No items found within dropdown');\n return;\n }\n\n if (this.disabled) return;\n\n if (StringSearchHelper.isPrintableCharacter(key)) {\n this.handlePrintableCharacterKey(event, this.isOpen);\n }\n\n // ALT + ArrowDown: Open dropdown\n if (key === 'ArrowDown' && event.altKey) {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n this.focusedIndex = this.selectedIndex > -1 ? this.selectedIndex : 0;\n }\n return;\n }\n\n // ALT + ArrowUp: Select focused item and close dropdown\n if (key === 'ArrowUp' && event.altKey) {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (this.focusedIndex > -1) {\n this.selectItem(this.focusedIndex);\n this.close();\n }\n }\n // PageUp: Jump up 10 options or to first\n if (key === 'PageUp') {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n }\n this.focusedIndex = Math.max(0, this.focusedIndex - 10);\n return;\n }\n\n // PageDown: Jump down 10 options or to last\n if (key === 'PageDown') {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n }\n this.focusedIndex = Math.min(this.items.length - 1, this.focusedIndex + 10);\n return;\n }\n }\n\n private handlePrintableCharacterKey(event: KeyboardEvent, isOpen: boolean) {\n const key = event.key;\n\n if (isOpen) {\n this.preventDefaultAndStopImmediatePropagation(event);\n } else {\n this.open();\n }\n\n // If the same character is typed twice, the search buffer should only contain that character once\n if (\n this.searchBuffer.length === 1 &&\n this.searchBuffer[0].toLowerCase() === key.toLowerCase()\n ) {\n this.searchBuffer = key;\n } else {\n this.addToSearchBuffer(key);\n }\n\n const isMultiCharSearch = this.searchBuffer.length > 1;\n let startIndex = 0;\n\n if (!isMultiCharSearch && this.isOpen) {\n startIndex = this.focusedIndex + 1;\n }\n\n let foundItemIndex = this.getIndexOfItemByFirstCharacter(this.searchBuffer, startIndex);\n\n if (foundItemIndex === -1 && isMultiCharSearch) {\n foundItemIndex = this.getIndexOfItemByFirstCharacter(key, startIndex);\n }\n\n if (foundItemIndex === -1 && !isMultiCharSearch && this.isOpen) {\n foundItemIndex = this.getIndexOfItemByFirstCharacter(this.searchBuffer, 0);\n }\n\n if (foundItemIndex > -1) {\n this.focusedIndex = foundItemIndex;\n }\n }\n\n private getIndexOfItemByFirstCharacter(char: string, startIndex: number = 0) {\n let itemTexts: string[];\n // Prefer slotted/projected items if present\n if (this.kirbyItemsSlotted && this.kirbyItemsSlotted.length) {\n itemTexts = this.kirbyItemsSlotted\n .toArray()\n .map((ref) => ref.nativeElement.textContent?.trim() ?? '');\n } else {\n itemTexts = this.items.map((item) => this.getTextFromItem(item) ?? '');\n }\n\n return StringSearchHelper.getIndexByFirstMatchingStartString(char, itemTexts, startIndex);\n }\n\n @HostListener('mousedown', ['$event'])\n _onMouseDown(event: MouseEvent) {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n\n @HostListener('touchstart', ['$event'])\n _onTouchStart(event: TouchEvent) {\n if (this.isOpen) {\n event.stopPropagation();\n }\n }\n\n _onPopoverWillHide() {\n this.state = OpenState.closed;\n this.buttonElement.nativeElement.focus();\n this._onTouched();\n }\n\n @HostListener('focusout')\n _onFocusOut() {\n if (!this.isOpen) {\n this._onTouched();\n }\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.escape')\n _onEnterOrEscape() {\n this.close();\n }\n\n _onPopoverClick() {\n this.close();\n }\n\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n _onEnterOrSpace(event: KeyboardEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isOpen) {\n this.selectItem(this.focusedIndex);\n }\n this.toggle();\n }\n\n @HostListener('keydown.arrowup', ['$event'])\n @HostListener('keydown.arrowdown', ['$event'])\n @HostListener('keydown.arrowleft', ['$event'])\n @HostListener('keydown.arrowright', ['$event'])\n _onArrowKeys(event: KeyboardEvent) {\n if (this.disabled) return false;\n\n // Mirror default HTML5 select behaviour - prevent left/right arrows when open:\n if (this.isOpen && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\n return false;\n }\n\n if (!this.isOpen) {\n // Avoid page scroll\n event.preventDefault();\n this.open();\n\n // If no selected item then focus first or last item\n if (!event.altKey && this.selectedIndex < 0) {\n switch (event.key) {\n case 'ArrowUp':\n this.focusedIndex = 0;\n break;\n case 'ArrowDown':\n this.focusedIndex = this.items.length - 1;\n break;\n default:\n break;\n }\n }\n return false;\n }\n\n const newFocusedIndex = this.keyboardHandlerService.handle(\n event,\n this.focusedIndex,\n this.items.length - 1\n );\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\n return false;\n }\n\n @HostListener('keydown.home', ['$event'])\n @HostListener('keydown.end', ['$event'])\n _onHomeEndKeys(event: KeyboardEvent) {\n if (this.disabled) return;\n if (!this.isOpen) {\n event.preventDefault();\n this.open();\n }\n const newFocusedIndex = this.keyboardHandlerService.handle(\n event,\n this.focusedIndex,\n this.items.length - 1\n );\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\n return false;\n }\n\n private domIndexOf(kirbyItem: ElementRef<HTMLElement>): number {\n return this.kirbyItemsSlotted\n .toArray()\n .filter(\n (item) =>\n item.nativeElement.compareDocumentPosition(kirbyItem.nativeElement) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ).length;\n }\n\n private unlistenAllSlottedItems() {\n let disposeClickListener: EventListenerDisposeFn;\n while ((disposeClickListener = this.disposeItemClickListeners.pop()) !== undefined) {\n disposeClickListener();\n }\n }\n\n ngOnDestroy(): void {\n this.unlistenAllSlottedItems();\n this.resizeObserverService.unobserve(this.elementRef);\n }\n}\n","<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport { CardModule } from '@kirbydesign/designsystem/card';\nimport { IconModule } from '@kirbydesign/designsystem/icon';\nimport { ItemModule } from '@kirbydesign/designsystem/item';\nimport { PopoverComponent } from '@kirbydesign/designsystem/popover';\n\nimport { ListItemTemplateDirective, ListModule } from '@kirbydesign/designsystem/list';\nimport { DropdownComponent } from './dropdown.component';\nimport { KeyboardHandlerService } from './keyboard-handler.service';\n\n@NgModule({\n imports: [\n CardModule,\n IconModule,\n ItemModule,\n PopoverComponent,\n ButtonComponent,\n CommonModule,\n ListModule,\n DropdownComponent,\n ],\n exports: [DropdownComponent, ListItemTemplateDirective],\n providers: [KeyboardHandlerService],\n})\nexport class DropdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.KeyboardHandlerService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"kirbydesign-designsystem-dropdown.mjs","sources":["../../dropdown/src/dropdown.types.ts","../../dropdown/src/keyboard-handler.service.ts","../../dropdown/src/dropdown.component.ts","../../dropdown/src/dropdown.component.html","../../dropdown/src/dropdown.module.ts","../../dropdown/src/kirbydesign-designsystem-dropdown.ts"],"sourcesContent":["export enum OpenState {\n closed,\n opening,\n open,\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class KeyboardHandlerService {\n handle(event: KeyboardEvent, selectedIndex: number, maxIndex: number, cyclicIndex = false) {\n let newIndex = -1;\n switch (event.key) {\n case 'ArrowUp':\n case 'ArrowLeft':\n if (selectedIndex === 0 && cyclicIndex) {\n newIndex = maxIndex;\n } else {\n // Select previous item:\n newIndex = selectedIndex - 1;\n }\n break;\n case 'ArrowDown':\n case 'ArrowRight':\n if (selectedIndex === undefined || (selectedIndex === maxIndex && cyclicIndex)) {\n // None selected, select first item:\n newIndex = 0;\n } else if (selectedIndex < maxIndex) {\n // Select next item:\n newIndex = selectedIndex + 1;\n }\n break;\n case 'Home':\n // Select first item:\n newIndex = 0;\n break;\n case 'End':\n // Select last item:\n newIndex = maxIndex;\n break;\n default:\n break;\n }\n return newIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectorRef,\n Component,\n ContentChild,\n ContentChildren,\n ElementRef,\n EventEmitter,\n forwardRef,\n HostBinding,\n HostListener,\n Input,\n OnDestroy,\n Output,\n QueryList,\n Renderer2,\n RendererStyleFlags2,\n TemplateRef,\n ViewChild,\n ViewChildren,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport { CardComponent } from '@kirbydesign/designsystem/card';\nimport { StringSearchHelper, UniqueIdGenerator } from '@kirbydesign/designsystem/helpers';\nimport { ItemComponent } from '@kirbydesign/designsystem/item';\nimport { ListItemTemplateDirective } from '@kirbydesign/designsystem/list';\nimport { HorizontalDirection, PopoverComponent } from '@kirbydesign/designsystem/popover';\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport {\n EventListenerDisposeFn,\n FORM_FIELD_CONTROL,\n FormFieldControl,\n} from '@kirbydesign/designsystem/types';\nimport { forwardAttributes, ResizeObserverService } from '@kirbydesign/designsystem/shared';\n\nimport { IconComponent } from '@kirbydesign/designsystem/icon';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { OpenState } from './dropdown.types';\nimport { KeyboardHandlerService } from './keyboard-handler.service';\n\n@Component({\n selector: 'kirby-dropdown',\n templateUrl: './dropdown.component.html',\n styleUrls: ['./dropdown.component.scss'],\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => DropdownComponent),\n multi: true,\n },\n { provide: FORM_FIELD_CONTROL, useExisting: forwardRef(() => DropdownComponent) },\n ],\n imports: [\n ButtonComponent,\n NgTemplateOutlet,\n PopoverComponent,\n CardComponent,\n ItemComponent,\n IconComponent,\n ],\n})\nexport class DropdownComponent\n implements AfterViewInit, OnDestroy, ControlValueAccessor, FormFieldControl\n{\n static readonly OPEN_DELAY_IN_MS = 100;\n private state = OpenState.closed;\n private _popout: HorizontalDirection | `${HorizontalDirection}` = HorizontalDirection.right;\n private _attributesToForward = ['aria-label', 'aria-labelledby'];\n\n _listboxId = UniqueIdGenerator.scopedTo('kirby-dropdown').next();\n _comboboxId = UniqueIdGenerator.scopedTo('kirby-button').next();\n\n private _items: string[] | any[] = [];\n\n get items(): string[] | any[] {\n return this._items;\n }\n\n @Input() set items(value: string[] | any[]) {\n this._items = value;\n this._value = this.items[this.selectedIndex] || null;\n }\n\n private _selectedIndex: number = -1;\n get selectedIndex(): number {\n return this._selectedIndex;\n }\n\n @Input() set selectedIndex(value: number) {\n if (value !== undefined && this._selectedIndex != value) {\n this._selectedIndex = value;\n this.focusedIndex = this._selectedIndex;\n this._value = this.items[this.selectedIndex] || null;\n }\n }\n\n // _focusedIndex keeps track of which element has focus and will be selected\n // if it is activated (by pressing ENTER or SPACE key)\n private _focusedIndex: number = 0;\n get focusedIndex(): number {\n return this._focusedIndex;\n }\n\n @Input() set focusedIndex(value: number) {\n if (this._focusedIndex !== value) {\n this._focusedIndex = value;\n this.scrollItemIntoView(this._focusedIndex);\n }\n }\n\n @Input()\n itemTextProperty = 'text';\n\n @Input()\n placeholder = 'Please select:';\n\n @Input() set popout(direction: HorizontalDirection | `${HorizontalDirection}`) {\n this._popout = direction || HorizontalDirection.right;\n }\n\n get popout() {\n return this._popout;\n }\n\n @Input()\n attentionLevel: '1' | '2' | '3' = '3';\n\n @Input()\n expand?: 'block';\n\n @Input()\n disabled = false;\n\n @HostBinding('attr.disabled')\n get _isDisabled() {\n return this.disabled ? 'disabled' : null;\n }\n\n @Output() hasErrorChange = new EventEmitter<boolean>();\n\n private _hasError: boolean;\n @HostBinding('class.error')\n @Input()\n get hasError(): boolean {\n return this._hasError;\n }\n\n set hasError(value: boolean) {\n if (this._hasError !== value) {\n this._hasError = value;\n this.hasErrorChange.emit(this._hasError);\n }\n }\n\n @Input()\n size: 'sm' | 'md' = 'md';\n\n // Tabindex defaults to 0 instead of no value to align tabbing behavior in Safari\n // with other browsers and the default select behavior: https://mayank.co/blog/safari-focus/\n @Input()\n tabindex = 0;\n\n /**\n * @deprecated This input is no longer needed. The dropdown now always uses popover positioning.\n * This input will be removed in a future major version.\n */\n @Input() set usePopover(_value: boolean) {\n console.warn(\n `[Kirby Dropdown] The 'usePopover' input is deprecated and no longer has any effect.\n The dropdown now always uses popover positioning. This input will be removed in a future major version.`\n );\n }\n\n get _tabindex() {\n return this.disabled ? -1 : this.tabindex;\n }\n\n // Prevent Ionic blur on scroll\n @HostBinding('attr.no-blur')\n get _noBlurOnScroll() {\n return true;\n }\n\n /**\n * Emitted when an item is selected (tap on mobile, click/keypress on web)\n */\n @Output() change: EventEmitter<string | any> = new EventEmitter<string | any>();\n\n private _value: string | any = null;\n get value(): string | any {\n return this._value;\n }\n\n get selectedText(): string {\n return this.getTextFromItem(this.value);\n }\n\n @HostBinding('class.expand')\n get _isBlockLevel() {\n return this.expand === 'block';\n }\n\n @HostBinding('class.is-opening')\n get _isOpening(): boolean {\n return this.state === OpenState.opening;\n }\n\n @HostBinding('class.is-open')\n get isOpen(): boolean {\n return this.state === OpenState.open;\n }\n\n /* The 'clicked' class is applied through Hostbinding to prevent the dropdown from getting a focus ring on click.\n There is a bug that causes the dropdown to get a focus ring on click, if it is the first element that is interacted with\n after the page is loaded. If the user interacts with any other element before, then the dropdown won't get a focus ring.\n See issue: https://github.com/kirbydesign/designsystem/issues/2477.\n\n This solution can potentially be refactored, when popover is not experimental anymore. Then it could be possible\n to close the dropdown when the popover backdrop is clicked, instead of relying on the blur event, which is utilized\n by this line below: this.elementRef.nativeElement.focus(). Right now this forces the blur event to be triggered, when\n clicking outside of the dropdown.\n */\n @HostBinding('class.clicked')\n clicked = false;\n\n @ContentChild(ListItemTemplateDirective, { static: true, read: TemplateRef })\n itemTemplate: TemplateRef<any>;\n @ContentChildren(ListItemTemplateDirective, { read: ElementRef })\n slottedItems: QueryList<ElementRef<HTMLElement>>;\n @ViewChild(CardComponent, { read: ElementRef })\n cardElement: ElementRef<HTMLElement>;\n @ViewChild(PopoverComponent)\n popover: PopoverComponent;\n @ViewChild(ButtonComponent, { static: true, read: ElementRef })\n buttonElement: ElementRef<HTMLElement>;\n\n get interactiveElement(): HTMLElement {\n return this.buttonElement.nativeElement;\n }\n\n private forwardAriaLabelToDropdownButton() {\n forwardAttributes(\n this.elementRef.nativeElement,\n this._attributesToForward,\n this.renderer,\n this.buttonElement.nativeElement\n );\n }\n @ViewChildren(ItemComponent, { read: ElementRef })\n kirbyItemsDefault: QueryList<ElementRef<HTMLElement>>;\n\n _kirbyItemsSlotted: QueryList<ElementRef<HTMLElement>>;\n @ContentChildren(ItemComponent, { read: ElementRef })\n set kirbyItemsSlotted(kirbyItems: QueryList<ElementRef<HTMLElement>>) {\n const hasSlottedItems = this.disposeItemClickListeners?.length > 0;\n if (hasSlottedItems) {\n this.unlistenAllSlottedItems();\n }\n\n // Setup a click listener for each new slotted items\n kirbyItems.forEach((kirbyItem) => {\n this.renderer.setAttribute(kirbyItem.nativeElement, 'role', 'option');\n const disposeClickListener: EventListenerDisposeFn = this.renderer.listen(\n kirbyItem.nativeElement,\n 'click',\n () => {\n this.onItemSelect(this.domIndexOf(kirbyItem));\n }\n );\n\n this.disposeItemClickListeners.push(disposeClickListener);\n });\n\n this._kirbyItemsSlotted = kirbyItems;\n }\n\n get kirbyItemsSlotted(): QueryList<ElementRef<HTMLElement>> {\n return this._kirbyItemsSlotted;\n }\n\n private disposeItemClickListeners: EventListenerDisposeFn[] = [];\n private searchBuffer: string = '';\n private searchBufferTimeout: ReturnType<typeof setTimeout>;\n private SEARCH_BUFFER_DELAY = 500; // ms\n\n constructor(\n private renderer: Renderer2,\n private elementRef: ElementRef<HTMLElement>,\n private cdr: ChangeDetectorRef,\n private keyboardHandlerService: KeyboardHandlerService,\n private resizeObserverService: ResizeObserverService\n ) {}\n\n onToggle(event: MouseEvent) {\n event.stopPropagation();\n\n this.clicked = true;\n\n this.toggle();\n }\n\n toggle() {\n if (this.disabled) {\n return;\n }\n this.isOpen ? this.close() : this.open();\n }\n\n /* Utility that makes it easier to set styles on card element */\n private setPopoverCardStyle(style: string, value: string) {\n this.renderer.setStyle(\n this.cardElement.nativeElement,\n style,\n value,\n RendererStyleFlags2.DashCase\n );\n }\n\n ngAfterViewInit() {\n if (this.expand === 'block') {\n const { width: initialWidth } = this.elementRef.nativeElement.getBoundingClientRect();\n this.setPopoverCardStyle('max-width', 'initial');\n this.setPopoverCardStyle('min-width', 'initial');\n // Ensure initial width is set even if the resize observer callback also fires initially:\n this.setPopoverCardStyle('--kirby-card-width', `${initialWidth}px`);\n\n this.resizeObserverService.observe(this.elementRef, (entry) => {\n const newWidth = entry.contentRect.width;\n if (newWidth > 0) {\n this.setPopoverCardStyle('--kirby-card-width', `${newWidth}px`);\n }\n });\n }\n this.forwardAriaLabelToDropdownButton();\n }\n\n open() {\n if (this.disabled) {\n return;\n }\n\n if (!this.isOpen) {\n this.state = OpenState.opening;\n // ensures that the dropdown is opened in case the IntersectionObserverCallback isn't invoked\n setTimeout(() => this.showDropdown(), DropdownComponent.OPEN_DELAY_IN_MS);\n\n // Move focus to selected item (if any) or first item\n this.focusedIndex = this.selectedIndex > -1 ? this.selectedIndex : 0;\n }\n }\n\n private showDropdown() {\n if (this.state === OpenState.opening) {\n this.state = OpenState.open;\n this.popover?.show();\n this.scrollItemIntoView(this.focusedIndex);\n this.cdr.markForCheck();\n }\n }\n\n close() {\n if (this.disabled) {\n return;\n }\n if (this.isOpen) {\n this.state = OpenState.closed;\n this.popover?.hide();\n }\n }\n\n onItemSelect(index: number) {\n this.selectItem(index);\n this.close();\n }\n\n private _onChange: (value: any) => void = () => {};\n private _onTouched = () => {};\n\n /**\n * Sets the select's value. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param value New value to be written to the model.\n */\n writeValue(value: any): void {\n this._selectItemByValue(value);\n this.cdr.markForCheck();\n }\n\n /**\n * Saves a callback function to be invoked when the select's value\n * changes from user input. Part of the ControlValueAccessor interface\n * required to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the value changes.\n */\n registerOnChange(fn: any): void {\n this._onChange = fn;\n }\n\n /**\n * Saves a callback function to be invoked when the select is blurred\n * by the user. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param fn Callback to be triggered when the component has been touched.\n */\n registerOnTouched(fn: any): void {\n this._onTouched = fn;\n }\n\n /**\n * Disables the select. Part of the ControlValueAccessor interface required\n * to integrate with Angular's core forms API.\n *\n * @param isDisabled Sets whether the component is disabled.\n */\n setDisabledState?(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.cdr.markForCheck();\n }\n\n private selectItem(index: number) {\n if (index != this.selectedIndex) {\n this.selectedIndex = index;\n this.focusedIndex = index;\n this.change.emit(this.value);\n this._onChange(this.value);\n }\n }\n\n private _selectItemByValue(value: string | any) {\n this.selectedIndex = this.items.indexOf(value);\n }\n\n getTextFromItem(item: string | any) {\n if (!item) {\n return null;\n }\n return typeof item === 'string' ? item : item[this.itemTextProperty];\n }\n\n scrollItemIntoView(index: number) {\n const kirbyItems =\n this.kirbyItemsSlotted && this.kirbyItemsSlotted.length\n ? this.kirbyItemsSlotted\n : this.kirbyItemsDefault;\n if (kirbyItems && kirbyItems.length) {\n const selectedKirbyItem = kirbyItems.toArray()[index];\n if (selectedKirbyItem && selectedKirbyItem.nativeElement) {\n const itemElement = selectedKirbyItem.nativeElement;\n itemElement.scrollIntoView({ block: 'nearest' });\n }\n }\n }\n\n @HostListener('keydown.tab')\n @HostListener('keydown.shift.tab')\n _onTab() {\n if (this.isOpen) {\n this.selectItem(this.focusedIndex);\n this.close();\n }\n\n if (this.clicked) {\n // Remove the 'clicked' class (Hostbinding) if the user has previously opened the dropdown by clicking,\n // since the class prevents the focus ring from showing,\n // which is expected to happen, when using the tab key\n this.clicked = false;\n }\n }\n\n private preventDefaultAndStopImmediatePropagation(event: KeyboardEvent) {\n event.stopImmediatePropagation();\n event.preventDefault();\n }\n\n private addToSearchBuffer(char: string) {\n clearTimeout(this.searchBufferTimeout);\n this.searchBuffer += char;\n this.searchBufferTimeout = setTimeout(() => {\n this.resetSearchBuffer();\n }, this.SEARCH_BUFFER_DELAY);\n }\n private resetSearchBuffer() {\n this.searchBuffer = '';\n }\n\n @HostListener('keydown', ['$event'])\n _onKeydown(event: KeyboardEvent) {\n const key = event.key;\n\n if (this.items.length === 0) {\n console.warn('[Kirby] No items found within dropdown');\n return;\n }\n\n if (this.disabled) return;\n\n if (StringSearchHelper.isPrintableCharacter(key)) {\n this.handlePrintableCharacterKey(event, this.isOpen);\n }\n\n // ALT + ArrowDown: Open dropdown\n if (key === 'ArrowDown' && event.altKey) {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n this.focusedIndex = this.selectedIndex > -1 ? this.selectedIndex : 0;\n }\n return;\n }\n\n // ALT + ArrowUp: Select focused item and close dropdown\n if (key === 'ArrowUp' && event.altKey) {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (this.focusedIndex > -1) {\n this.selectItem(this.focusedIndex);\n this.close();\n }\n }\n // PageUp: Jump up 10 options or to first\n if (key === 'PageUp') {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n }\n this.focusedIndex = Math.max(0, this.focusedIndex - 10);\n return;\n }\n\n // PageDown: Jump down 10 options or to last\n if (key === 'PageDown') {\n this.preventDefaultAndStopImmediatePropagation(event);\n if (!this.isOpen) {\n this.open();\n }\n this.focusedIndex = Math.min(this.items.length - 1, this.focusedIndex + 10);\n return;\n }\n }\n\n private handlePrintableCharacterKey(event: KeyboardEvent, isOpen: boolean) {\n const key = event.key;\n\n if (isOpen) {\n this.preventDefaultAndStopImmediatePropagation(event);\n } else {\n this.open();\n }\n\n // If the same character is typed twice, the search buffer should only contain that character once\n if (\n this.searchBuffer.length === 1 &&\n this.searchBuffer[0].toLowerCase() === key.toLowerCase()\n ) {\n this.searchBuffer = key;\n } else {\n this.addToSearchBuffer(key);\n }\n\n const isMultiCharSearch = this.searchBuffer.length > 1;\n let startIndex = 0;\n\n if (!isMultiCharSearch && this.isOpen) {\n startIndex = this.focusedIndex + 1;\n }\n\n let foundItemIndex = this.getIndexOfItemByFirstCharacter(this.searchBuffer, startIndex);\n\n if (foundItemIndex === -1 && isMultiCharSearch) {\n foundItemIndex = this.getIndexOfItemByFirstCharacter(key, startIndex);\n }\n\n if (foundItemIndex === -1 && !isMultiCharSearch && this.isOpen) {\n foundItemIndex = this.getIndexOfItemByFirstCharacter(this.searchBuffer, 0);\n }\n\n if (foundItemIndex > -1) {\n this.focusedIndex = foundItemIndex;\n }\n }\n\n private getIndexOfItemByFirstCharacter(char: string, startIndex: number = 0) {\n let itemTexts: string[];\n // Prefer slotted/projected items if present\n if (this.kirbyItemsSlotted && this.kirbyItemsSlotted.length) {\n itemTexts = this.kirbyItemsSlotted\n .toArray()\n .map((ref) => ref.nativeElement.textContent?.trim() ?? '');\n } else {\n itemTexts = this.items.map((item) => this.getTextFromItem(item) ?? '');\n }\n\n return StringSearchHelper.getIndexByFirstMatchingStartString(char, itemTexts, startIndex);\n }\n\n @HostListener('mousedown', ['$event'])\n _onMouseDown(event: MouseEvent) {\n if (this.disabled) {\n event.preventDefault();\n event.stopImmediatePropagation();\n }\n }\n\n @HostListener('touchstart', ['$event'])\n _onTouchStart(event: TouchEvent) {\n if (this.isOpen) {\n event.stopPropagation();\n }\n }\n\n _onPopoverWillHide() {\n this.state = OpenState.closed;\n this.buttonElement.nativeElement.focus();\n this._onTouched();\n }\n\n @HostListener('focusout')\n _onFocusOut() {\n if (!this.isOpen) {\n this._onTouched();\n }\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.escape')\n _onEnterOrEscape() {\n this.close();\n }\n\n _onPopoverClick() {\n this.close();\n }\n\n @HostListener('keydown.enter', ['$event'])\n @HostListener('keydown.space', ['$event'])\n _onEnterOrSpace(event: KeyboardEvent) {\n event.preventDefault();\n event.stopPropagation();\n\n if (this.isOpen) {\n this.selectItem(this.focusedIndex);\n }\n this.toggle();\n }\n\n @HostListener('keydown.arrowup', ['$event'])\n @HostListener('keydown.arrowdown', ['$event'])\n @HostListener('keydown.arrowleft', ['$event'])\n @HostListener('keydown.arrowright', ['$event'])\n _onArrowKeys(event: KeyboardEvent) {\n if (this.disabled) return false;\n\n // Mirror default HTML5 select behaviour - prevent left/right arrows when open:\n if (this.isOpen && (event.key === 'ArrowLeft' || event.key === 'ArrowRight')) {\n return false;\n }\n\n if (!this.isOpen) {\n // Avoid page scroll\n event.preventDefault();\n this.open();\n\n // If no selected item then focus first or last item\n if (!event.altKey && this.selectedIndex < 0) {\n switch (event.key) {\n case 'ArrowUp':\n this.focusedIndex = 0;\n break;\n case 'ArrowDown':\n this.focusedIndex = this.items.length - 1;\n break;\n default:\n break;\n }\n }\n return false;\n }\n\n const newFocusedIndex = this.keyboardHandlerService.handle(\n event,\n this.focusedIndex,\n this.items.length - 1\n );\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\n return false;\n }\n\n @HostListener('keydown.home', ['$event'])\n @HostListener('keydown.end', ['$event'])\n _onHomeEndKeys(event: KeyboardEvent) {\n if (this.disabled) return;\n if (!this.isOpen) {\n event.preventDefault();\n this.open();\n }\n const newFocusedIndex = this.keyboardHandlerService.handle(\n event,\n this.focusedIndex,\n this.items.length - 1\n );\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\n return false;\n }\n\n private domIndexOf(kirbyItem: ElementRef<HTMLElement>): number {\n return this.kirbyItemsSlotted\n .toArray()\n .filter(\n (item) =>\n item.nativeElement.compareDocumentPosition(kirbyItem.nativeElement) &\n Node.DOCUMENT_POSITION_FOLLOWING\n ).length;\n }\n\n private unlistenAllSlottedItems() {\n let disposeClickListener: EventListenerDisposeFn;\n while ((disposeClickListener = this.disposeItemClickListeners.pop()) !== undefined) {\n disposeClickListener();\n }\n }\n\n ngOnDestroy(): void {\n this.unlistenAllSlottedItems();\n this.resizeObserverService.unobserve(this.elementRef);\n }\n}\n","<button\n kirby-button\n type=\"button\"\n [attr.id]=\"_comboboxId\"\n role=\"combobox\"\n aria-haspopup=\"listbox\"\n [attr.aria-controls]=\"_listboxId\"\n [attr.aria-expanded]=\"isOpen\"\n [attr.aria-activedescendant]=\"isOpen ? _listboxId + '-item-' + focusedIndex : null\"\n [attr.aria-invalid]=\"hasError\"\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n (click)=\"onToggle($event)\"\n [disabled]=\"disabled\"\n [tabindex]=\"_tabindex\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n>\n <kirby-card role=\"listbox\" [attr.id]=\"_listboxId\" [attr.aria-labelledby]=\"_comboboxId\">\n @for (item of items; track item; let i = $index) {\n <ng-container\n *ngTemplateOutlet=\"\n itemTemplate || defaultItemTemplate;\n context: {\n $implicit: item,\n selected: i === selectedIndex,\n focused: i === focusedIndex,\n index: i,\n }\n \"\n ></ng-container>\n }\n </kirby-card>\n</kirby-popover>\n\n<ng-template\n #defaultItemTemplate\n let-item\n let-selected=\"selected\"\n let-index=\"index\"\n let-focused=\"focused\"\n>\n <kirby-item\n [selectable]=\"true\"\n [selected]=\"selected\"\n (click)=\"onItemSelect(index)\"\n [class.focused]=\"focused\"\n [class.keyboard-focused]=\"focused && !clicked\"\n role=\"option\"\n [attr.id]=\"_listboxId + '-item-' + index\"\n [attr.aria-selected]=\"selected\"\n >\n <p class=\"kirby-item-title\">{{ getTextFromItem(item) }}</p>\n @if (selected) {\n <kirby-icon name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n }\n </kirby-item>\n</ng-template>\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\n\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport { CardModule } from '@kirbydesign/designsystem/card';\nimport { IconModule } from '@kirbydesign/designsystem/icon';\nimport { ItemModule } from '@kirbydesign/designsystem/item';\nimport { PopoverComponent } from '@kirbydesign/designsystem/popover';\n\nimport { ListItemTemplateDirective, ListModule } from '@kirbydesign/designsystem/list';\nimport { DropdownComponent } from './dropdown.component';\nimport { KeyboardHandlerService } from './keyboard-handler.service';\n\n@NgModule({\n imports: [\n CardModule,\n IconModule,\n ItemModule,\n PopoverComponent,\n ButtonComponent,\n CommonModule,\n ListModule,\n DropdownComponent,\n ],\n exports: [DropdownComponent, ListItemTemplateDirective],\n providers: [KeyboardHandlerService],\n})\nexport class DropdownModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.KeyboardHandlerService"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { IconComponent, IconModule } from '@kirbydesign/designsystem/icon';
|
|
|
6
6
|
import { CommonModule } from '@angular/common';
|
|
7
7
|
import { ThemeColorDirective } from '@kirbydesign/designsystem/shared';
|
|
8
8
|
|
|
9
|
+
const supportedThemeColors = ['success', 'warning', 'danger', 'medium'];
|
|
9
10
|
class EmptyStateComponent {
|
|
10
11
|
set title(value) {
|
|
11
12
|
this._title = value;
|
|
@@ -16,6 +17,16 @@ class EmptyStateComponent {
|
|
|
16
17
|
get title() {
|
|
17
18
|
return this._title;
|
|
18
19
|
}
|
|
20
|
+
/**
|
|
21
|
+
* Sets which color the empty state should use from the theme palette.
|
|
22
|
+
* Supported values are 'success', 'warning', 'danger' and 'medium'.
|
|
23
|
+
* Deprecated values: 'primary', 'secondary', 'tertiary', 'light' and 'dark'
|
|
24
|
+
*/
|
|
25
|
+
set themeColor(value) {
|
|
26
|
+
if (value && !supportedThemeColors.includes(value)) {
|
|
27
|
+
console.warn(`[Kirby Empty State] themeColor '${value}' is deprecated and will be removed in a future major version. Use 'success', 'warning', 'danger' or 'medium' instead.`);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
19
30
|
constructor(elementRef, renderer) {
|
|
20
31
|
this.elementRef = elementRef;
|
|
21
32
|
this.renderer = renderer;
|
|
@@ -55,17 +66,19 @@ class EmptyStateComponent {
|
|
|
55
66
|
});
|
|
56
67
|
}
|
|
57
68
|
/** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: EmptyStateComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
58
|
-
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: EmptyStateComponent, isStandalone: true, selector: "kirby-empty-state", inputs: { iconName: "iconName", title: "title", subtitle: "subtitle" }, queries: [{ propertyName: "slottedButtons", predicate: ButtonComponent }], ngImport: i0, template: "<div class=\"message-container\">\n @if (iconName) {\n <div class=\"icon-outline\">\n <kirby-icon [name]=\"iconName\" size=\"lg\"></kirby-icon>\n </div>\n }\n @if (title) {\n @if (_insideModal) {\n <h2 class=\"title kirby-text-medium\">{{ title }}</h2>\n } @else {\n <span class=\"title kirby-text-medium\">{{ title }}</span>\n }\n }\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".
|
|
69
|
+
/** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.18", type: EmptyStateComponent, isStandalone: true, selector: "kirby-empty-state", inputs: { iconName: "iconName", title: "title", subtitle: "subtitle", themeColor: "themeColor" }, queries: [{ propertyName: "slottedButtons", predicate: ButtonComponent }], ngImport: i0, template: "<div class=\"message-container\">\n @if (iconName) {\n <div class=\"icon-outline\">\n <kirby-icon [name]=\"iconName\" size=\"lg\"></kirby-icon>\n </div>\n }\n @if (title) {\n @if (_insideModal) {\n <h2 class=\"title kirby-text-medium\">{{ title }}</h2>\n } @else {\n <span class=\"title kirby-text-medium\">{{ title }}</span>\n }\n }\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".message-container{max-width:330px;margin:auto;display:flex;flex-direction:column;justify-content:center;text-align:center}.icon-outline{width:calc(var(--kirby-spacing-xxl) * 2);height:calc(var(--kirby-spacing-xxl) * 2);margin-left:auto;margin-right:auto;margin-bottom:var(--kirby-spacing-m);display:flex;flex-direction:column;justify-content:center;border:var(--kirby-spacing-xxxs) solid var(--kirby-empty-state-color, var(--kirby-color-content-base-quiet));border-radius:var(--kirby-border-radius-circle)}kirby-icon{color:var(--kirby-empty-state-color, var(--kirby-color-content-base-quiet))}.title{margin-bottom:var(--kirby-spacing-xxs)}p.subtitle{margin-bottom:var(--kirby-spacing-m);white-space:pre-wrap}:host(.success){--kirby-empty-state-color: var(--kirby-color-fill-success-loud)}:host(.warning){--kirby-empty-state-color: var(--kirby-color-fill-warning-loud)}:host(.danger){--kirby-empty-state-color: var(--kirby-color-fill-danger-loud)}:host(.medium){--kirby-empty-state-color: var(--kirby-color-content-base-quiet)}:host(.primary){--kirby-empty-state-color: var(--kirby-primary)}:host(.secondary){--kirby-empty-state-color: var(--kirby-secondary)}:host(.tertiary){--kirby-empty-state-color: var(--kirby-tertiary)}:host(.white-overlay){--kirby-empty-state-color: var(--kirby-white-overlay)}:host(.light){--kirby-empty-state-color: var(--kirby-light)}:host(.dark){--kirby-empty-state-color: var(--kirby-dark)}:host(.dark-overlay){--kirby-empty-state-color: var(--kirby-dark-overlay)}\n"], dependencies: [{ kind: "component", type: IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
59
70
|
}
|
|
60
71
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.18", ngImport: i0, type: EmptyStateComponent, decorators: [{
|
|
61
72
|
type: Component,
|
|
62
|
-
args: [{ selector: 'kirby-empty-state', changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconComponent], template: "<div class=\"message-container\">\n @if (iconName) {\n <div class=\"icon-outline\">\n <kirby-icon [name]=\"iconName\" size=\"lg\"></kirby-icon>\n </div>\n }\n @if (title) {\n @if (_insideModal) {\n <h2 class=\"title kirby-text-medium\">{{ title }}</h2>\n } @else {\n <span class=\"title kirby-text-medium\">{{ title }}</span>\n }\n }\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".
|
|
73
|
+
args: [{ selector: 'kirby-empty-state', changeDetection: ChangeDetectionStrategy.OnPush, imports: [IconComponent], template: "<div class=\"message-container\">\n @if (iconName) {\n <div class=\"icon-outline\">\n <kirby-icon [name]=\"iconName\" size=\"lg\"></kirby-icon>\n </div>\n }\n @if (title) {\n @if (_insideModal) {\n <h2 class=\"title kirby-text-medium\">{{ title }}</h2>\n } @else {\n <span class=\"title kirby-text-medium\">{{ title }}</span>\n }\n }\n @if (subtitle) {\n <p class=\"subtitle\">{{ subtitle }}</p>\n }\n <div class=\"content\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".message-container{max-width:330px;margin:auto;display:flex;flex-direction:column;justify-content:center;text-align:center}.icon-outline{width:calc(var(--kirby-spacing-xxl) * 2);height:calc(var(--kirby-spacing-xxl) * 2);margin-left:auto;margin-right:auto;margin-bottom:var(--kirby-spacing-m);display:flex;flex-direction:column;justify-content:center;border:var(--kirby-spacing-xxxs) solid var(--kirby-empty-state-color, var(--kirby-color-content-base-quiet));border-radius:var(--kirby-border-radius-circle)}kirby-icon{color:var(--kirby-empty-state-color, var(--kirby-color-content-base-quiet))}.title{margin-bottom:var(--kirby-spacing-xxs)}p.subtitle{margin-bottom:var(--kirby-spacing-m);white-space:pre-wrap}:host(.success){--kirby-empty-state-color: var(--kirby-color-fill-success-loud)}:host(.warning){--kirby-empty-state-color: var(--kirby-color-fill-warning-loud)}:host(.danger){--kirby-empty-state-color: var(--kirby-color-fill-danger-loud)}:host(.medium){--kirby-empty-state-color: var(--kirby-color-content-base-quiet)}:host(.primary){--kirby-empty-state-color: var(--kirby-primary)}:host(.secondary){--kirby-empty-state-color: var(--kirby-secondary)}:host(.tertiary){--kirby-empty-state-color: var(--kirby-tertiary)}:host(.white-overlay){--kirby-empty-state-color: var(--kirby-white-overlay)}:host(.light){--kirby-empty-state-color: var(--kirby-light)}:host(.dark){--kirby-empty-state-color: var(--kirby-dark)}:host(.dark-overlay){--kirby-empty-state-color: var(--kirby-dark-overlay)}\n"] }]
|
|
63
74
|
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { iconName: [{
|
|
64
75
|
type: Input
|
|
65
76
|
}], title: [{
|
|
66
77
|
type: Input
|
|
67
78
|
}], subtitle: [{
|
|
68
79
|
type: Input
|
|
80
|
+
}], themeColor: [{
|
|
81
|
+
type: Input
|
|
69
82
|
}], slottedButtons: [{
|
|
70
83
|
type: ContentChildren,
|
|
71
84
|
args: [ButtonComponent]
|