@siemens/element-ng 51.3.0 → 51.4.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 (40) hide show
  1. package/fesm2022/siemens-element-ng-breadcrumb.mjs +8 -46
  2. package/fesm2022/siemens-element-ng-breadcrumb.mjs.map +1 -1
  3. package/fesm2022/siemens-element-ng-chat-messages.mjs +2 -2
  4. package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
  5. package/fesm2022/siemens-element-ng-common.mjs +5 -0
  6. package/fesm2022/siemens-element-ng-common.mjs.map +1 -1
  7. package/fesm2022/siemens-element-ng-dashboard.mjs +2 -3
  8. package/fesm2022/siemens-element-ng-dashboard.mjs.map +1 -1
  9. package/fesm2022/siemens-element-ng-filtered-search.mjs +255 -160
  10. package/fesm2022/siemens-element-ng-filtered-search.mjs.map +1 -1
  11. package/fesm2022/siemens-element-ng-formly.mjs +12 -8
  12. package/fesm2022/siemens-element-ng-formly.mjs.map +1 -1
  13. package/fesm2022/siemens-element-ng-maplibre.mjs +293 -10
  14. package/fesm2022/siemens-element-ng-maplibre.mjs.map +1 -1
  15. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs +2 -2
  16. package/fesm2022/siemens-element-ng-markdown-extensions-katex.mjs.map +1 -1
  17. package/fesm2022/siemens-element-ng-popover.mjs +3 -1
  18. package/fesm2022/siemens-element-ng-popover.mjs.map +1 -1
  19. package/fesm2022/siemens-element-ng-shadow-root.mjs +54 -1
  20. package/fesm2022/siemens-element-ng-shadow-root.mjs.map +1 -1
  21. package/fesm2022/siemens-element-ng-theme.mjs +59 -23
  22. package/fesm2022/siemens-element-ng-theme.mjs.map +1 -1
  23. package/fesm2022/siemens-element-ng-tooltip.mjs +82 -10
  24. package/fesm2022/siemens-element-ng-tooltip.mjs.map +1 -1
  25. package/fesm2022/siemens-element-ng-translate.mjs.map +1 -1
  26. package/fesm2022/siemens-element-ng-tree-view.mjs +2 -2
  27. package/fesm2022/siemens-element-ng-tree-view.mjs.map +1 -1
  28. package/maplibre/styles/maplibre-gl.scss +4 -0
  29. package/package.json +7 -7
  30. package/template-i18n.json +6 -0
  31. package/types/siemens-element-ng-breadcrumb.d.ts +1 -1
  32. package/types/siemens-element-ng-common.d.ts +5 -0
  33. package/types/siemens-element-ng-dashboard.d.ts +0 -1
  34. package/types/siemens-element-ng-filtered-search.d.ts +26 -10
  35. package/types/siemens-element-ng-maplibre.d.ts +112 -5
  36. package/types/siemens-element-ng-popover.d.ts +1 -0
  37. package/types/siemens-element-ng-shadow-root.d.ts +16 -1
  38. package/types/siemens-element-ng-theme.d.ts +35 -7
  39. package/types/siemens-element-ng-tooltip.d.ts +14 -1
  40. package/types/siemens-element-ng-translate.d.ts +6 -0
@@ -563,6 +563,10 @@ $icon-terrain: url('@siemens/element-icons/icons/element-waters.svg');
563
563
  padding-inline: 10px;
564
564
  pointer-events: auto;
565
565
 
