@siemens/element-ng 51.3.0 → 51.5.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 (98) hide show
  1. package/fesm2022/siemens-element-ng-about.mjs +2 -2
  2. package/fesm2022/siemens-element-ng-about.mjs.map +1 -1
  3. package/fesm2022/siemens-element-ng-ag-grid.mjs +5 -4
  4. package/fesm2022/siemens-element-ng-ag-grid.mjs.map +1 -1
  5. package/fesm2022/siemens-element-ng-breadcrumb.mjs +20 -71
  6. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-carousel.mjs +6 -4
  8. package/fesm2022/siemens-element-ng-carousel.mjs.map +1 -1
  9. package/fesm2022/siemens-element-ng-chat-messages.mjs +3 -3
  10. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
  11. package/fesm2022/siemens-element-ng-common.mjs +16 -1
  12. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  13. package/fesm2022/siemens-element-ng-dashboard.mjs +2 -3
  14. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-datatable.mjs +1 -1
  16. package/fesm2022/siemens-element-ng-datatable.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-empty-state.mjs +2 -2
  18. package/fesm2022/siemens-element-ng-empty-state.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-filtered-search.mjs +255 -160
  20. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-formly.mjs +13 -9
  22. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-header-dropdown.mjs +2 -2
  24. package/fesm2022/siemens-element-ng-header-dropdown.mjs.map +1 -1
  25. package/fesm2022/siemens-element-ng-list-details.mjs +7 -4
  26. package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
  27. package/fesm2022/siemens-element-ng-loading-spinner.mjs +21 -7
  28. package/fesm2022/siemens-element-ng-loading-spinner.mjs.map +1 -1
  29. package/fesm2022/siemens-element-ng-maplibre.mjs +293 -10
  30. package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -1
  31. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs +6 -3
  32. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs.map +1 -1
  33. package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs +9 -0
  34. package/fesm2022/siemens-element-ng-markdown-extensions-mermaid.mjs.map +1 -1
  35. package/fesm2022/siemens-element-ng-markdown.mjs +6 -2
  36. package/fesm2022/siemens-element-ng-markdown.mjs.map +1 -1
  37. package/fesm2022/siemens-element-ng-menu.mjs +6 -6
  38. package/fesm2022/siemens-element-ng-menu.mjs.map +1 -1
  39. package/fesm2022/siemens-element-ng-modal.mjs +4 -3
  40. package/fesm2022/siemens-element-ng-modal.mjs.map +1 -1
  41. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +10 -4
  42. package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
  43. package/fesm2022/siemens-element-ng-navbar-vertical.mjs +12 -6
  44. package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
  45. package/fesm2022/siemens-element-ng-pills-input.mjs +5 -4
  46. package/fesm2022/siemens-element-ng-pills-input.mjs.map +1 -1
  47. package/fesm2022/siemens-element-ng-popover-legacy.mjs +1 -1
  48. package/fesm2022/siemens-element-ng-popover-legacy.mjs.map +1 -1
  49. package/fesm2022/siemens-element-ng-popover.mjs +36 -7
  50. package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
  51. package/fesm2022/siemens-element-ng-result-details-list.mjs +1 -1
  52. package/fesm2022/siemens-element-ng-result-details-list.mjs.map +1 -1
  53. package/fesm2022/siemens-element-ng-select.mjs +3 -3
  54. package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
  55. package/fesm2022/siemens-element-ng-shadow-root.mjs +54 -1
  56. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -1
  57. package/fesm2022/siemens-element-ng-side-panel.mjs +17 -7
  58. package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
  59. package/fesm2022/siemens-element-ng-skip-links.mjs +18 -4
  60. package/fesm2022/siemens-element-ng-skip-links.mjs.map +1 -1
  61. package/fesm2022/siemens-element-ng-source-chip.mjs +1 -1
  62. package/fesm2022/siemens-element-ng-source-chip.mjs.map +1 -1
  63. package/fesm2022/siemens-element-ng-split.mjs +2 -2
  64. package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
  65. package/fesm2022/siemens-element-ng-status-bar.mjs +2 -2
  66. package/fesm2022/siemens-element-ng-status-bar.mjs.map +1 -1
  67. package/fesm2022/siemens-element-ng-theme.mjs +59 -23
  68. package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
  69. package/fesm2022/siemens-element-ng-tooltip.mjs +83 -11
  70. package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
  71. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  72. package/fesm2022/siemens-element-ng-tree-view.mjs +3 -4
  73. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  74. package/fesm2022/siemens-element-ng-typeahead.mjs +2 -2
  75. package/fesm2022/siemens-element-ng-typeahead.mjs.map +1 -1
  76. package/maplibre/styles/maplibre-gl.scss +4 -0
  77. package/package.json +7 -7
  78. package/schematics/utils/ts-compiler-host.js +21 -0
  79. package/template-i18n.json +7 -0
  80. package/types/siemens-element-ng-ag-grid.d.ts +1 -0
  81. package/types/siemens-element-ng-breadcrumb.d.ts +3 -6
  82. package/types/siemens-element-ng-common.d.ts +28 -3
  83. package/types/siemens-element-ng-dashboard.d.ts +0 -1
  84. package/types/siemens-element-ng-filtered-search.d.ts +26 -10
  85. package/types/siemens-element-ng-list-details.d.ts +2 -0
  86. package/types/siemens-element-ng-loading-spinner.d.ts +11 -4
  87. package/types/siemens-element-ng-maplibre.d.ts +112 -5
  88. package/types/siemens-element-ng-markdown-extensions-katex.d.ts +4 -1
  89. package/types/siemens-element-ng-markdown-extensions-mermaid.d.ts +9 -0
  90. package/types/siemens-element-ng-navbar-vertical-next.d.ts +2 -1
  91. package/types/siemens-element-ng-navbar-vertical.d.ts +2 -2
  92. package/types/siemens-element-ng-popover.d.ts +19 -1
  93. package/types/siemens-element-ng-shadow-root.d.ts +16 -1
  94. package/types/siemens-element-ng-side-panel.d.ts +7 -2
  95. package/types/siemens-element-ng-skip-links.d.ts +4 -2
  96. package/types/siemens-element-ng-theme.d.ts +35 -7
  97. package/types/siemens-element-ng-tooltip.d.ts +14 -1
  98. package/types/siemens-element-ng-translate.d.ts +7 -0
