@kirbydesign/designsystem 10.6.0-rc.2 → 10.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/README.md +7 -0
  2. package/config/provide-kirby.d.ts +4 -15
  3. package/config/provide-kirby.d.ts.map +1 -1
  4. package/config/public_api.d.ts +1 -1
  5. package/config/public_api.d.ts.map +1 -1
  6. package/fesm2022/kirbydesign-designsystem-action-group.mjs +1 -1
  7. package/fesm2022/kirbydesign-designsystem-action-group.mjs.map +1 -1
  8. package/fesm2022/kirbydesign-designsystem-config.mjs +17 -64
  9. package/fesm2022/kirbydesign-designsystem-config.mjs.map +1 -1
  10. package/fesm2022/kirbydesign-designsystem-dropdown.mjs +1 -1
  11. package/fesm2022/kirbydesign-designsystem-dropdown.mjs.map +1 -1
  12. package/fesm2022/kirbydesign-designsystem-form-field.mjs +6 -2
  13. package/fesm2022/kirbydesign-designsystem-form-field.mjs.map +1 -1
  14. package/fesm2022/kirbydesign-designsystem-item.mjs +30 -10
  15. package/fesm2022/kirbydesign-designsystem-item.mjs.map +1 -1
  16. package/fesm2022/kirbydesign-designsystem-modal.mjs +9 -4
  17. package/fesm2022/kirbydesign-designsystem-modal.mjs.map +1 -1
  18. package/fesm2022/kirbydesign-designsystem-page.mjs +13 -8
  19. package/fesm2022/kirbydesign-designsystem-page.mjs.map +1 -1
  20. package/fesm2022/kirbydesign-designsystem-radio.mjs +2 -2
  21. package/fesm2022/kirbydesign-designsystem-radio.mjs.map +1 -1
  22. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs +1 -1
  23. package/fesm2022/kirbydesign-designsystem-reorder-list.mjs.map +1 -1
  24. package/fesm2022/kirbydesign-designsystem.mjs +7 -1
  25. package/fesm2022/kirbydesign-designsystem.mjs.map +1 -1
  26. package/form-field/directives/decimal-mask/decimal-mask.directive.d.ts +2 -1
  27. package/form-field/directives/decimal-mask/decimal-mask.directive.d.ts.map +1 -1
  28. package/item/item.component.d.ts +13 -3
  29. package/item/item.component.d.ts.map +1 -1
  30. package/lib/kirby.module.d.ts +2 -0
  31. package/lib/kirby.module.d.ts.map +1 -1
  32. package/modal/modal-wrapper/modal-wrapper.component.d.ts.map +1 -1
  33. package/package.json +32 -32
  34. package/page/page.component.d.ts +4 -2
  35. package/page/page.component.d.ts.map +1 -1
  36. package/readme.md +26 -24
package/README.md ADDED
@@ -0,0 +1,7 @@
1
+ # designsystem
2
+
3
+ This library was generated with [Nx](https://nx.dev).
4
+
5
+ ## Running unit tests
6
+
7
+ Run `nx test designsystem` to execute the unit tests.
@@ -1,4 +1,4 @@
1
- import { EnvironmentProviders, InjectionToken, Provider } from '@angular/core';
1
+ import { EnvironmentProviders, InjectionToken } from '@angular/core';
2
2
  /**
3
3
  * Configuration object for global configuration of Kirby.
4
4
  */
@@ -19,20 +19,9 @@ export interface KirbyConfig {
19
19
  */
20
20
  export declare const KIRBY_CONFIG: InjectionToken<KirbyConfig>;
21
21
  /**
22
+ * Sets up top level configuration and providers needed for the Kirby components.
22
23
  *
23
- * @param features - Additional features to be provided to the Kirby environment:
24
- * @see {@link withGlobalSetup} for setting up global configuration.
24
+ * @param config - Optional configuration for the Kirby design system.
25
25
  */
26
- export declare function provideKirby(...features: Provider[] | EnvironmentProviders[]): EnvironmentProviders;
27
- /**
28
- * Sets up global configuration when used with the provideKirby EnvironmentProvider function.
29
- * Should always be called exactly once per application when bootstrapping, to set up Kirby in the browsers runtime.
30
- *
31
- * @param config - (Optional) Additional configuration via the `KirbyConfig` object.
32
- */
33
- export declare function withGlobalSetup(config?: KirbyConfig): EnvironmentProviders;
34
- /**
35
- * Retrieves the global Kirby configuration object from the window object.
36
- */
37
- export declare function getGlobalConfig(): KirbyConfig | undefined;
26
+ export declare function provideKirby(config?: KirbyConfig): EnvironmentProviders;
38
27
  //# sourceMappingURL=provide-kirby.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"provide-kirby.d.ts","sourceRoot":"","sources":["../../config/src/provide-kirby.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAEd,QAAQ,EACT,MAAM,eAAe,CAAC;AAuBvB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,6BAAkD,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,GAAG,QAAQ,EAAE,QAAQ,EAAE,GAAG,oBAAoB,EAAE,GAC/C,oBAAoB,CAetB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAS1E;AAsBD;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,GAAG,SAAS,CAEzD"}
1
+ {"version":3,"file":"provide-kirby.d.ts","sourceRoot":"","sources":["../../config/src/provide-kirby.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,oBAAoB,EACpB,cAAc,EAGf,MAAM,eAAe,CAAC;AAcvB;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAE7B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,6BAAkD,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,oBAAoB,CAoCvE"}
@@ -1,2 +1,2 @@
1
- export { provideKirby, withGlobalSetup, getGlobalConfig, KIRBY_CONFIG, KirbyConfig, } from './provide-kirby';
1
+ export * from './provide-kirby';
2
2
  //# sourceMappingURL=public_api.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../config/src/public_api.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,eAAe,EACf,YAAY,EACZ,WAAW,GACZ,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"public_api.d.ts","sourceRoot":"","sources":["../../config/src/public_api.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
@@ -96,7 +96,7 @@ class ActionGroupComponent {
96
96
  }));
97
97
  }