566
+ &:has(.cluster-popover) {
567
+ padding: 0;
568
+ }
569
+
566
570
  .maplibregl-popup-anchor-top-left & {
567
571
  border-start-start-radius: 0;
568
572
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@siemens/element-ng",
3
3
  "description": "Element Angular component library, implementing the Siemens Design Language",
4
- "version": "51.3.0",
4
+ "version": "51.4.0",
5
5
  "license": "MIT",
6
6
  "repository": {
7
7
  "type": "git",
@@ -42,21 +42,21 @@
42
42
  "@angular/forms": "22",
43
43
  "@angular/router": "22",
44
44
  "@angular/aria": "22",
45
- "@ngx-formly/bootstrap": "^6.2.2 || ^7.0.1",
46
- "@ngx-formly/core": "^6.2.2 || ^7.0.1",
45
+ "@ngx-formly/bootstrap": "^6.2.2 || ^7.0.1 || ^8.0.0",
46
+ "@ngx-formly/core": "^6.2.2 || ^7.0.1 || ^8.0.0",
47
47
  "@maplibre/ngx-maplibre-gl": "21 - 22",
48
48
  "maplibre-gl": "5 - 6",
49
49
  "@siemens/element-icons": "1",
50
- "@siemens/element-theme": "51.3.0",
51
- "@siemens/element-translate-ng": "51.3.0",
52
- "@siemens/map-styles": "51.3.0",
50
+ "@siemens/element-theme": "51.4.0",
51
+ "@siemens/element-translate-ng": "51.4.0",
52
+ "@siemens/map-styles": "51.4.0",
53
53
  "@siemens/ngx-datatable": "26 - 27",
54
54
  "ag-grid-community": "^34.3.1 || ^35.0.0 || ^36.0.0",
55
55
  "flag-icons": "^7.3.2",
56
56
  "google-libphonenumber": "^3.2.40",
57
57
  "highlight.js": "^11.11.1",
58
58
  "mermaid": "^11.16.0",
59
- "katex": "^0.17.0 || ^0.18.0",
59
+ "katex": "^0.17.0 || ^0.18.0 || ^0.19.0",
60
60
  "ngx-image-cropper": "^9.0.0",
61
61
  "remark-directive": "^4.0.0",
62
62
  "remark-gfm": "^4.0.1",
@@ -205,7 +205,13 @@
205
205
  "SI_MAP.WINDOWS_HELP": "Use Ctrl + scroll to zoom the map",
206
206
  "SI_MAP.ZOOM_IN": "Zoom in",
207
207
  "SI_MAP.ZOOM_OUT": "Zoom out",
208
+ "SI_MAP_CLUSTER.CLOSE": "Close",
209
+ "SI_MAP_CLUSTER.ERROR": "Could not load locations.",
208
210
  "SI_MAP_CLUSTER.LABEL": "Cluster with {{count}} locations",
211
+ "SI_MAP_CLUSTER.LOAD_MORE": "Load more",
212
+ "SI_MAP_CLUSTER.LOCATIONS": "Cluster locations",
213
+ "SI_MAP_CLUSTER.POPOVER_TITLE": "Cluster with {{count}} locations",
214
+ "SI_MAP_CLUSTER.RETRY": "Retry",
209
215
  "SI_MARKDOWN.COPIED_CODE": "Copied",
210
216
  "SI_MARKDOWN.COPY_CODE": "Copy code",
211
217
  "SI_MARKDOWN.COPY_TABLE_AS_CSV": "Copy table as CSV",
@@ -66,7 +66,6 @@ declare class SiBreadcrumbComponent implements OnChanges, OnDestroy {
66
66
  protected breadcrumbShortened: boolean;
67
67
  protected ellipsesLevel: number;
68
68
  protected breadcrumbDropdownOpen: number | undefined;
69
- protected addExpandDropdown: boolean;
70
69
  protected controlId: string;
71
70
  protected readonly icons: Record<"elementBreadcrumbRoot" | "elementRight2", string>;
72
71
  private readonly breadcrumbElement;
@@ -76,6 +75,7 @@ declare class SiBreadcrumbComponent implements OnChanges, OnDestroy {
76
75
  ngOnChanges(): void;
77
76
  ngOnDestroy(): void;
78
77
  private processItems;
78
+ /** Toggle the ellipses dropdown to show the hidden breadcrumb levels. */
79
79
  protected toggleBreadcrumbDropdown(itemLevel: number): void;
80
80
  protected documentClick(targetElement: any): void;
81
81
  protected resetBreadcrumb(): void;
@@ -130,6 +130,11 @@ declare class TextMeasureService {
130
130
  /**
131
131
  * Gets the width of the scrollbar. Nesc for windows
132
132
  * http://stackoverflow.com/a/13382873/888165
133
+ *
134
+ * @deprecated This service uses a legacy DOM-measurement hack to determine scrollbar width.
135
+ * Use `element.offsetWidth - element.clientWidth` on the scrollable element directly,
136
+ * which is more accurate, SSR-safe, and accounts for OS-level theming and CSS overrides.
137
+ * Will be removed in v52.
133
138
  */
134
139
  declare class ScrollbarHelper {
135
140
  private document;
@@ -129,7 +129,6 @@ declare class SiDashboardComponent implements OnChanges, AfterViewInit {
129
129
  private scroller;
130
130
  private dashboardService;
131
131
  private resizeObserver;
132
- private scrollbarHelper;
133
132
  private cdRef;
134
133
  private document;
135
134
  private injector;
@@ -140,12 +140,23 @@ interface DisplayedCriteriaEventArgs {
140
140
  allow(criteriaNamesToDisplay: string[], freeText?: boolean): void;
141
141
  }
142
142
 
143
+ /** Criterion definition normalized for internal rendering and input handling. */
143
144
  interface InternalCriterionDefinition extends CriterionDefinition {
144
145
  label: string;
145
146
  translatedLabel: string;
147
+ /**
148
+ * Identifies free-text pills, displayed without a criterion label using a plain-text editor.
149
+ * Omitted for regular criteria. Internal only; not included in the search model.
150
+ */
146
151
  type?: 'free-text';
147
152
  }
148
153
 
154
+ interface InternalCriterion {
155
+ config: InternalCriterionDefinition;
156
+ value: CriterionValue;
157
+ editOnCreation: boolean;
158
+ initialValueText?: string;
159
+ }
149
160
  declare class SiFilteredSearchComponent implements OnInit, OnChanges {
150
161
  /**
151
162
  * Factory for CDK scroll strategies used by filtered-search overlays.
@@ -375,11 +386,8 @@ declare class SiFilteredSearchComponent implements OnInit, OnChanges {
375
386
  private readonly scrollContainer;
376
387
  private readonly valueComponents;
377
388
  protected dataSource: Observable<InternalCriterionDefinition[]>;
378
- protected autoEditCriteria: boolean;
379
- protected readonly values: _angular_core.WritableSignal<{
380
- config: InternalCriterionDefinition;
381
- value: CriterionValue;
382
- }[]>;
389
+ protected readonly values: _angular_core.WritableSignal<InternalCriterion[]>;
390
+ protected readonly maxCriteriaReached: _angular_core.Signal<boolean>;
383
391
  protected readonly searchValue: _angular_core.WritableSignal<string>;
384
392
  /** Internal criteria model */
385
393
  protected internalCriterionDefinitions: InternalCriterionDefinition[];
@@ -423,6 +431,11 @@ declare class SiFilteredSearchComponent implements OnInit, OnChanges {
423
431
  */
424
432
  private convertToExternalModel;
425
433
  private addCriterion;
434
+ private resolveValue;
435
+ private isDateCriterion;
436
+ private parseModelDate;
437
+ private parseInputDate;
438
+ private getAllowedCriteria;
426
439
  /**
427
440
  * Get criteria list to be shown in typeahead.
428
441
  * @returns list of criteria to be shown in typeahead.
@@ -434,22 +447,25 @@ declare class SiFilteredSearchComponent implements OnInit, OnChanges {
434
447
  protected onCreateCriterion(event: {
435
448
  criterion: InternalCriterionDefinition;
436
449
  value?: string;
450
+ accept: () => void;
437
451
  }): void;
438
452
  protected onCreateCriterionByName(event: {
439
453
  criterionName: string;
440
454
  value?: string;
455
+ editOnCreation?: boolean;
456
+ accept: () => void;
441
457
  }): void;
442
458
  protected onSearchValueChange(): void;
443
- protected valueChange(value: CriterionValue, criterion: {
444
- config: InternalCriterionDefinition;
445
- value: CriterionValue;
446
- }): void;
459
+ protected valueChange(value: CriterionValue, criterion: InternalCriterion): void;
447
460
  protected focusNext(index: number, event: {
448
461
  freeText: string;
449
462
  } | void): void;
450
463
  private updateAndEmitSearchCriteria;
451
464
  private emitChangeEvent;
452
- protected createFreeTextPill(query: string): void;
465
+ protected createFreeTextPill(event: {
466
+ query: string;
467
+ accept: () => void;
468
+ }): void;
453
469
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SiFilteredSearchComponent, never>;
454
470
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SiFilteredSearchComponent, "si-filtered-search", never, { "scrollStrategy": { "alias": "scrollStrategy"; "required": false; "isSignal": true; }; "doSearchOnInputChange": { "alias": "doSearchOnInputChange"; "required": false; "isSignal": true; }; "lazyCriterionProvider": { "alias": "lazyCriterionProvider"; "required": false; "isSignal": true; }; "lazyValueProvider": { "alias": "lazyValueProvider"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "strictCriterion": { "alias": "strictCriterion"; "required": false; "isSignal": true; }; "strictValue": { "alias": "strictValue"; "required": false; "isSignal": true; }; "onlySelectValue": { "alias": "onlySelectValue"; "required": false; "isSignal": true; }; "lazyLoadingDebounceTime": { "alias": "lazyLoadingDebounceTime"; "required": false; "isSignal": true; }; "searchDebounceTime": { "alias": "searchDebounceTime"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "optionsInScrollableView": { "alias": "optionsInScrollableView"; "required": false; "isSignal": true; }; "searchCriteria": { "alias": "searchCriteria"; "required": false; "isSignal": true; }; "criteria": { "alias": "criteria"; "required": false; "isSignal": true; }; "exclusiveCriteria": { "alias": "exclusiveCriteria"; "required": false; "isSignal": true; }; "maxCriteria": { "alias": "maxCriteria"; "required": false; "isSignal": true; }; "maxCriteriaOptions": { "alias": "maxCriteriaOptions"; "required": false; "isSignal": true; }; "searchLabel": { "alias": "searchLabel"; "required": false; "isSignal": true; }; "clearButtonLabel": { "alias": "clearButtonLabel"; "required": false; "isSignal": true; }; "submitButtonLabel": { "alias": "submitButtonLabel"; "required": false; "isSignal": true; }; "itemCountText": { "alias": "itemCountText"; "required": false; "isSignal": true; }; "colorVariant": { "alias": "colorVariant"; "required": false; "isSignal": true; }; "disableFreeTextSearch": { "alias": "disableFreeTextSearch"; "required": false; "isSignal": true; }; "typeaheadOptionsLimit": { "alias": "typeaheadOptionsLimit"; "required": false; "isSignal": true; }; "disableSelectionByColonAndSemicolon": { "alias": "disableSelectionByColonAndSemicolon"; "required": false; "isSignal": true; }; "freeTextCriterion": { "alias": "freeTextCriterion"; "required": false; "isSignal": true; }; "searchForFreeTextLabel": { "alias": "searchForFreeTextLabel"; "required": false; "isSignal": true; }; }, { "doSearch": "doSearch"; "searchCriteria": "searchCriteriaChange"; "interceptDisplayedCriteria": "interceptDisplayedCriteria"; }, never, never, true, never>;
455
471
  }
@@ -1,8 +1,9 @@
1
1
  import { ExtendedStatusType } from '@siemens/element-ng/common';
2
2
  import * as _angular_core from '@angular/core';
3
- import { Signal } from '@angular/core';
3
+ import { Signal, TemplateRef } from '@angular/core';
4
4
  import { StyleSpecification } from 'maplibre-gl';
5
5
  import * as geojson from 'geojson';
6
+ import * as _siemens_element_translate_ng_translate from '@siemens/element-translate-ng/translate';
6
7
 
7
8
  /**
8
9
  * Copyright (c) Siemens 2016 - 2026
@@ -20,6 +21,27 @@ interface ClusterSegment {
20
21
  color: string;
21
22
  property: string;
22
23
  }
24
+ /**
25
+ * Context supplied to custom cluster popover templates, including all locations loaded so far.
26
+ *
27
+ * @experimental
28
+ */
29
+ interface ClusterPopoverContext {
30
+ /** All loaded original point features, exposed by an unqualified `let-features` binding. */
31
+ $implicit: readonly ClusterPoint[];
32
+ /** The same accumulated features as `$implicit`, exposed by `let-features="features"`. */
33
+ features: readonly ClusterPoint[];
34
+ /** Total number of locations in the selected cluster, including locations not yet loaded. */
35
+ total: number;
36
+ /** Whether the initial batch, an additional batch, or a retry is being loaded. */
37
+ loading: boolean;
38
+ /** Error from a failed batch request, or `undefined` when no error is available. */
39
+ error: unknown;
40
+ /** Selected cluster feature, including its `cluster_id` and `point_count` properties. */
41
+ cluster: ClusterPoint;
42
+ /** Closes the popover using the same behavior as its Close button. */
43
+ close: () => void;
44
+ }
23
45
 
24
46
  /**
25
47
  * Copyright (c) Siemens 2016 - 2026
@@ -144,9 +166,94 @@ declare class SiClusterSourceComponent {
144
166
  protected readonly clusterConfiguration: _angular_core.Signal<ClusterConfiguration>;
145
167
  /** Stores selection for the projected cluster-popover integration. */
146
168
  protected readonly selectedCluster: _angular_core.WritableSignal<ClusterPoint | undefined>;
147
- protected selectCluster(feature: ClusterPoint): Promise<void>;
169
+ private readonly source;
170
+ /**
171
+ * Returns a page of original points belonging to a cluster.
172
+ * @see https://maplibre.org/maplibre-gl-js/docs/API/classes/GeoJSONSource/#getclusterleaves
173
+ */
174
+ getClusterLeaves(clusterId: number, limit: number, offset: number): Promise<ClusterPoint[]>;
148
175
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SiClusterSourceComponent, never>;
149
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SiClusterSourceComponent, "si-cluster-source", never, { "sourceId": { "alias": "sourceId"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "groupProperty": { "alias": "groupProperty"; "required": false; "isSignal": true; }; "groupColors": { "alias": "groupColors"; "required": false; "isSignal": true; }; "statusProperty": { "alias": "statusProperty"; "required": false; "isSignal": true; }; "clusterRadius": { "alias": "clusterRadius"; "required": false; "isSignal": true; }; "clusterMaxZoom": { "alias": "clusterMaxZoom"; "required": false; "isSignal": true; }; "clusterMinPoints": { "alias": "clusterMinPoints"; "required": false; "isSignal": true; }; }, { "clusterClick": "clusterClick"; }, never, ["si-cluster-popover,[siClusterPopoverOutlet]"], true, never>;
176
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SiClusterSourceComponent, "si-cluster-source", never, { "sourceId": { "alias": "sourceId"; "required": true; "isSignal": true; }; "data": { "alias": "data"; "required": false; "isSignal": true; }; "groupProperty": { "alias": "groupProperty"; "required": false; "isSignal": true; }; "groupColors": { "alias": "groupColors"; "required": false; "isSignal": true; }; "statusProperty": { "alias": "statusProperty"; "required": false; "isSignal": true; }; "clusterRadius": { "alias": "clusterRadius"; "required": false; "isSignal": true; }; "clusterMaxZoom": { "alias": "clusterMaxZoom"; "required": false; "isSignal": true; }; "clusterMinPoints": { "alias": "clusterMinPoints"; "required": false; "isSignal": true; }; }, { "clusterClick": "clusterClick"; }, never, ["*"], true, never>;
177
+ }
178
+
179
+ /**
180
+ * Optional popup with incrementally loaded locations projected into a `si-cluster-source`.
181
+ *
182
+ * @experimental
183
+ */
184
+ declare class SiClusterPopoverComponent {
185
+ private static idCounter;
186
+ private readonly destroyRef;
187
+ private readonly focusTrapFactory;
188
+ private readonly document;
189
+ private readonly source;
190
+ private readonly mapService;
191
+ private readonly resizeObserver;
192
+ /**
193
+ * Maximum width passed to the MapLibre popup.
194
+ * @defaultValue '320px'
195
+ */
196
+ readonly maxWidth: _angular_core.InputSignal<string>;
197
+ /**
198
+ * Whether the popup closes when the map moves.
199
+ * @defaultValue true
200
+ */
201
+ readonly closeOnMove: _angular_core.InputSignalWithTransform<boolean, unknown>;
202
+ /**
203
+ * Number of locations loaded initially and with each "Load more" action.
204
+ * @defaultValue 8
205
+ */
206
+ readonly pageSize: _angular_core.InputSignalWithTransform<number, unknown>;
207
+ /**
208
+ * Feature property displayed in the default list.
209
+ * @defaultValue 'name'
210
+ */
211
+ readonly labelProperty: _angular_core.InputSignal<string>;
212
+ /**
213
+ * Feature property displayed as the description in the default list.
214
+ * @defaultValue 'description'
215
+ */
216
+ readonly descriptionProperty: _angular_core.InputSignal<string>;
217
+ private readonly dialog;
218
+ private readonly scrollRegion;
219
+ private readonly batchButton;
220
+ private readonly selectedCluster;
221
+ private readonly batchFocusRequested;
222
+ private readonly offset;
223
+ private readonly displayedFeatures;
224
+ protected readonly titleId: string;
225
+ protected readonly popupCoordinates: _angular_core.WritableSignal<geojson.Position | undefined>;
226
+ protected readonly availableBlockSize: _angular_core.WritableSignal<number | undefined>;
227
+ protected readonly leaves: _angular_core.ResourceRef<ClusterPoint[] | undefined>;
228
+ protected readonly context: _angular_core.Signal<ClusterPopoverContext | undefined>;
229
+ protected readonly template: _angular_core.Signal<TemplateRef<ClusterPopoverContext> | undefined>;
230
+ protected readonly clusterPopoverTitle: _siemens_element_translate_ng_translate.TranslatableString;
231
+ protected readonly locationsLabel: _siemens_element_translate_ng_translate.TranslatableString;
232
+ protected readonly errorText: _siemens_element_translate_ng_translate.TranslatableString;
233
+ protected readonly loadMoreText: _siemens_element_translate_ng_translate.TranslatableString;
234
+ protected readonly retryText: _siemens_element_translate_ng_translate.TranslatableString;
235
+ protected readonly closeText: _siemens_element_translate_ng_translate.TranslatableString;
236
+ protected readonly icons: Record<"elementCancel", string>;
237
+ protected readonly close: () => void;
238
+ protected readonly loadBatch: () => void;
239
+ constructor();
240
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SiClusterPopoverComponent, never>;
241
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SiClusterPopoverComponent, "si-cluster-popover", never, { "maxWidth": { "alias": "maxWidth"; "required": false; "isSignal": true; }; "closeOnMove": { "alias": "closeOnMove"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "labelProperty": { "alias": "labelProperty"; "required": false; "isSignal": true; }; "descriptionProperty": { "alias": "descriptionProperty"; "required": false; "isSignal": true; }; }, {}, ["template"], never, true, never>;
242
+ }
243
+
244
+ /**
245
+ * Template for custom location content inside `si-cluster-popover`.
246
+ *
247
+ * Receives a {@link ClusterPopoverContext} with all locations loaded so far. Loading feedback,
248
+ * error recovery, and the "Load more" button are handled by the popover.
249
+ *
250
+ * @experimental
251
+ */
252
+ declare class SiClusterPopoverTemplateDirective {
253
+ /** @internal */
254
+ static ngTemplateContextGuard(directive: SiClusterPopoverTemplateDirective, context: unknown): context is ClusterPopoverContext;
255
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<SiClusterPopoverTemplateDirective, never>;
256
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SiClusterPopoverTemplateDirective, "[siClusterPopoverTemplate]", never, {}, {}, never, never, true, never>;
150
257
  }
151
258
 
152
259
  /**
@@ -186,5 +293,5 @@ declare class SiStatusMarkerComponent {
186
293
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<SiStatusMarkerComponent, "si-status-marker", never, { "status": { "alias": "status"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
187
294
  }
188
295
 
189
- export { SiClusterSourceComponent, SiStatusMarkerComponent, injectSiMapStyle, injectSiMapTranslations };
190
- export type { ClusterColors, ClusterPoint, ClusterSegment, MarkerStatus };
296
+ export { SiClusterPopoverComponent, SiClusterPopoverTemplateDirective, SiClusterSourceComponent, SiStatusMarkerComponent, injectSiMapStyle, injectSiMapTranslations };
297
+ export type { ClusterColors, ClusterPoint, ClusterPopoverContext, ClusterSegment, MarkerStatus };
@@ -99,6 +99,7 @@ declare class PopoverComponent implements OnInit, OnDestroy {
99
99
  private elementRef;
100
100
  private focusTrapFactory;
101
101
  private focusTrap?;
102
+ private focusTimeoutId?;
102
103
  private readonly previouslyActiveElement;
103
104
  ngOnInit(): void;
104
105
  ngOnDestroy(): void;
@@ -1,5 +1,6 @@
1
1
  import { OverlayContainer } from '@angular/cdk/overlay';
2
2
  import * as i0 from '@angular/core';
3
+ import { Provider } from '@angular/core';
3
4
 
4
5
  /**
5
6
  * Copyright (c) Siemens 2016 - 2026
@@ -36,9 +37,23 @@ declare class SiShadowRootDirective extends OverlayContainer {
36
37
  private elementRef;
37
38
  private document;
38
39
  private destroyRef;
40
+ private themeTarget;
39
41
  protected _createContainer(): void;
40
42
  static ɵfac: i0.ɵɵFactoryDeclaration<SiShadowRootDirective, never>;
41
43
  static ɵdir: i0.ɵɵDirectiveDeclaration<SiShadowRootDirective, "[siShadowRoot]", never, {}, {}, never, never, true, never>;
42
44
  }
43
45
 
44
- export { SiShadowRootDirective };
46
+ /**
47
+ * Copyright (c) Siemens 2016 - 2026
48
+ * SPDX-License-Identifier: MIT
49
+ */
50
+
51
+ /**
52
+ * Provides the shadow root specific theme service with a dedicated theme target
53
+ * for components using Shadow DOM encapsulation.
54
+ * Use this when the component defines and loads the Element theme in its own shadow root instead
55
+ * of reusing the theme defined on `:root`.
56
+ */
57
+ declare const provideShadowRootThemeTarget: () => Provider;
58
+
59
+ export { SiShadowRootDirective, provideShadowRootThemeTarget };
@@ -1,6 +1,6 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import * as i0 from '@angular/core';
3
- import { EventEmitter, Signal } from '@angular/core';
3
+ import { InjectionToken, EventEmitter, Signal } from '@angular/core';
4
4
 
5
5
  /**
6
6
  * Copyright (c) Siemens 2016 - 2026
@@ -48,7 +48,8 @@ interface ThemeColorSchemes {
48
48
  type ThemeColorScheme = {
49
49
  [key: string]: string;
50
50
  };
51
- type ThemeType = 'dark' | 'light' | 'auto';
51
+ type ColorScheme = 'light' | 'dark';
52
+ type ThemeType = ColorScheme | 'auto';
52
53
  declare const ELEMENT_THEME_NAME = "element";
53
54
  declare const elementTheme: ThemeDescription;
54
55
 
@@ -134,6 +135,32 @@ declare class SiDefaultThemeStore extends SiThemeStore {
134
135
  private saveStore;
135
136
  }
136
137
 
138
+ /**
139
+ * Copyright (c) Siemens 2016 - 2026
140
+ * SPDX-License-Identifier: MIT
141
+ */
142
+
143
+ /**
144
+ * DOM boundary controlled by {@link SiThemeService}.
145
+ */
146
+ interface SiThemeDomTarget {
147
+ /** Element that receives theme and color-scheme classes. */
148
+ readonly element: HTMLElement;
149
+ /** CSS selector used for runtime theme variables. */
150
+ readonly rootSelector: string;
151
+ /** Event target for the legacy `theme-switch` event. */
152
+ readonly eventTarget?: EventTarget;
153
+ forEachElement(callback: (element: HTMLElement) => void): void;
154
+ registerElement?(element: HTMLElement): () => void;
155
+ getStyleElement(id: string): HTMLStyleElement | null;
156
+ appendStyleElement(style: HTMLStyleElement): void;
157
+ updateColorScheme(colorScheme: ColorScheme): void;
158
+ }
159
+ /**
160
+ * Theme DOM target. The default implementation targets the current document.
161
+ */
162
+ declare const SI_THEME_DOM_TARGET: InjectionToken<SiThemeDomTarget>;
163
+
137
164
  declare class SiThemeService {
138
165
  /**
139
166
  * The current color scheme. (e.g. light or dark).
@@ -190,8 +217,8 @@ declare class SiThemeService {
190
217
  private isBrowser;
191
218
  private previewTheme?;
192
219
  private themeStore;
193
- private meta;
194
220
  private document;
221
+ private themeTarget;
195
222
  constructor();
196
223
  /**
197
224
  * Returns `true` if a theme with the given name is available.
@@ -228,11 +255,11 @@ declare class SiThemeService {
228
255
  */
229
256
  setActiveTheme(name?: string, type?: ThemeType): Observable<boolean>;
230
257
  /**
231
- * Apply `light` or `dark` theme to the document.
258
+ * Apply `light` or `dark` theme to the configured theme target.
232
259
  */
233
260
  applyThemeType(type: ThemeType): void;
234
261
  /**
235
- * Applies the given theme to the document. If no theme is given, the active theme is applied.
262
+ * Applies the given theme to the configured theme target. If no theme is given, the active theme is applied.
236
263
  */
237
264
  applyTheme(theme?: Theme, type?: ThemeType, overwrite?: boolean): void;
238
265
  /**
@@ -248,6 +275,7 @@ declare class SiThemeService {
248
275
  private activateTheme;
249
276
  private hasThemeCSS;
250
277
  private createThemeCSS;
278
+ private createThemeSelector;
251
279
  private createThemeVariantCSS;
252
280
  private removeThemeCSS;
253
281
  private toggleDark;
@@ -267,5 +295,5 @@ declare class SiThemeService {
267
295
  */
268
296
  declare const injectIsDarkTheme: () => Signal<boolean>;
269
297
 
270
- export { ELEMENT_THEME_NAME, SI_THEME_LOCAL_STORAGE_KEY, SiDefaultThemeStore, SiThemeService, SiThemeStore, elementTheme, injectIsDarkTheme };
271
- export type { Theme, ThemeColorScheme, ThemeColorSchemes, ThemeDescription, ThemeProperty, ThemePropertyGroup, ThemePropertyType, ThemeStorage, ThemeType };
298
+ export { ELEMENT_THEME_NAME, SI_THEME_DOM_TARGET, SI_THEME_LOCAL_STORAGE_KEY, SiDefaultThemeStore, SiThemeService, SiThemeStore, elementTheme, injectIsDarkTheme };
299
+ export type { ColorScheme, SiThemeDomTarget, Theme, ThemeColorScheme, ThemeColorSchemes, ThemeDescription, ThemeProperty, ThemePropertyGroup, ThemePropertyType, ThemeStorage, ThemeType };
@@ -50,6 +50,19 @@ declare class SiTooltipModule {
50
50
  static ɵinj: i0.ɵɵInjectorDeclaration<SiTooltipModule>;
51
51
  }
52
52
 
53
+ /**
54
+ * Adds a tooltip containing the host element's text when that text is truncated.
55
+ */
56
+ declare class SiTooltipOverflowDirective {
57
+ private readonly elementRef;
58
+ private readonly tooltipService;
59
+ private readonly element;
60
+ constructor();
61
+ private canShow;
62
+ static ɵfac: i0.ɵɵFactoryDeclaration<SiTooltipOverflowDirective, never>;
63
+ static ɵdir: i0.ɵɵDirectiveDeclaration<SiTooltipOverflowDirective, "[siTooltipOverflow]", never, {}, {}, never, never, true, never>;
64
+ }
65
+
53
66
  /**
54
67
  * Copyright (c) Siemens 2016 - 2026
55
68
  * SPDX-License-Identifier: MIT
@@ -90,5 +103,5 @@ declare class SiTooltipService {
90
103
  static ɵprov: i0.ɵɵInjectableDeclaration<SiTooltipService>;
91
104
  }
92
105
 
93
- export { SiTooltipDirective, SiTooltipModule, SiTooltipService };
106
+ export { SiTooltipDirective, SiTooltipModule, SiTooltipOverflowDirective, SiTooltipService };
94
107
  export type { TooltipRef };
@@ -207,7 +207,13 @@ interface SiTranslatableKeys {
207
207
  'SI_MAP.WINDOWS_HELP'?: string;
208
208
  'SI_MAP.ZOOM_IN'?: string;
209
209
  'SI_MAP.ZOOM_OUT'?: string;
210
+ 'SI_MAP_CLUSTER.CLOSE'?: string;
211
+ 'SI_MAP_CLUSTER.ERROR'?: string;
210
212
  'SI_MAP_CLUSTER.LABEL'?: string;
213
+ 'SI_MAP_CLUSTER.LOAD_MORE'?: string;
214
+ 'SI_MAP_CLUSTER.LOCATIONS'?: string;
215
+ 'SI_MAP_CLUSTER.POPOVER_TITLE'?: string;
216
+ 'SI_MAP_CLUSTER.RETRY'?: string;
211
217
  'SI_MARKDOWN.COPIED_CODE'?: string;
212
218
  'SI_MARKDOWN.COPY_CODE'?: string;
213
219
  'SI_MARKDOWN.COPY_TABLE_AS_CSV'?: string;