@siemens/element-ng 51.0.0-rc.9 → 51.0.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.
- package/fesm2022/siemens-element-ng-chat-messages.mjs +121 -21
- package/fesm2022/siemens-element-ng-chat-messages.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-form.mjs +17 -4
- package/fesm2022/siemens-element-ng-form.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs +1 -1
- package/fesm2022/siemens-element-ng-icon.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-list-details.mjs +62 -16
- package/fesm2022/siemens-element-ng-list-details.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-main-detail-container.mjs +72 -24
- package/fesm2022/siemens-element-ng-main-detail-container.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs +2 -2
- package/fesm2022/siemens-element-ng-markdown-hightlighter-highlightjs.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs +2 -2
- package/fesm2022/siemens-element-ng-navbar-vertical-next.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs +2 -2
- package/fesm2022/siemens-element-ng-navbar-vertical.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-select.mjs +44 -5
- package/fesm2022/siemens-element-ng-select.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-side-panel.mjs +44 -9
- package/fesm2022/siemens-element-ng-side-panel.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-split.mjs +18 -16
- package/fesm2022/siemens-element-ng-split.mjs.map +1 -1
- package/fesm2022/siemens-element-ng-tabs.mjs +93 -71
- package/fesm2022/siemens-element-ng-tabs.mjs.map +1 -1
- package/package.json +4 -4
- package/schematics/migrations/data/element-class-changes.js +8 -7
- package/schematics/ng-update/migrate-list-details-units.js +86 -0
- package/schematics/ng-update/migrate-main-detail-units.js +89 -0
- package/schematics/ng-update/migrate-split-collapse.js +1 -32
- package/schematics/ng-update/migrate-split-scale.js +524 -0
- package/schematics/ng-update/migrate-split-sizes.js +5 -3
- package/schematics/ng-update/migrate-to-v51.js +6 -0
- package/schematics/utils/index.js +1 -0
- package/schematics/utils/template-edit-utils.js +35 -0
- package/schematics/utils/template-utils.js +31 -45
- package/types/siemens-element-ng-chat-messages.d.ts +81 -17
- package/types/siemens-element-ng-form.d.ts +3 -0
- package/types/siemens-element-ng-list-details.d.ts +25 -3
- package/types/siemens-element-ng-main-detail-container.d.ts +23 -3
- package/types/siemens-element-ng-select.d.ts +31 -4
- package/types/siemens-element-ng-side-panel.d.ts +17 -3
- package/types/siemens-element-ng-split.d.ts +3 -10
|
@@ -68,14 +68,6 @@ class SiSplitPartComponent {
|
|
|
68
68
|
* @defaultValue false
|
|
69
69
|
*/
|
|
70
70
|
removeContentOnCollapse = input(false, { ...(ngDevMode ? { debugName: "removeContentOnCollapse" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
71
|
-
/**
|
|
72
|
-
* Defines the behavior of the split part during scaling.
|
|
73
|
-
* E.g. when set to `none`, the spit part will keep its current size even when the parent container grows or shrinks.
|
|
74
|
-
*
|
|
75
|
-
* @defaultValue 'auto'
|
|
76
|
-
*/
|
|
77
|
-
scale = input('auto', /* @ts-ignore */
|
|
78
|
-
...(ngDevMode ? [{ debugName: "scale" }] : /* istanbul ignore next */ []));
|
|
79
71
|
/**
|
|
80
72
|
* Defines if the header of the split part is visible. Default is true.
|
|
81
73
|
*
|
|
@@ -244,7 +236,7 @@ class SiSplitPartComponent {
|
|
|
244
236
|
}
|
|
245
237
|
}
|
|
246
238
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitPartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
247
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapseIconClass: { classPropertyName: "collapseIconClass", publicName: "collapseIconClass", isSignal: true, isRequired: false, transformFunction: null }, collapseToMinSize: { classPropertyName: "collapseToMinSize", publicName: "collapseToMinSize", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, removeContentOnCollapse: { classPropertyName: "removeContentOnCollapse", publicName: "removeContentOnCollapse", isSignal: true, isRequired: false, transformFunction: null },
|
|
239
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiSplitPartComponent, isStandalone: true, selector: "si-split-part", inputs: { actions: { classPropertyName: "actions", publicName: "actions", isSignal: true, isRequired: false, transformFunction: null }, collapsible: { classPropertyName: "collapsible", publicName: "collapsible", isSignal: true, isRequired: false, transformFunction: null }, collapseIconClass: { classPropertyName: "collapseIconClass", publicName: "collapseIconClass", isSignal: true, isRequired: false, transformFunction: null }, collapseToMinSize: { classPropertyName: "collapseToMinSize", publicName: "collapseToMinSize", isSignal: true, isRequired: false, transformFunction: null }, headerTemplate: { classPropertyName: "headerTemplate", publicName: "headerTemplate", isSignal: true, isRequired: false, transformFunction: null }, heading: { classPropertyName: "heading", publicName: "heading", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, removeContentOnCollapse: { classPropertyName: "removeContentOnCollapse", publicName: "removeContentOnCollapse", isSignal: true, isRequired: false, transformFunction: null }, showHeader: { classPropertyName: "showHeader", publicName: "showHeader", isSignal: true, isRequired: false, transformFunction: null }, collapseLabel: { classPropertyName: "collapseLabel", publicName: "collapseLabel", isSignal: true, isRequired: false, transformFunction: null }, stateId: { classPropertyName: "stateId", publicName: "stateId", isSignal: true, isRequired: false, transformFunction: null }, size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: true, transformFunction: null }, unit: { classPropertyName: "unit", publicName: "unit", isSignal: true, isRequired: true, transformFunction: null }, collapseOthers: { classPropertyName: "collapseOthers", publicName: "collapseOthers", isSignal: true, isRequired: false, transformFunction: null }, expanded: { classPropertyName: "expanded", publicName: "expanded", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { collapseChanged: "collapseChanged", stateChange: "stateChange" }, host: { properties: { "class.is-collapsed": "collapsedState()", "class.collapse-start": "collapseDirectionState() === \"to-start\"", "style.grid-area": "\"p-\" + this.index" } }, ngImport: i0, template: "@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30);background:var(--si-sys-background-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:600;flex:1}.si-split-part-actions{padding-inline:var(--si-sys-sizing-spacing-x-40);flex:0 0 auto}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
248
240
|
}
|
|
249
241
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitPartComponent, decorators: [{
|
|
250
242
|
type: Component,
|
|
@@ -253,7 +245,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
253
245
|
'[class.collapse-start]': 'collapseDirectionState() === "to-start"',
|
|
254
246
|
'[style.grid-area]': '"p-" + this.index'
|
|
255
247
|
}, template: "@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n", styles: [":host{display:flex;flex-direction:column;overflow:hidden}.si-split-part-content{flex:1 1 auto;display:flex;overflow:hidden;flex-direction:column}.si-split-part-header{display:flex;flex-direction:row;flex:none;align-items:center;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30);background:var(--si-sys-background-0);block-size:40px}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header{flex:auto;flex-direction:column;max-block-size:100%;padding:var(--si-sys-sizing-spacing-y-30) var(--si-sys-sizing-spacing-x-30)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-title{inline-size:100%;writing-mode:vertical-rl;transform:rotate(180deg)}:host-context(.horizontal)>:host(.is-collapsed) .si-split-part-header .si-split-part-collapse-button{order:-1}.si-split-part-title{font-weight:600;flex:1}.si-split-part-actions{padding-inline:var(--si-sys-sizing-spacing-x-40);flex:0 0 auto}:host-context(.vertical)>:host .si-split-button{--orientation-rotate: rotate(90deg)}[dir=rtl] :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:dir(rtl) :host-context(.horizontal)>:host .si-split-button{--orientation-rtl: scaleX(-1)}:host(.is-collapsed) .si-split-button{--collapse-rotate: rotate(180deg)}:host(.collapse-start) .si-split-button{--collapse-direction: rotate(180deg)}.si-split-button .collapse-icon{transform:var(--orientation-rotate, rotate(0)) var(--collapse-rotate, rotate(0)) var(--collapse-direction, rotate(0)) var(--orientation-rtl, scaleX(1))}\n"] }]
|
|
256
|
-
}], ctorParameters: () => [], propDecorators: { actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapseIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseIconClass", required: false }] }], collapseToMinSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseToMinSize", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], removeContentOnCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeContentOnCollapse", required: false }] }],
|
|
248
|
+
}], ctorParameters: () => [], propDecorators: { actions: [{ type: i0.Input, args: [{ isSignal: true, alias: "actions", required: false }] }], collapsible: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapsible", required: false }] }], collapseIconClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseIconClass", required: false }] }], collapseToMinSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseToMinSize", required: false }] }], headerTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "headerTemplate", required: false }] }], heading: [{ type: i0.Input, args: [{ isSignal: true, alias: "heading", required: false }] }], minSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSize", required: false }] }], removeContentOnCollapse: [{ type: i0.Input, args: [{ isSignal: true, alias: "removeContentOnCollapse", required: false }] }], showHeader: [{ type: i0.Input, args: [{ isSignal: true, alias: "showHeader", required: false }] }], collapseLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseLabel", required: false }] }], stateId: [{ type: i0.Input, args: [{ isSignal: true, alias: "stateId", required: false }] }], size: [{ type: i0.Input, args: [{ isSignal: true, alias: "size", required: true }] }], unit: [{ type: i0.Input, args: [{ isSignal: true, alias: "unit", required: true }] }], collapseOthers: [{ type: i0.Input, args: [{ isSignal: true, alias: "collapseOthers", required: false }] }], expanded: [{ type: i0.Input, args: [{ isSignal: true, alias: "expanded", required: false }] }], collapseChanged: [{ type: i0.Output, args: ["collapseChanged"] }], stateChange: [{ type: i0.Output, args: ["stateChange"] }] } });
|
|
257
249
|
|
|
258
250
|
class SiSplitComponent {
|
|
259
251
|
/**
|
|
@@ -388,7 +380,6 @@ class SiSplitComponent {
|
|
|
388
380
|
const startPosition = this.getPosition(event);
|
|
389
381
|
const minDelta = -1 * (beforeSize - gutter.before.minSize());
|
|
390
382
|
const maxDelta = afterSize - afterPart.minSize();
|
|
391
|
-
const containerSize = this.measureContainerSize();
|
|
392
383
|
event.preventDefault(); // prevents text-selection
|
|
393
384
|
this.ngZone.runOutsideAngular(() => {
|
|
394
385
|
merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))
|
|
@@ -426,12 +417,18 @@ class SiSplitComponent {
|
|
|
426
417
|
else {
|
|
427
418
|
this.elementRef.nativeElement.style.setProperty('grid-template-columns', this.gridTemplateColumns());
|
|
428
419
|
}
|
|
429
|
-
this.
|
|
420
|
+
this.emitSizesChange();
|
|
430
421
|
},
|
|
431
422
|
complete: () => this.saveUIState()
|
|
432
423
|
});
|
|
433
424
|
});
|
|
434
425
|
}
|
|
426
|
+
emitSizesChange() {
|
|
427
|
+
const containerSize = this.measureContainerSize();
|
|
428
|
+
if (containerSize > 0) {
|
|
429
|
+
this.ngZone.run(() => this.sizesChange.emit(this.parts().map(part => (part.actualSize() * 100) / containerSize)));
|
|
430
|
+
}
|
|
431
|
+
}
|
|
435
432
|
measureContainerSize() {
|
|
436
433
|
const rect = this.elementRef.nativeElement.getBoundingClientRect();
|
|
437
434
|
if (this.orientation() === 'vertical') {
|
|
@@ -476,13 +473,13 @@ class SiSplitComponent {
|
|
|
476
473
|
if (!uiState) {
|
|
477
474
|
return;
|
|
478
475
|
}
|
|
476
|
+
let restored = false;
|
|
479
477
|
this.parts()
|
|
480
478
|
.filter(part => part.stateId())
|
|
481
479
|
.map(part => ({ part, state: uiState[part.stateId()] }))
|
|
482
|
-
.filter((item) => !!item.state &&
|
|
483
|
-
item.state.initialSize === item.part.size() &&
|
|
484
|
-
item.state.initialUnit === item.part.unit())
|
|
480
|
+
.filter((item) => !!item.state && item.state.initialUnit === item.part.unit())
|
|
485
481
|
.forEach(({ part, state }) => {
|
|
482
|
+
restored = true;
|
|
486
483
|
if (part.unit() === 'px') {
|
|
487
484
|
part.expandedSize.set(state.size);
|
|
488
485
|
}
|
|
@@ -491,7 +488,12 @@ class SiSplitComponent {
|
|
|
491
488
|
}
|
|
492
489
|
part.collapsedState.set(!state.expanded);
|
|
493
490
|
});
|
|
494
|
-
setTimeout(() =>
|
|
491
|
+
setTimeout(() => {
|
|
492
|
+
this.refreshAllPartSizes();
|
|
493
|
+
if (restored) {
|
|
494
|
+
this.emitSizesChange();
|
|
495
|
+
}
|
|
496
|
+
});
|
|
495
497
|
});
|
|
496
498
|
}
|
|
497
499
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiSplitComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"siemens-element-ng-split.mjs","sources":["../../../../projects/element-ng/split/si-split-part.component.ts","../../../../projects/element-ng/split/si-split-part.component.html","../../../../projects/element-ng/split/si-split.component.ts","../../../../projects/element-ng/split/si-split.component.html","../../../../projects/element-ng/split/si-split.module.ts","../../../../projects/element-ng/split/index.ts","../../../../projects/element-ng/split/siemens-element-ng-split.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { elementDoubleRight } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport {\n Action,\n CollapseTo,\n PartState,\n Scale,\n SplitOrientation,\n SplitUnit\n} from './si-split.interfaces';\n\n@Component({\n selector: 'si-split-part',\n imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe],\n templateUrl: './si-split-part.component.html',\n styleUrl: './si-split-part.component.scss',\n host: {\n '[class.is-collapsed]': 'collapsedState()',\n '[class.collapse-start]': 'collapseDirectionState() === \"to-start\"',\n '[style.grid-area]': '\"p-\" + this.index'\n }\n})\nexport class SiSplitPartComponent {\n protected readonly icons = addIcons({ elementDoubleRight });\n /**\n * Action buttons displayed in the split part header.\n *\n * @defaultValue []\n */\n readonly actions = input<Action[]>([]);\n /**\n * Defines whether and in which direction the split part can collapse.\n * When unset, the collapse button is hidden.\n *\n * @defaultValue undefined\n */\n readonly collapsible = input<CollapseTo>();\n\n /**\n * Sets the icon class that is used in the buttons of split parts to\n * collapse and uncollapse the parts.\n */\n readonly collapseIconClass = input<string | undefined>();\n\n /**\n * Collapse only to the given min size.\n *\n * @defaultValue false\n */\n readonly collapseToMinSize = input(false, { transform: booleanAttribute });\n\n /**\n * Custom template for the split part header. The template receives the component instance as implicit context.\n */\n readonly headerTemplate = input<TemplateRef<{ $implicit: SiSplitPartComponent }>>();\n\n /**\n * Sets the title of the split part header.\n */\n readonly heading = input<TranslatableString>();\n\n /**\n * Minimum size in px.\n *\n * @defaultValue 0\n */\n readonly minSize = input(0, { transform: numberAttribute });\n\n /**\n * When a split part is collapsed, the content gets hidden but it will\n * still remain within the DOM. If you want to remove and destroy the component\n * in collapsed mode and recreate it on un-collapse, set this property to\n * true.\n *\n * @defaultValue false\n */\n readonly removeContentOnCollapse = input(false, { transform: booleanAttribute });\n\n /**\n * Defines the behavior of the split part during scaling.\n * E.g. when set to `none`, the spit part will keep its current size even when the parent container grows or shrinks.\n *\n * @defaultValue 'auto'\n */\n readonly scale = input<Scale>('auto');\n\n /**\n * Defines if the header of the split part is visible. Default is true.\n *\n * @defaultValue true\n */\n readonly showHeader = input(true, { transform: booleanAttribute });\n /**\n * Aria label for collapse button. Needed for a11y\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)\n * ```\n */\n readonly collapseLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)\n );\n /**\n * An optional stateId to uniquely identify a component instance.\n * Required for persistence of ui state.\n */\n readonly stateId = input<string>();\n\n /**\n * Expanded size.\n */\n readonly size = input.required<number, number | string>({ transform: numberAttribute });\n\n /**\n * Unit for the configured {@link size}.\n */\n readonly unit = input.required<SplitUnit>();\n\n /**\n * This toggles the behavior when collapsing this split part.\n * If enabled, all split parts between this one and the end of the split in the respective direction will be collapsed if this part is collapsed.\n * If disabled, only this split part will be collapsed.\n *\n * @defaultValue false\n */\n readonly collapseOthers = input(false, { transform: booleanAttribute });\n\n /**\n * Sets the initial expanded or collapsed state of the split part.\n *\n * @defaultValue true\n */\n readonly expanded = input(true, { transform: booleanAttribute });\n\n /**\n * Emits when the part is collapsed or expanded.\n */\n readonly collapseChanged = output<boolean>();\n /**\n * Emits the part's expanded state and size after it is toggled.\n */\n readonly stateChange = output<PartState>();\n\n /** @internal */\n index = 0;\n /** @internal */\n readonly before = signal<SiSplitPartComponent | undefined>(undefined);\n /** @internal */\n readonly after = signal<SiSplitPartComponent | undefined>(undefined);\n\n /** @internal */\n readonly fractionalSize = linkedSignal(() => (this.unit() === 'fr' ? this.size() : undefined));\n\n /** @internal */\n readonly collapsedSize = computed(() => (this.collapseToMinSize() ? (this.minSize() ?? 40) : 40));\n\n /**\n * Internal, mutable collapsed state. Initialized from the {@link expanded} input but can be\n * overwritten while toggling, cascading to sibling parts or restoring the persisted ui state.\n * @internal\n */\n readonly collapsedState = linkedSignal(() => !this.expanded());\n\n /**\n * Internal, mutable collapse direction. Initialized from the {@link collapsible}\n * input but can be overwritten while cascading collapse state to sibling parts.\n * @internal\n */\n readonly collapseDirectionState = linkedSignal(() => this.collapsible());\n\n /**\n * Get collapsed state.\n * @returns True if the split part is collapsed, false is expanded.\n */\n get collapsed(): boolean {\n return this.collapsedState();\n }\n\n /** @internal */\n readonly expandedSize = linkedSignal({\n source: () => ({ size: this.size(), unit: this.unit() }),\n computation: source => (source.unit === 'fr' ? undefined : source.size)\n });\n\n /** @internal */\n readonly actualSize = computed(() => {\n if (this.collapsedState()) {\n return this.collapsedSize();\n }\n return this.expandedSize() ?? 0;\n });\n\n /** @internal */\n saveUIState!: () => void;\n\n /** @internal */\n readonly nextExpandedAfter = computed(() => {\n if (!this.collapsedState()) {\n return this as SiSplitPartComponent;\n }\n const after = this.after();\n const nextExpanded: SiSplitPartComponent = after ? after.nextExpandedAfter() : this;\n\n return nextExpanded;\n });\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n protected headerContext: { $implicit: SiSplitPartComponent } = {\n $implicit: this\n };\n\n constructor() {\n effect(() => {\n this.expanded();\n untracked(() => {\n if (this.collapseOthers()) {\n this.before()?.refreshCollapseToStart();\n this.after()?.refreshCollapsedToEnd();\n }\n });\n });\n }\n\n /** @internal */\n refreshSizePx(orientation: SplitOrientation): void {\n if (!this.collapsedState()) {\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n if (orientation === 'vertical') {\n this.expandedSize.set(rect.height);\n } else {\n this.expandedSize.set(rect.width);\n }\n }\n }\n\n /**\n * Toggles the collapsed or expanded state.\n */\n toggleCollapse(): void {\n this.collapsedState.update(v => !v);\n if (this.collapseOthers()) {\n this.before()?.refreshCollapseToStart();\n this.after()?.refreshCollapsedToEnd();\n }\n this.collapseChanged.emit(this.collapsedState());\n this.stateChange.emit({ expanded: !this.collapsedState(), size: this.actualSize() });\n this.saveUIState();\n }\n\n private refreshCollapsedToEnd(): void {\n const before = this.before();\n if (before?.collapsedState() && before.collapseDirectionState() === 'to-end') {\n this.collapsedState.set(true);\n this.collapseDirectionState.set('to-end');\n this.after()?.refreshCollapsedToEnd();\n }\n }\n\n private refreshCollapseToStart(): void {\n const after = this.after();\n if (after?.collapsedState() && after.collapseDirectionState() === 'to-start') {\n this.collapsedState.set(true);\n this.collapseDirectionState.set('to-start');\n this.before()?.refreshCollapseToStart();\n }\n }\n}\n","@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n ChangeDetectorRef,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n input,\n NgZone,\n signal,\n Signal,\n DOCUMENT,\n DestroyRef,\n output\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport {\n isRTL,\n SI_UI_STATE_SERVICE,\n WebComponentContentChildren\n} from '@siemens/element-ng/common';\nimport { asapScheduler, fromEvent, merge } from 'rxjs';\nimport { observeOn, takeUntil } from 'rxjs/operators';\n\nimport { SiSplitPartComponent } from './si-split-part.component';\nimport { SplitOrientation, SplitUnit } from './si-split.interfaces';\n\ninterface Gutter {\n before: SiSplitPartComponent;\n after: SiSplitPartComponent;\n visible: Signal<boolean>;\n}\n\ninterface SplitPartState {\n size: number;\n initialSize: number;\n initialUnit: SplitUnit;\n expanded: boolean;\n}\n\n@Component({\n selector: 'si-split',\n templateUrl: './si-split.component.html',\n styleUrl: './si-split.component.scss',\n host: {\n '[class]': 'orientation()',\n '[style.grid-template-rows]': 'gridTemplateRows()',\n '[style.grid-template-columns]': 'gridTemplateColumns()',\n '[style.grid-template-areas]': 'gridTemplateAreas()'\n }\n})\nexport class SiSplitComponent {\n /**\n * Size of the gutter (divider) between split parts in pixels.\n *\n * @defaultValue 16\n */\n readonly gutterSize = input(16);\n\n /**\n * Defines the split layout direction.\n *\n * @defaultValue 'horizontal'\n */\n readonly orientation = input<SplitOrientation>('horizontal');\n\n /**\n * An optional stateId to uniquely identify a component instance.\n * Required for persistence of ui state.\n */\n readonly stateId = input<string>();\n\n /**\n * Emits the sizes of all parts as percentages when the user resizes a gutter.\n */\n readonly sizesChange = output<number[]>();\n\n @WebComponentContentChildren(SiSplitPartComponent)\n protected readonly parts = contentChildren(SiSplitPartComponent);\n protected readonly gutters = signal<Gutter[]>([]);\n\n private readonly gridTemplate = computed(() => {\n if (!this.initialized()) {\n return '';\n }\n return this.parts()\n .map(part =>\n part.collapsedState()\n ? part.collapseToMinSize()\n ? `${part.minSize()}px`\n : 'min-content'\n : part.unit() === 'px'\n ? `minmax(${part.minSize()}px, ${part.expandedSize() ?? part.size()}px)`\n : `minmax(${part.minSize()}px, ${\n part.expandedSize() === undefined\n ? part.fractionalSize()! * this.fractionalSizeToExpandedSizeFactor()\n : part.fractionalSize()!\n }fr)`\n )\n .join(' min-content ');\n });\n\n protected readonly gridTemplateRows = computed(() =>\n this.orientation() === 'vertical' ? this.gridTemplate() : '1fr'\n );\n\n protected readonly gridTemplateColumns = computed(() =>\n this.orientation() === 'horizontal' ? this.gridTemplate() : '1fr'\n );\n\n protected readonly gridTemplateAreas = computed(() => {\n if (!this.initialized()) {\n return '';\n }\n const areaNames = this.parts()\n .map((part, index) => [`p-${index}`, part.after() ? `g-${index}` : []])\n .flat(2) as string[];\n\n if (this.orientation() === 'horizontal') {\n return `\"${areaNames.join(' ')}\"`;\n } else {\n return `\"${areaNames.join('\" \"')}\"`;\n }\n });\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly ngZone = inject(NgZone);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly document = inject(DOCUMENT);\n private readonly uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n // Existing fr parts are measured in pixels after layout or dragging, so their fr weights become\n // pixel-derived. A newly added fr part has not been measured yet and still has its configured\n // weight. This factor converts that configured weight into the same scale until it is measured.\n // It is the ratio of measured expanded sizes to configured weights of visible measured fr parts.\n private readonly fractionalSizeToExpandedSizeFactor = computed(() => {\n const measuredParts = this.parts().filter(\n part => !part.collapsedState() && part.unit() === 'fr' && part.expandedSize() !== undefined\n );\n const configuredSizeSum = measuredParts.reduce((sum, part) => sum + part.size(), 0);\n const expandedSizeSum = measuredParts.reduce((sum, part) => sum + part.expandedSize()!, 0);\n\n return configuredSizeSum ? expandedSizeSum / configuredSizeSum : 1;\n });\n private readonly initialized = signal(false);\n\n constructor() {\n toObservable(this.parts)\n .pipe(observeOn(asapScheduler), takeUntilDestroyed())\n .subscribe(() => this.setupParts());\n }\n\n private setupParts(): void {\n this.initialized.set(true);\n const gutters: Gutter[] = [];\n\n const parts = this.parts();\n for (let index = 0; index < parts.length; index++) {\n const component = parts[index];\n component.index = index;\n component.after.set(parts[index + 1]);\n component.before.set(parts[index - 1]);\n component.saveUIState = () => this.saveUIState();\n\n if (component.after()) {\n gutters.push({\n before: component,\n after: parts[index + 1]!,\n visible: computed(() => {\n const afterPart = component.after()!.nextExpandedAfter();\n return !afterPart.collapsedState() && !component.collapsedState();\n })\n });\n }\n }\n this.gutters.set(gutters);\n\n this.restoreFromUIState();\n setTimeout(() => this.refreshAllPartSizes());\n }\n\n private refreshAllPartSizes(): void {\n this.parts().forEach(part => {\n part.refreshSizePx(this.orientation());\n if (!part.collapsedState() && part.unit() === 'fr') {\n part.fractionalSize.set(part.expandedSize()!);\n }\n });\n }\n\n protected resizeStart(gutter: Gutter, event: Event): void {\n this.refreshAllPartSizes();\n this.changeDetectorRef.detectChanges();\n const afterPart = gutter.after.nextExpandedAfter();\n let beforeSize = gutter.before.expandedSize()!;\n let afterSize = afterPart.expandedSize()!;\n let appliedDelta = 0;\n const rtl = isRTL();\n const startPosition = this.getPosition(event);\n const minDelta = -1 * (beforeSize - gutter.before.minSize());\n const maxDelta = afterSize - afterPart.minSize();\n const containerSize = this.measureContainerSize();\n event.preventDefault(); // prevents text-selection\n\n this.ngZone.runOutsideAngular(() => {\n merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))\n .pipe(\n takeUntil(\n merge(fromEvent(this.document, 'mouseup'), fromEvent(this.document, 'touchend'))\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: move => {\n let delta = this.getPosition(move) - startPosition;\n if (rtl && this.orientation() === 'horizontal') {\n delta *= -1;\n }\n\n delta -= appliedDelta;\n if (maxDelta < appliedDelta + delta) {\n delta = maxDelta - appliedDelta;\n } else if (minDelta > appliedDelta + delta) {\n delta = minDelta - appliedDelta;\n }\n\n if (delta === 0) {\n return;\n }\n\n beforeSize += delta;\n afterSize -= delta;\n appliedDelta += delta;\n gutter.before.expandedSize.set(beforeSize);\n afterPart.expandedSize.set(afterSize);\n if (gutter.before.unit() === 'fr') {\n gutter.before.fractionalSize.set(beforeSize);\n }\n if (afterPart.unit() === 'fr') {\n afterPart.fractionalSize.set(afterSize);\n }\n if (this.orientation() === 'vertical') {\n this.elementRef.nativeElement.style.setProperty(\n 'grid-template-rows',\n this.gridTemplateRows()\n );\n } else {\n this.elementRef.nativeElement.style.setProperty(\n 'grid-template-columns',\n this.gridTemplateColumns()\n );\n }\n this.ngZone.run(() =>\n this.sizesChange.emit(\n this.parts().map(part => (part.actualSize() * 100) / containerSize)\n )\n );\n },\n complete: () => this.saveUIState()\n });\n });\n }\n\n private measureContainerSize(): number {\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n if (this.orientation() === 'vertical') {\n return rect.height;\n } else {\n return rect.width;\n }\n }\n\n private getPosition(event: Event): number {\n const positionObject = (event as TouchEvent).touches?.[0] ?? (event as MouseEvent);\n return this.orientation() === 'horizontal'\n ? (positionObject.clientX ?? 0)\n : (positionObject.clientY ?? 0);\n }\n\n private saveUIState(): void {\n const stateId = this.stateId();\n if (!stateId || !this.uiStateService) {\n return;\n }\n\n const state = this.parts().reduce(\n (partState, part) => {\n const partStateId = part.stateId();\n if (partStateId) {\n const unit = part.unit();\n partState[partStateId] = {\n size: unit === 'px' ? part.expandedSize()! : part.fractionalSize()!,\n initialSize: part.size(),\n initialUnit: unit,\n expanded: !part.collapsedState()\n };\n }\n return partState;\n },\n {} as Record<string, SplitPartState>\n );\n\n this.uiStateService.save(stateId, state);\n }\n\n private restoreFromUIState(): void {\n const stateId = this.stateId();\n if (!stateId || !this.uiStateService) {\n return;\n }\n\n this.uiStateService.load<Record<string, SplitPartState>>(stateId).then(uiState => {\n if (!uiState) {\n return;\n }\n\n this.parts()\n .filter(part => part.stateId())\n .map(part => ({ part, state: uiState[part.stateId()!] }))\n .filter(\n (item): item is { part: SiSplitPartComponent; state: SplitPartState } =>\n !!item.state &&\n item.state.initialSize === item.part.size() &&\n item.state.initialUnit === item.part.unit()\n )\n .forEach(({ part, state }) => {\n if (part.unit() === 'px') {\n part.expandedSize.set(state.size);\n } else {\n part.fractionalSize.set(state.size);\n }\n part.collapsedState.set(!state.expanded);\n });\n setTimeout(() => this.refreshAllPartSizes());\n });\n }\n}\n","<ng-content />\n\n@for (gutter of gutters(); track $index) {\n @if ($index < parts().length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation() === 'horizontal' ? gutterSize() : null\"\n [style.height.px]=\"orientation() === 'vertical' ? gutterSize() : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiSplitPartComponent } from './si-split-part.component';\nimport { SiSplitComponent } from './si-split.component';\n\n@NgModule({\n imports: [SiSplitComponent, SiSplitPartComponent],\n exports: [SiSplitComponent, SiSplitPartComponent]\n})\nexport class SiSplitModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-split.module';\nexport * from './si-split-part.component';\nexport * from './si-split.component';\nexport * from './si-split.interfaces';\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-split.mjs","sources":["../../../../projects/element-ng/split/si-split-part.component.ts","../../../../projects/element-ng/split/si-split-part.component.html","../../../../projects/element-ng/split/si-split.component.ts","../../../../projects/element-ng/split/si-split.component.html","../../../../projects/element-ng/split/si-split.module.ts","../../../../projects/element-ng/split/index.ts","../../../../projects/element-ng/split/siemens-element-ng-split.ts"],"sourcesContent":["/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n Component,\n computed,\n effect,\n ElementRef,\n inject,\n input,\n linkedSignal,\n numberAttribute,\n output,\n signal,\n TemplateRef,\n untracked\n} from '@angular/core';\nimport { elementDoubleRight } from '@siemens/element-icons';\nimport { addIcons, SiIconComponent } from '@siemens/element-ng/icon';\nimport { SiTranslatePipe, t, TranslatableString } from '@siemens/element-translate-ng/translate';\n\nimport { Action, CollapseTo, PartState, SplitOrientation, SplitUnit } from './si-split.interfaces';\n\n@Component({\n selector: 'si-split-part',\n imports: [NgTemplateOutlet, SiIconComponent, SiTranslatePipe],\n templateUrl: './si-split-part.component.html',\n styleUrl: './si-split-part.component.scss',\n host: {\n '[class.is-collapsed]': 'collapsedState()',\n '[class.collapse-start]': 'collapseDirectionState() === \"to-start\"',\n '[style.grid-area]': '\"p-\" + this.index'\n }\n})\nexport class SiSplitPartComponent {\n protected readonly icons = addIcons({ elementDoubleRight });\n /**\n * Action buttons displayed in the split part header.\n *\n * @defaultValue []\n */\n readonly actions = input<Action[]>([]);\n /**\n * Defines whether and in which direction the split part can collapse.\n * When unset, the collapse button is hidden.\n *\n * @defaultValue undefined\n */\n readonly collapsible = input<CollapseTo>();\n\n /**\n * Sets the icon class that is used in the buttons of split parts to\n * collapse and uncollapse the parts.\n */\n readonly collapseIconClass = input<string | undefined>();\n\n /**\n * Collapse only to the given min size.\n *\n * @defaultValue false\n */\n readonly collapseToMinSize = input(false, { transform: booleanAttribute });\n\n /**\n * Custom template for the split part header. The template receives the component instance as implicit context.\n */\n readonly headerTemplate = input<TemplateRef<{ $implicit: SiSplitPartComponent }>>();\n\n /**\n * Sets the title of the split part header.\n */\n readonly heading = input<TranslatableString>();\n\n /**\n * Minimum size in px.\n *\n * @defaultValue 0\n */\n readonly minSize = input(0, { transform: numberAttribute });\n\n /**\n * When a split part is collapsed, the content gets hidden but it will\n * still remain within the DOM. If you want to remove and destroy the component\n * in collapsed mode and recreate it on un-collapse, set this property to\n * true.\n *\n * @defaultValue false\n */\n readonly removeContentOnCollapse = input(false, { transform: booleanAttribute });\n\n /**\n * Defines if the header of the split part is visible. Default is true.\n *\n * @defaultValue true\n */\n readonly showHeader = input(true, { transform: booleanAttribute });\n /**\n * Aria label for collapse button. Needed for a11y\n *\n * @defaultValue\n * ```\n * t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)\n * ```\n */\n readonly collapseLabel = input<TranslatableString>(\n t(() => $localize`:@@SI_SPLIT.COLLAPSE_LABEL:Collapse`)\n );\n /**\n * An optional stateId to uniquely identify a component instance.\n * Required for persistence of ui state.\n */\n readonly stateId = input<string>();\n\n /**\n * Expanded size.\n */\n readonly size = input.required<number, number | string>({ transform: numberAttribute });\n\n /**\n * Unit for the configured {@link size}.\n */\n readonly unit = input.required<SplitUnit>();\n\n /**\n * This toggles the behavior when collapsing this split part.\n * If enabled, all split parts between this one and the end of the split in the respective direction will be collapsed if this part is collapsed.\n * If disabled, only this split part will be collapsed.\n *\n * @defaultValue false\n */\n readonly collapseOthers = input(false, { transform: booleanAttribute });\n\n /**\n * Sets the initial expanded or collapsed state of the split part.\n *\n * @defaultValue true\n */\n readonly expanded = input(true, { transform: booleanAttribute });\n\n /**\n * Emits when the part is collapsed or expanded.\n */\n readonly collapseChanged = output<boolean>();\n /**\n * Emits the part's expanded state and size after it is toggled.\n */\n readonly stateChange = output<PartState>();\n\n /** @internal */\n index = 0;\n /** @internal */\n readonly before = signal<SiSplitPartComponent | undefined>(undefined);\n /** @internal */\n readonly after = signal<SiSplitPartComponent | undefined>(undefined);\n\n /** @internal */\n readonly fractionalSize = linkedSignal(() => (this.unit() === 'fr' ? this.size() : undefined));\n\n /** @internal */\n readonly collapsedSize = computed(() => (this.collapseToMinSize() ? (this.minSize() ?? 40) : 40));\n\n /**\n * Internal, mutable collapsed state. Initialized from the {@link expanded} input but can be\n * overwritten while toggling, cascading to sibling parts or restoring the persisted ui state.\n * @internal\n */\n readonly collapsedState = linkedSignal(() => !this.expanded());\n\n /**\n * Internal, mutable collapse direction. Initialized from the {@link collapsible}\n * input but can be overwritten while cascading collapse state to sibling parts.\n * @internal\n */\n readonly collapseDirectionState = linkedSignal(() => this.collapsible());\n\n /**\n * Get collapsed state.\n * @returns True if the split part is collapsed, false is expanded.\n */\n get collapsed(): boolean {\n return this.collapsedState();\n }\n\n /** @internal */\n readonly expandedSize = linkedSignal({\n source: () => ({ size: this.size(), unit: this.unit() }),\n computation: source => (source.unit === 'fr' ? undefined : source.size)\n });\n\n /** @internal */\n readonly actualSize = computed(() => {\n if (this.collapsedState()) {\n return this.collapsedSize();\n }\n return this.expandedSize() ?? 0;\n });\n\n /** @internal */\n saveUIState!: () => void;\n\n /** @internal */\n readonly nextExpandedAfter = computed(() => {\n if (!this.collapsedState()) {\n return this as SiSplitPartComponent;\n }\n const after = this.after();\n const nextExpanded: SiSplitPartComponent = after ? after.nextExpandedAfter() : this;\n\n return nextExpanded;\n });\n\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n\n protected headerContext: { $implicit: SiSplitPartComponent } = {\n $implicit: this\n };\n\n constructor() {\n effect(() => {\n this.expanded();\n untracked(() => {\n if (this.collapseOthers()) {\n this.before()?.refreshCollapseToStart();\n this.after()?.refreshCollapsedToEnd();\n }\n });\n });\n }\n\n /** @internal */\n refreshSizePx(orientation: SplitOrientation): void {\n if (!this.collapsedState()) {\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n if (orientation === 'vertical') {\n this.expandedSize.set(rect.height);\n } else {\n this.expandedSize.set(rect.width);\n }\n }\n }\n\n /**\n * Toggles the collapsed or expanded state.\n */\n toggleCollapse(): void {\n this.collapsedState.update(v => !v);\n if (this.collapseOthers()) {\n this.before()?.refreshCollapseToStart();\n this.after()?.refreshCollapsedToEnd();\n }\n this.collapseChanged.emit(this.collapsedState());\n this.stateChange.emit({ expanded: !this.collapsedState(), size: this.actualSize() });\n this.saveUIState();\n }\n\n private refreshCollapsedToEnd(): void {\n const before = this.before();\n if (before?.collapsedState() && before.collapseDirectionState() === 'to-end') {\n this.collapsedState.set(true);\n this.collapseDirectionState.set('to-end');\n this.after()?.refreshCollapsedToEnd();\n }\n }\n\n private refreshCollapseToStart(): void {\n const after = this.after();\n if (after?.collapsedState() && after.collapseDirectionState() === 'to-start') {\n this.collapsedState.set(true);\n this.collapseDirectionState.set('to-start');\n this.before()?.refreshCollapseToStart();\n }\n }\n}\n","@if (!headerTemplate() && showHeader()) {\n <div class=\"si-split-part-header\" [class.is-collapsed]=\"collapsedState()\">\n <div class=\"si-split-part-title text-truncate\">\n {{ heading() | translate }}\n </div>\n @if (!collapsedState()) {\n <div class=\"si-split-part-actions\">\n @for (action of actions(); track $index) {\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [title]=\"action.tooltip || ''\"\n [attr.aria-label]=\"action.tooltip\"\n (click)=\"action.click($event)\"\n >\n <si-icon [icon]=\"action.iconClass\" />\n </button>\n }\n </div>\n }\n @if (collapsible()) {\n <div class=\"si-split-part-collapse-button\">\n <button\n type=\"button\"\n class=\"btn btn-icon btn-tertiary-ghost si-split-button\"\n [attr.aria-label]=\"collapseLabel() | translate\"\n (click)=\"toggleCollapse()\"\n >\n <si-icon class=\"collapse-icon\" [icon]=\"collapseIconClass() ?? icons.elementDoubleRight\" />\n </button>\n </div>\n }\n </div>\n}\n\n@if (headerTemplate(); as headerTemplate) {\n <ng-container *ngTemplateOutlet=\"headerTemplate; context: headerContext\" />\n}\n\n<div\n class=\"si-split-part-content\"\n [class.d-none]=\"!removeContentOnCollapse() && collapsedState() && !collapseToMinSize()\"\n>\n @if (!removeContentOnCollapse() || !collapsedState()) {\n <ng-content />\n }\n</div>\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport {\n ChangeDetectorRef,\n Component,\n computed,\n contentChildren,\n ElementRef,\n inject,\n input,\n NgZone,\n signal,\n Signal,\n DOCUMENT,\n DestroyRef,\n output\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport {\n isRTL,\n SI_UI_STATE_SERVICE,\n WebComponentContentChildren\n} from '@siemens/element-ng/common';\nimport { asapScheduler, fromEvent, merge } from 'rxjs';\nimport { observeOn, takeUntil } from 'rxjs/operators';\n\nimport { SiSplitPartComponent } from './si-split-part.component';\nimport { SplitOrientation, SplitUnit } from './si-split.interfaces';\n\ninterface Gutter {\n before: SiSplitPartComponent;\n after: SiSplitPartComponent;\n visible: Signal<boolean>;\n}\n\ninterface SplitPartState {\n size: number;\n initialSize: number;\n initialUnit: SplitUnit;\n expanded: boolean;\n}\n\n@Component({\n selector: 'si-split',\n templateUrl: './si-split.component.html',\n styleUrl: './si-split.component.scss',\n host: {\n '[class]': 'orientation()',\n '[style.grid-template-rows]': 'gridTemplateRows()',\n '[style.grid-template-columns]': 'gridTemplateColumns()',\n '[style.grid-template-areas]': 'gridTemplateAreas()'\n }\n})\nexport class SiSplitComponent {\n /**\n * Size of the gutter (divider) between split parts in pixels.\n *\n * @defaultValue 16\n */\n readonly gutterSize = input(16);\n\n /**\n * Defines the split layout direction.\n *\n * @defaultValue 'horizontal'\n */\n readonly orientation = input<SplitOrientation>('horizontal');\n\n /**\n * An optional stateId to uniquely identify a component instance.\n * Required for persistence of ui state.\n */\n readonly stateId = input<string>();\n\n /**\n * Emits the sizes of all parts as percentages when the user resizes a gutter.\n */\n readonly sizesChange = output<number[]>();\n\n @WebComponentContentChildren(SiSplitPartComponent)\n protected readonly parts = contentChildren(SiSplitPartComponent);\n protected readonly gutters = signal<Gutter[]>([]);\n\n private readonly gridTemplate = computed(() => {\n if (!this.initialized()) {\n return '';\n }\n return this.parts()\n .map(part =>\n part.collapsedState()\n ? part.collapseToMinSize()\n ? `${part.minSize()}px`\n : 'min-content'\n : part.unit() === 'px'\n ? `minmax(${part.minSize()}px, ${part.expandedSize() ?? part.size()}px)`\n : `minmax(${part.minSize()}px, ${\n part.expandedSize() === undefined\n ? part.fractionalSize()! * this.fractionalSizeToExpandedSizeFactor()\n : part.fractionalSize()!\n }fr)`\n )\n .join(' min-content ');\n });\n\n protected readonly gridTemplateRows = computed(() =>\n this.orientation() === 'vertical' ? this.gridTemplate() : '1fr'\n );\n\n protected readonly gridTemplateColumns = computed(() =>\n this.orientation() === 'horizontal' ? this.gridTemplate() : '1fr'\n );\n\n protected readonly gridTemplateAreas = computed(() => {\n if (!this.initialized()) {\n return '';\n }\n const areaNames = this.parts()\n .map((part, index) => [`p-${index}`, part.after() ? `g-${index}` : []])\n .flat(2) as string[];\n\n if (this.orientation() === 'horizontal') {\n return `\"${areaNames.join(' ')}\"`;\n } else {\n return `\"${areaNames.join('\" \"')}\"`;\n }\n });\n\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly ngZone = inject(NgZone);\n private readonly changeDetectorRef = inject(ChangeDetectorRef);\n private readonly document = inject(DOCUMENT);\n private readonly uiStateService = inject(SI_UI_STATE_SERVICE, { optional: true });\n private readonly destroyRef = inject(DestroyRef);\n // Existing fr parts are measured in pixels after layout or dragging, so their fr weights become\n // pixel-derived. A newly added fr part has not been measured yet and still has its configured\n // weight. This factor converts that configured weight into the same scale until it is measured.\n // It is the ratio of measured expanded sizes to configured weights of visible measured fr parts.\n private readonly fractionalSizeToExpandedSizeFactor = computed(() => {\n const measuredParts = this.parts().filter(\n part => !part.collapsedState() && part.unit() === 'fr' && part.expandedSize() !== undefined\n );\n const configuredSizeSum = measuredParts.reduce((sum, part) => sum + part.size(), 0);\n const expandedSizeSum = measuredParts.reduce((sum, part) => sum + part.expandedSize()!, 0);\n\n return configuredSizeSum ? expandedSizeSum / configuredSizeSum : 1;\n });\n private readonly initialized = signal(false);\n\n constructor() {\n toObservable(this.parts)\n .pipe(observeOn(asapScheduler), takeUntilDestroyed())\n .subscribe(() => this.setupParts());\n }\n\n private setupParts(): void {\n this.initialized.set(true);\n const gutters: Gutter[] = [];\n\n const parts = this.parts();\n for (let index = 0; index < parts.length; index++) {\n const component = parts[index];\n component.index = index;\n component.after.set(parts[index + 1]);\n component.before.set(parts[index - 1]);\n component.saveUIState = () => this.saveUIState();\n\n if (component.after()) {\n gutters.push({\n before: component,\n after: parts[index + 1]!,\n visible: computed(() => {\n const afterPart = component.after()!.nextExpandedAfter();\n return !afterPart.collapsedState() && !component.collapsedState();\n })\n });\n }\n }\n this.gutters.set(gutters);\n\n this.restoreFromUIState();\n setTimeout(() => this.refreshAllPartSizes());\n }\n\n private refreshAllPartSizes(): void {\n this.parts().forEach(part => {\n part.refreshSizePx(this.orientation());\n if (!part.collapsedState() && part.unit() === 'fr') {\n part.fractionalSize.set(part.expandedSize()!);\n }\n });\n }\n\n protected resizeStart(gutter: Gutter, event: Event): void {\n this.refreshAllPartSizes();\n this.changeDetectorRef.detectChanges();\n const afterPart = gutter.after.nextExpandedAfter();\n let beforeSize = gutter.before.expandedSize()!;\n let afterSize = afterPart.expandedSize()!;\n let appliedDelta = 0;\n const rtl = isRTL();\n const startPosition = this.getPosition(event);\n const minDelta = -1 * (beforeSize - gutter.before.minSize());\n const maxDelta = afterSize - afterPart.minSize();\n event.preventDefault(); // prevents text-selection\n\n this.ngZone.runOutsideAngular(() => {\n merge(fromEvent(this.document, 'mousemove'), fromEvent(this.document, 'touchmove'))\n .pipe(\n takeUntil(\n merge(fromEvent(this.document, 'mouseup'), fromEvent(this.document, 'touchend'))\n ),\n takeUntilDestroyed(this.destroyRef)\n )\n .subscribe({\n next: move => {\n let delta = this.getPosition(move) - startPosition;\n if (rtl && this.orientation() === 'horizontal') {\n delta *= -1;\n }\n\n delta -= appliedDelta;\n if (maxDelta < appliedDelta + delta) {\n delta = maxDelta - appliedDelta;\n } else if (minDelta > appliedDelta + delta) {\n delta = minDelta - appliedDelta;\n }\n\n if (delta === 0) {\n return;\n }\n\n beforeSize += delta;\n afterSize -= delta;\n appliedDelta += delta;\n gutter.before.expandedSize.set(beforeSize);\n afterPart.expandedSize.set(afterSize);\n if (gutter.before.unit() === 'fr') {\n gutter.before.fractionalSize.set(beforeSize);\n }\n if (afterPart.unit() === 'fr') {\n afterPart.fractionalSize.set(afterSize);\n }\n if (this.orientation() === 'vertical') {\n this.elementRef.nativeElement.style.setProperty(\n 'grid-template-rows',\n this.gridTemplateRows()\n );\n } else {\n this.elementRef.nativeElement.style.setProperty(\n 'grid-template-columns',\n this.gridTemplateColumns()\n );\n }\n this.emitSizesChange();\n },\n complete: () => this.saveUIState()\n });\n });\n }\n\n private emitSizesChange(): void {\n const containerSize = this.measureContainerSize();\n if (containerSize > 0) {\n this.ngZone.run(() =>\n this.sizesChange.emit(this.parts().map(part => (part.actualSize() * 100) / containerSize))\n );\n }\n }\n\n private measureContainerSize(): number {\n const rect = this.elementRef.nativeElement.getBoundingClientRect();\n if (this.orientation() === 'vertical') {\n return rect.height;\n } else {\n return rect.width;\n }\n }\n\n private getPosition(event: Event): number {\n const positionObject = (event as TouchEvent).touches?.[0] ?? (event as MouseEvent);\n return this.orientation() === 'horizontal'\n ? (positionObject.clientX ?? 0)\n : (positionObject.clientY ?? 0);\n }\n\n private saveUIState(): void {\n const stateId = this.stateId();\n if (!stateId || !this.uiStateService) {\n return;\n }\n\n const state = this.parts().reduce(\n (partState, part) => {\n const partStateId = part.stateId();\n if (partStateId) {\n const unit = part.unit();\n partState[partStateId] = {\n size: unit === 'px' ? part.expandedSize()! : part.fractionalSize()!,\n initialSize: part.size(),\n initialUnit: unit,\n expanded: !part.collapsedState()\n };\n }\n return partState;\n },\n {} as Record<string, SplitPartState>\n );\n\n this.uiStateService.save(stateId, state);\n }\n\n private restoreFromUIState(): void {\n const stateId = this.stateId();\n if (!stateId || !this.uiStateService) {\n return;\n }\n\n this.uiStateService.load<Record<string, SplitPartState>>(stateId).then(uiState => {\n if (!uiState) {\n return;\n }\n\n let restored = false;\n this.parts()\n .filter(part => part.stateId())\n .map(part => ({ part, state: uiState[part.stateId()!] }))\n .filter(\n (item): item is { part: SiSplitPartComponent; state: SplitPartState } =>\n !!item.state && item.state.initialUnit === item.part.unit()\n )\n .forEach(({ part, state }) => {\n restored = true;\n if (part.unit() === 'px') {\n part.expandedSize.set(state.size);\n } else {\n part.fractionalSize.set(state.size);\n }\n part.collapsedState.set(!state.expanded);\n });\n setTimeout(() => {\n this.refreshAllPartSizes();\n if (restored) {\n this.emitSizesChange();\n }\n });\n });\n }\n}\n","<ng-content />\n\n@for (gutter of gutters(); track $index) {\n @if ($index < parts().length - 1) {\n <div\n class=\"si-split-gutter\"\n [class.d-none]=\"!gutter.visible()\"\n [style.grid-area]=\"'g-' + $index\"\n [style.width.px]=\"orientation() === 'horizontal' ? gutterSize() : null\"\n [style.height.px]=\"orientation() === 'vertical' ? gutterSize() : null\"\n (mousedown)=\"resizeStart(gutter, $event)\"\n (touchstart)=\"resizeStart(gutter, $event)\"\n ></div>\n }\n}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nimport { NgModule } from '@angular/core';\n\nimport { SiSplitPartComponent } from './si-split-part.component';\nimport { SiSplitComponent } from './si-split.component';\n\n@NgModule({\n imports: [SiSplitComponent, SiSplitPartComponent],\n exports: [SiSplitComponent, SiSplitPartComponent]\n})\nexport class SiSplitModule {}\n","/**\n * Copyright (c) Siemens 2016 - 2026\n * SPDX-License-Identifier: MIT\n */\nexport * from './si-split.module';\nexport * from './si-split-part.component';\nexport * from './si-split.component';\nexport * from './si-split.interfaces';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { CdkMenuTrigger } from '@angular/cdk/menu';
|
|
|
3
3
|
import { DomPortal, CdkPortalOutlet } from '@angular/cdk/portal';
|
|
4
4
|
import { NgTemplateOutlet } from '@angular/common';
|
|
5
5
|
import * as i0 from '@angular/core';
|
|
6
|
-
import { input, Component, InjectionToken, booleanAttribute, output, inject, ElementRef, viewChild, TemplateRef, computed, effect, untracked, Directive, contentChildren, INJECTOR, signal
|
|
6
|
+
import { input, Component, InjectionToken, booleanAttribute, output, inject, ElementRef, viewChild, TemplateRef, computed, effect, untracked, Directive, model, contentChildren, INJECTOR, signal } from '@angular/core';
|
|
7
7
|
import * as i1 from '@angular/router';
|
|
8
8
|
import { Router, RouterLink, RouterLinkActive } from '@angular/router';
|
|
9
9
|
import { elementCancel, elementOptions } from '@siemens/element-icons';
|
|
@@ -243,6 +243,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
243
243
|
], template: "@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0)}:host.nav-link.icon-only{min-inline-size:auto}.tab-icon{font-size:1.5rem}\n"] }]
|
|
244
244
|
}] });
|
|
245
245
|
|
|
246
|
+
/**
|
|
247
|
+
* Copyright (c) Siemens 2016 - 2026
|
|
248
|
+
* SPDX-License-Identifier: MIT
|
|
249
|
+
*/
|
|
250
|
+
/**
|
|
251
|
+
* Creates a normal tab that can contain any content.
|
|
252
|
+
*
|
|
253
|
+
* @example
|
|
254
|
+
* ```html
|
|
255
|
+
* <si-tabset>
|
|
256
|
+
* <si-tab heading="Tab 1">
|
|
257
|
+
* <p>Content of Tab 1</p>
|
|
258
|
+
* </si-tab>
|
|
259
|
+
* </si-tabset>
|
|
260
|
+
* ```
|
|
261
|
+
*/
|
|
262
|
+
class SiTabComponent extends SiTabBaseDirective {
|
|
263
|
+
/**
|
|
264
|
+
* Whether the tab is active or not.
|
|
265
|
+
* If set to `true`, the tab will be selected and its content will be displayed.
|
|
266
|
+
* @defaultValue false
|
|
267
|
+
* */
|
|
268
|
+
active = model(false, /* @ts-ignore */
|
|
269
|
+
...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
|
|
270
|
+
/**
|
|
271
|
+
* Guard to check if the tab can be activated.
|
|
272
|
+
* If not provided, the tab can always be activated.
|
|
273
|
+
*/
|
|
274
|
+
canActivate = input(/* @ts-ignore */
|
|
275
|
+
...(ngDevMode ? [undefined, { debugName: "canActivate" }] : /* istanbul ignore next */ []));
|
|
276
|
+
/**
|
|
277
|
+
* Guard to check if the tab can be deactivated.
|
|
278
|
+
* If not provided, the tab can always be deactivated.
|
|
279
|
+
*/
|
|
280
|
+
canDeactivate = input(/* @ts-ignore */
|
|
281
|
+
...(ngDevMode ? [undefined, { debugName: "canDeactivate" }] : /* istanbul ignore next */ []));
|
|
282
|
+
selectTabByUser() {
|
|
283
|
+
const canActivate = this.canActivate();
|
|
284
|
+
if (!this.active() && (canActivate ? canActivate() : true)) {
|
|
285
|
+
this.selectTab();
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
/** {@inheritDoc} */
|
|
289
|
+
selectTab(retainFocus) {
|
|
290
|
+
const activeTab = this.tabset.activeTab();
|
|
291
|
+
if (activeTab instanceof SiTabComponent) {
|
|
292
|
+
const canDeactivate = activeTab?.canDeactivate();
|
|
293
|
+
if (canDeactivate ? !canDeactivate() : false) {
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
this.tabset.activeTab()?.deSelectTab();
|
|
298
|
+
this.active.set(true);
|
|
299
|
+
super.selectTab(retainFocus);
|
|
300
|
+
}
|
|
301
|
+
/** @internal */
|
|
302
|
+
deSelectTab() {
|
|
303
|
+
this.active.set(false);
|
|
304
|
+
}
|
|
305
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiTabComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
306
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiTabComponent, isStandalone: true, selector: "si-tab", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, canActivate: { classPropertyName: "canActivate", publicName: "canActivate", isSignal: true, isRequired: false, transformFunction: null }, canDeactivate: { classPropertyName: "canDeactivate", publicName: "canDeactivate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { listeners: { "click": "selectTabByUser()", "keydown.enter": "selectTabByUser()" } }, providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabComponent }], usesInheritance: true, ngImport: i0, template: "@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0)}:host.nav-link.icon-only{min-inline-size:auto}.tab-icon{font-size:1.5rem}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiTabBadgeComponent, selector: "si-tab-badge", inputs: ["badgeContent", "badgeColor"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
307
|
+
}
|
|
308
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiTabComponent, decorators: [{
|
|
309
|
+
type: Component,
|
|
310
|
+
args: [{ selector: 'si-tab', imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent], providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabComponent }], host: {
|
|
311
|
+
'(click)': 'selectTabByUser()',
|
|
312
|
+
'(keydown.enter)': 'selectTabByUser()'
|
|
313
|
+
}, template: "@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0)}:host.nav-link.icon-only{min-inline-size:auto}.tab-icon{font-size:1.5rem}\n"] }]
|
|
314
|
+
}], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }, { type: i0.Output, args: ["activeChange"] }], canActivate: [{ type: i0.Input, args: [{ isSignal: true, alias: "canActivate", required: false }] }], canDeactivate: [{ type: i0.Input, args: [{ isSignal: true, alias: "canDeactivate", required: false }] }] } });
|
|
315
|
+
|
|
246
316
|
/**
|
|
247
317
|
* Copyright (c) Siemens 2016 - 2026
|
|
248
318
|
* SPDX-License-Identifier: MIT
|
|
@@ -285,6 +355,28 @@ class SiTabsetComponent {
|
|
|
285
355
|
return tab instanceof SiTabLinkComponent;
|
|
286
356
|
}
|
|
287
357
|
constructor() {
|
|
358
|
+
// Per the ARIA tabs pattern, at least one tab should be active. If the app
|
|
359
|
+
// does not provide an active tab, activate the first non-disabled content
|
|
360
|
+
// tab so the tablist stays keyboard reachable.
|
|
361
|
+
effect(() => {
|
|
362
|
+
const hasActiveTab = !!this.activeTab();
|
|
363
|
+
untracked(() => {
|
|
364
|
+
if (hasActiveTab) {
|
|
365
|
+
return;
|
|
366
|
+
}
|
|
367
|
+
const tabToActivate = this.tabPanels().find(tab => {
|
|
368
|
+
if (tab.disabledTab()) {
|
|
369
|
+
return false;
|
|
370
|
+
}
|
|
371
|
+
if (tab instanceof SiTabComponent) {
|
|
372
|
+
const canActivate = tab.canActivate();
|
|
373
|
+
return canActivate ? canActivate() : true;
|
|
374
|
+
}
|
|
375
|
+
return true;
|
|
376
|
+
});
|
|
377
|
+
tabToActivate?.selectTab();
|
|
378
|
+
});
|
|
379
|
+
});
|
|
288
380
|
effect(() => {
|
|
289
381
|
if (this.showMenuButton() && this.activeTab()) {
|
|
290
382
|
// wait for menu button to render on DOM
|
|
@@ -350,76 +442,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
|
|
|
350
442
|
], template: "<div class=\"tabs-container\">\n <div class=\"tab-container-buttonbar-list nav nav-tabs\">\n <div\n #tabScrollContainer\n role=\"tablist\"\n tabindex=\"-1\"\n class=\"d-flex tabs-wrapper\"\n (siResizeObserver)=\"\n resizeContainer(tabScrollContainer.clientWidth, tabScrollContainer.scrollWidth)\n \"\n (keydown)=\"keydown($event)\"\n >\n <ng-content />\n </div>\n\n @if (showMenuButton()) {\n <button\n type=\"button\"\n class=\"dropdown btn btn-tertiary focus-inside\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n [cdkMenuTriggerFor]=\"tabsMenu\"\n >\n <si-icon class=\"icon m-0\" [icon]=\"icons.elementOptions\" />\n </button>\n }\n </div>\n @let tabContent = this.activeTab()?.tabContent();\n @let activeTab = this.activeTab();\n\n <div #contentNode class=\"d-contents\">\n @if (activeTab) {\n <div\n class=\"tab-content focus-inside\"\n role=\"tabpanel\"\n [id]=\"`content-${activeTab.tabId}`\"\n [class.tab-scroll]=\"contentOverflowAuto()\"\n [attr.tabindex]=\"contentOverflowAuto() ? '0' : null\"\n [attr.aria-labelledby]=\"`tab-${activeTab.tabId}`\"\n >\n @if (tabContent) {\n <ng-container [ngTemplateOutlet]=\"tabContent\" />\n }\n\n <ng-content select=\"router-outlet\" />\n </div>\n }\n </div>\n</div>\n\n<ng-template #tabsMenu>\n <si-menu>\n @for (tab of tabPanels(); track tab) {\n @if (tabIsLink(tab)) {\n <a\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n [routerLink]=\"tab.routerLink.urlTree\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </a>\n } @else {\n <button\n type=\"button\"\n si-menu-item\n [disabled]=\"tab.disabledTab()\"\n [icon]=\"tab.icon()\"\n (triggered)=\"tab.selectTab(true)\"\n >\n <ng-container [ngTemplateOutlet]=\"badgeTemplate\" [ngTemplateOutletContext]=\"{ tab }\" />\n </button>\n }\n }\n </si-menu>\n</ng-template>\n\n<ng-template #badgeTemplate let-tab=\"tab\">\n <div class=\"d-flex align-items-center space-between flex-no-wrap justify-content-between\">\n {{ tab.heading() }}\n <si-tab-badge [badgeContent]=\"tab.badgeContent()\" [badgeColor]=\"tab.badgeColor()\" />\n </div>\n</ng-template>\n", styles: [":host{display:block;flex-direction:column}.tabs-container{display:flex;flex-direction:column;overflow:hidden;block-size:100%}.tabs-container:before{inset-block-start:38px;inset-block-end:auto}.btn.dropdown{color:var(--si-sys-text-primary);min-inline-size:0;border-block-end:1px solid var(--si-sys-border-4);padding-inline:var(--si-sys-sizing-spacing-x-50);flex-shrink:0}.btn.dropdown:hover{border-color:var(--si-sys-border-4);color:var(--si-sys-text-accent-hover)}.tab-content{flex-grow:1}.tab-scroll{flex-basis:0;overflow:auto}.tabs-wrapper{overflow-y:hidden;overflow-x:auto;scroll-behavior:smooth;scrollbar-width:none}\n"] }]
|
|
351
443
|
}], ctorParameters: () => [], propDecorators: { contentOverflowAuto: [{ type: i0.Input, args: [{ isSignal: true, alias: "contentOverflowAuto", required: false }] }], contentNode: [{ type: i0.ViewChild, args: ['contentNode', { isSignal: true }] }], tabPanels: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SiTabBaseDirective), { isSignal: true }] }] } });
|
|
352
444
|
|
|
353
|
-
/**
|
|
354
|
-
* Copyright (c) Siemens 2016 - 2026
|
|
355
|
-
* SPDX-License-Identifier: MIT
|
|
356
|
-
*/
|
|
357
|
-
/**
|
|
358
|
-
* Creates a normal tab that can contain any content.
|
|
359
|
-
*
|
|
360
|
-
* @example
|
|
361
|
-
* ```html
|
|
362
|
-
* <si-tabset>
|
|
363
|
-
* <si-tab heading="Tab 1">
|
|
364
|
-
* <p>Content of Tab 1</p>
|
|
365
|
-
* </si-tab>
|
|
366
|
-
* </si-tabset>
|
|
367
|
-
* ```
|
|
368
|
-
*/
|
|
369
|
-
class SiTabComponent extends SiTabBaseDirective {
|
|
370
|
-
/**
|
|
371
|
-
* Whether the tab is active or not.
|
|
372
|
-
* If set to `true`, the tab will be selected and its content will be displayed.
|
|
373
|
-
* @defaultValue false
|
|
374
|
-
* */
|
|
375
|
-
active = model(false, /* @ts-ignore */
|
|
376
|
-
...(ngDevMode ? [{ debugName: "active" }] : /* istanbul ignore next */ []));
|
|
377
|
-
/**
|
|
378
|
-
* Guard to check if the tab can be activated.
|
|
379
|
-
* If not provided, the tab can always be activated.
|
|
380
|
-
*/
|
|
381
|
-
canActivate = input(/* @ts-ignore */
|
|
382
|
-
...(ngDevMode ? [undefined, { debugName: "canActivate" }] : /* istanbul ignore next */ []));
|
|
383
|
-
/**
|
|
384
|
-
* Guard to check if the tab can be deactivated.
|
|
385
|
-
* If not provided, the tab can always be deactivated.
|
|
386
|
-
*/
|
|
387
|
-
canDeactivate = input(/* @ts-ignore */
|
|
388
|
-
...(ngDevMode ? [undefined, { debugName: "canDeactivate" }] : /* istanbul ignore next */ []));
|
|
389
|
-
selectTabByUser() {
|
|
390
|
-
const canActivate = this.canActivate();
|
|
391
|
-
if (!this.active() && (canActivate ? canActivate() : true)) {
|
|
392
|
-
this.selectTab();
|
|
393
|
-
}
|
|
394
|
-
}
|
|
395
|
-
/** {@inheritDoc} */
|
|
396
|
-
selectTab(retainFocus) {
|
|
397
|
-
const activeTab = this.tabset.activeTab();
|
|
398
|
-
if (activeTab instanceof SiTabComponent) {
|
|
399
|
-
const canDeactivate = activeTab?.canDeactivate();
|
|
400
|
-
if (canDeactivate ? !canDeactivate() : false) {
|
|
401
|
-
return;
|
|
402
|
-
}
|
|
403
|
-
}
|
|
404
|
-
this.tabset.activeTab()?.deSelectTab();
|
|
405
|
-
this.active.set(true);
|
|
406
|
-
super.selectTab(retainFocus);
|
|
407
|
-
}
|
|
408
|
-
/** @internal */
|
|
409
|
-
deSelectTab() {
|
|
410
|
-
this.active.set(false);
|
|
411
|
-
}
|
|
412
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiTabComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
|
|
413
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SiTabComponent, isStandalone: true, selector: "si-tab", inputs: { active: { classPropertyName: "active", publicName: "active", isSignal: true, isRequired: false, transformFunction: null }, canActivate: { classPropertyName: "canActivate", publicName: "canActivate", isSignal: true, isRequired: false, transformFunction: null }, canDeactivate: { classPropertyName: "canDeactivate", publicName: "canDeactivate", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { active: "activeChange" }, host: { listeners: { "click": "selectTabByUser()", "keydown.enter": "selectTabByUser()" } }, providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabComponent }], usesInheritance: true, ngImport: i0, template: "@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0)}:host.nav-link.icon-only{min-inline-size:auto}.tab-icon{font-size:1.5rem}\n"], dependencies: [{ kind: "component", type: SiIconComponent, selector: "si-icon", inputs: ["icon"] }, { kind: "component", type: SiTabBadgeComponent, selector: "si-tab-badge", inputs: ["badgeContent", "badgeColor"] }, { kind: "pipe", type: SiTranslatePipe, name: "translate" }] });
|
|
414
|
-
}
|
|
415
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SiTabComponent, decorators: [{
|
|
416
|
-
type: Component,
|
|
417
|
-
args: [{ selector: 'si-tab', imports: [SiIconComponent, SiTranslatePipe, SiTabBadgeComponent], providers: [SiTooltipService, { provide: SiTabBaseDirective, useExisting: SiTabComponent }], host: {
|
|
418
|
-
'(click)': 'selectTabByUser()',
|
|
419
|
-
'(keydown.enter)': 'selectTabByUser()'
|
|
420
|
-
}, template: "@let icon = this.icon();\n<span class=\"text-truncate\" [class.visually-hidden]=\"!!icon\">{{ heading() | translate }}</span>\n@if (icon) {\n <si-icon class=\"tab-icon\" [icon]=\"icon\" />\n}\n<si-tab-badge [badgeColor]=\"badgeColor()\" [badgeContent]=\"badgeContent()\" />\n@if (closable() && !disabledTab()) {\n <si-icon\n class=\"ms-2 btn btn-circle btn-sm btn-tertiary-ghost close\"\n [icon]=\"icons.elementCancel\"\n (click)=\"closeTab($event)\"\n />\n}\n\n<ng-template #tabContent>\n <ng-content />\n</ng-template>\n", styles: [":host.nav-link{flex-shrink:0;transform:translate(0)}:host.nav-link.icon-only{min-inline-size:auto}.tab-icon{font-size:1.5rem}\n"] }]
|
|
421
|
-
}], propDecorators: { active: [{ type: i0.Input, args: [{ isSignal: true, alias: "active", required: false }] }, { type: i0.Output, args: ["activeChange"] }], canActivate: [{ type: i0.Input, args: [{ isSignal: true, alias: "canActivate", required: false }] }], canDeactivate: [{ type: i0.Input, args: [{ isSignal: true, alias: "canDeactivate", required: false }] }] } });
|
|
422
|
-
|
|
423
445
|
/**
|
|
424
446
|
* Copyright (c) Siemens 2016 - 2026
|
|
425
447
|
* SPDX-License-Identifier: MIT
|