@@ -1 +1 @@
1
- {"version":3,"file":"siemens-element-ng-loading-spinner.mjs","sources":["../../../../projects/element-ng/loading-spinner/si-loading-spinner.component.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.component.html","../../../../projects/element-ng/loading-spinner/si-loading-button.component.ts","../../../../projects/element-ng/loading-spinner/si-loading-button.component.html","../../../../projects/element-ng/loading-spinner/si-loading-spinner.directive.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.service.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.module.ts","../../../../projects/element-ng/loading-spinner/index.ts","../../../../projects/element-ng/loading-spinner/siemens-element-ng-loading-spinner.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { SiTranslatePipe, t } from '@siemens/element-translate-ng/translate';\n\n@Component({\n selector: 'si-loading-spinner',\n imports: [SiTranslatePipe],\n templateUrl: './si-loading-spinner.component.html',\n styleUrl: './si-loading-spinner.component.scss',\n host: {\n 'animate.leave': 'spinner-leave'\n }\n})\nexport class SiLoadingSpinnerComponent {\n /**\n * Whether the spinner blocks interaction with the surrounding content.\n *\n * @defaultValue false\n */\n readonly isBlockingSpinner = input(false, {\n transform: booleanAttribute\n });\n /**\n * Whether the spinner is displayed as an overlay.\n *\n * @defaultValue false\n */\n readonly isSpinnerOverlay = input(false, {\n transform: booleanAttribute\n });\n /**\n * Needed for a11y\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_LOADING_SPINNER.LABEL:Loading`)\n * ```\n */\n readonly ariaLabel = input(t(() => $localize`:@@SI_LOADING_SPINNER.LABEL:Loading`));\n}\n","<div\n class=\"loading\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n [class.blocking-spinner]=\"isBlockingSpinner()\"\n [class.spinner-overlay]=\"isSpinnerOverlay()\"\n>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <title>{{ ariaLabel() | translate }}</title>\n <g>\n <path d=\"M256,156a16,16,0,0,1-16-16V80a16,16,0,0,1,32,0v60A16,16,0,0,1,256,156Z\" />\n <path\n d=\"M314.78,175.1a16,16,0,0,1-3.54-22.35l35.27-48.54A16,16,0,1,1,372.39,123l-35.26,48.54A16,16,0,0,1,314.78,175.1Z\"\n />\n <path\n d=\"M351.11,225.1a16,16,0,0,1,10.27-20.16l57.06-18.54a16,16,0,1,1,9.89,30.43l-57.06,18.54A16,16,0,0,1,351.11,225.1Z\"\n />\n <path\n d=\"M351.11,286.9a16,16,0,0,1,20.16-10.27l57.06,18.54a16,16,0,1,1-9.89,30.43l-57.06-18.54A16,16,0,0,1,351.11,286.9Z\"\n />\n <path\n d=\"M314.78,336.9a16,16,0,0,1,22.35,3.54L372.39,389a16,16,0,1,1-25.88,18.81l-35.27-48.54A16,16,0,0,1,314.78,336.9Z\"\n />\n <path d=\"M256,356a16,16,0,0,1,16,16v60a16,16,0,0,1-32,0V372A16,16,0,0,1,256,356Z\" />\n <path\n d=\"M197.22,336.9a16,16,0,0,1,3.54,22.35l-35.27,48.54A16,16,0,1,1,139.61,389l35.26-48.54A16,16,0,0,1,197.22,336.9Z\"\n />\n <path\n d=\"M160.89,286.9a16,16,0,0,1-10.27,20.16L93.56,325.6a16,16,0,0,1-9.89-30.43l57.06-18.54A16,16,0,0,1,160.89,286.9Z\"\n />\n <path\n d=\"M160.89,225.1a16,16,0,0,1-20.16,10.27L83.67,216.83a16,16,0,1,1,9.89-30.43l57.06,18.54A16,16,0,0,1,160.89,225.1Z\"\n />\n <path\n d=\"M197.22,175.1a16,16,0,0,1-22.35-3.54L139.61,123a16,16,0,1,1,25.88-18.81l35.27,48.54A16,16,0,0,1,197.22,175.1Z\"\n />\n </g>\n </svg>\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { SiTranslatePipe, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\n\n@Component({\n selector: 'si-loading-button',\n imports: [SiLoadingSpinnerComponent, SiTranslatePipe],\n templateUrl: './si-loading-button.component.html',\n styleUrl: './si-loading-button.component.scss',\n host: {\n '[class.pe-none]': 'disabled()'\n }\n})\nexport class SiLoadingButtonComponent {\n /**\n * Whether the button is disabled.\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Whether the loading state should be displayed.\n * @defaultValue false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n /**\n * Type of the button.\n * @defaultValue 'button'\n **/\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n /** aria-label for the button */\n readonly ariaLabel = input<TranslatableString>();\n /** aria-labelledby for the button */\n readonly ariaLabelledBy = input<string>();\n /**\n * CSS class for the button.\n * @defaultValue ''\n */\n readonly buttonClass = input('');\n\n protected handleClick(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.stopPropagation();\n }\n }\n}\n","<button\n [type]=\"type()\"\n [class]=\"buttonClass()\"\n [class.loading]=\"loading()\"\n [class.disabled]=\"loading()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.tabindex]=\"loading() ? '-1' : null\"\n (click)=\"handleClick($event)\"\n>\n <div class=\"button-wrapper\">\n <ng-content />\n </div>\n</button>\n@if (loading()) {\n <div class=\"spinner-wrapper\" (click)=\"$event.stopPropagation()\">\n <si-loading-spinner />\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n OnChanges,\n OnDestroy,\n OnInit,\n ViewContainerRef\n} from '@angular/core';\nimport { BehaviorSubject, combineLatest, merge, Subscription, timer } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\n@Directive({\n selector: '[siLoading]',\n host: {\n class: 'position-relative'\n }\n})\nexport class SiLoadingSpinnerDirective implements OnInit, OnChanges, OnDestroy {\n /**\n * Displays the loading spinner when the value is either true or non-zero.\n */\n readonly siLoading = input.required<boolean | number>();\n\n /**\n * Displays semi-transparent backdrop for the spinner, default is false.\n *\n * @defaultValue false\n */\n readonly blocking = input(false, { transform: booleanAttribute });\n\n /**\n * Specifies if the spinner should be displayed after a delay, default is true.\n *\n * @defaultValue true\n */\n readonly initialDelay = input(true, { transform: booleanAttribute });\n\n private el = inject(ElementRef);\n private readonly viewRef = inject(ViewContainerRef);\n private cdRef = inject(ChangeDetectorRef);\n\n private sub?: Subscription;\n private progressSubject = new BehaviorSubject(false);\n private off$ = this.progressSubject.pipe(filter(val => !val));\n private on$ = this.progressSubject.pipe(filter(val => val));\n private readonly initialWaitTime = computed(() => (this.initialDelay() ? 500 : 0));\n private minSpinTime = 500;\n private portalOutlet?: DomPortalOutlet;\n private readonly compPortal = new ComponentPortal(\n SiLoadingSpinnerComponent,\n this.viewRef,\n undefined,\n null,\n [inputBinding('isBlockingSpinner', this.blocking), inputBinding('isSpinnerOverlay', () => true)]\n );\n\n // this makes sure the spinner only displays with a delay of 500ms and stays for 500ms so\n // that it doesn't flicker\n protected readonly spinner$ = this.on$.pipe(\n switchMap(() =>\n merge(\n timer(this.initialWaitTime()).pipe(\n map(() => true),\n takeUntil(this.off$)\n ),\n combineLatest([this.off$, timer(this.initialWaitTime() + this.minSpinTime)]).pipe(\n map(() => false)\n )\n )\n )\n );\n\n private createPortal(): void {\n this.portalOutlet ??= new DomPortalOutlet(this.el.nativeElement);\n this.compPortal.attach(this.portalOutlet);\n }\n\n ngOnInit(): void {\n this.sub = this.spinner$.subscribe(val => {\n if (val) {\n if (!this.compPortal.isAttached) {\n this.createPortal();\n }\n } else if (this.compPortal.isAttached) {\n this.compPortal.detach();\n }\n this.cdRef.markForCheck();\n });\n }\n\n ngOnChanges(): void {\n const newState = !!this.siLoading();\n if (newState !== this.progressSubject.value) {\n this.progressSubject.next(newState);\n }\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n if (this.compPortal.isAttached) {\n this.compPortal.detach();\n }\n this.portalOutlet?.dispose();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SiLoadingService {\n /**\n * Counts the number of loads active, is `0` when all loading is finished (or hasn't started).\n */\n readonly counter: BehaviorSubject<number> = new BehaviorSubject<number>(0);\n\n /**\n * Start the loading.\n */\n startLoad(): void {\n this.counter.next(this.counter.value + 1);\n }\n\n /**\n * Stop the loading.\n */\n stopLoad(): void {\n if (this.counter.value > 0) {\n this.counter.next(this.counter.value - 1);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\nimport { SiLoadingSpinnerDirective } from './si-loading-spinner.directive';\n\n@NgModule({\n imports: [SiLoadingSpinnerComponent, SiLoadingSpinnerDirective],\n exports: [SiLoadingSpinnerComponent, SiLoadingSpinnerDirective]\n})\nexport class SiLoadingSpinnerModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-loading-button.component';\nexport * from './si-loading-spinner.component';\nexport * from './si-loading-spinner.directive';\nexport * from './si-loading-spinner.service';\nexport * from './si-loading-spinner.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"siemens-element-ng-loading-spinner.mjs","sources":["../../../../projects/element-ng/loading-spinner/si-loading-spinner.component.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.component.html","../../../../projects/element-ng/loading-spinner/si-loading-button.component.ts","../../../../projects/element-ng/loading-spinner/si-loading-button.component.html","../../../../projects/element-ng/loading-spinner/si-loading-spinner.directive.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.service.ts","../../../../projects/element-ng/loading-spinner/si-loading-spinner.module.ts","../../../../projects/element-ng/loading-spinner/index.ts","../../../../projects/element-ng/loading-spinner/siemens-element-ng-loading-spinner.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { SiTranslatePipe, t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\n@Component({\n selector: 'si-loading-spinner',\n imports: [SiTranslatePipe],\n templateUrl: './si-loading-spinner.component.html',\n styleUrl: './si-loading-spinner.component.scss',\n host: {\n 'animate.leave': 'spinner-leave'\n }\n})\nexport class SiLoadingSpinnerComponent {\n /**\n * Whether the spinner blocks interaction with the surrounding content.\n *\n * @defaultValue false\n */\n readonly isBlockingSpinner = input(false, {\n transform: booleanAttribute\n });\n /**\n * Whether the spinner is displayed as an overlay.\n *\n * @defaultValue false\n */\n readonly isSpinnerOverlay = input(false, {\n transform: booleanAttribute\n });\n /**\n * Needed for a11y\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_LOADING_SPINNER.LABEL:Loading`)\n * ```\n */\n readonly ariaLabel = input(t(() => $localize`:@@SI_LOADING_SPINNER.LABEL:Loading`));\n\n /**\n * Optional text to be displayed below the spinner.\n */\n readonly loadingText = input<TranslatableString>();\n}\n","<div\n class=\"loading\"\n aria-atomic=\"true\"\n aria-live=\"assertive\"\n [class.blocking-spinner]=\"isBlockingSpinner()\"\n [class.spinner-overlay]=\"isSpinnerOverlay()\"\n>\n <svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 512 512\">\n <title>{{ ariaLabel() | translate }}</title>\n <g>\n <path d=\"M256,156a16,16,0,0,1-16-16V80a16,16,0,0,1,32,0v60A16,16,0,0,1,256,156Z\" />\n <path\n d=\"M314.78,175.1a16,16,0,0,1-3.54-22.35l35.27-48.54A16,16,0,1,1,372.39,123l-35.26,48.54A16,16,0,0,1,314.78,175.1Z\"\n />\n <path\n d=\"M351.11,225.1a16,16,0,0,1,10.27-20.16l57.06-18.54a16,16,0,1,1,9.89,30.43l-57.06,18.54A16,16,0,0,1,351.11,225.1Z\"\n />\n <path\n d=\"M351.11,286.9a16,16,0,0,1,20.16-10.27l57.06,18.54a16,16,0,1,1-9.89,30.43l-57.06-18.54A16,16,0,0,1,351.11,286.9Z\"\n />\n <path\n d=\"M314.78,336.9a16,16,0,0,1,22.35,3.54L372.39,389a16,16,0,1,1-25.88,18.81l-35.27-48.54A16,16,0,0,1,314.78,336.9Z\"\n />\n <path d=\"M256,356a16,16,0,0,1,16,16v60a16,16,0,0,1-32,0V372A16,16,0,0,1,256,356Z\" />\n <path\n d=\"M197.22,336.9a16,16,0,0,1,3.54,22.35l-35.27,48.54A16,16,0,1,1,139.61,389l35.26-48.54A16,16,0,0,1,197.22,336.9Z\"\n />\n <path\n d=\"M160.89,286.9a16,16,0,0,1-10.27,20.16L93.56,325.6a16,16,0,0,1-9.89-30.43l57.06-18.54A16,16,0,0,1,160.89,286.9Z\"\n />\n <path\n d=\"M160.89,225.1a16,16,0,0,1-20.16,10.27L83.67,216.83a16,16,0,1,1,9.89-30.43l57.06,18.54A16,16,0,0,1,160.89,225.1Z\"\n />\n <path\n d=\"M197.22,175.1a16,16,0,0,1-22.35-3.54L139.61,123a16,16,0,1,1,25.88-18.81l35.27,48.54A16,16,0,0,1,197.22,175.1Z\"\n />\n </g>\n </svg>\n @if (loadingText()) {\n <div class=\"loading-text\">{{ loadingText() | translate }}</div>\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { booleanAttribute, Component, input } from '@angular/core';\nimport { SiTranslatePipe, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\n\n@Component({\n selector: 'si-loading-button',\n imports: [SiLoadingSpinnerComponent, SiTranslatePipe],\n templateUrl: './si-loading-button.component.html',\n styleUrl: './si-loading-button.component.scss',\n host: {\n '[class.pe-none]': 'disabled()'\n }\n})\nexport class SiLoadingButtonComponent {\n /**\n * Whether the button is disabled.\n * @defaultValue false\n */\n readonly disabled = input(false, { transform: booleanAttribute });\n /**\n * Whether the loading state should be displayed.\n * @defaultValue false\n */\n readonly loading = input(false, { transform: booleanAttribute });\n /**\n * Type of the button.\n * @defaultValue 'button'\n **/\n readonly type = input<'button' | 'submit' | 'reset'>('button');\n /** aria-label for the button */\n readonly ariaLabel = input<TranslatableString>();\n /** aria-labelledby for the button */\n readonly ariaLabelledBy = input<string>();\n /**\n * CSS class for the button.\n * @defaultValue ''\n */\n readonly buttonClass = input('');\n\n protected handleClick(event: Event): void {\n if (this.disabled() || this.loading()) {\n event.stopPropagation();\n }\n }\n}\n","<button\n [type]=\"type()\"\n [class]=\"buttonClass()\"\n [class.loading]=\"loading()\"\n [class.disabled]=\"loading()\"\n [disabled]=\"disabled()\"\n [attr.aria-disabled]=\"disabled() || loading()\"\n [attr.aria-label]=\"ariaLabel() | translate\"\n [attr.aria-labelledby]=\"ariaLabelledBy()\"\n [attr.tabindex]=\"loading() ? '-1' : null\"\n (click)=\"handleClick($event)\"\n>\n <div class=\"button-wrapper\">\n <ng-content />\n </div>\n</button>\n@if (loading()) {\n <div class=\"spinner-wrapper\" (click)=\"$event.stopPropagation()\">\n <si-loading-spinner />\n </div>\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { ComponentPortal, DomPortalOutlet } from '@angular/cdk/portal';\nimport {\n booleanAttribute,\n ChangeDetectorRef,\n computed,\n Directive,\n ElementRef,\n inject,\n input,\n inputBinding,\n OnChanges,\n OnDestroy,\n OnInit,\n ViewContainerRef\n} from '@angular/core';\nimport { TranslatableString } from '@siemens/element-translate-ng/translate';\nimport { BehaviorSubject, combineLatest, merge, Subscription, timer } from 'rxjs';\nimport { filter, map, switchMap, takeUntil } from 'rxjs/operators';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\n@Directive({\n selector: '[siLoading]',\n host: {\n class: 'position-relative'\n }\n})\nexport class SiLoadingSpinnerDirective implements OnInit, OnChanges, OnDestroy {\n /**\n * Displays the loading spinner when the value is either true or non-zero.\n */\n readonly siLoading = input.required<boolean | number>();\n\n /**\n * Displays semi-transparent backdrop for the spinner, default is false.\n *\n * @defaultValue false\n */\n readonly blocking = input(false, { transform: booleanAttribute });\n\n /**\n * Specifies if the spinner should be displayed after a delay, default is true.\n *\n * @defaultValue true\n */\n readonly initialDelay = input(true, { transform: booleanAttribute });\n\n /**\n * Optional text to be displayed below the spinner.\n */\n readonly loadingText = input<TranslatableString>();\n\n private el = inject(ElementRef);\n private readonly viewRef = inject(ViewContainerRef);\n private cdRef = inject(ChangeDetectorRef);\n\n private sub?: Subscription;\n private progressSubject = new BehaviorSubject(false);\n private off$ = this.progressSubject.pipe(filter(val => !val));\n private on$ = this.progressSubject.pipe(filter(val => val));\n private readonly initialWaitTime = computed(() => (this.initialDelay() ? 500 : 0));\n private minSpinTime = 500;\n private portalOutlet?: DomPortalOutlet;\n private readonly compPortal = new ComponentPortal(\n SiLoadingSpinnerComponent,\n this.viewRef,\n undefined,\n null,\n [\n inputBinding('isBlockingSpinner', this.blocking),\n inputBinding('isSpinnerOverlay', () => true),\n inputBinding('loadingText', this.loadingText)\n ]\n );\n\n // this makes sure the spinner only displays with a delay of 500ms and stays for 500ms so\n // that it doesn't flicker\n protected readonly spinner$ = this.on$.pipe(\n switchMap(() =>\n merge(\n timer(this.initialWaitTime()).pipe(\n map(() => true),\n takeUntil(this.off$)\n ),\n combineLatest([this.off$, timer(this.initialWaitTime() + this.minSpinTime)]).pipe(\n map(() => false)\n )\n )\n )\n );\n\n private createPortal(): void {\n this.portalOutlet ??= new DomPortalOutlet(this.el.nativeElement);\n this.compPortal.attach(this.portalOutlet);\n }\n\n ngOnInit(): void {\n this.sub = this.spinner$.subscribe(val => {\n if (val) {\n if (!this.compPortal.isAttached) {\n this.createPortal();\n }\n } else if (this.compPortal.isAttached) {\n this.compPortal.detach();\n }\n this.cdRef.markForCheck();\n });\n }\n\n ngOnChanges(): void {\n const newState = !!this.siLoading();\n if (newState !== this.progressSubject.value) {\n this.progressSubject.next(newState);\n }\n }\n\n ngOnDestroy(): void {\n this.sub?.unsubscribe();\n if (this.compPortal.isAttached) {\n this.compPortal.detach();\n }\n this.portalOutlet?.dispose();\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SiLoadingService {\n /**\n * Counts the number of loads active, is `0` when all loading is finished (or hasn't started).\n */\n readonly counter: BehaviorSubject<number> = new BehaviorSubject<number>(0);\n\n /**\n * Start the loading.\n */\n startLoad(): void {\n this.counter.next(this.counter.value + 1);\n }\n\n /**\n * Stop the loading.\n */\n stopLoad(): void {\n if (this.counter.value > 0) {\n this.counter.next(this.counter.value - 1);\n }\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiLoadingSpinnerComponent } from './si-loading-spinner.component';\nimport { SiLoadingSpinnerDirective } from './si-loading-spinner.directive';\n\n@NgModule({\n imports: [SiLoadingSpinnerComponent, SiLoadingSpinnerDirective],\n exports: [SiLoadingSpinnerComponent, SiLoadingSpinnerDirective]\n})\nexport class SiLoadingSpinnerModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-loading-button.component';\nexport * from './si-loading-spinner.component';\nexport * from './si-loading-spinner.directive';\nexport * from './si-loading-spinner.service';\nexport * from './si-loading-spinner.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,11 +1,17 @@
1
1
  import * as i0 from '@angular/core';
2
- import { assertInInjectionContext, computed, input, output, Component, signal } from '@angular/core';
2
+ import { assertInInjectionContext, computed, input, output, Component, signal, viewChild, Directive, inject, DestroyRef, DOCUMENT, booleanAttribute, numberAttribute, linkedSignal, resource, contentChild, TemplateRef, effect, afterRenderEffect } from '@angular/core';
3
3
  import { injectIsDarkTheme } from '@siemens/element-ng/theme';
4
4
  import { siMapStyle } from '@siemens/map-styles/common';
5
- import { ClusterPointDirective, GeoJSONSourceComponent, MarkersForClustersComponent } from '@maplibre/ngx-maplibre-gl';
5
+ import { GeoJSONSourceComponent, ClusterPointDirective, MarkersForClustersComponent, MapService, PopupComponent } from '@maplibre/ngx-maplibre-gl';
6
6
  import { t, SiTranslatePipe, injectSiTranslateService } from '@siemens/element-translate-ng/translate';
7
+ import { FocusTrapFactory } from '@angular/cdk/a11y';
8
+ import { NgTemplateOutlet } from '@angular/common';
9
+ import { elementCancel } from '@siemens/element-icons';
10
+ import { addIcons, SiIconComponent } from '@siemens/element-ng/icon';
11
+ import { SiLoadingSpinnerDirective } from '@siemens/element-ng/loading-spinner';
12
+ import { ResizeObserverService } from '@siemens/element-ng/resize-observer';
13
+ import { from, map } from 'rxjs';
7
14
  import { toSignal } from '@angular/core/rxjs-interop';
8
- import { map } from 'rxjs';
9
15
 
10
16
  /**
11
17
  * Copyright (c) Siemens 2016 - 2026
@@ -292,12 +298,17 @@ class SiClusterSourceComponent {
292
298
  /** Stores selection for the projected cluster-popover integration. */
293
299
  selectedCluster = signal(undefined, /* @ts-ignore */
294
300
  ...(ngDevMode ? [{ debugName: "selectedCluster" }] : /* istanbul ignore next */ []));
295
- async selectCluster(feature) {
296
- this.clusterClick.emit(feature);
297
- this.selectedCluster.set({ ...feature, geometry: feature.geometry });
301
+ source = viewChild.required(GeoJSONSourceComponent, /* @ts-ignore */
302
+ ...(ngDevMode ? [{ debugName: "source" }] : /* istanbul ignore next */ []));
303
+ /**
304
+ * Returns a page of original points belonging to a cluster.
305
+ * @see https://maplibre.org/maplibre-gl-js/docs/API/classes/GeoJSONSource/#getclusterleaves
306
+ */
307
+ getClusterLeaves(clusterId, limit, offset) {
308
+ return this.source().getClusterLeaves(clusterId, limit, offset);
298
309
  }
299
310
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterSourceComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
300
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.8", type: SiClusterSourceComponent, isStandalone: true, selector: "si-cluster-source", inputs: { sourceId: { classPropertyName: "sourceId", publicName: "sourceId", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, groupProperty: { classPropertyName: "groupProperty", publicName: "groupProperty", isSignal: true, isRequired: false, transformFunction: null }, groupColors: { classPropertyName: "groupColors", publicName: "groupColors", isSignal: true, isRequired: false, transformFunction: null }, statusProperty: { classPropertyName: "statusProperty", publicName: "statusProperty", isSignal: true, isRequired: false, transformFunction: null }, clusterRadius: { classPropertyName: "clusterRadius", publicName: "clusterRadius", isSignal: true, isRequired: false, transformFunction: null }, clusterMaxZoom: { classPropertyName: "clusterMaxZoom", publicName: "clusterMaxZoom", isSignal: true, isRequired: false, transformFunction: null }, clusterMinPoints: { classPropertyName: "clusterMinPoints", publicName: "clusterMinPoints", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clusterClick: "clusterClick" }, ngImport: i0, template: "<mgl-geojson-source\n #source\n [id]=\"sourceId()\"\n [data]=\"data()\"\n [cluster]=\"true\"\n [clusterRadius]=\"clusterRadius()\"\n [clusterMaxZoom]=\"clusterMaxZoom()\"\n [clusterMinPoints]=\"clusterMinPoints()\"\n [clusterProperties]=\"clusterConfiguration().clusterProperties\"\n/>\n\n<mgl-markers-for-clusters [source]=\"sourceId()\">\n <ng-template let-feature mglClusterPoint>\n <si-cluster-marker\n [feature]=\"feature\"\n [segments]=\"clusterConfiguration().segments\"\n (markerClick)=\"selectCluster(feature)\"\n />\n </ng-template>\n</mgl-markers-for-clusters>\n\n<ng-content select=\"si-cluster-popover,[siClusterPopoverOutlet]\" />\n", dependencies: [{ kind: "directive", type: ClusterPointDirective, selector: "ng-template[mglClusterPoint]" }, { kind: "component", type: GeoJSONSourceComponent, selector: "mgl-geojson-source", inputs: ["data", "maxzoom", "attribution", "buffer", "tolerance", "cluster", "clusterRadius", "clusterMaxZoom", "clusterMinPoints", "clusterProperties", "lineMetrics", "generateId", "promoteId", "filter"] }, { kind: "component", type: MarkersForClustersComponent, selector: "mgl-markers-for-clusters", inputs: ["source"] }, { kind: "component", type: SiClusterMarkerComponent, selector: "si-cluster-marker", inputs: ["feature", "segments"], outputs: ["markerClick"] }] });
311
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: SiClusterSourceComponent, isStandalone: true, selector: "si-cluster-source", inputs: { sourceId: { classPropertyName: "sourceId", publicName: "sourceId", isSignal: true, isRequired: true, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: false, transformFunction: null }, groupProperty: { classPropertyName: "groupProperty", publicName: "groupProperty", isSignal: true, isRequired: false, transformFunction: null }, groupColors: { classPropertyName: "groupColors", publicName: "groupColors", isSignal: true, isRequired: false, transformFunction: null }, statusProperty: { classPropertyName: "statusProperty", publicName: "statusProperty", isSignal: true, isRequired: false, transformFunction: null }, clusterRadius: { classPropertyName: "clusterRadius", publicName: "clusterRadius", isSignal: true, isRequired: false, transformFunction: null }, clusterMaxZoom: { classPropertyName: "clusterMaxZoom", publicName: "clusterMaxZoom", isSignal: true, isRequired: false, transformFunction: null }, clusterMinPoints: { classPropertyName: "clusterMinPoints", publicName: "clusterMinPoints", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { clusterClick: "clusterClick" }, viewQueries: [{ propertyName: "source", first: true, predicate: GeoJSONSourceComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<mgl-geojson-source\n #source\n [id]=\"sourceId()\"\n [data]=\"data()\"\n [cluster]=\"true\"\n [clusterRadius]=\"clusterRadius()\"\n [clusterMaxZoom]=\"clusterMaxZoom()\"\n [clusterMinPoints]=\"clusterMinPoints()\"\n [clusterProperties]=\"clusterConfiguration().clusterProperties\"\n/>\n\n<mgl-markers-for-clusters [source]=\"sourceId()\">\n <ng-template let-feature mglClusterPoint>\n <si-cluster-marker\n [feature]=\"feature\"\n [segments]=\"clusterConfiguration().segments\"\n (markerClick)=\"clusterClick.emit(feature)\"\n />\n </ng-template>\n</mgl-markers-for-clusters>\n\n<ng-content />\n", dependencies: [{ kind: "directive", type: ClusterPointDirective, selector: "ng-template[mglClusterPoint]" }, { kind: "component", type: GeoJSONSourceComponent, selector: "mgl-geojson-source", inputs: ["data", "maxzoom", "attribution", "buffer", "tolerance", "cluster", "clusterRadius", "clusterMaxZoom", "clusterMinPoints", "clusterProperties", "lineMetrics", "generateId", "promoteId", "filter"] }, { kind: "component", type: MarkersForClustersComponent, selector: "mgl-markers-for-clusters", inputs: ["source", "markerOptions", "clusterMarkerOptions"] }, { kind: "component", type: SiClusterMarkerComponent, selector: "si-cluster-marker", inputs: ["feature", "segments"], outputs: ["markerClick"] }] });
301
312
  }
302
313
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterSourceComponent, decorators: [{
303
314
  type: Component,
@@ -306,8 +317,280 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
306
317
  GeoJSONSourceComponent,
307
318
  MarkersForClustersComponent,
308
319
  SiClusterMarkerComponent
309
- ], template: "<mgl-geojson-source\n #source\n [id]=\"sourceId()\"\n [data]=\"data()\"\n [cluster]=\"true\"\n [clusterRadius]=\"clusterRadius()\"\n [clusterMaxZoom]=\"clusterMaxZoom()\"\n [clusterMinPoints]=\"clusterMinPoints()\"\n [clusterProperties]=\"clusterConfiguration().clusterProperties\"\n/>\n\n<mgl-markers-for-clusters [source]=\"sourceId()\">\n <ng-template let-feature mglClusterPoint>\n <si-cluster-marker\n [feature]=\"feature\"\n [segments]=\"clusterConfiguration().segments\"\n (markerClick)=\"selectCluster(feature)\"\n />\n </ng-template>\n</mgl-markers-for-clusters>\n\n<ng-content select=\"si-cluster-popover,[siClusterPopoverOutlet]\" />\n" }]
310
- }], propDecorators: { sourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceId", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], groupProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupProperty", required: false }] }], groupColors: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupColors", required: false }] }], statusProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusProperty", required: false }] }], clusterRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterRadius", required: false }] }], clusterMaxZoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterMaxZoom", required: false }] }], clusterMinPoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterMinPoints", required: false }] }], clusterClick: [{ type: i0.Output, args: ["clusterClick"] }] } });
320
+ ], template: "<mgl-geojson-source\n #source\n [id]=\"sourceId()\"\n [data]=\"data()\"\n [cluster]=\"true\"\n [clusterRadius]=\"clusterRadius()\"\n [clusterMaxZoom]=\"clusterMaxZoom()\"\n [clusterMinPoints]=\"clusterMinPoints()\"\n [clusterProperties]=\"clusterConfiguration().clusterProperties\"\n/>\n\n<mgl-markers-for-clusters [source]=\"sourceId()\">\n <ng-template let-feature mglClusterPoint>\n <si-cluster-marker\n [feature]=\"feature\"\n [segments]=\"clusterConfiguration().segments\"\n (markerClick)=\"clusterClick.emit(feature)\"\n />\n </ng-template>\n</mgl-markers-for-clusters>\n\n<ng-content />\n" }]
321
+ }], propDecorators: { sourceId: [{ type: i0.Input, args: [{ isSignal: true, alias: "sourceId", required: true }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: false }] }], groupProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupProperty", required: false }] }], groupColors: [{ type: i0.Input, args: [{ isSignal: true, alias: "groupColors", required: false }] }], statusProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "statusProperty", required: false }] }], clusterRadius: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterRadius", required: false }] }], clusterMaxZoom: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterMaxZoom", required: false }] }], clusterMinPoints: [{ type: i0.Input, args: [{ isSignal: true, alias: "clusterMinPoints", required: false }] }], clusterClick: [{ type: i0.Output, args: ["clusterClick"] }], source: [{ type: i0.ViewChild, args: [i0.forwardRef(() => GeoJSONSourceComponent), { isSignal: true }] }] } });
322
+
323
+ /**
324
+ * Copyright (c) Siemens 2016 - 2026
325
+ * SPDX-License-Identifier: MIT
326
+ */
327
+ /**
328
+ * Template for custom location content inside `si-cluster-popover`.
329
+ *
330
+ * Receives a {@link ClusterPopoverContext} with all locations loaded so far. Loading feedback,
331
+ * error recovery, and the "Load more" button are handled by the popover.
332
+ *
333
+ * @experimental
334
+ */
335
+ class SiClusterPopoverTemplateDirective {
336
+ /** @internal */
337
+ static ngTemplateContextGuard(directive, context) {
338
+ return true;
339
+ }
340
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterPopoverTemplateDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
341
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SiClusterPopoverTemplateDirective, isStandalone: true, selector: "[siClusterPopoverTemplate]", ngImport: i0 });
342
+ }
343
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterPopoverTemplateDirective, decorators: [{
344
+ type: Directive,
345
+ args: [{
346
+ selector: '[siClusterPopoverTemplate]'
347
+ }]
348
+ }] });
349
+
350
+ /**
351
+ * Copyright (c) Siemens 2016 - 2026
352
+ * SPDX-License-Identifier: MIT
353
+ */
354
+ /**
355
+ * Optional popup with incrementally loaded locations projected into a `si-cluster-source`.
356
+ *
357
+ * @experimental
358
+ */
359
+ class SiClusterPopoverComponent {
360
+ static idCounter = 0;
361
+ destroyRef = inject(DestroyRef);
362
+ focusTrapFactory = inject(FocusTrapFactory);
363
+ document = inject(DOCUMENT);
364
+ source = inject(SiClusterSourceComponent);
365
+ mapService = inject(MapService);
366
+ resizeObserver = inject(ResizeObserverService);
367
+ /**
368
+ * Maximum width passed to the MapLibre popup.
369
+ * @defaultValue '320px'
370
+ */
371
+ maxWidth = input('320px', /* @ts-ignore */
372
+ ...(ngDevMode ? [{ debugName: "maxWidth" }] : /* istanbul ignore next */ []));
373
+ /**
374
+ * Whether the popup closes when the map moves.
375
+ * @defaultValue true
376
+ */
377
+ closeOnMove = input(true, { ...(ngDevMode ? { debugName: "closeOnMove" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
378
+ /**
379
+ * Number of locations loaded initially and with each "Load more" action.
380
+ * @defaultValue 8
381
+ */
382
+ pageSize = input(8, { ...(ngDevMode ? { debugName: "pageSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
383
+ /**
384
+ * Feature property displayed in the default list.
385
+ * @defaultValue 'name'
386
+ */
387
+ labelProperty = input('name', /* @ts-ignore */
388
+ ...(ngDevMode ? [{ debugName: "labelProperty" }] : /* istanbul ignore next */ []));
389
+ /**
390
+ * Feature property displayed as the description in the default list.
391
+ * @defaultValue 'description'
392
+ */
393
+ descriptionProperty = input('description', /* @ts-ignore */
394
+ ...(ngDevMode ? [{ debugName: "descriptionProperty" }] : /* istanbul ignore next */ []));
395
+ dialog = viewChild('dialog', /* @ts-ignore */
396
+ ...(ngDevMode ? [{ debugName: "dialog" }] : /* istanbul ignore next */ []));
397
+ scrollRegion = viewChild('scrollRegion', /* @ts-ignore */
398
+ ...(ngDevMode ? [{ debugName: "scrollRegion" }] : /* istanbul ignore next */ []));
399
+ batchButton = viewChild('batchButton', /* @ts-ignore */
400
+ ...(ngDevMode ? [{ debugName: "batchButton" }] : /* istanbul ignore next */ []));
401
+ selectedCluster = linkedSignal(() => {
402
+ this.source.sourceId();
403
+ this.source.data();
404
+ this.source.groupProperty();
405
+ this.source.groupColors();
406
+ this.source.statusProperty();
407
+ this.source.clusterRadius();
408
+ this.source.clusterMaxZoom();
409
+ this.source.clusterMinPoints();
410
+ return undefined;
411
+ }, /* @ts-ignore */
412
+ ...(ngDevMode ? [{ debugName: "selectedCluster" }] : /* istanbul ignore next */ []));
413
+ batchFocusRequested = linkedSignal(() => {
414
+ this.selectedCluster();
415
+ this.pageSize();
416
+ return false;
417
+ }, /* @ts-ignore */
418
+ ...(ngDevMode ? [{ debugName: "batchFocusRequested" }] : /* istanbul ignore next */ []));
419
+ offset = linkedSignal(() => {
420
+ this.selectedCluster();
421
+ this.pageSize();
422
+ return 0;
423
+ }, /* @ts-ignore */
424
+ ...(ngDevMode ? [{ debugName: "offset" }] : /* istanbul ignore next */ []));
425
+ displayedFeatures = linkedSignal({ ...(ngDevMode ? { debugName: "displayedFeatures" } : /* istanbul ignore next */ {}), source: () => ({
426
+ cluster: this.selectedCluster(),
427
+ limit: this.pageSize(),
428
+ offset: this.offset(),
429
+ features: this.leaves.hasValue() ? this.leaves.value() : undefined
430
+ }),
431
+ computation: (current, previous) => {
432
+ if (!current.cluster) {
433
+ return [];
434
+ }
435
+ const retainedFeatures = current.cluster === previous?.source.cluster && current.limit === previous.source.limit
436
+ ? previous.value
437
+ : [];
438
+ return current.features
439
+ ? [...retainedFeatures.slice(0, current.offset), ...current.features]
440
+ : retainedFeatures;
441
+ } });
442
+ titleId = `__si-cluster-popover-title-${SiClusterPopoverComponent.idCounter++}`;
443
+ popupCoordinates = linkedSignal(() => this.selectedCluster()?.geometry.coordinates, /* @ts-ignore */
444
+ ...(ngDevMode ? [{ debugName: "popupCoordinates" }] : /* istanbul ignore next */ []));
445
+ availableBlockSize = signal(undefined, /* @ts-ignore */
446
+ ...(ngDevMode ? [{ debugName: "availableBlockSize" }] : /* istanbul ignore next */ []));
447
+ leaves = resource({ ...(ngDevMode ? { debugName: "leaves" } : /* istanbul ignore next */ {}), params: () => {
448
+ const cluster = this.selectedCluster();
449
+ return cluster
450
+ ? {
451
+ cluster,
452
+ limit: this.pageSize(),
453
+ offset: this.offset()
454
+ }
455
+ : undefined;
456
+ },
457
+ loader: ({ params }) => this.source.getClusterLeaves(Number(params.cluster.properties?.cluster_id), params.limit, params.offset) });
458
+ context = computed(() => {
459
+ const features = this.displayedFeatures();
460
+ const cluster = this.selectedCluster();
461
+ if (!cluster) {
462
+ return undefined;
463
+ }
464
+ return {
465
+ $implicit: features,
466
+ features,
467
+ total: Number(cluster.properties?.point_count),
468
+ loading: this.leaves.isLoading(),
469
+ error: this.leaves.error(),
470
+ cluster,
471
+ close: this.close
472
+ };
473
+ }, /* @ts-ignore */
474
+ ...(ngDevMode ? [{ debugName: "context" }] : /* istanbul ignore next */ []));
475
+ template = contentChild(SiClusterPopoverTemplateDirective, { ...(ngDevMode ? { debugName: "template" } : /* istanbul ignore next */ {}), read: TemplateRef });
476
+ clusterPopoverTitle = t(() => $localize `:@@SI_MAP_CLUSTER.POPOVER_TITLE:Cluster with {{count}} locations`);
477
+ locationsLabel = t(() => $localize `:@@SI_MAP_CLUSTER.LOCATIONS:Cluster locations`);
478
+ errorText = t(() => $localize `:@@SI_MAP_CLUSTER.ERROR:Could not load locations.`);
479
+ loadMoreText = t(() => $localize `:@@SI_MAP_CLUSTER.LOAD_MORE:Load more`);
480
+ retryText = t(() => $localize `:@@SI_MAP_CLUSTER.RETRY:Retry`);
481
+ closeText = t(() => $localize `:@@SI_MAP_CLUSTER.CLOSE:Close`);
482
+ icons = addIcons({ elementCancel });
483
+ close = () => this.selectedCluster.set(undefined);
484
+ loadBatch = () => {
485
+ if (this.leaves.isLoading()) {
486
+ return;
487
+ }
488
+ // Safari does not focus buttons on click.
489
+ this.batchButton()?.nativeElement.focus({ preventScroll: true });
490
+ this.batchFocusRequested.set(true);
491
+ if (this.leaves.error()) {
492
+ this.leaves.reload();
493
+ }
494
+ else {
495
+ this.offset.set(this.displayedFeatures().length);
496
+ }
497
+ };
498
+ constructor() {
499
+ const subscription = this.source.clusterClick.subscribe(cluster => {
500
+ this.selectedCluster.set(cluster);
501
+ });
502
+ this.destroyRef.onDestroy(() => subscription.unsubscribe());
503
+ effect(onCleanup => {
504
+ const dialog = this.dialog()?.nativeElement;
505
+ const cluster = this.selectedCluster();
506
+ if (!dialog || !cluster) {
507
+ return;
508
+ }
509
+ const focusTrap = this.focusTrapFactory.create(dialog);
510
+ const focusSubscription = from(focusTrap.focusFirstTabbableElementWhenReady()).subscribe();
511
+ const map = this.mapService.mapInstance;
512
+ const mapContainer = map.getContainer();
513
+ const updateAvailableSpace = () => {
514
+ const [longitude, latitude] = cluster.geometry.coordinates;
515
+ const { y } = map.project([longitude, latitude]);
516
+ const height = mapContainer.clientHeight;
517
+ this.availableBlockSize.set(Math.min(height, Math.max(y, height - y)));
518
+ };
519
+ updateAvailableSpace();
520
+ const mapResizeSubscription = this.resizeObserver
521
+ .observe(mapContainer, 0)
522
+ .subscribe(updateAvailableSpace);
523
+ const dialogResizeSubscription = this.resizeObserver.observe(dialog, 0).subscribe(() => {
524
+ // A new coordinate reference refreshes MapLibre's popup anchor.
525
+ this.popupCoordinates.update(coordinates => (coordinates ? [...coordinates] : undefined));
526
+ });
527
+ const moveSubscription = map.on('move', updateAvailableSpace);
528
+ onCleanup(() => {
529
+ mapResizeSubscription.unsubscribe();
530
+ dialogResizeSubscription.unsubscribe();
531
+ moveSubscription.unsubscribe();
532
+ focusSubscription.unsubscribe();
533
+ focusTrap.destroy();
534
+ });
535
+ });
536
+ afterRenderEffect({
537
+ earlyRead: () => {
538
+ if (!this.batchFocusRequested()) {
539
+ return undefined;
540
+ }
541
+ const loading = this.leaves.isLoading();
542
+ const button = this.batchButton()?.nativeElement;
543
+ const active = this.document.activeElement;
544
+ return {
545
+ loading,
546
+ button: active === button ? button : undefined,
547
+ scrollRegion: !button && active === this.document.body
548
+ ? this.scrollRegion()?.nativeElement
549
+ : undefined
550
+ };
551
+ },
552
+ write: state => {
553
+ const request = state();
554
+ if (!request || request.loading) {
555
+ return;
556
+ }
557
+ this.batchFocusRequested.set(false);
558
+ if (request.button) {
559
+ request.button.scrollIntoView({ block: 'nearest', inline: 'nearest' });
560
+ }
561
+ else {
562
+ request.scrollRegion?.focus({ preventScroll: true });
563
+ }
564
+ }
565
+ });
566
+ effect(onCleanup => {
567
+ if (!this.selectedCluster()) {
568
+ return;
569
+ }
570
+ const trigger = this.document.activeElement;
571
+ onCleanup(() => {
572
+ const active = this.document.activeElement;
573
+ if (trigger instanceof HTMLElement &&
574
+ trigger.isConnected &&
575
+ (active === this.document.body || this.dialog()?.nativeElement.contains(active))) {
576
+ trigger.focus();
577
+ }
578
+ });
579
+ });
580
+ }
581
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterPopoverComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
582
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiClusterPopoverComponent, isStandalone: true, selector: "si-cluster-popover", inputs: { maxWidth: { classPropertyName: "maxWidth", publicName: "maxWidth", isSignal: true, isRequired: false, transformFunction: null }, closeOnMove: { classPropertyName: "closeOnMove", publicName: "closeOnMove", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, labelProperty: { classPropertyName: "labelProperty", publicName: "labelProperty", isSignal: true, isRequired: false, transformFunction: null }, descriptionProperty: { classPropertyName: "descriptionProperty", publicName: "descriptionProperty", isSignal: true, isRequired: false, transformFunction: null } }, queries: [{ propertyName: "template", first: true, predicate: SiClusterPopoverTemplateDirective, descendants: true, read: TemplateRef, isSignal: true }], viewQueries: [{ propertyName: "dialog", first: true, predicate: ["dialog"], descendants: true, isSignal: true }, { propertyName: "scrollRegion", first: true, predicate: ["scrollRegion"], descendants: true, isSignal: true }, { propertyName: "batchButton", first: true, predicate: ["batchButton"], descendants: true, isSignal: true }], ngImport: i0, template: "@if (context(); as context) {\n <mgl-popup\n [maxWidth]=\"maxWidth()\"\n [lngLat]=\"popupCoordinates()\"\n [closeOnMove]=\"closeOnMove()\"\n [focusAfterOpen]=\"false\"\n [closeButton]=\"false\"\n (popupClose)=\"context.close()\"\n >\n <section\n #dialog\n class=\"cluster-popover d-flex flex-column\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"titleId\"\n [style.--_si-cluster-popover-available-block-size.px]=\"availableBlockSize()\"\n (keydown.escape)=\"$event.stopPropagation(); context.close()\"\n >\n <div class=\"popover-header flex-shrink-0\">\n <strong class=\"flex-grow-1\" [id]=\"titleId\">\n {{ clusterPopoverTitle | translate: { count: context.total } }}\n </strong>\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost ms-2\"\n [attr.aria-label]=\"closeText | translate\"\n (click)=\"context.close()\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n </div>\n <div\n class=\"cluster-popover-body d-flex flex-column p-2\"\n [siLoading]=\"context.loading\"\n [blocking]=\"true\"\n >\n <div\n #scrollRegion\n class=\"cluster-popover-scroll overflow-auto\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"locationsLabel | translate\"\n >\n <div [inert]=\"context.loading\" [attr.aria-busy]=\"context.loading\">\n @if (template(); as customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"context\"\n />\n } @else {\n <ul class=\"list-unstyled mb-0\">\n @for (feature of context.features; track feature.id ?? $index) {\n <li class=\"list-item p-4\">\n <div class=\"list-item-title pt-0\">\n {{ feature.properties?.[labelProperty()] }}\n </div>\n <div class=\"list-item-description mb-0\">\n {{ feature.properties?.[descriptionProperty()] }}\n </div>\n </li>\n }\n </ul>\n }\n </div>\n @if (context.error && !context.loading) {\n <p role=\"alert\" class=\"mt-4 mb-0\">{{ errorText | translate }}</p>\n }\n @if (\n context.error ||\n (context.features.length > 0 && context.features.length < context.total)\n ) {\n <button\n #batchButton\n type=\"button\"\n class=\"btn btn-link d-flex w-100 justify-content-center p-4 focus-inside\"\n [class.disabled]=\"context.loading\"\n [attr.aria-disabled]=\"context.loading\"\n (click)=\"loadBatch()\"\n >\n {{ (context.error ? retryText : loadMoreText) | translate }}\n </button>\n }\n </div>\n </div>\n </section>\n </mgl-popup>\n}\n", styles: [".cluster-popover{min-inline-size:200px;max-block-size:calc(var(--_si-cluster-popover-available-block-size, 100dvb) - var(--si-sys-sizing-spacing-y-60) * 2)}.cluster-popover-body,.cluster-popover-scroll{min-block-size:0}.cluster-popover-scroll{overscroll-behavior-block:contain}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PopupComponent, selector: "mgl-popup", inputs: ["closeButton", "closeOnClick", "closeOnMove", "focusAfterOpen", "anchor", "className", "contentStyle", "locationOccludedOpacity", "feature", "lngLat", "marker", "offset", "maxWidth", "subpixelPositioning", "padding"], outputs: ["popupClose", "popupOpen"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "directive", type: SiLoadingSpinnerDirective, selector: "[siLoading]", inputs: ["siLoading", "blocking", "initialDelay", "loadingText"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
583
+ }
584
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiClusterPopoverComponent, decorators: [{
585
+ type: Component,
586
+ args: [{ selector: 'si-cluster-popover', imports: [
587
+ NgTemplateOutlet,
588
+ PopupComponent,
589
+ SiIconComponent,
590
+ SiLoadingSpinnerDirective,
591
+ SiTranslatePipe
592
+ ], template: "@if (context(); as context) {\n <mgl-popup\n [maxWidth]=\"maxWidth()\"\n [lngLat]=\"popupCoordinates()\"\n [closeOnMove]=\"closeOnMove()\"\n [focusAfterOpen]=\"false\"\n [closeButton]=\"false\"\n (popupClose)=\"context.close()\"\n >\n <section\n #dialog\n class=\"cluster-popover d-flex flex-column\"\n role=\"dialog\"\n [attr.aria-labelledby]=\"titleId\"\n [style.--_si-cluster-popover-available-block-size.px]=\"availableBlockSize()\"\n (keydown.escape)=\"$event.stopPropagation(); context.close()\"\n >\n <div class=\"popover-header flex-shrink-0\">\n <strong class=\"flex-grow-1\" [id]=\"titleId\">\n {{ clusterPopoverTitle | translate: { count: context.total } }}\n </strong>\n <button\n type=\"button\"\n class=\"btn btn-circle btn-sm btn-ghost ms-2\"\n [attr.aria-label]=\"closeText | translate\"\n (click)=\"context.close()\"\n >\n <si-icon [icon]=\"icons.elementCancel\" />\n </button>\n </div>\n <div\n class=\"cluster-popover-body d-flex flex-column p-2\"\n [siLoading]=\"context.loading\"\n [blocking]=\"true\"\n >\n <div\n #scrollRegion\n class=\"cluster-popover-scroll overflow-auto\"\n role=\"region\"\n tabindex=\"0\"\n [attr.aria-label]=\"locationsLabel | translate\"\n >\n <div [inert]=\"context.loading\" [attr.aria-busy]=\"context.loading\">\n @if (template(); as customTemplate) {\n <ng-container\n [ngTemplateOutlet]=\"customTemplate\"\n [ngTemplateOutletContext]=\"context\"\n />\n } @else {\n <ul class=\"list-unstyled mb-0\">\n @for (feature of context.features; track feature.id ?? $index) {\n <li class=\"list-item p-4\">\n <div class=\"list-item-title pt-0\">\n {{ feature.properties?.[labelProperty()] }}\n </div>\n <div class=\"list-item-description mb-0\">\n {{ feature.properties?.[descriptionProperty()] }}\n </div>\n </li>\n }\n </ul>\n }\n </div>\n @if (context.error && !context.loading) {\n <p role=\"alert\" class=\"mt-4 mb-0\">{{ errorText | translate }}</p>\n }\n @if (\n context.error ||\n (context.features.length > 0 && context.features.length < context.total)\n ) {\n <button\n #batchButton\n type=\"button\"\n class=\"btn btn-link d-flex w-100 justify-content-center p-4 focus-inside\"\n [class.disabled]=\"context.loading\"\n [attr.aria-disabled]=\"context.loading\"\n (click)=\"loadBatch()\"\n >\n {{ (context.error ? retryText : loadMoreText) | translate }}\n </button>\n }\n </div>\n </div>\n </section>\n </mgl-popup>\n}\n", styles: [".cluster-popover{min-inline-size:200px;max-block-size:calc(var(--_si-cluster-popover-available-block-size, 100dvb) - var(--si-sys-sizing-spacing-y-60) * 2)}.cluster-popover-body,.cluster-popover-scroll{min-block-size:0}.cluster-popover-scroll{overscroll-behavior-block:contain}\n"] }]
593
+ }], ctorParameters: () => [], propDecorators: { maxWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "maxWidth", required: false }] }], closeOnMove: [{ type: i0.Input, args: [{ isSignal: true, alias: "closeOnMove", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], labelProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "labelProperty", required: false }] }], descriptionProperty: [{ type: i0.Input, args: [{ isSignal: true, alias: "descriptionProperty", required: false }] }], dialog: [{ type: i0.ViewChild, args: ['dialog', { isSignal: true }] }], scrollRegion: [{ type: i0.ViewChild, args: ['scrollRegion', { isSignal: true }] }], batchButton: [{ type: i0.ViewChild, args: ['batchButton', { isSignal: true }] }], template: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SiClusterPopoverTemplateDirective), { ...{ read: TemplateRef }, isSignal: true }] }] } });
311
594
 
312
595
  const createDefaultLocale = () => ({
313
596
  'AttributionControl.ToggleAttribution': t(() => $localize `:@@SI_MAP.TOGGLE_ATTRIBUTION:Toggle attribution`),
@@ -397,5 +680,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
397
680
  * Generated bundle index. Do not edit.
398
681
  */
399
682
 
400
- export { SiClusterSourceComponent, SiStatusMarkerComponent, injectSiMapStyle, injectSiMapTranslations };
683
+ export { SiClusterPopoverComponent, SiClusterPopoverTemplateDirective, SiClusterSourceComponent, SiStatusMarkerComponent, injectSiMapStyle, injectSiMapTranslations };
401
684
  //# sourceMappingURL=siemens-element-ng-maplibre.mjs.map