98
98
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ActionGroupComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: ACTIONGROUP_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
99
- /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ActionGroupComponent, isStandalone: true, selector: "kirby-action-group", inputs: { visibleActions: "visibleActions", align: "align" }, host: { properties: { "class.is-collapsed": "this._isCollapsed", "class": "this._align" } }, queries: [{ propertyName: "buttonElements", predicate: ButtonComponent, read: ElementRef }, { propertyName: "buttons", predicate: ButtonComponent }], viewQueries: [{ propertyName: "hiddenLayer", first: true, predicate: ["hiddenLayer"], descendants: true, read: ElementRef, static: true }, { propertyName: "menuElement", first: true, predicate: MenuComponent, descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-content select=\"button[kirby-button]\"></ng-content>\n\n<kirby-menu [placement]=\"'bottom-end'\">\n <kirby-item\n *ngFor=\"let action of _collapsedActions\"\n [selectable]=\"true\"\n [disabled]=\"action.button?.disabled\"\n (click)=\"onActionSelect(action)\"\n >\n {{ action.text }}\n </kirby-item>\n</kirby-menu>\n\n<div class=\"hidden-layer\" #hiddenLayer></div>\n", styles: [":host{display:flex;position:relative;gap:8px}:host(.align-end){justify-content:flex-end}:host(.align-end) .hidden-layer{order:-1}.hidden-layer{display:none;visibility:hidden}kirby-menu{display:none;z-index:1}:host(.is-collapsed) kirby-menu{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ItemModule }, { kind: "component", type: i2.ItemComponent, selector: "kirby-item", inputs: ["disabled", "selected", "disclosure", "selectable", "reorderable", "size", "rotateIcon"] }, { kind: "component", type: MenuComponent, selector: "kirby-menu", inputs: ["isDisabled", "buttonSize", "placement", "attentionLevel", "triggers", "DOMPortalOutlet", "portalOutletConfig", "autoPlacement", "closeOnSelect", "closeOnEscapeKey", "closeOnBackdrop", "shift", "minWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
99
+ /** @nocollapse */ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: ActionGroupComponent, isStandalone: true, selector: "kirby-action-group", inputs: { visibleActions: "visibleActions", align: "align" }, host: { properties: { "class.is-collapsed": "this._isCollapsed", "class": "this._align" } }, queries: [{ propertyName: "buttonElements", predicate: ButtonComponent, read: ElementRef }, { propertyName: "buttons", predicate: ButtonComponent }], viewQueries: [{ propertyName: "hiddenLayer", first: true, predicate: ["hiddenLayer"], descendants: true, read: ElementRef, static: true }, { propertyName: "menuElement", first: true, predicate: MenuComponent, descendants: true, read: ElementRef, static: true }], usesOnChanges: true, ngImport: i0, template: "<ng-content select=\"button[kirby-button]\"></ng-content>\n\n<kirby-menu [placement]=\"'bottom-end'\">\n <kirby-item\n *ngFor=\"let action of _collapsedActions\"\n [selectable]=\"true\"\n [disabled]=\"action.button?.disabled\"\n (click)=\"onActionSelect(action)\"\n >\n {{ action.text }}\n </kirby-item>\n</kirby-menu>\n\n<div class=\"hidden-layer\" #hiddenLayer></div>\n", styles: [":host{display:flex;position:relative;gap:8px}:host(.align-end){justify-content:flex-end}:host(.align-end) .hidden-layer{order:-1}.hidden-layer{display:none;visibility:hidden}kirby-menu{display:none;z-index:1}:host(.is-collapsed) kirby-menu{display:inline-block}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ItemModule }, { kind: "component", type: i2.ItemComponent, selector: "kirby-item", inputs: ["disabled", "selected", "disclosure", "selectable", "reorderable", "size", "href", "rotateIcon"] }, { kind: "component", type: MenuComponent, selector: "kirby-menu", inputs: ["isDisabled", "buttonSize", "placement", "attentionLevel", "triggers", "DOMPortalOutlet", "portalOutletConfig", "autoPlacement", "closeOnSelect", "closeOnEscapeKey", "closeOnBackdrop", "shift", "minWidth"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
100
100
  }
101
101
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: ActionGroupComponent, decorators: [{
102
102
  type: Component,
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-action-group.mjs","sources":["../../action-group/src/action-group.component.ts","../../action-group/src/action-group.component.html","../../action-group/src/kirbydesign-designsystem-action-group.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n HostBinding,\n Inject,\n InjectionToken,\n Input,\n OnChanges,\n Optional,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport { ItemModule } from '@kirbydesign/designsystem/item';\nimport { MenuComponent } from '@kirbydesign/designsystem/menu';\n\nexport type ActionGroupConfig = {\n isCondensed?: boolean;\n defaultVisibleActions?: number;\n maxVisibleActions?: number;\n};\nexport const ACTIONGROUP_CONFIG = new InjectionToken<ActionGroupConfig>('action-group.config');\n\ntype CollapsedAction = { button: HTMLButtonElement; text: string };\n\n@Component({\n selector: 'kirby-action-group',\n imports: [CommonModule, ButtonComponent, ItemModule, MenuComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './action-group.component.html',\n styleUrls: ['./action-group.component.scss'],\n})\nexport class ActionGroupComponent implements AfterContentInit, OnChanges {\n @Input() visibleActions?: number;\n\n @Input()\n align: 'start' | 'end' = 'end';\n\n @ContentChildren(ButtonComponent, { read: ElementRef }) private buttonElements?: QueryList<\n ElementRef<HTMLButtonElement>\n >;\n @ContentChildren(ButtonComponent) private buttons?: QueryList<ButtonComponent>;\n @ViewChild('hiddenLayer', { read: ElementRef, static: true })\n private hiddenLayer!: ElementRef<HTMLElement>;\n\n @ViewChild(MenuComponent, { read: ElementRef, static: true })\n private menuElement!: ElementRef<HTMLElement>;\n\n @HostBinding('class.is-collapsed')\n _isCollapsed: boolean;\n _collapsedActions: CollapsedAction[] = [];\n\n @HostBinding('class')\n get _align() {\n return 'align-' + this.align;\n }\n\n private collapseThreshold = 2;\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n @Optional() @Inject(ACTIONGROUP_CONFIG) private config: ActionGroupConfig\n ) {}\n\n ngAfterContentInit(): void {\n // Ensure we collapse according to visibleActions if lower than our default threshold (2).\n // I.e. if there are 2 buttons and visibleActions = 1 we'll collapse the 2nd button into the menu:\n if (this.visibleActions < this.collapseThreshold) {\n this.collapseThreshold = this.visibleActions;\n }\n\n this.initializeFromConfig();\n\n if (this.visibleActions !== undefined) {\n this.initializeCollapsing();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.visibleActions && !changes.visibleActions.firstChange) {\n const satifiesMaxVisibleActions =\n this.config?.maxVisibleActions === undefined ||\n this.config?.maxVisibleActions === null ||\n changes.visibleActions.currentValue <= this.config?.maxVisibleActions;\n if (satifiesMaxVisibleActions) {\n this.initializeCollapsing();\n }\n }\n }\n\n onActionSelect(action: CollapsedAction) {\n const event = new PointerEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n });\n\n action.button.dispatchEvent(event);\n }\n\n private initializeFromConfig() {\n if (!this.config) return;\n\n if (this.visibleActions === undefined && this.config.defaultVisibleActions !== undefined) {\n this.visibleActions = this.config.defaultVisibleActions;\n }\n\n if (this.config.maxVisibleActions !== undefined) {\n // Don't overwrite visibleActions value if configured lower than maxVisibleActions:\n if (!(this.visibleActions < this.config.maxVisibleActions)) {\n this.visibleActions = this.config.maxVisibleActions;\n }\n }\n\n if (this.config.isCondensed) {\n this.buttons?.forEach((button) => (button.showIconOnly = true));\n }\n }\n\n private initializeCollapsing() {\n if (this.buttonElements.length <= this.collapseThreshold) return;\n\n this.moveButtons();\n this.populateMenu();\n this.toggleMenu();\n }\n\n private moveButtons() {\n const buttonsToShow = [...this.buttonElements]\n .slice(0, this.visibleActions)\n .filter((btn) => btn.nativeElement.parentElement === this.hiddenLayer.nativeElement);\n buttonsToShow.forEach((button) => {\n this.renderer.insertBefore(\n this.elementRef.nativeElement,\n button.nativeElement,\n this.menuElement.nativeElement\n );\n });\n\n const buttonsToHide = [...this.buttonElements].slice(this.visibleActions);\n buttonsToHide.forEach((button) => {\n this.renderer.appendChild(this.hiddenLayer.nativeElement, button.nativeElement);\n });\n }\n\n private toggleMenu() {\n const hasHiddenButtons = this.hiddenLayer.nativeElement.childElementCount > 0;\n this._isCollapsed = hasHiddenButtons;\n }\n\n private populateMenu() {\n const hiddenButtons = Array.from(\n this.hiddenLayer.nativeElement.children\n ) as HTMLButtonElement[];\n\n this._collapsedActions = hiddenButtons.map((button) => ({\n button,\n text: button.textContent.trim(),\n }));\n }\n}\n","<ng-content select=\"button[kirby-button]\"></ng-content>\n\n<kirby-menu [placement]=\"'bottom-end'\">\n <kirby-item\n *ngFor=\"let action of _collapsedActions\"\n [selectable]=\"true\"\n [disabled]=\"action.button?.disabled\"\n (click)=\"onActionSelect(action)\"\n >\n {{ action.text }}\n </kirby-item>\n</kirby-menu>\n\n<div class=\"hidden-layer\" #hiddenLayer></div>\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-action-group.mjs","sources":["../../action-group/src/action-group.component.ts","../../action-group/src/action-group.component.html","../../action-group/src/kirbydesign-designsystem-action-group.ts"],"sourcesContent":["import { CommonModule } from '@angular/common';\nimport {\n AfterContentInit,\n ChangeDetectionStrategy,\n Component,\n ContentChildren,\n ElementRef,\n HostBinding,\n Inject,\n InjectionToken,\n Input,\n OnChanges,\n Optional,\n QueryList,\n Renderer2,\n SimpleChanges,\n ViewChild,\n} from '@angular/core';\nimport { ButtonComponent } from '@kirbydesign/designsystem/button';\nimport { ItemModule } from '@kirbydesign/designsystem/item';\nimport { MenuComponent } from '@kirbydesign/designsystem/menu';\n\nexport type ActionGroupConfig = {\n isCondensed?: boolean;\n defaultVisibleActions?: number;\n maxVisibleActions?: number;\n};\nexport const ACTIONGROUP_CONFIG = new InjectionToken<ActionGroupConfig>('action-group.config');\n\ntype CollapsedAction = { button: HTMLButtonElement; text: string };\n\n@Component({\n selector: 'kirby-action-group',\n imports: [CommonModule, ButtonComponent, ItemModule, MenuComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './action-group.component.html',\n styleUrls: ['./action-group.component.scss'],\n})\nexport class ActionGroupComponent implements AfterContentInit, OnChanges {\n @Input() visibleActions?: number;\n\n @Input()\n align: 'start' | 'end' = 'end';\n\n @ContentChildren(ButtonComponent, { read: ElementRef }) private buttonElements?: QueryList<\n ElementRef<HTMLButtonElement>\n >;\n @ContentChildren(ButtonComponent) private buttons?: QueryList<ButtonComponent>;\n @ViewChild('hiddenLayer', { read: ElementRef, static: true })\n private hiddenLayer!: ElementRef<HTMLElement>;\n\n @ViewChild(MenuComponent, { read: ElementRef, static: true })\n private menuElement!: ElementRef<HTMLElement>;\n\n @HostBinding('class.is-collapsed')\n _isCollapsed: boolean;\n _collapsedActions: CollapsedAction[] = [];\n\n @HostBinding('class')\n get _align() {\n return 'align-' + this.align;\n }\n\n private collapseThreshold = 2;\n\n constructor(\n private elementRef: ElementRef<HTMLElement>,\n private renderer: Renderer2,\n @Optional() @Inject(ACTIONGROUP_CONFIG) private config: ActionGroupConfig\n ) {}\n\n ngAfterContentInit(): void {\n // Ensure we collapse according to visibleActions if lower than our default threshold (2).\n // I.e. if there are 2 buttons and visibleActions = 1 we'll collapse the 2nd button into the menu:\n if (this.visibleActions < this.collapseThreshold) {\n this.collapseThreshold = this.visibleActions;\n }\n\n this.initializeFromConfig();\n\n if (this.visibleActions !== undefined) {\n this.initializeCollapsing();\n }\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (changes.visibleActions && !changes.visibleActions.firstChange) {\n const satifiesMaxVisibleActions =\n this.config?.maxVisibleActions === undefined ||\n this.config?.maxVisibleActions === null ||\n changes.visibleActions.currentValue <= this.config?.maxVisibleActions;\n if (satifiesMaxVisibleActions) {\n this.initializeCollapsing();\n }\n }\n }\n\n onActionSelect(action: CollapsedAction) {\n const event = new PointerEvent('click', {\n bubbles: true,\n cancelable: true,\n view: window,\n });\n\n action.button.dispatchEvent(event);\n }\n\n private initializeFromConfig() {\n if (!this.config) return;\n\n if (this.visibleActions === undefined && this.config.defaultVisibleActions !== undefined) {\n this.visibleActions = this.config.defaultVisibleActions;\n }\n\n if (this.config.maxVisibleActions !== undefined) {\n // Don't overwrite visibleActions value if configured lower than maxVisibleActions:\n if (!(this.visibleActions < this.config.maxVisibleActions)) {\n this.visibleActions = this.config.maxVisibleActions;\n }\n }\n\n if (this.config.isCondensed) {\n this.buttons?.forEach((button) => (button.showIconOnly = true));\n }\n }\n\n private initializeCollapsing() {\n if (this.buttonElements.length <= this.collapseThreshold) return;\n\n this.moveButtons();\n this.populateMenu();\n this.toggleMenu();\n }\n\n private moveButtons() {\n const buttonsToShow = [...this.buttonElements]\n .slice(0, this.visibleActions)\n .filter((btn) => btn.nativeElement.parentElement === this.hiddenLayer.nativeElement);\n buttonsToShow.forEach((button) => {\n this.renderer.insertBefore(\n this.elementRef.nativeElement,\n button.nativeElement,\n this.menuElement.nativeElement\n );\n });\n\n const buttonsToHide = [...this.buttonElements].slice(this.visibleActions);\n buttonsToHide.forEach((button) => {\n this.renderer.appendChild(this.hiddenLayer.nativeElement, button.nativeElement);\n });\n }\n\n private toggleMenu() {\n const hasHiddenButtons = this.hiddenLayer.nativeElement.childElementCount > 0;\n this._isCollapsed = hasHiddenButtons;\n }\n\n private populateMenu() {\n const hiddenButtons = Array.from(\n this.hiddenLayer.nativeElement.children\n ) as HTMLButtonElement[];\n\n this._collapsedActions = hiddenButtons.map((button) => ({\n button,\n text: button.textContent.trim(),\n }));\n }\n}\n","<ng-content select=\"button[kirby-button]\"></ng-content>\n\n<kirby-menu [placement]=\"'bottom-end'\">\n <kirby-item\n *ngFor=\"let action of _collapsedActions\"\n [selectable]=\"true\"\n [disabled]=\"action.button?.disabled\"\n (click)=\"onActionSelect(action)\"\n >\n {{ action.text }}\n </kirby-item>\n</kirby-menu>\n\n<div class=\"hidden-layer\" #hiddenLayer></div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
2
- import { provideIonicAngular, PopoverController, ModalController as ModalController$1, isPlatform, AnimationController } from '@ionic/angular/standalone';
3
- import { ConfigToken, provideComponentInputBinding, AngularDelegate } from '@ionic/angular/common';
2
+ import { isPlatform, AnimationController, provideIonicAngular } from '@ionic/angular/standalone';
4
3
  import { LoadingOverlayService } from '@kirbydesign/designsystem/loading-overlay';
5
4
  import { ModalController, ActionSheetHelper, ModalHelper, AlertHelper, CanDismissHelper } from '@kirbydesign/designsystem/modal';
6
5
  import { ResizeObserverFactory, ResizeObserverService } from '@kirbydesign/designsystem/shared';
@@ -11,12 +10,12 @@ import { ToastHelper, ToastController } from '@kirbydesign/designsystem/toast';
11
10
  */
12
11
  const KIRBY_CONFIG = new InjectionToken('KIRBY_CONFIG');
13
12
  /**
13
+ * Sets up top level configuration and providers needed for the Kirby components.
14
14
  *
15
- * @param features - Additional features to be provided to the Kirby environment:
16
- * @see {@link withGlobalSetup} for setting up global configuration.
15
+ * @param config - Optional configuration for the Kirby design system.
17
16
  */
18
- function provideKirby(...features) {
19
- return makeEnvironmentProviders([
17
+ function provideKirby(config) {
18
+ const providers = [
20
19
  ModalController,
21
20
  ActionSheetHelper,
22
21
  ModalHelper,
@@ -27,76 +26,30 @@ function provideKirby(...features) {
27
26
  ResizeObserverFactory,
28
27
  ResizeObserverService,
29
28
  CanDismissHelper,
30
- ...patchIonicProviders(),
31
- features,
32
- ]);
33
- }
34
- /**
35
- * Sets up global configuration when used with the provideKirby EnvironmentProvider function.
36
- * Should always be called exactly once per application when bootstrapping, to set up Kirby in the browsers runtime.
37
- *
38
- * @param config - (Optional) Additional configuration via the `KirbyConfig` object.
39
- */
40
- function withGlobalSetup(config) {
41
- setGlobalConfig(config);
42
- const ionicConfig = {
43
- ...getBaseIonicConfig(),
44
- focusManagerPriority: config.focusManager ? ['heading'] : undefined,
45
- };
46
- return makeEnvironmentProviders([provideIonicAngular(ionicConfig)]);
47
- }
48
- /**
49
- * Return same Ionic Angular providers as provideIonicAngular, but exclude the APP_INITIALIZER token.
50
- * https://github.com/ionic-team/ionic-framework/blob/v8.6.1/packages/angular/standalone/src/providers/ionic-angular.ts#L15
51
- * This is to ensure that we only initialize Ionic once in `withGlobalSetup`, where we use provideIonicAngular as intended,
52
- * but still allow other Angular contexts (e.g. Micro Frontends) to call provideKirby to get needed Kirby and Ionic providers in their context.
53
- */
54
- function patchIonicProviders() {
55
- console.log('Patching Ionic', window?.Ionic?.config);
56
- return [
57
- {
58
- provide: ConfigToken,
59
- useValue: { ...getBaseIonicConfig(), ...window?.Ionic?.config },
60
- },
61
- provideComponentInputBinding(),
62
- AngularDelegate,
63
- PopoverController,
64
- ModalController$1,
65
29
  ];
66
- }
67
- /**
68
- * Retrieves the global Kirby configuration object from the window object.
69
- */
70
- function getGlobalConfig() {
71
- return window.__KIRBY_CONFIG__;
72
- }
73
- /**
74
- * Private method to set the global Kirby configuration object on the window object.
75
- *
76
- * @param config - `KirbyConfig` object to configure Kirby globally.
77
- */
78
- function setGlobalConfig(config) {
79
- if (getGlobalConfig()) {
80
- console.warn(`Global Kirby configuration is already provided through withGlobalSetup() elsewhere.
81
- Overwriting the existing configuration at a later time is currently not supported.
82
- Consider removing duplicate calls.`);
83
- }
84
- window.__KIRBY_CONFIG__ = config ?? {};
85
- }
86
- function getBaseIonicConfig() {
30
+ if (config)
31
+ providers.push({ provide: KIRBY_CONFIG, useValue: config });
87
32
  const shouldHaveNoopAnimation = !isPlatform('hybrid');
33
+ // A no-op animation is parsed here when we are not on a native device,
34
+ // to disable animation between pages on desktop browsers.
88
35
  const navAnimationConfig = shouldHaveNoopAnimation && {
89
36
  navAnimation: () => new AnimationController().create(),
90
37
  };
91
- return {
38
+ const ionicConfig = {
92
39
  mode: 'ios',
93
40
  ...navAnimationConfig,
94
41
  };
42
+ if (config?.focusManager) {
43
+ ionicConfig.focusManagerPriority = ['heading'];
44
+ }
45
+ // Provide both Kirby and Ionic config as environment providers,
46
+ // to avoid multiple conflicting configurations of global options.
47
+ return makeEnvironmentProviders([...providers, provideIonicAngular(ionicConfig)]);
95
48
  }
96
49
 
97
50
  /**
98
51
  * Generated bundle index. Do not edit.
99
52
  */
100
53
 
101
- export { KIRBY_CONFIG, getGlobalConfig, provideKirby, withGlobalSetup };
54
+ export { KIRBY_CONFIG, provideKirby };
102
55
  //# sourceMappingURL=kirbydesign-designsystem-config.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"kirbydesign-designsystem-config.mjs","sources":["../../config/src/provide-kirby.ts","../../config/src/kirbydesign-designsystem-config.ts"],"sourcesContent":["import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { AnimationController, isPlatform, provideIonicAngular } from '@ionic/angular/standalone';\nimport { provideComponentInputBinding } from '@ionic/angular/common';\nimport {\n ModalController as IonModalController,\n PopoverController as IonPopoverController,\n} from '@ionic/angular/standalone';\nimport {\n AngularDelegate as IonAngularDelegate,\n ConfigToken as IonConfigToken,\n} from '@ionic/angular/common';\nimport type { IonicConfig } from '@ionic/core';\nimport { LoadingOverlayService } from '@kirbydesign/designsystem/loading-overlay';\nimport {\n ActionSheetHelper,\n AlertHelper,\n CanDismissHelper,\n ModalController,\n ModalHelper,\n} from '@kirbydesign/designsystem/modal';\nimport { ResizeObserverFactory, ResizeObserverService } from '@kirbydesign/designsystem/shared';\nimport { ToastController, ToastHelper } from '@kirbydesign/designsystem/toast';\n\n/**\n * Configuration object for global configuration of Kirby.\n */\nexport interface KirbyConfig {\n moduleRootRoutePath?: string;\n\n /**\n * Activate focus management for components rendered in a kirby-router-outlet.\n * When a kirby-page enters the view, focus will be set to the pages primary heading (h1) inside the pages toolbar.\n */\n focusManager?: boolean;\n\n /**\n * Set the HTML documents title to match the title of any kirby-page entering the view.\n */\n setHtmlDocTitle?: boolean;\n}\n\n/**\n * Injection token for provided Kirby configuration.\n */\nexport const KIRBY_CONFIG = new InjectionToken<KirbyConfig>('KIRBY_CONFIG');\n\n/**\n *\n * @param features - Additional features to be provided to the Kirby environment:\n * @see {@link withGlobalSetup} for setting up global configuration.\n */\nexport function provideKirby(\n ...features: Provider[] | EnvironmentProviders[]\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n ModalController,\n ActionSheetHelper,\n ModalHelper,\n AlertHelper,\n ToastHelper,\n ToastController,\n LoadingOverlayService,\n ResizeObserverFactory,\n ResizeObserverService,\n CanDismissHelper,\n ...patchIonicProviders(),\n features,\n ]);\n}\n\n/**\n * Sets up global configuration when used with the provideKirby EnvironmentProvider function.\n * Should always be called exactly once per application when bootstrapping, to set up Kirby in the browsers runtime.\n *\n * @param config - (Optional) Additional configuration via the `KirbyConfig` object.\n */\nexport function withGlobalSetup(config?: KirbyConfig): EnvironmentProviders {\n setGlobalConfig(config);\n\n const ionicConfig: IonicConfig = {\n ...getBaseIonicConfig(),\n focusManagerPriority: config.focusManager ? ['heading'] : undefined,\n };\n\n return makeEnvironmentProviders([provideIonicAngular(ionicConfig)]);\n}\n\n/**\n * Return same Ionic Angular providers as provideIonicAngular, but exclude the APP_INITIALIZER token.\n * https://github.com/ionic-team/ionic-framework/blob/v8.6.1/packages/angular/standalone/src/providers/ionic-angular.ts#L15\n * This is to ensure that we only initialize Ionic once in `withGlobalSetup`, where we use provideIonicAngular as intended,\n * but still allow other Angular contexts (e.g. Micro Frontends) to call provideKirby to get needed Kirby and Ionic providers in their context.\n */\nfunction patchIonicProviders(): Provider[] {\n console.log('Patching Ionic', (window as any)?.Ionic?.config);\n return [\n {\n provide: IonConfigToken,\n useValue: { ...getBaseIonicConfig(), ...(window as any)?.Ionic?.config },\n },\n provideComponentInputBinding(),\n IonAngularDelegate,\n IonPopoverController,\n IonModalController,\n ];\n}\n\n/**\n * Retrieves the global Kirby configuration object from the window object.\n */\nexport function getGlobalConfig(): KirbyConfig | undefined {\n return (window as any).__KIRBY_CONFIG__ as KirbyConfig | undefined;\n}\n\n/**\n * Private method to set the global Kirby configuration object on the window object.\n *\n * @param config - `KirbyConfig` object to configure Kirby globally.\n */\nfunction setGlobalConfig(config: KirbyConfig | undefined): void {\n if (getGlobalConfig()) {\n console.warn(\n `Global Kirby configuration is already provided through withGlobalSetup() elsewhere. \nOverwriting the existing configuration at a later time is currently not supported. \nConsider removing duplicate calls.`\n );\n }\n\n (window as any).__KIRBY_CONFIG__ = config ?? {};\n}\n\nfunction getBaseIonicConfig(): IonicConfig {\n const shouldHaveNoopAnimation = !isPlatform('hybrid');\n const navAnimationConfig: IonicConfig = shouldHaveNoopAnimation && {\n navAnimation: () => new AnimationController().create(),\n };\n\n return {\n mode: 'ios',\n ...navAnimationConfig,\n };\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["IonConfigToken","IonAngularDelegate","IonPopoverController","IonModalController"],"mappings":";;;;;;;;AA8CA;;AAEG;MACU,YAAY,GAAG,IAAI,cAAc,CAAc,cAAc;AAE1E;;;;AAIG;AACa,SAAA,YAAY,CAC1B,GAAG,QAA6C,EAAA;AAEhD,IAAA,OAAO,wBAAwB,CAAC;QAC9B,eAAe;QACf,iBAAiB;QACjB,WAAW;QACX,WAAW;QACX,WAAW;QACX,eAAe;QACf,qBAAqB;QACrB,qBAAqB;QACrB,qBAAqB;QACrB,gBAAgB;AAChB,QAAA,GAAG,mBAAmB,EAAE;QACxB,QAAQ;AACT,KAAA,CAAC;AACJ;AAEA;;;;;AAKG;AACG,SAAU,eAAe,CAAC,MAAoB,EAAA;IAClD,eAAe,CAAC,MAAM,CAAC;AAEvB,IAAA,MAAM,WAAW,GAAgB;AAC/B,QAAA,GAAG,kBAAkB,EAAE;AACvB,QAAA,oBAAoB,EAAE,MAAM,CAAC,YAAY,GAAG,CAAC,SAAS,CAAC,GAAG,SAAS;KACpE;IAED,OAAO,wBAAwB,CAAC,CAAC,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;AACrE;AAEA;;;;;AAKG;AACH,SAAS,mBAAmB,GAAA;IAC1B,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAG,MAAc,EAAE,KAAK,EAAE,MAAM,CAAC;IAC7D,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAEA,WAAc;AACvB,YAAA,QAAQ,EAAE,EAAE,GAAG,kBAAkB,EAAE,EAAE,GAAI,MAAc,EAAE,KAAK,EAAE,MAAM,EAAE;AACzE,SAAA;AACD,QAAA,4BAA4B,EAAE;QAC9BC,eAAkB;QAClBC,iBAAoB;QACpBC,iBAAkB;KACnB;AACH;AAEA;;AAEG;SACa,eAAe,GAAA;IAC7B,OAAQ,MAAc,CAAC,gBAA2C;AACpE;AAEA;;;;AAIG;AACH,SAAS,eAAe,CAAC,MAA+B,EAAA;IACtD,IAAI,eAAe,EAAE,EAAE;QACrB,OAAO,CAAC,IAAI,CACV,CAAA;;AAE6B,kCAAA,CAAA,CAC9B;;AAGF,IAAA,MAAc,CAAC,gBAAgB,GAAG,MAAM,IAAI,EAAE;AACjD;AAEA,SAAS,kBAAkB,GAAA;AACzB,IAAA,MAAM,uBAAuB,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;IACrD,MAAM,kBAAkB,GAAgB,uBAAuB,IAAI;QACjE,YAAY,EAAE,MAAM,IAAI,mBAAmB,EAAE,CAAC,MAAM,EAAE;KACvD;IAED,OAAO;AACL,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,GAAG,kBAAkB;KACtB;AACH;;AClJA;;AAEG;;;;"}
1
+ {"version":3,"file":"kirbydesign-designsystem-config.mjs","sources":["../../config/src/provide-kirby.ts","../../config/src/kirbydesign-designsystem-config.ts"],"sourcesContent":["import {\n EnvironmentProviders,\n InjectionToken,\n makeEnvironmentProviders,\n Provider,\n} from '@angular/core';\nimport { AnimationController, isPlatform, provideIonicAngular } from '@ionic/angular/standalone';\nimport type { IonicConfig } from '@ionic/core';\nimport { LoadingOverlayService } from '@kirbydesign/designsystem/loading-overlay';\nimport {\n ActionSheetHelper,\n AlertHelper,\n CanDismissHelper,\n ModalController,\n ModalHelper,\n} from '@kirbydesign/designsystem/modal';\nimport { ResizeObserverFactory, ResizeObserverService } from '@kirbydesign/designsystem/shared';\nimport { ToastController, ToastHelper } from '@kirbydesign/designsystem/toast';\n\n/**\n * Configuration object for global configuration of Kirby.\n */\nexport interface KirbyConfig {\n moduleRootRoutePath?: string;\n\n /**\n * Activate focus management for components rendered in a kirby-router-outlet.\n * When a kirby-page enters the view, focus will be set to the pages primary heading (h1) inside the pages toolbar.\n */\n focusManager?: boolean;\n\n /**\n * Set the HTML documents title to match the title of any kirby-page entering the view.\n */\n setHtmlDocTitle?: boolean;\n}\n\n/**\n * Injection token for provided Kirby configuration.\n */\nexport const KIRBY_CONFIG = new InjectionToken<KirbyConfig>('KIRBY_CONFIG');\n\n/**\n * Sets up top level configuration and providers needed for the Kirby components.\n *\n * @param config - Optional configuration for the Kirby design system.\n */\nexport function provideKirby(config?: KirbyConfig): EnvironmentProviders {\n const providers: Provider[] = [\n ModalController,\n ActionSheetHelper,\n ModalHelper,\n AlertHelper,\n ToastHelper,\n ToastController,\n LoadingOverlayService,\n ResizeObserverFactory,\n ResizeObserverService,\n CanDismissHelper,\n ];\n\n if (config) providers.push({ provide: KIRBY_CONFIG, useValue: config });\n\n const shouldHaveNoopAnimation = !isPlatform('hybrid');\n\n // A no-op animation is parsed here when we are not on a native device,\n // to disable animation between pages on desktop browsers.\n const navAnimationConfig: IonicConfig = shouldHaveNoopAnimation && {\n navAnimation: () => new AnimationController().create(),\n };\n\n const ionicConfig: IonicConfig = {\n mode: 'ios',\n ...navAnimationConfig,\n };\n\n if (config?.focusManager) {\n ionicConfig.focusManagerPriority = ['heading'];\n }\n\n // Provide both Kirby and Ionic config as environment providers,\n // to avoid multiple conflicting configurations of global options.\n return makeEnvironmentProviders([...providers, provideIonicAngular(ionicConfig)]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;;;AAqCA;;AAEG;MACU,YAAY,GAAG,IAAI,cAAc,CAAc,cAAc;AAE1E;;;;AAIG;AACG,SAAU,YAAY,CAAC,MAAoB,EAAA;AAC/C,IAAA,MAAM,SAAS,GAAe;QAC5B,eAAe;QACf,iBAAiB;QACjB,WAAW;QACX,WAAW;QACX,WAAW;QACX,eAAe;QACf,qBAAqB;QACrB,qBAAqB;QACrB,qBAAqB;QACrB,gBAAgB;KACjB;AAED,IAAA,IAAI,MAAM;AAAE,QAAA,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;AAEvE,IAAA,MAAM,uBAAuB,GAAG,CAAC,UAAU,CAAC,QAAQ,CAAC;;;IAIrD,MAAM,kBAAkB,GAAgB,uBAAuB,IAAI;QACjE,YAAY,EAAE,MAAM,IAAI,mBAAmB,EAAE,CAAC,MAAM,EAAE;KACvD;AAED,IAAA,MAAM,WAAW,GAAgB;AAC/B,QAAA,IAAI,EAAE,KAAK;AACX,QAAA,GAAG,kBAAkB;KACtB;AAED,IAAA,IAAI,MAAM,EAAE,YAAY,EAAE;AACxB,QAAA,WAAW,CAAC,oBAAoB,GAAG,CAAC,SAAS,CAAC;;;;AAKhD,IAAA,OAAO,wBAAwB,CAAC,CAAC,GAAG,SAAS,EAAE,mBAAmB,CAAC,WAAW,CAAC,CAAC,CAAC;AACnF;;ACnFA;;AAEG;;;;"}
@@ -526,7 +526,7 @@ class DropdownComponent {
526
526
  useExisting: forwardRef((() => DropdownComponent)),
527
527
  multi: true,
528
528
  },
529
- ], 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 [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n type=\"button\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<ng-container *ngTemplateOutlet=\"usePopover ? popoverTemplate : itemWrapperTemplate\"></ng-container>\n\n<ng-template #popoverTemplate>\n <kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n >\n <ng-container *ngTemplateOutlet=\"itemWrapperTemplate\"></ng-container>\n </kirby-popover>\n</ng-template>\n\n<ng-template #itemWrapperTemplate>\n <kirby-card>\n <ng-container *ngFor=\"let item of items; 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 </ng-container>\n </kirby-card>\n</ng-template>\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 role=\"option\"\n >\n <!-- Tabindex fixes issue with popover dropdown not working in safari -->\n <p class=\"kirby-item-title\" tabindex=\"0\">{{ getTextFromItem(item) }}</p>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n </kirby-item>\n</ng-template>\n", styles: ["@media (hover: hover) and (pointer: fine){:host{outline:none;border-radius:999px}:host:focus{transition:all 80ms linear 0ms;box-shadow:0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{display:inline-block;position:relative;max-width:calc(100vw - 32px)}:host.clicked{box-shadow:none}:host.expand{display:block}:host.expand kirby-card{width:100%;min-width:initial;max-width:initial}:host.error>button,:host.ng-touched.ng-invalid>button{border-color:var(--kirby-danger)}:host>button{position:relative;margin:0;outline:none;width:100%;min-width:0}:host>button.attention-level2{border:1px solid transparent}:host>button .text{overflow:hidden;text-overflow:ellipsis}:host kirby-card{display:none;opacity:0;position:absolute;z-index:800}:host.is-opening kirby-card{display:block}:host.is-open kirby-card{display:block;opacity:1}:host.is-open>button{box-shadow:0 0 5px #1c1c1c0a,0 10px 15px -10px #1c1c1c26}:host.popout-left kirby-card{right:0}:host.popout-up kirby-card{top:0;margin-top:-4px;transform:translateY(-100%)}:host.popout-up.is-open>button{z-index:801}kirby-popover{--max-height: 352px}kirby-card{max-height:352px;margin-block:4px;overflow-y:auto;box-shadow:0 0 5px #1c1c1c0a,0 10px 15px -10px #1c1c1c26;max-width:calc(100vw - 32px);min-width:288px}@media (min-width: 321px){kirby-card{min-width:343px}}@media (hover: hover){:host-context(kirby-calendar)>button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}:host-context(kirby-calendar)>button:active,:host-context(kirby-calendar)>button.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}:host-context(kirby-calendar)>button{border-color:transparent;font-weight:700;font-size:initial}:host-context(kirby-calendar).is-open>button{box-shadow:none}\n"], dependencies: [{ kind: "component", type: i3.CardComponent, selector: "kirby-card", inputs: ["title", "subtitle", "backgroundImageUrl", "hasPadding", "sizes", "variant"] }, { kind: "component", type: i4.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "component", type: i5.ItemComponent, selector: "kirby-item", inputs: ["disabled", "selected", "disclosure", "selectable", "reorderable", "size", "rotateIcon"] }, { kind: "component", type: i6.PopoverComponent, selector: "kirby-popover", inputs: ["popout", "target"], outputs: ["willHide"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
529
+ ], 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 [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n type=\"button\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<ng-container *ngTemplateOutlet=\"usePopover ? popoverTemplate : itemWrapperTemplate\"></ng-container>\n\n<ng-template #popoverTemplate>\n <kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n >\n <ng-container *ngTemplateOutlet=\"itemWrapperTemplate\"></ng-container>\n </kirby-popover>\n</ng-template>\n\n<ng-template #itemWrapperTemplate>\n <kirby-card>\n <ng-container *ngFor=\"let item of items; 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 </ng-container>\n </kirby-card>\n</ng-template>\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 role=\"option\"\n >\n <!-- Tabindex fixes issue with popover dropdown not working in safari -->\n <p class=\"kirby-item-title\" tabindex=\"0\">{{ getTextFromItem(item) }}</p>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\n </kirby-item>\n</ng-template>\n", styles: ["@media (hover: hover) and (pointer: fine){:host{outline:none;border-radius:999px}:host:focus{transition:all 80ms linear 0ms;box-shadow:0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}:host:focus:not(:focus-visible){box-shadow:0 0 0 0 transparent}:host:focus-visible{transition:all 80ms linear 0ms;box-shadow:0 0 0 2px var(--kirby-background-color),0 0 0 4px #4d90fe}}:host{display:inline-block;position:relative;max-width:calc(100vw - 32px)}:host.clicked{box-shadow:none}:host.expand{display:block}:host.expand kirby-card{width:100%;min-width:initial;max-width:initial}:host.error>button,:host.ng-touched.ng-invalid>button{border-color:var(--kirby-danger)}:host>button{position:relative;margin:0;outline:none;width:100%;min-width:0}:host>button.attention-level2{border:1px solid transparent}:host>button .text{overflow:hidden;text-overflow:ellipsis}:host kirby-card{display:none;opacity:0;position:absolute;z-index:800}:host.is-opening kirby-card{display:block}:host.is-open kirby-card{display:block;opacity:1}:host.is-open>button{box-shadow:0 0 5px #1c1c1c0a,0 10px 15px -10px #1c1c1c26}:host.popout-left kirby-card{right:0}:host.popout-up kirby-card{top:0;margin-top:-4px;transform:translateY(-100%)}:host.popout-up.is-open>button{z-index:801}kirby-popover{--max-height: 352px}kirby-card{max-height:352px;margin-block:4px;overflow-y:auto;box-shadow:0 0 5px #1c1c1c0a,0 10px 15px -10px #1c1c1c26;max-width:calc(100vw - 32px);min-width:288px}@media (min-width: 321px){kirby-card{min-width:343px}}@media (hover: hover){:host-context(kirby-calendar)>button:hover{--state-layer-opacity: .08;--state-layer-background-color: var(--kirby-black);cursor:pointer}}:host-context(kirby-calendar)>button:active,:host-context(kirby-calendar)>button.interaction-state-active{--state-layer-opacity: .16;--state-layer-background-color: var(--kirby-black)}:host-context(kirby-calendar)>button{border-color:transparent;font-weight:700;font-size:initial}:host-context(kirby-calendar).is-open>button{box-shadow:none}\n"], dependencies: [{ kind: "component", type: i3.CardComponent, selector: "kirby-card", inputs: ["title", "subtitle", "backgroundImageUrl", "hasPadding", "sizes", "variant"] }, { kind: "component", type: i4.IconComponent, selector: "kirby-icon", inputs: ["size", "name"] }, { kind: "component", type: i5.ItemComponent, selector: "kirby-item", inputs: ["disabled", "selected", "disclosure", "selectable", "reorderable", "size", "href", "rotateIcon"] }, { kind: "component", type: i6.PopoverComponent, selector: "kirby-popover", inputs: ["popout", "target"], outputs: ["willHide"] }, { kind: "component", type: i7.ButtonComponent, selector: "button[kirby-button],Button[kirby-button],a[kirby-button]", inputs: ["attentionLevel", "noDecoration", "themeColor", "expand", "isFloating", "size", "showIconOnly"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
530
530
  }
531
531
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DropdownComponent, decorators: [{
532
532
  type: Component,
@@ -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\nexport enum VerticalDirection {\n up,\n down,\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 { DesignTokenHelper } 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 { EventListenerDisposeFn } from '@kirbydesign/designsystem/types';\nimport { ResizeObserverService } from '@kirbydesign/designsystem/shared';\n\nimport { OpenState, VerticalDirection } 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 ],\n standalone: false,\n})\nexport class DropdownComponent implements AfterViewInit, OnDestroy, ControlValueAccessor {\n static readonly OPEN_DELAY_IN_MS = 100;\n private state = OpenState.closed;\n private horizontalDirection: HorizontalDirection | `${HorizontalDirection}` =\n HorizontalDirection.right;\n private verticalDirection: VerticalDirection | `${VerticalDirection}` = VerticalDirection.down;\n\n private _items: string[] | any[] = [];\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 = -1;\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.horizontalDirection = direction || HorizontalDirection.right;\n }\n\n get popout() {\n return this.horizontalDirection;\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 @HostBinding('class.error')\n @Input()\n hasError: boolean;\n\n @Input()\n size: 'sm' | 'md' = 'md';\n\n @Input()\n tabindex = 0;\n\n @HostBinding('class.with-popover')\n @Input()\n usePopover = false;\n\n @HostBinding('attr.tabindex')\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('attr.role')\n _role = 'listbox';\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 @HostBinding('class.popout-left')\n get _popoutLeft() {\n return this.horizontalDirection === HorizontalDirection.left;\n }\n\n @HostBinding('class.popout-up')\n get _popoutUp() {\n return this.verticalDirection === VerticalDirection.up;\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 @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.itemClickUnlisten?.length > 0;\n if (hasSlottedItems) {\n this.unlistenAllSlottedItems();\n }\n\n // Setup a click listener for each new slotted items\n kirbyItems.forEach((kirbyItem, index) => {\n this.renderer.setAttribute(kirbyItem.nativeElement, 'role', 'option');\n const unlisten: EventListenerDisposeFn = this.renderer.listen(\n kirbyItem.nativeElement,\n 'click',\n () => {\n this.onItemSelect(index);\n }\n );\n\n this.itemClickUnlisten.push(unlisten);\n });\n\n this._kirbyItemsSlotted = kirbyItems;\n }\n\n get kirbyItemsSlotted(): QueryList<ElementRef<HTMLElement>> {\n return this._kirbyItemsSlotted;\n }\n\n private itemClickUnlisten: EventListenerDisposeFn[] = [];\n private intersectionObserverRef: IntersectionObserver;\n private showDropdownTimeoutId: ReturnType<typeof setTimeout>;\n\n constructor(\n private renderer: Renderer2,\n private elementRef: ElementRef<HTMLElement>,\n private changeDetectorRef: 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 if (!this.isOpen) {\n this.elementRef.nativeElement.focus();\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 onButtonMouseEvent(event: Event) {\n // Prevent button focus;\n event.preventDefault();\n }\n\n /* Utility that makes it easier to set styles on card element\n when using popover*/\n private setPopoverCardStyle(style: string, value: string) {\n if (!this.usePopover) return;\n\n this.renderer.setStyle(\n this.cardElement.nativeElement,\n style,\n value,\n RendererStyleFlags2.DashCase\n );\n }\n\n ngAfterViewInit() {\n if (this.usePopover && 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.initializeAlignment();\n }\n\n private initializeAlignment() {\n if (this.usePopover) return;\n if (!this.intersectionObserverRef) {\n // Get the design token size of the button. In the button stylesheet a medium button height is utils.size(xl)\n // and a small button height is utils.size(\"l\")\n const designTokenSizeHeight = this.size === 'md' ? 'xl' : 'l';\n\n // Setting the rootMargin equal to the height of the button\n // allows the Intersection Observer Callback to be called\n // even if the dropdown button is intersecting with the viewport\n const options = {\n rootMargin: DesignTokenHelper.size(designTokenSizeHeight),\n };\n const callback: IntersectionObserverCallback = (entries) => {\n // Only apply alignment when opening:\n if (this.state !== OpenState.opening) {\n return;\n }\n\n // Cancel any pending timer to show dropdown:\n clearTimeout(this.showDropdownTimeoutId);\n const entry = entries[0];\n const isVisible = entry.boundingClientRect.width > 0;\n if (isVisible && entry.intersectionRatio < 1) {\n this.setHorizontalDirection(entry);\n this.setVerticalDirection(entry);\n }\n this.showDropdown();\n this.changeDetectorRef.detectChanges();\n };\n this.intersectionObserverRef = new IntersectionObserver(callback, options);\n this.intersectionObserverRef.observe(this.cardElement.nativeElement);\n }\n }\n\n private setHorizontalDirection(entry: IntersectionObserverEntry) {\n // If popout direction is set to right, and the entry is cut off to the right by ${entry.boundingClientRect.right - entry.intersectionRect.right}px\n // it is set to popout left instead, and vice versa for popout direction left\n if (this.horizontalDirection === HorizontalDirection.right) {\n if (entry.boundingClientRect.right > entry.rootBounds.right) {\n this.horizontalDirection = HorizontalDirection.left;\n }\n } else {\n if (entry.boundingClientRect.left < entry.rootBounds.left) {\n this.horizontalDirection = HorizontalDirection.right;\n }\n }\n }\n\n private setVerticalDirection(entry: IntersectionObserverEntry) {\n if (entry.boundingClientRect.top < 0) {\n // entry is cut off at the top by ${entry.boundingClientRect.top}px\n // open downwards:\n this.verticalDirection = VerticalDirection.down;\n }\n if (entry.boundingClientRect.bottom > entry.rootBounds.bottom) {\n // entry is cut off at the bottom by ${entry.boundingClientRect.bottom - entry.intersectionRect.bottom}px\n const containerOffsetTop = this.elementRef.nativeElement.getBoundingClientRect().top;\n const SPACING = 5; //TODO: Get from SCSS\n // Check if the card can fit on top of button:\n if (containerOffsetTop > entry.target.clientHeight + SPACING) {\n // open upwards:\n this.verticalDirection = VerticalDirection.up;\n }\n }\n }\n\n open() {\n if (this.disabled) {\n return;\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 this.showDropdownTimeoutId = setTimeout(\n () => this.showDropdown(),\n DropdownComponent.OPEN_DELAY_IN_MS\n );\n\n // Move focus to selected item (if any)\n this.focusedIndex = this.selectedIndex;\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.selectedIndex);\n this.changeDetectorRef.markForCheck();\n }\n }\n\n close() {\n if (this.disabled) {\n return;\n }\n if (this.isOpen) {\n this.state = OpenState.closed;\n // Reset vertical direction to default\n this.verticalDirection = VerticalDirection.down;\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 }\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 }\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', ['$event'])\n _onTab(event: KeyboardEvent) {\n if (this.isOpen) {\n event.preventDefault();\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 @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 @HostListener('focus')\n _onFocus() {\n if (this.disabled) {\n this.elementRef.nativeElement.blur();\n }\n }\n\n _onPopoverWillHide() {\n this.state = OpenState.closed;\n this.elementRef.nativeElement.focus();\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.escape')\n _onEnterOrEscape() {\n this.close();\n this._onTouched();\n }\n\n _onPopoverClick() {\n this.close();\n }\n\n @HostListener('blur', ['$event'])\n _onBlur() {\n if (this.usePopover) return;\n this.close();\n this._onTouched();\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\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 (this.selectedIndex < 0) {\n switch (event.key) {\n case 'ArrowUp':\n this.focusedIndex = this.items.length - 1;\n break;\n case 'ArrowDown':\n this.focusedIndex = 0;\n break;\n default:\n break;\n }\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\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\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) return;\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 unlistenAllSlottedItems() {\n let unlistenItem: () => void;\n while ((unlistenItem = this.itemClickUnlisten.pop()) !== undefined) {\n unlistenItem();\n }\n }\n\n ngOnDestroy(): void {\n this.unlistenAllSlottedItems();\n this.resizeObserverService.unobserve(this.elementRef);\n if (this.intersectionObserverRef) {\n this.intersectionObserverRef.disconnect();\n }\n }\n}\n","<button\n kirby-button\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n type=\"button\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<ng-container *ngTemplateOutlet=\"usePopover ? popoverTemplate : itemWrapperTemplate\"></ng-container>\n\n<ng-template #popoverTemplate>\n <kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n >\n <ng-container *ngTemplateOutlet=\"itemWrapperTemplate\"></ng-container>\n </kirby-popover>\n</ng-template>\n\n<ng-template #itemWrapperTemplate>\n <kirby-card>\n <ng-container *ngFor=\"let item of items; 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 </ng-container>\n </kirby-card>\n</ng-template>\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 role=\"option\"\n >\n <!-- Tabindex fixes issue with popover dropdown not working in safari -->\n <p class=\"kirby-item-title\" tabindex=\"0\">{{ getTextFromItem(item) }}</p>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\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 { FormFieldModule } from '@kirbydesign/designsystem/form-field';\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\nconst declarations = [DropdownComponent];\n\n@NgModule({\n imports: [\n CardModule,\n IconModule,\n ItemModule,\n FormFieldModule,\n PopoverComponent,\n ButtonComponent,\n CommonModule,\n ListModule,\n ],\n declarations: [...declarations],\n exports: [...declarations, 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\nexport enum VerticalDirection {\n up,\n down,\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 { DesignTokenHelper } 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 { EventListenerDisposeFn } from '@kirbydesign/designsystem/types';\nimport { ResizeObserverService } from '@kirbydesign/designsystem/shared';\n\nimport { OpenState, VerticalDirection } 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 ],\n standalone: false,\n})\nexport class DropdownComponent implements AfterViewInit, OnDestroy, ControlValueAccessor {\n static readonly OPEN_DELAY_IN_MS = 100;\n private state = OpenState.closed;\n private horizontalDirection: HorizontalDirection | `${HorizontalDirection}` =\n HorizontalDirection.right;\n private verticalDirection: VerticalDirection | `${VerticalDirection}` = VerticalDirection.down;\n\n private _items: string[] | any[] = [];\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 = -1;\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.horizontalDirection = direction || HorizontalDirection.right;\n }\n\n get popout() {\n return this.horizontalDirection;\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 @HostBinding('class.error')\n @Input()\n hasError: boolean;\n\n @Input()\n size: 'sm' | 'md' = 'md';\n\n @Input()\n tabindex = 0;\n\n @HostBinding('class.with-popover')\n @Input()\n usePopover = false;\n\n @HostBinding('attr.tabindex')\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('attr.role')\n _role = 'listbox';\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 @HostBinding('class.popout-left')\n get _popoutLeft() {\n return this.horizontalDirection === HorizontalDirection.left;\n }\n\n @HostBinding('class.popout-up')\n get _popoutUp() {\n return this.verticalDirection === VerticalDirection.up;\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 @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.itemClickUnlisten?.length > 0;\n if (hasSlottedItems) {\n this.unlistenAllSlottedItems();\n }\n\n // Setup a click listener for each new slotted items\n kirbyItems.forEach((kirbyItem, index) => {\n this.renderer.setAttribute(kirbyItem.nativeElement, 'role', 'option');\n const unlisten: EventListenerDisposeFn = this.renderer.listen(\n kirbyItem.nativeElement,\n 'click',\n () => {\n this.onItemSelect(index);\n }\n );\n\n this.itemClickUnlisten.push(unlisten);\n });\n\n this._kirbyItemsSlotted = kirbyItems;\n }\n\n get kirbyItemsSlotted(): QueryList<ElementRef<HTMLElement>> {\n return this._kirbyItemsSlotted;\n }\n\n private itemClickUnlisten: EventListenerDisposeFn[] = [];\n private intersectionObserverRef: IntersectionObserver;\n private showDropdownTimeoutId: ReturnType<typeof setTimeout>;\n\n constructor(\n private renderer: Renderer2,\n private elementRef: ElementRef<HTMLElement>,\n private changeDetectorRef: 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 if (!this.isOpen) {\n this.elementRef.nativeElement.focus();\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 onButtonMouseEvent(event: Event) {\n // Prevent button focus;\n event.preventDefault();\n }\n\n /* Utility that makes it easier to set styles on card element\n when using popover*/\n private setPopoverCardStyle(style: string, value: string) {\n if (!this.usePopover) return;\n\n this.renderer.setStyle(\n this.cardElement.nativeElement,\n style,\n value,\n RendererStyleFlags2.DashCase\n );\n }\n\n ngAfterViewInit() {\n if (this.usePopover && 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.initializeAlignment();\n }\n\n private initializeAlignment() {\n if (this.usePopover) return;\n if (!this.intersectionObserverRef) {\n // Get the design token size of the button. In the button stylesheet a medium button height is utils.size(xl)\n // and a small button height is utils.size(\"l\")\n const designTokenSizeHeight = this.size === 'md' ? 'xl' : 'l';\n\n // Setting the rootMargin equal to the height of the button\n // allows the Intersection Observer Callback to be called\n // even if the dropdown button is intersecting with the viewport\n const options = {\n rootMargin: DesignTokenHelper.size(designTokenSizeHeight),\n };\n const callback: IntersectionObserverCallback = (entries) => {\n // Only apply alignment when opening:\n if (this.state !== OpenState.opening) {\n return;\n }\n\n // Cancel any pending timer to show dropdown:\n clearTimeout(this.showDropdownTimeoutId);\n const entry = entries[0];\n const isVisible = entry.boundingClientRect.width > 0;\n if (isVisible && entry.intersectionRatio < 1) {\n this.setHorizontalDirection(entry);\n this.setVerticalDirection(entry);\n }\n this.showDropdown();\n this.changeDetectorRef.detectChanges();\n };\n this.intersectionObserverRef = new IntersectionObserver(callback, options);\n this.intersectionObserverRef.observe(this.cardElement.nativeElement);\n }\n }\n\n private setHorizontalDirection(entry: IntersectionObserverEntry) {\n // If popout direction is set to right, and the entry is cut off to the right by ${entry.boundingClientRect.right - entry.intersectionRect.right}px\n // it is set to popout left instead, and vice versa for popout direction left\n if (this.horizontalDirection === HorizontalDirection.right) {\n if (entry.boundingClientRect.right > entry.rootBounds.right) {\n this.horizontalDirection = HorizontalDirection.left;\n }\n } else {\n if (entry.boundingClientRect.left < entry.rootBounds.left) {\n this.horizontalDirection = HorizontalDirection.right;\n }\n }\n }\n\n private setVerticalDirection(entry: IntersectionObserverEntry) {\n if (entry.boundingClientRect.top < 0) {\n // entry is cut off at the top by ${entry.boundingClientRect.top}px\n // open downwards:\n this.verticalDirection = VerticalDirection.down;\n }\n if (entry.boundingClientRect.bottom > entry.rootBounds.bottom) {\n // entry is cut off at the bottom by ${entry.boundingClientRect.bottom - entry.intersectionRect.bottom}px\n const containerOffsetTop = this.elementRef.nativeElement.getBoundingClientRect().top;\n const SPACING = 5; //TODO: Get from SCSS\n // Check if the card can fit on top of button:\n if (containerOffsetTop > entry.target.clientHeight + SPACING) {\n // open upwards:\n this.verticalDirection = VerticalDirection.up;\n }\n }\n }\n\n open() {\n if (this.disabled) {\n return;\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 this.showDropdownTimeoutId = setTimeout(\n () => this.showDropdown(),\n DropdownComponent.OPEN_DELAY_IN_MS\n );\n\n // Move focus to selected item (if any)\n this.focusedIndex = this.selectedIndex;\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.selectedIndex);\n this.changeDetectorRef.markForCheck();\n }\n }\n\n close() {\n if (this.disabled) {\n return;\n }\n if (this.isOpen) {\n this.state = OpenState.closed;\n // Reset vertical direction to default\n this.verticalDirection = VerticalDirection.down;\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 }\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 }\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', ['$event'])\n _onTab(event: KeyboardEvent) {\n if (this.isOpen) {\n event.preventDefault();\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 @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 @HostListener('focus')\n _onFocus() {\n if (this.disabled) {\n this.elementRef.nativeElement.blur();\n }\n }\n\n _onPopoverWillHide() {\n this.state = OpenState.closed;\n this.elementRef.nativeElement.focus();\n }\n\n @HostListener('keydown.enter')\n @HostListener('keydown.escape')\n _onEnterOrEscape() {\n this.close();\n this._onTouched();\n }\n\n _onPopoverClick() {\n this.close();\n }\n\n @HostListener('blur', ['$event'])\n _onBlur() {\n if (this.usePopover) return;\n this.close();\n this._onTouched();\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\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 (this.selectedIndex < 0) {\n switch (event.key) {\n case 'ArrowUp':\n this.focusedIndex = this.items.length - 1;\n break;\n case 'ArrowDown':\n this.focusedIndex = 0;\n break;\n default:\n break;\n }\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\n if (newFocusedIndex > -1) {\n this.focusedIndex = newFocusedIndex;\n }\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) return;\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 unlistenAllSlottedItems() {\n let unlistenItem: () => void;\n while ((unlistenItem = this.itemClickUnlisten.pop()) !== undefined) {\n unlistenItem();\n }\n }\n\n ngOnDestroy(): void {\n this.unlistenAllSlottedItems();\n this.resizeObserverService.unobserve(this.elementRef);\n if (this.intersectionObserverRef) {\n this.intersectionObserverRef.disconnect();\n }\n }\n}\n","<button\n kirby-button\n [size]=\"size\"\n [attentionLevel]=\"attentionLevel\"\n tabindex=\"-1\"\n (click)=\"onToggle($event)\"\n (mousedown)=\"onButtonMouseEvent($event)\"\n [disabled]=\"disabled\"\n type=\"button\"\n>\n <span class=\"text\">{{ selectedText || placeholder }}</span>\n <kirby-icon [name]=\"isOpen ? 'arrow-up' : 'arrow-down'\"></kirby-icon>\n</button>\n\n<ng-container *ngTemplateOutlet=\"usePopover ? popoverTemplate : itemWrapperTemplate\"></ng-container>\n\n<ng-template #popoverTemplate>\n <kirby-popover\n [target]=\"buttonElement\"\n [popout]=\"popout\"\n (click)=\"_onPopoverClick()\"\n (willHide)=\"_onPopoverWillHide()\"\n >\n <ng-container *ngTemplateOutlet=\"itemWrapperTemplate\"></ng-container>\n </kirby-popover>\n</ng-template>\n\n<ng-template #itemWrapperTemplate>\n <kirby-card>\n <ng-container *ngFor=\"let item of items; 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 </ng-container>\n </kirby-card>\n</ng-template>\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 role=\"option\"\n >\n <!-- Tabindex fixes issue with popover dropdown not working in safari -->\n <p class=\"kirby-item-title\" tabindex=\"0\">{{ getTextFromItem(item) }}</p>\n <kirby-icon *ngIf=\"selected\" name=\"checkmark-selected\" slot=\"end\"></kirby-icon>\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 { FormFieldModule } from '@kirbydesign/designsystem/form-field';\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\nconst declarations = [DropdownComponent];\n\n@NgModule({\n imports: [\n CardModule,\n IconModule,\n ItemModule,\n FormFieldModule,\n PopoverComponent,\n ButtonComponent,\n CommonModule,\n ListModule,\n ],\n declarations: [...declarations],\n exports: [...declarations, 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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"}
@@ -649,6 +649,7 @@ class DecimalMaskDirective {
649
649
  this.precision = 2;
650
650
  this.setMaxOnOverflow = false;
651
651
  this.alignment = 'right';
652
+ this.padPrecisionDigits = false;
652
653
  this.groupSeparator = getLocaleNumberSymbol(this.locale, NumberSymbol.Group);
653
654
  this.radixPoint = getLocaleNumberSymbol(this.locale, NumberSymbol.Decimal);
654
655
  this._allowMinus = false;
@@ -681,6 +682,7 @@ class DecimalMaskDirective {
681
682
  groupSeparator: this._groupSeperatorDisabled ? '' : this.groupSeparator,
682
683
  radixPoint: this.radixPoint,
683
684
  digits: this._maxlength ? 0 : this.precision,
685
+ digitsOptional: !this.padPrecisionDigits,
684
686
  min: this.min,
685
687
  max: this.max,
686
688
  allowMinus: this._allowMinus,
@@ -691,7 +693,7 @@ class DecimalMaskDirective {
691
693
  SetMaxOnOverflow: this.setMaxOnOverflow,
692
694
  showMaskOnFocus: false,
693
695
  showMaskOnHover: false,
694
- placeholder: '',
696
+ placeholder: this.padPrecisionDigits ? undefined : '',
695
697
  rightAlign: this.alignment === 'right',
696
698
  onBeforeWrite: () => {
697
699
  if (!this.inputmask)
@@ -712,7 +714,7 @@ class DecimalMaskDirective {
712
714
  return this.min === undefined ? maxlengthValue : -Math.abs(Math.max(this.min, maxlengthValue));
713
715
  }
714
716
  /** @nocollapse */ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: DecimalMaskDirective, deps: [{ token: i0.ElementRef }, { token: LOCALE_ID }], target: i0.ɵɵFactoryTarget.Directive }); }
715
- /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: DecimalMaskDirective, isStandalone: true, selector: "[kirby-decimal-mask]", inputs: { min: "min", max: "max", precision: "precision", setMaxOnOverflow: "setMaxOnOverflow", alignment: "alignment", allowMinus: "allowMinus", disableGroupSeperator: "disableGroupSeperator", maxlength: "maxlength" }, providers: [
717
+ /** @nocollapse */ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.14", type: DecimalMaskDirective, isStandalone: true, selector: "[kirby-decimal-mask]", inputs: { min: "min", max: "max", precision: "precision", setMaxOnOverflow: "setMaxOnOverflow", alignment: "alignment", padPrecisionDigits: "padPrecisionDigits", allowMinus: "allowMinus", disableGroupSeperator: "disableGroupSeperator", maxlength: "maxlength" }, providers: [
716
718
  {
717
719
  provide: NG_VALUE_ACCESSOR,
718
720
  multi: true,
@@ -747,6 +749,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
747
749
  type: Input
748
750
  }], alignment: [{
749
751
  type: Input
752
+ }], padPrecisionDigits: [{
753
+ type: Input
750
754
  }], allowMinus: [{
751
755
  type: Input
752
756
  }], disableGroupSeperator: [{