@scion/components 19.1.0 → 19.2.1
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/scion-components-sashbox.mjs +180 -78
- package/fesm2022/scion-components-sashbox.mjs.map +1 -1
- package/package.json +1 -1
- package/sashbox/sash/sash.component.d.ts +31 -0
- package/sashbox/sash.directive.d.ts +12 -3
- package/sashbox/sashbox-accessor.d.ts +1 -0
- package/sashbox/sashbox.component.d.ts +14 -3
- package/sashbox/sash-initializer.directive.d.ts +0 -11
|
@@ -1,8 +1,18 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { input, inject, TemplateRef, computed,
|
|
2
|
+
import { input, booleanAttribute, inject, signal, TemplateRef, computed, linkedSignal, Directive, ElementRef, ChangeDetectorRef, effect, Component, output, contentChildren, NgZone, afterNextRender, IterableDiffers, untracked, HostBinding, NgModule } from '@angular/core';
|
|
3
3
|
import { SciSplitterComponent } from '@scion/components/splitter';
|
|
4
4
|
import { NgTemplateOutlet } from '@angular/common';
|
|
5
|
+
import { trigger, transition, style, animate } from '@angular/animations';
|
|
5
6
|
|
|
7
|
+
/*
|
|
8
|
+
* Copyright (c) 2018-2025 Swiss Federal Railways
|
|
9
|
+
*
|
|
10
|
+
* This program and the accompanying materials are made
|
|
11
|
+
* available under the terms of the Eclipse Public License 2.0
|
|
12
|
+
* which is available at https://www.eclipse.org/legal/epl-2.0/
|
|
13
|
+
*
|
|
14
|
+
* SPDX-License-Identifier: EPL-2.0
|
|
15
|
+
*/
|
|
6
16
|
/**
|
|
7
17
|
* Allows accessing the sashbox component from sashes.
|
|
8
18
|
*/
|
|
@@ -10,7 +20,7 @@ class SciSashBoxAccessor {
|
|
|
10
20
|
}
|
|
11
21
|
|
|
12
22
|
/*
|
|
13
|
-
* Copyright (c) 2018-
|
|
23
|
+
* Copyright (c) 2018-2025 Swiss Federal Railways
|
|
14
24
|
*
|
|
15
25
|
* This program and the accompanying materials are made
|
|
16
26
|
* available under the terms of the Eclipse Public License 2.0
|
|
@@ -54,22 +64,31 @@ class SciSashDirective {
|
|
|
54
64
|
*/
|
|
55
65
|
minSize = input();
|
|
56
66
|
/**
|
|
57
|
-
*
|
|
67
|
+
* Specifies an optional key to identify this sash.
|
|
58
68
|
*
|
|
59
|
-
*
|
|
69
|
+
* The key is used as the property key in the object emitted by {@link SciSashboxComponent.sashEnd2} to associate the size of this sash.
|
|
60
70
|
*/
|
|
61
71
|
key = input();
|
|
62
72
|
/**
|
|
63
|
-
*
|
|
73
|
+
* Controls whether to animate the entering and leaving of this sash, only if fixed-sized. Defaults to `false`.
|
|
64
74
|
*
|
|
65
|
-
*
|
|
75
|
+
* Enabling animation will mimic the behavior of a side panel that slides in or out.
|
|
76
|
+
*
|
|
77
|
+
* Note: Animates only sashes added or removed after the initial rendering.
|
|
66
78
|
*/
|
|
67
|
-
|
|
79
|
+
animate = input(false, { transform: booleanAttribute });
|
|
68
80
|
_sashBoxAccessor = inject(SciSashBoxAccessor);
|
|
81
|
+
_component = signal(undefined);
|
|
69
82
|
/**
|
|
70
83
|
* Flex properties computed based on the configured {@link size}. Properties are updated when moving this sash.
|
|
71
84
|
*/
|
|
72
85
|
_flexProperties = this.computeFlexProperties();
|
|
86
|
+
/**
|
|
87
|
+
* Represents the template used as sash content.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
sashTemplate = inject(TemplateRef);
|
|
73
92
|
/**
|
|
74
93
|
* Flex properties with normalized 'flex-grow' to ensure the sashes fill the entire sash-box space.
|
|
75
94
|
*
|
|
@@ -85,27 +104,18 @@ class SciSashDirective {
|
|
|
85
104
|
*/
|
|
86
105
|
isFixedSize = computed(() => Number.isNaN(+this.size()));
|
|
87
106
|
/**
|
|
88
|
-
* Gets the
|
|
107
|
+
* Gets the component that renders this sash.
|
|
89
108
|
*
|
|
90
109
|
* @internal
|
|
91
110
|
*/
|
|
92
|
-
|
|
111
|
+
component = computed(() => this._component() ?? throwError('[SciSashbox] SashComponent not available yet.'));
|
|
93
112
|
/**
|
|
94
|
-
*
|
|
113
|
+
* Sets the component that renders this sash.
|
|
95
114
|
*
|
|
96
115
|
* @internal
|
|
97
116
|
*/
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
if (!element) {
|
|
101
|
-
return 0;
|
|
102
|
-
}
|
|
103
|
-
if (this._sashBoxAccessor.direction() === 'row') {
|
|
104
|
-
return element.getBoundingClientRect().width;
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
return element.getBoundingClientRect().height;
|
|
108
|
-
}
|
|
117
|
+
setComponent(component) {
|
|
118
|
+
this._component.set(component);
|
|
109
119
|
}
|
|
110
120
|
/**
|
|
111
121
|
* Returns the identity of this sash, or the passed index if not configured.
|
|
@@ -170,7 +180,7 @@ class SciSashDirective {
|
|
|
170
180
|
});
|
|
171
181
|
}
|
|
172
182
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciSashDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
173
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.0", type: SciSashDirective, isStandalone: true, selector: "ng-template[sciSash]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["sciSash"], ngImport: i0 });
|
|
183
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.0", type: SciSashDirective, isStandalone: true, selector: "ng-template[sciSash]", inputs: { size: { classPropertyName: "size", publicName: "size", isSignal: true, isRequired: false, transformFunction: null }, minSize: { classPropertyName: "minSize", publicName: "minSize", isSignal: true, isRequired: false, transformFunction: null }, key: { classPropertyName: "key", publicName: "key", isSignal: true, isRequired: false, transformFunction: null }, animate: { classPropertyName: "animate", publicName: "animate", isSignal: true, isRequired: false, transformFunction: null } }, exportAs: ["sciSash"], ngImport: i0 });
|
|
174
184
|
}
|
|
175
185
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciSashDirective, decorators: [{
|
|
176
186
|
type: Directive,
|
|
@@ -179,6 +189,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
179
189
|
exportAs: 'sciSash',
|
|
180
190
|
}]
|
|
181
191
|
}] });
|
|
192
|
+
function throwError(error) {
|
|
193
|
+
throw Error(error);
|
|
194
|
+
}
|
|
182
195
|
|
|
183
196
|
/*
|
|
184
197
|
* Copyright (c) 2018-2019 Swiss Federal Railways
|
|
@@ -190,26 +203,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
190
203
|
* SPDX-License-Identifier: EPL-2.0
|
|
191
204
|
*/
|
|
192
205
|
/**
|
|
193
|
-
*
|
|
206
|
+
* Provides access to the native {@link HTMLElement} of the host.
|
|
194
207
|
*/
|
|
195
|
-
class
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
effect(() => this.sash().element.set(host));
|
|
200
|
-
}
|
|
201
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciSashInitializerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
202
|
-
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "19.0.0", type: SciSashInitializerDirective, isStandalone: true, selector: "div[sciSashInitializer].sash", inputs: { sash: { classPropertyName: "sash", publicName: "sciSashInitializer", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
|
|
208
|
+
class SciElementRefDirective {
|
|
209
|
+
host = inject(ElementRef).nativeElement;
|
|
210
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciElementRefDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
211
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.0.0", type: SciElementRefDirective, isStandalone: true, selector: "[sciElementRef]", exportAs: ["sciElementRef"], ngImport: i0 });
|
|
203
212
|
}
|
|
204
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type:
|
|
213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciElementRefDirective, decorators: [{
|
|
205
214
|
type: Directive,
|
|
206
215
|
args: [{
|
|
207
|
-
selector: '
|
|
216
|
+
selector: '[sciElementRef]',
|
|
217
|
+
exportAs: 'sciElementRef',
|
|
208
218
|
}]
|
|
209
|
-
}]
|
|
219
|
+
}] });
|
|
210
220
|
|
|
211
221
|
/*
|
|
212
|
-
* Copyright (c) 2018-
|
|
222
|
+
* Copyright (c) 2018-2025 Swiss Federal Railways
|
|
213
223
|
*
|
|
214
224
|
* This program and the accompanying materials are made
|
|
215
225
|
* available under the terms of the Eclipse Public License 2.0
|
|
@@ -218,23 +228,79 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
218
228
|
* SPDX-License-Identifier: EPL-2.0
|
|
219
229
|
*/
|
|
220
230
|
/**
|
|
221
|
-
*
|
|
231
|
+
* Represents a {@link SciSashDirective} in the DOM, displaying the specified sash template.
|
|
222
232
|
*/
|
|
223
|
-
class
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
233
|
+
class SashComponent {
|
|
234
|
+
/**
|
|
235
|
+
* Specifies the sash representing this component.
|
|
236
|
+
*/
|
|
237
|
+
sash = input.required();
|
|
238
|
+
_host = inject(ElementRef).nativeElement;
|
|
239
|
+
_cd = inject(ChangeDetectorRef);
|
|
240
|
+
_sashBoxAccessor = inject(SciSashBoxAccessor);
|
|
241
|
+
animationState = linkedSignal(() => this.sash().animate() && this._sashBoxAccessor.afterFirstRender() ? 'enter' : null);
|
|
242
|
+
constructor() {
|
|
243
|
+
// Associate sash with this component.
|
|
244
|
+
effect(() => this.sash().setComponent(this));
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Starts the leave animation, returning a signal to track animation completion.
|
|
248
|
+
*/
|
|
249
|
+
startLeaveAnimation() {
|
|
250
|
+
// Detach change detector to prevent updates to the component during the animation.
|
|
251
|
+
this._cd.detach();
|
|
252
|
+
// Trigger 'leave' animation.
|
|
253
|
+
this.animationState.set('leave');
|
|
254
|
+
// Return signal to track animation completion.
|
|
255
|
+
return computed(() => void this.animationState(), { equal: () => false });
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Notifies when ending the animation.
|
|
259
|
+
*/
|
|
260
|
+
onAnimationEnd() {
|
|
261
|
+
this.animationState.set(null);
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Gets the size of this sash in pixel.
|
|
265
|
+
*/
|
|
266
|
+
get size() {
|
|
267
|
+
const { width, height } = this._host.getBoundingClientRect();
|
|
268
|
+
return this._sashBoxAccessor.direction() === 'row' ? width : height;
|
|
269
|
+
}
|
|
270
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SashComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
271
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.0.0", type: SashComponent, isStandalone: true, selector: "sci-sash", inputs: { sash: { classPropertyName: "sash", publicName: "sash", isSignal: true, isRequired: true, transformFunction: null } }, host: { listeners: { "@sash-animation.done": "onAnimationEnd();" }, properties: { "@sash-animation": "animationState()" } }, ngImport: i0, template: "<ng-container *ngTemplateOutlet=\"sash().sashTemplate\"/>\n", styles: [":host{display:grid;grid-auto-rows:100%;grid-auto-columns:100%;overflow:hidden}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], animations: [
|
|
272
|
+
trigger('sash-animation', provideAnimation()),
|
|
273
|
+
] });
|
|
274
|
+
}
|
|
275
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SashComponent, decorators: [{
|
|
276
|
+
type: Component,
|
|
277
|
+
args: [{ selector: 'sci-sash', imports: [
|
|
278
|
+
NgTemplateOutlet,
|
|
279
|
+
], animations: [
|
|
280
|
+
trigger('sash-animation', provideAnimation()),
|
|
281
|
+
], host: {
|
|
282
|
+
'[@sash-animation]': 'animationState()',
|
|
283
|
+
'(@sash-animation.done)': 'onAnimationEnd();',
|
|
284
|
+
}, template: "<ng-container *ngTemplateOutlet=\"sash().sashTemplate\"/>\n", styles: [":host{display:grid;grid-auto-rows:100%;grid-auto-columns:100%;overflow:hidden}\n"] }]
|
|
285
|
+
}], ctorParameters: () => [] });
|
|
286
|
+
/**
|
|
287
|
+
* Returns animation metadata to slide-in and slide-out a sash.
|
|
288
|
+
*/
|
|
289
|
+
function provideAnimation() {
|
|
290
|
+
return [
|
|
291
|
+
transition('void => enter', [
|
|
292
|
+
style({ 'flex-basis': 0 }),
|
|
293
|
+
animate(`125ms ease-out`, style({ 'flex-basis': '*' })),
|
|
294
|
+
]),
|
|
295
|
+
transition('* => leave', [
|
|
296
|
+
style({ 'flex-basis': '*' }),
|
|
297
|
+
animate(`125ms ease-out`, style({ 'flex-basis': 0 })),
|
|
298
|
+
]),
|
|
299
|
+
];
|
|
227
300
|
}
|
|
228
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciElementRefDirective, decorators: [{
|
|
229
|
-
type: Directive,
|
|
230
|
-
args: [{
|
|
231
|
-
selector: '[sciElementRef]',
|
|
232
|
-
exportAs: 'sciElementRef',
|
|
233
|
-
}]
|
|
234
|
-
}] });
|
|
235
301
|
|
|
236
302
|
/*
|
|
237
|
-
* Copyright (c) 2018-
|
|
303
|
+
* Copyright (c) 2018-2025 Swiss Federal Railways
|
|
238
304
|
*
|
|
239
305
|
* This program and the accompanying materials are made
|
|
240
306
|
* available under the terms of the Eclipse Public License 2.0
|
|
@@ -324,11 +390,17 @@ class SciSashboxComponent {
|
|
|
324
390
|
*/
|
|
325
391
|
sashEnd2 = output();
|
|
326
392
|
_host = inject(ElementRef).nativeElement;
|
|
393
|
+
_contentChildren = contentChildren(SciSashDirective);
|
|
394
|
+
/** @internal */
|
|
395
|
+
sashes = this.computeSashes(this._contentChildren);
|
|
327
396
|
/** @internal */
|
|
328
|
-
|
|
397
|
+
afterFirstRender = signal(false);
|
|
329
398
|
sashing = false;
|
|
330
399
|
maxHeight;
|
|
331
400
|
maxWidth;
|
|
401
|
+
constructor() {
|
|
402
|
+
this.detectFirstRendering();
|
|
403
|
+
}
|
|
332
404
|
onSashStart() {
|
|
333
405
|
this.sashing = true;
|
|
334
406
|
// Avoid overflow when sashing.
|
|
@@ -342,7 +414,7 @@ class SciSashboxComponent {
|
|
|
342
414
|
sash.updateFlexProperties({
|
|
343
415
|
flexGrow: 0,
|
|
344
416
|
flexShrink: 1,
|
|
345
|
-
flexBasis: `${sash.
|
|
417
|
+
flexBasis: `${sash.component().size}px`,
|
|
346
418
|
});
|
|
347
419
|
}
|
|
348
420
|
});
|
|
@@ -353,7 +425,7 @@ class SciSashboxComponent {
|
|
|
353
425
|
this.maxWidth = undefined;
|
|
354
426
|
// Unset the flex-basis for non-fixed sashes and set the flex-grow accordingly.
|
|
355
427
|
const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());
|
|
356
|
-
const sashSizes = this.sashes().reduce((acc, sash, i) => acc.set(sash.computeKey(i), sash.
|
|
428
|
+
const sashSizes = this.sashes().reduce((acc, sash, i) => acc.set(sash.computeKey(i), sash.component().size), new Map());
|
|
357
429
|
this.sashes().forEach((sash, i) => {
|
|
358
430
|
if (!sash.isFixedSize()) {
|
|
359
431
|
sash.updateFlexProperties({
|
|
@@ -374,8 +446,8 @@ class SciSashboxComponent {
|
|
|
374
446
|
}
|
|
375
447
|
// Compute the splitter position.
|
|
376
448
|
const splitterRect = splitter.getBoundingClientRect();
|
|
377
|
-
const splitterStart = (this.
|
|
378
|
-
const splitterEnd = (this.
|
|
449
|
+
const splitterStart = (this.direction() === 'row' ? splitterRect.left : splitterRect.top);
|
|
450
|
+
const splitterEnd = (this.direction() === 'row' ? splitterRect.left + splitterRect.width : splitterRect.top + splitterRect.height);
|
|
379
451
|
// Ignore the event if outside the splitter's action scope.
|
|
380
452
|
const eventPos = moveEvent.position.clientPos;
|
|
381
453
|
// The sash should not grow after moved the mouse pointer beyond the left bounds of the sash and now moving the mouse pointer back toward the current sash.
|
|
@@ -389,8 +461,8 @@ class SciSashboxComponent {
|
|
|
389
461
|
// Compute the new sash sizes.
|
|
390
462
|
const sash1 = this.sashes()[sashIndex];
|
|
391
463
|
const sash2 = this.sashes()[sashIndex + 1];
|
|
392
|
-
const sashSize1 = sash1.
|
|
393
|
-
const sashSize2 = sash2.
|
|
464
|
+
const sashSize1 = sash1.component().size;
|
|
465
|
+
const sashSize2 = sash2.component().size;
|
|
394
466
|
const sashMinSize1 = sash1.minSize() ? this.toPixel(sash1.minSize()) : 0;
|
|
395
467
|
const sashMinSize2 = sash2.minSize() ? this.toPixel(sash2.minSize()) : 0;
|
|
396
468
|
const newSashSize1 = between(Math.round(sashSize1 + distance), { min: sashMinSize1, max: sashSize1 + sashSize2 - sashMinSize2 });
|
|
@@ -402,10 +474,10 @@ class SciSashboxComponent {
|
|
|
402
474
|
onSashReset(sashIndex) {
|
|
403
475
|
const sash1 = this.sashes()[sashIndex];
|
|
404
476
|
const sash2 = this.sashes()[sashIndex + 1];
|
|
405
|
-
const equalSashSize = (sash1.
|
|
477
|
+
const equalSashSize = (sash1.component().size + sash2.component().size) / 2;
|
|
406
478
|
const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());
|
|
407
479
|
const sashSizesAfterReset = this.sashes().reduce((acc, sash, index) => {
|
|
408
|
-
const size = index === sashIndex || index === sashIndex + 1 ? equalSashSize : sash.
|
|
480
|
+
const size = index === sashIndex || index === sashIndex + 1 ? equalSashSize : sash.component().size;
|
|
409
481
|
return acc.set(sash.computeKey(index), size);
|
|
410
482
|
}, new Map());
|
|
411
483
|
[sash1, sash2].forEach(sash => {
|
|
@@ -420,41 +492,76 @@ class SciSashboxComponent {
|
|
|
420
492
|
this.sashEnd.emit(Array.from(sashSizesAfterReset.values()));
|
|
421
493
|
this.sashEnd2.emit(Object.fromEntries(sashSizesAfterReset));
|
|
422
494
|
}
|
|
423
|
-
get isColumnDirection() {
|
|
424
|
-
return this.direction() === 'column';
|
|
425
|
-
}
|
|
426
|
-
get isRowDirection() {
|
|
427
|
-
return this.direction() === 'row';
|
|
428
|
-
}
|
|
429
495
|
toPixel(value) {
|
|
430
496
|
if (typeof value === 'number') {
|
|
431
497
|
return value;
|
|
432
498
|
}
|
|
433
499
|
if (value.endsWith('%')) {
|
|
434
500
|
const hostBounds = this._host.getBoundingClientRect();
|
|
435
|
-
const hostSize = (this.
|
|
501
|
+
const hostSize = (this.direction() === 'row' ? hostBounds.width : hostBounds.height);
|
|
436
502
|
return parseInt(value, 10) * hostSize / 100;
|
|
437
503
|
}
|
|
438
504
|
return parseInt(value, 10);
|
|
439
505
|
}
|
|
506
|
+
/**
|
|
507
|
+
* Detects when rendered this component for the first time.
|
|
508
|
+
*/
|
|
509
|
+
detectFirstRendering() {
|
|
510
|
+
afterNextRender({
|
|
511
|
+
read: () => this.afterFirstRender.set(true),
|
|
512
|
+
});
|
|
513
|
+
}
|
|
514
|
+
/**
|
|
515
|
+
* Mirrors the provided signal. If animated sashes are being removed, delays emission until the animation completes,
|
|
516
|
+
* effectively removing the element after the animation.
|
|
517
|
+
*
|
|
518
|
+
* Delayed removal is required for CDK Portals to not remove displayed content immediately.
|
|
519
|
+
*/
|
|
520
|
+
computeSashes(contentChildren) {
|
|
521
|
+
const differ = inject(IterableDiffers).find([]).create();
|
|
522
|
+
const sashes = signal([]);
|
|
523
|
+
effect(() => {
|
|
524
|
+
// Compute removed sashes to be removed with an animation.
|
|
525
|
+
const removedAnimatedSashes = new Array();
|
|
526
|
+
differ.diff(contentChildren())?.forEachRemovedItem(({ item: sash }) => untracked(() => {
|
|
527
|
+
if (sash.animate()) {
|
|
528
|
+
removedAnimatedSashes.push(sash);
|
|
529
|
+
}
|
|
530
|
+
}));
|
|
531
|
+
// Emit if no sashes are removed with an animation.
|
|
532
|
+
if (!removedAnimatedSashes.length) {
|
|
533
|
+
sashes.set(contentChildren());
|
|
534
|
+
return;
|
|
535
|
+
}
|
|
536
|
+
// Delay emission until a leave animation completes.
|
|
537
|
+
removedAnimatedSashes.forEach(sash => {
|
|
538
|
+
// Start the leave animation.
|
|
539
|
+
const done = sash.component().startLeaveAnimation();
|
|
540
|
+
// Track animation completion, re-running this effect to finally emit the sashes.
|
|
541
|
+
done();
|
|
542
|
+
});
|
|
543
|
+
});
|
|
544
|
+
return sashes;
|
|
545
|
+
}
|
|
440
546
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciSashboxComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
441
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: SciSashboxComponent, isStandalone: true, selector: "sci-sashbox", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sashStart: "sashStart", sashEnd: "sashEnd", sashEnd2: "sashEnd2" }, host: { properties: { "class.sashing": "this.sashing", "style.--\u0275sci-sashbox-max-height": "this.maxHeight", "style.--\u0275sci-sashbox-max-width": "this.maxWidth"
|
|
547
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.0.0", type: SciSashboxComponent, isStandalone: true, selector: "sci-sashbox", inputs: { direction: { classPropertyName: "direction", publicName: "direction", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sashStart: "sashStart", sashEnd: "sashEnd", sashEnd2: "sashEnd2" }, host: { properties: { "attr.data-direction": "direction()", "class.sashing": "this.sashing", "style.--\u0275sci-sashbox-max-height": "this.maxHeight", "style.--\u0275sci-sashbox-max-width": "this.maxWidth" } }, providers: [{
|
|
442
548
|
provide: SciSashBoxAccessor,
|
|
443
549
|
useFactory: provideSashBoxAccessor,
|
|
444
|
-
}], queries: [{ propertyName: "
|
|
550
|
+
}], queries: [{ propertyName: "_contentChildren", predicate: SciSashDirective, isSignal: true }], ngImport: i0, template: "@for (sash of sashes(); track sash; let i = $index; let first = $first; let last = $last) {\n <sci-sash [sash]=\"sash\"\n [class.first]=\"first\"\n [class.last]=\"last\"\n [style.flex-grow]=\"sash.flexProperties().flexGrow\"\n [style.flex-shrink]=\"sash.flexProperties().flexShrink\"\n [style.flex-basis]=\"sash.flexProperties().flexBasis\"/>\n @if (!last) {\n <sci-splitter sciElementRef #sciElementRef=\"sciElementRef\"\n [orientation]=\"direction() === 'row' ? 'vertical' : 'horizontal'\"\n (start)=\"onSashStart()\"\n (move)=\"onSash(sciElementRef.host, i, $event)\"\n (end)=\"onSashEnd()\"\n (reset)=\"onSashReset(i)\"/>\n }\n}\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:stretch;box-sizing:border-box;overflow:hidden;z-index:0}:host *{box-sizing:border-box}:host[data-direction=column]{flex-direction:column}:host[data-direction=row]{flex-direction:row}:host[data-direction=row]>sci-sash{margin:0 var(--sci-sashbox-gap)}:host[data-direction=row]>sci-sash.first{margin-left:0}:host[data-direction=row]>sci-sash.last{margin-right:0}:host[data-direction=column]>sci-sash{margin:var(--sci-sashbox-gap) 0}:host[data-direction=column]>sci-sash.first{margin-top:0}:host[data-direction=column]>sci-sash.last{margin-bottom:0}:host.sashing{max-height:calc(var(--\\275sci-sashbox-max-height) * 1px);max-width:calc(var(--\\275sci-sashbox-max-width) * 1px)}:host.sashing>sci-sash{pointer-events:none}:host>sci-splitter{--sci-splitter-background-color: var(--sci-sashbox-splitter-background-color);--sci-splitter-background-color-hover: var(--sci-sashbox-splitter-background-color-hover);--sci-splitter-size: var(--sci-sashbox-splitter-size);--sci-splitter-size-hover: var(--sci-sashbox-splitter-size-hover);--sci-splitter-touch-target-size: var(--sci-sashbox-splitter-touch-target-size);--sci-splitter-cross-axis-size: var(--sci-sashbox-splitter-cross-axis-size);--sci-splitter-border-radius: var(--sci-sashbox-splitter-border-radius);--sci-splitter-opacity-active: var(--sci-sashbox-splitter-opacity-active);--sci-splitter-opacity-hover: var(--sci-sashbox-splitter-opacity-hover);flex:none;z-index:1}\n"], dependencies: [{ kind: "component", type: SciSplitterComponent, selector: "sci-splitter", inputs: ["orientation"], outputs: ["start", "move", "end", "reset"] }, { kind: "directive", type: SciElementRefDirective, selector: "[sciElementRef]", exportAs: ["sciElementRef"] }, { kind: "component", type: SashComponent, selector: "sci-sash", inputs: ["sash"] }] });
|
|
445
551
|
}
|
|
446
552
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImport: i0, type: SciSashboxComponent, decorators: [{
|
|
447
553
|
type: Component,
|
|
448
554
|
args: [{ selector: 'sci-sashbox', imports: [
|
|
449
|
-
NgTemplateOutlet,
|
|
450
|
-
SciSashInitializerDirective,
|
|
451
555
|
SciSplitterComponent,
|
|
452
556
|
SciElementRefDirective,
|
|
557
|
+
SashComponent,
|
|
453
558
|
], providers: [{
|
|
454
559
|
provide: SciSashBoxAccessor,
|
|
455
560
|
useFactory: provideSashBoxAccessor,
|
|
456
|
-
}],
|
|
457
|
-
|
|
561
|
+
}], host: {
|
|
562
|
+
'[attr.data-direction]': 'direction()',
|
|
563
|
+
}, template: "@for (sash of sashes(); track sash; let i = $index; let first = $first; let last = $last) {\n <sci-sash [sash]=\"sash\"\n [class.first]=\"first\"\n [class.last]=\"last\"\n [style.flex-grow]=\"sash.flexProperties().flexGrow\"\n [style.flex-shrink]=\"sash.flexProperties().flexShrink\"\n [style.flex-basis]=\"sash.flexProperties().flexBasis\"/>\n @if (!last) {\n <sci-splitter sciElementRef #sciElementRef=\"sciElementRef\"\n [orientation]=\"direction() === 'row' ? 'vertical' : 'horizontal'\"\n (start)=\"onSashStart()\"\n (move)=\"onSash(sciElementRef.host, i, $event)\"\n (end)=\"onSashEnd()\"\n (reset)=\"onSashReset(i)\"/>\n }\n}\n", styles: ["@charset \"UTF-8\";:host{display:flex;align-items:stretch;box-sizing:border-box;overflow:hidden;z-index:0}:host *{box-sizing:border-box}:host[data-direction=column]{flex-direction:column}:host[data-direction=row]{flex-direction:row}:host[data-direction=row]>sci-sash{margin:0 var(--sci-sashbox-gap)}:host[data-direction=row]>sci-sash.first{margin-left:0}:host[data-direction=row]>sci-sash.last{margin-right:0}:host[data-direction=column]>sci-sash{margin:var(--sci-sashbox-gap) 0}:host[data-direction=column]>sci-sash.first{margin-top:0}:host[data-direction=column]>sci-sash.last{margin-bottom:0}:host.sashing{max-height:calc(var(--\\275sci-sashbox-max-height) * 1px);max-width:calc(var(--\\275sci-sashbox-max-width) * 1px)}:host.sashing>sci-sash{pointer-events:none}:host>sci-splitter{--sci-splitter-background-color: var(--sci-sashbox-splitter-background-color);--sci-splitter-background-color-hover: var(--sci-sashbox-splitter-background-color-hover);--sci-splitter-size: var(--sci-sashbox-splitter-size);--sci-splitter-size-hover: var(--sci-sashbox-splitter-size-hover);--sci-splitter-touch-target-size: var(--sci-sashbox-splitter-touch-target-size);--sci-splitter-cross-axis-size: var(--sci-sashbox-splitter-cross-axis-size);--sci-splitter-border-radius: var(--sci-sashbox-splitter-border-radius);--sci-splitter-opacity-active: var(--sci-sashbox-splitter-opacity-active);--sci-splitter-opacity-hover: var(--sci-sashbox-splitter-opacity-hover);flex:none;z-index:1}\n"] }]
|
|
564
|
+
}], ctorParameters: () => [], propDecorators: { sashing: [{
|
|
458
565
|
type: HostBinding,
|
|
459
566
|
args: ['class.sashing']
|
|
460
567
|
}], maxHeight: [{
|
|
@@ -463,12 +570,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.0.0", ngImpor
|
|
|
463
570
|
}], maxWidth: [{
|
|
464
571
|
type: HostBinding,
|
|
465
572
|
args: ['style.--ɵsci-sashbox-max-width']
|
|
466
|
-
}], isColumnDirection: [{
|
|
467
|
-
type: HostBinding,
|
|
468
|
-
args: ['class.column']
|
|
469
|
-
}], isRowDirection: [{
|
|
470
|
-
type: HostBinding,
|
|
471
|
-
args: ['class.row']
|
|
472
573
|
}] } });
|
|
473
574
|
function between(value, minmax) {
|
|
474
575
|
return Math.min(minmax.max, Math.max(minmax.min, value));
|
|
@@ -479,14 +580,15 @@ function between(value, minmax) {
|
|
|
479
580
|
function computePixelToFlexGrowFactor(sashes) {
|
|
480
581
|
const flexibleSashes = sashes.filter(sash => !sash.isFixedSize());
|
|
481
582
|
const proportionSum = flexibleSashes.reduce((sum, sash) => sum + Number(sash.size()), 0);
|
|
482
|
-
const pixelSum = flexibleSashes.reduce((sum, sash) => sum + sash.
|
|
583
|
+
const pixelSum = flexibleSashes.reduce((sum, sash) => sum + sash.component().size, 0);
|
|
483
584
|
return proportionSum / pixelSum;
|
|
484
585
|
}
|
|
485
586
|
function provideSashBoxAccessor() {
|
|
486
587
|
const component = inject(SciSashboxComponent);
|
|
487
588
|
return new class {
|
|
488
|
-
direction = component.direction;
|
|
489
589
|
sashes = component.sashes;
|
|
590
|
+
direction = component.direction;
|
|
591
|
+
afterFirstRender = component.afterFirstRender;
|
|
490
592
|
}();
|
|
491
593
|
}
|
|
492
594
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scion-components-sashbox.mjs","sources":["../../../../projects/scion/components/sashbox/src/sashbox-accessor.ts","../../../../projects/scion/components/sashbox/src/sash.directive.ts","../../../../projects/scion/components/sashbox/src/sash-initializer.directive.ts","../../../../projects/scion/components/sashbox/src/element-ref.directive.ts","../../../../projects/scion/components/sashbox/src/sashbox.component.ts","../../../../projects/scion/components/sashbox/src/sashbox.component.html","../../../../projects/scion/components/sashbox/src/sashbox.module.ts","../../../../projects/scion/components/sashbox/src/public_api.ts","../../../../projects/scion/components/sashbox/src/scion-components-sashbox.ts"],"sourcesContent":["import {SciSashDirective} from './sash.directive';\nimport {Signal} from '@angular/core';\n\n/**\n * Allows accessing the sashbox component from sashes.\n */\nexport abstract class SciSashBoxAccessor {\n\n public abstract readonly sashes: Signal<readonly SciSashDirective[]>;\n\n public abstract readonly direction: Signal<'column' | 'row'>;\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {computed, Directive, inject, input, linkedSignal, signal, Signal, TemplateRef, WritableSignal} from '@angular/core';\nimport {SciSashBoxAccessor} from './sashbox-accessor';\n\n/**\n * Use this directive to model a sash for {@link SciSashboxComponent}.\n * The host element of this modelling directive must be a <ng-template> which is used as sash template.\n *\n *\n * ### Usage:\n *\n * <sci-sashbox direction=\"row\">\n * <!-- fixed size sash -->\n * <ng-template sciSash size=\"200px\">\n * ...\n * </ng-template>\n *\n * <!-- sash which takes the remaining space -->\n * <ng-template sciSash>\n * ...\n * </ng-template>\n * </sci-sashbox>\n */\n@Directive({\n selector: 'ng-template[sciSash]',\n exportAs: 'sciSash',\n})\nexport class SciSashDirective {\n\n /**\n * Specifies the sash size, either as fixed size with an explicit unit,\n * or as a unitless proportion to distribute remaining space. A proportional\n * sash has the ability to grow or shrink if necessary, and must be >= 1.\n *\n * If not set, remaining space is distributed equally.\n */\n public readonly size = input('1', {transform: (size: string | number | null | undefined): string | number => size ?? '1'});\n\n /**\n * Specifies the minimal sash size in pixel or percent.\n * The min-size prevents the user from shrinking the sash below this minimal size.\n *\n * If the unit is omitted, the value is interpreted as a pixel value.\n */\n public readonly minSize = input<string | number | undefined>();\n\n /**\n * Optional key to identify this sash.\n *\n * If set, this key is used as the property key in the object emitted by {@link SciSashboxComponent.sashEnd2} to associate the size of this sash.\n */\n public readonly key = input<string | undefined>();\n\n /**\n * Represents the template used as sash content.\n *\n * @internal\n */\n public readonly sashTemplate = inject<TemplateRef<void>>(TemplateRef);\n private readonly _sashBoxAccessor = inject(SciSashBoxAccessor);\n\n /**\n * Flex properties computed based on the configured {@link size}. Properties are updated when moving this sash.\n */\n private readonly _flexProperties = this.computeFlexProperties();\n\n /**\n * Flex properties with normalized 'flex-grow' to ensure the sashes fill the entire sash-box space.\n *\n * Use these properties to lay out this sash in the sashbox's flex layout.\n *\n * @internal\n */\n public readonly flexProperties = this.normalizeFlexGrow(this._flexProperties);\n\n /**\n * Returns if this sash has a fixed size, meaning that it has not the ability to grow or shrink.\n *\n * @internal\n */\n public readonly isFixedSize = computed(() => Number.isNaN(+this.size()));\n\n /**\n * Gets the DOM element that renders this sash.\n *\n * @internal\n */\n public readonly element = signal<HTMLElement | undefined>(undefined);\n\n /**\n * Gets the effective size of this sash in the DOM.\n *\n * @internal\n */\n public get elementSize(): number {\n const element = this.element();\n if (!element) {\n return 0;\n }\n if (this._sashBoxAccessor.direction() === 'row') {\n return element.getBoundingClientRect().width;\n }\n else {\n return element.getBoundingClientRect().height;\n }\n }\n\n /**\n * Returns the identity of this sash, or the passed index if not configured.\n *\n * @internal\n */\n public computeKey(index: number): string {\n return this.key() ?? `${index}`;\n }\n\n /**\n * Updates the flex properties of this sash for layout in the sashbox's flex layout.\n *\n * @internal\n */\n public updateFlexProperties(flexProperties: Partial<FlexProperties>): void {\n this._flexProperties.update(previousFlexProperties => ({...previousFlexProperties, ...flexProperties}));\n }\n\n /**\n * Computes the flex properties to lay out this sash in the sashbox's flex layout based on the configured {@link size}.\n */\n private computeFlexProperties(): WritableSignal<FlexProperties> {\n return linkedSignal(() => {\n const size = this.size();\n if (this.isFixedSize()) {\n // fixed-sized sash\n return {\n flexGrow: 0,\n flexShrink: 0,\n flexBasis: `${size}`,\n };\n }\n else {\n // remaining space is distributed according to given proportion\n const proportion = +size;\n if (proportion < 1) {\n throw Error(`[IllegalSashSizeError] The proportion for flexible sized sashes must be >=1 [size=${this.size()}]`);\n }\n return {\n flexGrow: proportion,\n flexShrink: 1,\n flexBasis: '0',\n };\n }\n });\n }\n\n /**\n * Normalizes the 'flex-grow' of the passed {@link FlexProperties} to ensure that the sum of the 'flex-grow' proportions of all sashes is 1.\n *\n * If the sum of all flex-grow proportions were less than 1, the sashes would not fill the entire sash-box space.\n * Without normalization, this could occur when a sash is removed.\n */\n private normalizeFlexGrow(flexProperties: Signal<FlexProperties>): Signal<FlexProperties> {\n return computed(() => {\n const sashes = this._sashBoxAccessor.sashes();\n const {flexGrow, flexShrink, flexBasis} = flexProperties();\n const flexGrowSum = sashes.reduce((sum, sash) => sum + sash._flexProperties().flexGrow, 0);\n\n return {\n flexGrow: flexGrow === 0 || flexGrowSum === 0 ? 0 : flexGrow / flexGrowSum, // Sum of normalized flex-grow proportions must be 1;\n flexShrink,\n flexBasis,\n };\n });\n }\n}\n\n/**\n * Flex properties to lay out the sash in the sashbox's flex layout.\n */\ninterface FlexProperties {\n flexGrow: number;\n flexShrink: number;\n flexBasis: string;\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, effect, ElementRef, inject, input} from '@angular/core';\nimport {SciSashDirective} from './sash.directive';\n\n/**\n * Initializes {SashDirective} with the target {HTMLDivElement}.\n */\n@Directive({\n selector: 'div[sciSashInitializer].sash',\n})\nexport class SciSashInitializerDirective {\n\n public readonly sash = input.required<SciSashDirective>({alias: 'sciSashInitializer'});\n\n constructor() {\n const host = inject(ElementRef).nativeElement as HTMLDivElement;\n effect(() => this.sash().element.set(host));\n }\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, ElementRef, inject} from '@angular/core';\n\n/**\n * Provides access to the native {@link HTMLElement} of the host.\n */\n@Directive({\n selector: '[sciElementRef]',\n exportAs: 'sciElementRef',\n})\nexport class SciElementRefDirective {\n\n public readonly host = inject(ElementRef).nativeElement as HTMLElement;\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Component, contentChildren, ElementRef, HostBinding, inject, input, NgZone, output} from '@angular/core';\nimport {SciSplitterComponent, SplitterMoveEvent} from '@scion/components/splitter';\nimport {SciSashDirective} from './sash.directive';\nimport {SciSashBoxAccessor} from './sashbox-accessor';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {SciSashInitializerDirective} from './sash-initializer.directive';\nimport {SciElementRefDirective} from './element-ref.directive';\n\n/**\n * The <sci-sashbox> is like a CSS flexbox container that lays out its content children (sashes) in a row (which is by default)\n * or column arrangement (as specified by the direction property). A splitter is added between each child to allow the user to\n * shrink or stretch the individual sashes.\n *\n * Sashes are modelled as <ng-template> decorated with the 'sciSash' directive.\n * A sash can have a fixed size with an explicit unit, or a unitless proportion to distribute remaining space.\n * A proportional sash has the ability to grow or shrink if necessary.\n *\n * Sash content is added to a CSS grid container with a single column, stretching the content vertically and horizontally.\n *\n * ### Usage\n *\n * ```html\n * <sci-sashbox direction=\"row\">\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"2\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n * </sci-sashbox>\n * ```\n *\n * ### Styling\n *\n * To customize the default look of SCION components or support different themes, configure the `@scion/components` SCSS module in `styles.scss`.\n * To style a specific `sci-sashbox` component, the following CSS variables can be set directly on the component.\n *\n * - --sci-sashbox-gap: Sets the gaps (gutters) between sashes.\n * - --sci-sashbox-splitter-background-color: Sets the background color of the splitter.\n * - --sci-sashbox-splitter-background-color-hover: Sets the background color of the splitter when hovering it.\n * - --sci-sashbox-splitter-size: Sets the size of the splitter along the main axis.\n * - --sci-sashbox-splitter-size-hover: Sets the size of the splitter along the main axis when hovering it.\n * - --sci-sashbox-splitter-touch-target-size: Sets the touch target size to move the splitter (accessibility).\n * - --sci-sashbox-splitter-cross-axis-size: Sets the splitter size along the cross axis.\n * - --sci-sashbox-splitter-border-radius: Sets the border radius of the splitter.\n * - --sci-sashbox-splitter-opacity-active: Sets the opacity of the splitter while the user moves the splitter.\n * - --sci-sashbox-splitter-opacity-hover: Sets the opacity of the splitter when hovering it.\n *\n * Example:\n *\n * ```scss\n * sci-sashbox {\n * --sci-sashbox-splitter-background-color: black;\n * --sci-sashbox-splitter-background-color-hover: black;\n * }\n * ```\n */\n@Component({\n selector: 'sci-sashbox',\n templateUrl: './sashbox.component.html',\n styleUrls: ['./sashbox.component.scss'],\n imports: [\n NgTemplateOutlet,\n SciSashInitializerDirective,\n SciSplitterComponent,\n SciElementRefDirective,\n ],\n providers: [{\n provide: SciSashBoxAccessor,\n useFactory: provideSashBoxAccessor,\n }],\n})\nexport class SciSashboxComponent {\n\n /**\n * Specifies if to lay out sashes in a row (which is by default) or column arrangement.\n */\n public readonly direction = input<'column' | 'row'>('row');\n\n /**\n * Notifies when start sashing.\n */\n public readonly sashStart = output<void>();\n\n /**\n * Emits an array with new sash sizes when sashing ends.\n *\n * The array contains the sash sizes in display order.\n *\n * TODO [Angular 20] BREAKING CHANGE: Change signature from `number[]` to `{[key: string]: number}` and remove {@link sashEnd2}.\n */\n public readonly sashEnd = output<number[]>();\n\n /**\n * Emits an object with new sash sizes when sashing ends.\n *\n * Each sash size is associated with its {@link SciSashDirective.key} or its display position (zero-based) if not set.\n *\n * Note: This output will be renamed to `sashEnd` in version 20, changing the signature of {@link sashEnd} from `number[]` to `{[key: string]: number}`.\n *\n * TODO [Angular 20] BREAKING CHANGE: Replace with {@link sashEnd}.\n */\n public readonly sashEnd2 = output<{[key: string]: number}>();\n\n private readonly _host = inject(ElementRef).nativeElement as HTMLElement;\n\n /** @internal */\n public readonly sashes = contentChildren(SciSashDirective);\n\n @HostBinding('class.sashing')\n protected sashing = false;\n\n @HostBinding('style.--ɵsci-sashbox-max-height')\n protected maxHeight: number | undefined;\n\n @HostBinding('style.--ɵsci-sashbox-max-width')\n protected maxWidth: number | undefined;\n\n protected onSashStart(): void {\n this.sashing = true;\n\n // Avoid overflow when sashing.\n const hostBounds = this._host.getBoundingClientRect();\n this.maxHeight = hostBounds.height;\n this.maxWidth = hostBounds.width;\n this.sashStart.emit();\n\n // Set the effective sash size as the flex-basis for non-fixed sashes (as sashing operates on pixel deltas).\n this.sashes().forEach(sash => {\n if (!sash.isFixedSize()) {\n sash.updateFlexProperties({\n flexGrow: 0,\n flexShrink: 1,\n flexBasis: `${sash.elementSize}px`,\n });\n }\n });\n }\n\n protected onSashEnd(): void {\n this.sashing = false;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n\n // Unset the flex-basis for non-fixed sashes and set the flex-grow accordingly.\n const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());\n const sashSizes = this.sashes().reduce((acc, sash, i) => acc.set(sash.computeKey(i), sash.elementSize), new Map<string, number>());\n\n this.sashes().forEach((sash, i) => {\n if (!sash.isFixedSize()) {\n sash.updateFlexProperties({\n flexGrow: pixelToFlexGrowFactor * sashSizes.get(sash.computeKey(i))!,\n flexShrink: 1,\n flexBasis: '0',\n });\n }\n });\n\n this.sashEnd.emit(Array.from(sashSizes.values()));\n this.sashEnd2.emit(Object.fromEntries(sashSizes));\n }\n\n protected onSash(splitter: HTMLElement, sashIndex: number, moveEvent: SplitterMoveEvent): void {\n NgZone.assertNotInAngularZone();\n\n const distance = moveEvent.distance;\n if (distance === 0) {\n return;\n }\n\n // Compute the splitter position.\n const splitterRect = splitter.getBoundingClientRect();\n const splitterStart = (this.isRowDirection ? splitterRect.left : splitterRect.top);\n const splitterEnd = (this.isRowDirection ? splitterRect.left + splitterRect.width : splitterRect.top + splitterRect.height);\n\n // Ignore the event if outside the splitter's action scope.\n const eventPos = moveEvent.position.clientPos;\n // The sash should not grow after moved the mouse pointer beyond the left bounds of the sash and now moving the mouse pointer back toward the current sash.\n if (distance > 0 && eventPos < splitterStart) {\n return;\n }\n\n // The sash should not shrink after moved the mouse pointer beyond the right bounds of the sash and now moving the mouse pointer back toward the current sash.\n if (distance < 0 && eventPos > splitterEnd) {\n return;\n }\n\n // Compute the new sash sizes.\n const sash1 = this.sashes()[sashIndex]!;\n const sash2 = this.sashes()[sashIndex + 1]!;\n\n const sashSize1 = sash1.elementSize;\n const sashSize2 = sash2.elementSize;\n\n const sashMinSize1 = sash1.minSize() ? this.toPixel(sash1.minSize()!) : 0;\n const sashMinSize2 = sash2.minSize() ? this.toPixel(sash2.minSize()!) : 0;\n\n const newSashSize1 = between(Math.round(sashSize1 + distance), {min: sashMinSize1, max: sashSize1 + sashSize2 - sashMinSize2});\n const newSashSize2 = between(Math.round(sashSize2 - distance), {min: sashMinSize2, max: sashSize1 + sashSize2 - sashMinSize1});\n\n // Set the new computed sash sizes.\n sash1.updateFlexProperties({flexBasis: `${newSashSize1}px`});\n sash2.updateFlexProperties({flexBasis: `${newSashSize2}px`});\n }\n\n protected onSashReset(sashIndex: number): void {\n const sash1 = this.sashes()[sashIndex]!;\n const sash2 = this.sashes()[sashIndex + 1]!;\n const equalSashSize = (sash1.elementSize + sash2.elementSize) / 2;\n const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());\n\n const sashSizesAfterReset = this.sashes().reduce((acc, sash, index) => {\n const size = index === sashIndex || index === sashIndex + 1 ? equalSashSize : sash.elementSize;\n return acc.set(sash.computeKey(index), size);\n }, new Map<string, number>());\n\n [sash1, sash2].forEach(sash => {\n if (sash.isFixedSize()) {\n sash.updateFlexProperties({flexBasis: `${equalSashSize}px`});\n }\n else {\n sash.updateFlexProperties({flexGrow: pixelToFlexGrowFactor * equalSashSize});\n }\n });\n\n this.sashStart.emit();\n this.sashEnd.emit(Array.from(sashSizesAfterReset.values()));\n this.sashEnd2.emit(Object.fromEntries(sashSizesAfterReset));\n }\n\n @HostBinding('class.column')\n protected get isColumnDirection(): boolean {\n return this.direction() === 'column';\n }\n\n @HostBinding('class.row')\n protected get isRowDirection(): boolean {\n return this.direction() === 'row';\n }\n\n private toPixel(value: string | number): number {\n if (typeof value === 'number') {\n return value;\n }\n if (value.endsWith('%')) {\n const hostBounds = this._host.getBoundingClientRect();\n const hostSize = (this.isRowDirection ? hostBounds.width : hostBounds.height);\n return parseInt(value, 10) * hostSize / 100;\n }\n return parseInt(value, 10);\n }\n}\n\nfunction between(value: number, minmax: {min: number; max: number}): number {\n return Math.min(minmax.max, Math.max(minmax.min, value));\n}\n\n/**\n * Returns the factor to compute the flex-grow proportion from the pixel size of a sash.\n */\nfunction computePixelToFlexGrowFactor(sashes: readonly SciSashDirective[]): number {\n const flexibleSashes = sashes.filter(sash => !sash.isFixedSize());\n\n const proportionSum = flexibleSashes.reduce((sum, sash) => sum + Number(sash.size()), 0);\n const pixelSum = flexibleSashes.reduce((sum, sash) => sum + sash.elementSize, 0);\n\n return proportionSum / pixelSum;\n}\n\nfunction provideSashBoxAccessor(): SciSashBoxAccessor {\n const component = inject(SciSashboxComponent);\n\n return new class implements SciSashBoxAccessor {\n public readonly direction = component.direction;\n public readonly sashes = component.sashes;\n }();\n}\n","@for (sash of sashes(); track sash; let i = $index; let first = $first; let last = $last) {\n <div class=\"sash\"\n [class.first]=\"first\"\n [class.last]=\"last\"\n [sciSashInitializer]=\"sash\"\n [style.flex-grow]=\"sash.flexProperties().flexGrow\"\n [style.flex-shrink]=\"sash.flexProperties().flexShrink\"\n [style.flex-basis]=\"sash.flexProperties().flexBasis\">\n <ng-container *ngTemplateOutlet=\"sash.sashTemplate\"/>\n </div>\n @if (!last) {\n <sci-splitter sciElementRef #sciElementRef=\"sciElementRef\"\n [orientation]=\"isRowDirection ? 'vertical' : 'horizontal'\"\n (start)=\"onSashStart()\"\n (move)=\"onSash(sciElementRef.host, i, $event)\"\n (end)=\"onSashEnd()\"\n (reset)=\"onSashReset(i)\"/>\n }\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {NgModule} from '@angular/core';\nimport {SciSashboxComponent} from './sashbox.component';\nimport {SciSashDirective} from './sash.directive';\n\n/**\n * Provides a sashbox component that lays out its children in a row or column arrangement and places a splitter between each child.\n *\n * ### Usage:\n *\n * ```html\n * <sci-sashbox direction=\"row\">\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"2\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n * </sci-sashbox>\n * ```\n *\n * @deprecated since version 19.0.0; Import standalone component and directive instead; API will be removed in a future release.\n */\n@NgModule({ // TODO [Angular 20] Remove deprecated NgModule\n imports: [\n SciSashboxComponent,\n SciSashDirective,\n ],\n exports: [\n SciSashboxComponent,\n SciSashDirective,\n ],\n})\nexport class SciSashboxModule {\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\n/*\n * Secondary entrypoint: '@scion/components/sashbox'\n *\n * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md\n */\nexport {SciSashboxModule} from './sashbox.module';\nexport {SciSashboxComponent} from './sashbox.component';\nexport {SciSashDirective} from './sash.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":";;;;;AAGA;;AAEG;MACmB,kBAAkB,CAAA;AAKvC;;ACXD;;;;;;;;AAQG;AAKH;;;;;;;;;;;;;;;;;;AAkBG;MAKU,gBAAgB,CAAA;AAE3B;;;;;;AAMG;AACa,IAAA,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,EAAC,SAAS,EAAE,CAAC,IAAwC,KAAsB,IAAI,IAAI,GAAG,EAAC,CAAC;AAE1H;;;;;AAKG;IACa,OAAO,GAAG,KAAK,EAA+B;AAE9D;;;;AAIG;IACa,GAAG,GAAG,KAAK,EAAsB;AAEjD;;;;AAIG;AACa,IAAA,YAAY,GAAG,MAAM,CAAoB,WAAW,CAAC;AACpD,IAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC;AAE9D;;AAEG;AACc,IAAA,eAAe,GAAG,IAAI,CAAC,qBAAqB,EAAE;AAE/D;;;;;;AAMG;IACa,cAAc,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC;AAE7E;;;;AAIG;AACa,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAExE;;;;AAIG;AACa,IAAA,OAAO,GAAG,MAAM,CAA0B,SAAS,CAAC;AAEpE;;;;AAIG;AACH,IAAA,IAAW,WAAW,GAAA;AACpB,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;QAC9B,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC;;QAEV,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,KAAK,EAAE;AAC/C,YAAA,OAAO,OAAO,CAAC,qBAAqB,EAAE,CAAC,KAAK;;aAEzC;AACH,YAAA,OAAO,OAAO,CAAC,qBAAqB,EAAE,CAAC,MAAM;;;AAIjD;;;;AAIG;AACI,IAAA,UAAU,CAAC,KAAa,EAAA;QAC7B,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,CAAG,EAAA,KAAK,EAAE;;AAGjC;;;;AAIG;AACI,IAAA,oBAAoB,CAAC,cAAuC,EAAA;AACjE,QAAA,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,sBAAsB,KAAK,EAAC,GAAG,sBAAsB,EAAE,GAAG,cAAc,EAAC,CAAC,CAAC;;AAGzG;;AAEG;IACK,qBAAqB,GAAA;QAC3B,OAAO,YAAY,CAAC,MAAK;AACvB,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE;AACxB,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;;gBAEtB,OAAO;AACL,oBAAA,QAAQ,EAAE,CAAC;AACX,oBAAA,UAAU,EAAE,CAAC;oBACb,SAAS,EAAE,CAAG,EAAA,IAAI,CAAE,CAAA;iBACrB;;iBAEE;;AAEH,gBAAA,MAAM,UAAU,GAAG,CAAC,IAAI;AACxB,gBAAA,IAAI,UAAU,GAAG,CAAC,EAAE;oBAClB,MAAM,KAAK,CAAC,CAAqF,kFAAA,EAAA,IAAI,CAAC,IAAI,EAAE,CAAG,CAAA,CAAA,CAAC;;gBAElH,OAAO;AACL,oBAAA,QAAQ,EAAE,UAAU;AACpB,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,SAAS,EAAE,GAAG;iBACf;;AAEL,SAAC,CAAC;;AAGJ;;;;;AAKG;AACK,IAAA,iBAAiB,CAAC,cAAsC,EAAA;QAC9D,OAAO,QAAQ,CAAC,MAAK;YACnB,MAAM,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE;YAC7C,MAAM,EAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAC,GAAG,cAAc,EAAE;YAC1D,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;YAE1F,OAAO;AACL,gBAAA,QAAQ,EAAE,QAAQ,KAAK,CAAC,IAAI,WAAW,KAAK,CAAC,GAAG,CAAC,GAAG,QAAQ,GAAG,WAAW;gBAC1E,UAAU;gBACV,SAAS;aACV;AACH,SAAC,CAAC;;uGAhJO,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,iBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,QAAQ,EAAE,SAAS;AACpB,iBAAA;;;ACnCD;;;;;;;;AAQG;AAKH;;AAEG;MAIU,2BAA2B,CAAA;IAEtB,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAmB,EAAC,KAAK,EAAE,oBAAoB,EAAC,CAAC;AAEtF,IAAA,WAAA,GAAA;QACE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAA+B;AAC/D,QAAA,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;;uGANlC,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAA3B,2BAA2B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAA3B,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBAHvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,8BAA8B;AACzC,iBAAA;;;AClBD;;;;;;;;AAQG;AAIH;;AAEG;MAKU,sBAAsB,CAAA;AAEjB,IAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAA4B;uGAF3D,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;2FAAtB,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;2FAAtB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAJlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,QAAQ,EAAE,eAAe;AAC1B,iBAAA;;;AClBD;;;;;;;;AAQG;AAUH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDG;MAgBU,mBAAmB,CAAA;AAE9B;;AAEG;AACa,IAAA,SAAS,GAAG,KAAK,CAAmB,KAAK,CAAC;AAE1D;;AAEG;IACa,SAAS,GAAG,MAAM,EAAQ;AAE1C;;;;;;AAMG;IACa,OAAO,GAAG,MAAM,EAAY;AAE5C;;;;;;;;AAQG;IACa,QAAQ,GAAG,MAAM,EAA2B;AAE3C,IAAA,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,aAA4B;;AAGxD,IAAA,MAAM,GAAG,eAAe,CAAC,gBAAgB,CAAC;IAGhD,OAAO,GAAG,KAAK;AAGf,IAAA,SAAS;AAGT,IAAA,QAAQ;IAER,WAAW,GAAA;AACnB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;;QAGnB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACrD,QAAA,IAAI,CAAC,SAAS,GAAG,UAAU,CAAC,MAAM;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,KAAK;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;QAGrB,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,IAAG;AAC3B,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBACvB,IAAI,CAAC,oBAAoB,CAAC;AACxB,oBAAA,QAAQ,EAAE,CAAC;AACX,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,SAAS,EAAE,CAAA,EAAG,IAAI,CAAC,WAAW,CAAI,EAAA,CAAA;AACnC,iBAAA,CAAC;;AAEN,SAAC,CAAC;;IAGM,SAAS,GAAA;AACjB,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,SAAS;AAC1B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;;QAGzB,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AACzE,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,EAAE,IAAI,GAAG,EAAkB,CAAC;QAElI,IAAI,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAI;AAChC,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE;gBACvB,IAAI,CAAC,oBAAoB,CAAC;AACxB,oBAAA,QAAQ,EAAE,qBAAqB,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAE;AACpE,oBAAA,UAAU,EAAE,CAAC;AACb,oBAAA,SAAS,EAAE,GAAG;AACf,iBAAA,CAAC;;AAEN,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;;AAGzC,IAAA,MAAM,CAAC,QAAqB,EAAE,SAAiB,EAAE,SAA4B,EAAA;QACrF,MAAM,CAAC,sBAAsB,EAAE;AAE/B,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ;AACnC,QAAA,IAAI,QAAQ,KAAK,CAAC,EAAE;YAClB;;;AAIF,QAAA,MAAM,YAAY,GAAG,QAAQ,CAAC,qBAAqB,EAAE;AACrD,QAAA,MAAM,aAAa,IAAI,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC;QAClF,MAAM,WAAW,IAAI,IAAI,CAAC,cAAc,GAAG,YAAY,CAAC,IAAI,GAAG,YAAY,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,GAAG,YAAY,CAAC,MAAM,CAAC;;AAG3H,QAAA,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,SAAS;;QAE7C,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,aAAa,EAAE;YAC5C;;;QAIF,IAAI,QAAQ,GAAG,CAAC,IAAI,QAAQ,GAAG,WAAW,EAAE;YAC1C;;;QAIF,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,GAAG,CAAC,CAAE;AAE3C,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW;AACnC,QAAA,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW;QAEnC,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAG,CAAC,GAAG,CAAC;QACzE,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAG,CAAC,GAAG,CAAC;QAEzE,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,EAAE,EAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,EAAC,CAAC;QAC9H,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,QAAQ,CAAC,EAAE,EAAC,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,SAAS,GAAG,SAAS,GAAG,YAAY,EAAC,CAAC;;QAG9H,KAAK,CAAC,oBAAoB,CAAC,EAAC,SAAS,EAAE,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI,EAAC,CAAC;QAC5D,KAAK,CAAC,oBAAoB,CAAC,EAAC,SAAS,EAAE,CAAA,EAAG,YAAY,CAAA,EAAA,CAAI,EAAC,CAAC;;AAGpD,IAAA,WAAW,CAAC,SAAiB,EAAA;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAE;QACvC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,GAAG,CAAC,CAAE;AAC3C,QAAA,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,IAAI,CAAC;QACjE,MAAM,qBAAqB,GAAG,4BAA4B,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;AAEzE,QAAA,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,KAAI;YACpE,MAAM,IAAI,GAAG,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,SAAS,GAAG,CAAC,GAAG,aAAa,GAAG,IAAI,CAAC,WAAW;AAC9F,YAAA,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC;AAC9C,SAAC,EAAE,IAAI,GAAG,EAAkB,CAAC;QAE7B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,OAAO,CAAC,IAAI,IAAG;AAC5B,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE;gBACtB,IAAI,CAAC,oBAAoB,CAAC,EAAC,SAAS,EAAE,CAAA,EAAG,aAAa,CAAA,EAAA,CAAI,EAAC,CAAC;;iBAEzD;gBACH,IAAI,CAAC,oBAAoB,CAAC,EAAC,QAAQ,EAAE,qBAAqB,GAAG,aAAa,EAAC,CAAC;;AAEhF,SAAC,CAAC;AAEF,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;AACrB,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;;AAG7D,IAAA,IACc,iBAAiB,GAAA;AAC7B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,QAAQ;;AAGtC,IAAA,IACc,cAAc,GAAA;AAC1B,QAAA,OAAO,IAAI,CAAC,SAAS,EAAE,KAAK,KAAK;;AAG3B,IAAA,OAAO,CAAC,KAAsB,EAAA;AACpC,QAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;AAC7B,YAAA,OAAO,KAAK;;AAEd,QAAA,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACvB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE;AACrD,YAAA,MAAM,QAAQ,IAAI,IAAI,CAAC,cAAc,GAAG,UAAU,CAAC,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC;YAC7E,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,QAAQ,GAAG,GAAG;;AAE7C,QAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC;;uGAjLjB,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,mBAAmB,ohBALnB,CAAC;AACV,gBAAA,OAAO,EAAE,kBAAkB;AAC3B,gBAAA,UAAU,EAAE,sBAAsB;aACnC,CAAC,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,QAAA,EAAA,SAAA,EAqCuC,gBAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC1H3D,o1BAmBA,EAAA,MAAA,EAAA,CAAA,s5CAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,ED0DI,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,kBAAA,EAAA,0BAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAChB,2BAA2B,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAC3B,oBAAoB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACpB,sBAAsB,EAAA,QAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,CAAA,eAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FAOb,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAf/B,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,aAAa,EAGd,OAAA,EAAA;wBACP,gBAAgB;wBAChB,2BAA2B;wBAC3B,oBAAoB;wBACpB,sBAAsB;AACvB,qBAAA,EAAA,SAAA,EACU,CAAC;AACV,4BAAA,OAAO,EAAE,kBAAkB;AAC3B,4BAAA,UAAU,EAAE,sBAAsB;yBACnC,CAAC,EAAA,QAAA,EAAA,o1BAAA,EAAA,MAAA,EAAA,CAAA,s5CAAA,CAAA,EAAA;8BAwCQ,OAAO,EAAA,CAAA;sBADhB,WAAW;uBAAC,eAAe;gBAIlB,SAAS,EAAA,CAAA;sBADlB,WAAW;uBAAC,iCAAiC;gBAIpC,QAAQ,EAAA,CAAA;sBADjB,WAAW;uBAAC,gCAAgC;gBAoH/B,iBAAiB,EAAA,CAAA;sBAD9B,WAAW;uBAAC,cAAc;gBAMb,cAAc,EAAA,CAAA;sBAD3B,WAAW;uBAAC,WAAW;;AAkB1B,SAAS,OAAO,CAAC,KAAa,EAAE,MAAkC,EAAA;AAChE,IAAA,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC1D;AAEA;;AAEG;AACH,SAAS,4BAA4B,CAAC,MAAmC,EAAA;AACvE,IAAA,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjE,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,KAAK,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAEhF,OAAO,aAAa,GAAG,QAAQ;AACjC;AAEA,SAAS,sBAAsB,GAAA;AAC7B,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,mBAAmB,CAAC;AAE7C,IAAA,OAAO,IAAI,MAAA;AACO,QAAA,SAAS,GAAG,SAAS,CAAC,SAAS;AAC/B,QAAA,MAAM,GAAG,SAAS,CAAC,MAAM;AAC1C,KAAA,EAAE;AACL;;AEnSA;;;;;;;;AAQG;AAMH;;;;;;;;;;;;;;;;;;;;;;AAsBG;MAWU,gBAAgB,CAAA;uGAAhB,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YARzB,mBAAmB;AACnB,YAAA,gBAAgB,aAGhB,mBAAmB;YACnB,gBAAgB,CAAA,EAAA,CAAA;AAGP,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,YARzB,mBAAmB,CAAA,EAAA,CAAA;;2FAQV,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAV5B,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,gBAAgB;AACjB,qBAAA;AACD,oBAAA,OAAO,EAAE;wBACP,mBAAmB;wBACnB,gBAAgB;AACjB,qBAAA;AACF,iBAAA;;;AC9CD;;;;;;;;AAQG;AAEH;;;;AAIG;;ACdH;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"scion-components-sashbox.mjs","sources":["../../../../projects/scion/components/sashbox/src/sashbox-accessor.ts","../../../../projects/scion/components/sashbox/src/sash.directive.ts","../../../../projects/scion/components/sashbox/src/element-ref.directive.ts","../../../../projects/scion/components/sashbox/src/sash/sash.component.ts","../../../../projects/scion/components/sashbox/src/sash/sash.component.html","../../../../projects/scion/components/sashbox/src/sashbox.component.ts","../../../../projects/scion/components/sashbox/src/sashbox.component.html","../../../../projects/scion/components/sashbox/src/sashbox.module.ts","../../../../projects/scion/components/sashbox/src/public_api.ts","../../../../projects/scion/components/sashbox/src/scion-components-sashbox.ts"],"sourcesContent":["/*\n * Copyright (c) 2018-2025 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {SciSashDirective} from './sash.directive';\nimport {Signal} from '@angular/core';\n\n/**\n * Allows accessing the sashbox component from sashes.\n */\nexport abstract class SciSashBoxAccessor {\n\n public abstract readonly sashes: Signal<readonly SciSashDirective[]>;\n public abstract readonly direction: Signal<'column' | 'row'>;\n public abstract readonly afterFirstRender: Signal<boolean>;\n}\n","/*\n * Copyright (c) 2018-2025 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {booleanAttribute, computed, Directive, inject, input, linkedSignal, signal, Signal, TemplateRef, WritableSignal} from '@angular/core';\nimport {SciSashBoxAccessor} from './sashbox-accessor';\nimport {SashComponent} from './sash/sash.component';\n\n/**\n * Use this directive to model a sash for {@link SciSashboxComponent}.\n * The host element of this modelling directive must be a <ng-template> which is used as sash template.\n *\n *\n * ### Usage:\n *\n * <sci-sashbox direction=\"row\">\n * <!-- fixed size sash -->\n * <ng-template sciSash size=\"200px\">\n * ...\n * </ng-template>\n *\n * <!-- sash which takes the remaining space -->\n * <ng-template sciSash>\n * ...\n * </ng-template>\n * </sci-sashbox>\n */\n@Directive({\n selector: 'ng-template[sciSash]',\n exportAs: 'sciSash',\n})\nexport class SciSashDirective {\n\n /**\n * Specifies the sash size, either as fixed size with an explicit unit,\n * or as a unitless proportion to distribute remaining space. A proportional\n * sash has the ability to grow or shrink if necessary, and must be >= 1.\n *\n * If not set, remaining space is distributed equally.\n */\n public readonly size = input('1', {transform: (size: string | number | null | undefined): string | number => size ?? '1'});\n\n /**\n * Specifies the minimal sash size in pixel or percent.\n * The min-size prevents the user from shrinking the sash below this minimal size.\n *\n * If the unit is omitted, the value is interpreted as a pixel value.\n */\n public readonly minSize = input<string | number | undefined>();\n\n /**\n * Specifies an optional key to identify this sash.\n *\n * The key is used as the property key in the object emitted by {@link SciSashboxComponent.sashEnd2} to associate the size of this sash.\n */\n public readonly key = input<string | undefined>();\n\n /**\n * Controls whether to animate the entering and leaving of this sash, only if fixed-sized. Defaults to `false`.\n *\n * Enabling animation will mimic the behavior of a side panel that slides in or out.\n *\n * Note: Animates only sashes added or removed after the initial rendering.\n */\n public readonly animate = input(false, {transform: booleanAttribute});\n\n private readonly _sashBoxAccessor = inject(SciSashBoxAccessor);\n private readonly _component = signal<SashComponent | undefined>(undefined);\n\n /**\n * Flex properties computed based on the configured {@link size}. Properties are updated when moving this sash.\n */\n private readonly _flexProperties = this.computeFlexProperties();\n\n /**\n * Represents the template used as sash content.\n *\n * @internal\n */\n public readonly sashTemplate = inject<TemplateRef<void>>(TemplateRef);\n\n /**\n * Flex properties with normalized 'flex-grow' to ensure the sashes fill the entire sash-box space.\n *\n * Use these properties to lay out this sash in the sashbox's flex layout.\n *\n * @internal\n */\n public readonly flexProperties = this.normalizeFlexGrow(this._flexProperties);\n\n /**\n * Returns if this sash has a fixed size, meaning that it has not the ability to grow or shrink.\n *\n * @internal\n */\n public readonly isFixedSize = computed(() => Number.isNaN(+this.size()));\n\n /**\n * Gets the component that renders this sash.\n *\n * @internal\n */\n public readonly component = computed(() => this._component() ?? throwError('[SciSashbox] SashComponent not available yet.'));\n\n /**\n * Sets the component that renders this sash.\n *\n * @internal\n */\n public setComponent(component: SashComponent): void {\n this._component.set(component);\n }\n\n /**\n * Returns the identity of this sash, or the passed index if not configured.\n *\n * @internal\n */\n public computeKey(index: number): string {\n return this.key() ?? `${index}`;\n }\n\n /**\n * Updates the flex properties of this sash for layout in the sashbox's flex layout.\n *\n * @internal\n */\n public updateFlexProperties(flexProperties: Partial<FlexProperties>): void {\n this._flexProperties.update(previousFlexProperties => ({...previousFlexProperties, ...flexProperties}));\n }\n\n /**\n * Computes the flex properties to lay out this sash in the sashbox's flex layout based on the configured {@link size}.\n */\n private computeFlexProperties(): WritableSignal<FlexProperties> {\n return linkedSignal(() => {\n const size = this.size();\n if (this.isFixedSize()) {\n // fixed-sized sash\n return {\n flexGrow: 0,\n flexShrink: 0,\n flexBasis: `${size}`,\n };\n }\n else {\n // remaining space is distributed according to given proportion\n const proportion = +size;\n if (proportion < 1) {\n throw Error(`[IllegalSashSizeError] The proportion for flexible sized sashes must be >=1 [size=${this.size()}]`);\n }\n return {\n flexGrow: proportion,\n flexShrink: 1,\n flexBasis: '0',\n };\n }\n });\n }\n\n /**\n * Normalizes the 'flex-grow' of the passed {@link FlexProperties} to ensure that the sum of the 'flex-grow' proportions of all sashes is 1.\n *\n * If the sum of all flex-grow proportions were less than 1, the sashes would not fill the entire sash-box space.\n * Without normalization, this could occur when a sash is removed.\n */\n private normalizeFlexGrow(flexProperties: Signal<FlexProperties>): Signal<FlexProperties> {\n return computed(() => {\n const sashes = this._sashBoxAccessor.sashes();\n const {flexGrow, flexShrink, flexBasis} = flexProperties();\n const flexGrowSum = sashes.reduce((sum, sash) => sum + sash._flexProperties().flexGrow, 0);\n\n return {\n flexGrow: flexGrow === 0 || flexGrowSum === 0 ? 0 : flexGrow / flexGrowSum, // Sum of normalized flex-grow proportions must be 1;\n flexShrink,\n flexBasis,\n };\n });\n }\n}\n\n/**\n * Flex properties to lay out the sash in the sashbox's flex layout.\n */\ninterface FlexProperties {\n flexGrow: number;\n flexShrink: number;\n flexBasis: string;\n}\n\nfunction throwError(error: string): never {\n throw Error(error);\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {Directive, ElementRef, inject} from '@angular/core';\n\n/**\n * Provides access to the native {@link HTMLElement} of the host.\n */\n@Directive({\n selector: '[sciElementRef]',\n exportAs: 'sciElementRef',\n})\nexport class SciElementRefDirective {\n\n public readonly host = inject(ElementRef).nativeElement as HTMLElement;\n}\n","/*\n * Copyright (c) 2018-2025 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {ChangeDetectorRef, Component, computed, effect, ElementRef, inject, input, linkedSignal, Signal} from '@angular/core';\nimport {NgTemplateOutlet} from '@angular/common';\nimport {animate, AnimationMetadata, style, transition, trigger} from '@angular/animations';\nimport {SciSashBoxAccessor} from '../sashbox-accessor';\nimport {SciSashDirective} from '../sash.directive';\n\n/**\n * Represents a {@link SciSashDirective} in the DOM, displaying the specified sash template.\n */\n@Component({\n selector: 'sci-sash',\n templateUrl: './sash.component.html',\n styleUrls: ['./sash.component.scss'],\n imports: [\n NgTemplateOutlet,\n ],\n animations: [\n trigger('sash-animation', provideAnimation()),\n ],\n host: {\n '[@sash-animation]': 'animationState()',\n '(@sash-animation.done)': 'onAnimationEnd();',\n },\n})\nexport class SashComponent {\n\n /**\n * Specifies the sash representing this component.\n */\n public readonly sash = input.required<SciSashDirective>();\n\n private readonly _host = inject(ElementRef).nativeElement as HTMLElement;\n private readonly _cd = inject(ChangeDetectorRef);\n private readonly _sashBoxAccessor = inject(SciSashBoxAccessor);\n\n protected readonly animationState = linkedSignal<'enter' | 'leave' | null>(() => this.sash().animate() && this._sashBoxAccessor.afterFirstRender() ? 'enter' : null);\n\n constructor() {\n // Associate sash with this component.\n effect(() => this.sash().setComponent(this));\n }\n\n /**\n * Starts the leave animation, returning a signal to track animation completion.\n */\n public startLeaveAnimation(): Signal<void> {\n // Detach change detector to prevent updates to the component during the animation.\n this._cd.detach();\n // Trigger 'leave' animation.\n this.animationState.set('leave');\n // Return signal to track animation completion.\n return computed(() => void this.animationState(), {equal: () => false});\n }\n\n /**\n * Notifies when ending the animation.\n */\n protected onAnimationEnd(): void {\n this.animationState.set(null);\n }\n\n /**\n * Gets the size of this sash in pixel.\n */\n public get size(): number {\n const {width, height} = this._host.getBoundingClientRect();\n return this._sashBoxAccessor.direction() === 'row' ? width : height;\n }\n}\n\n/**\n * Returns animation metadata to slide-in and slide-out a sash.\n */\nfunction provideAnimation(): AnimationMetadata[] {\n return [\n transition('void => enter', [\n style({'flex-basis': 0}),\n animate(`125ms ease-out`, style({'flex-basis': '*'})),\n ]),\n transition('* => leave', [\n style({'flex-basis': '*'}),\n animate(`125ms ease-out`, style({'flex-basis': 0})),\n ]),\n ];\n}\n","<ng-container *ngTemplateOutlet=\"sash().sashTemplate\"/>\n","/*\n * Copyright (c) 2018-2025 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {afterNextRender, Component, contentChildren, effect, ElementRef, HostBinding, inject, input, IterableDiffers, NgZone, output, Signal, signal, untracked} from '@angular/core';\nimport {SciSplitterComponent, SplitterMoveEvent} from '@scion/components/splitter';\nimport {SciSashDirective} from './sash.directive';\nimport {SciSashBoxAccessor} from './sashbox-accessor';\nimport {SciElementRefDirective} from './element-ref.directive';\nimport {SashComponent} from './sash/sash.component';\n\n/**\n * The <sci-sashbox> is like a CSS flexbox container that lays out its content children (sashes) in a row (which is by default)\n * or column arrangement (as specified by the direction property). A splitter is added between each child to allow the user to\n * shrink or stretch the individual sashes.\n *\n * Sashes are modelled as <ng-template> decorated with the 'sciSash' directive.\n * A sash can have a fixed size with an explicit unit, or a unitless proportion to distribute remaining space.\n * A proportional sash has the ability to grow or shrink if necessary.\n *\n * Sash content is added to a CSS grid container with a single column, stretching the content vertically and horizontally.\n *\n * ### Usage\n *\n * ```html\n * <sci-sashbox direction=\"row\">\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"2\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n * </sci-sashbox>\n * ```\n *\n * ### Styling\n *\n * To customize the default look of SCION components or support different themes, configure the `@scion/components` SCSS module in `styles.scss`.\n * To style a specific `sci-sashbox` component, the following CSS variables can be set directly on the component.\n *\n * - --sci-sashbox-gap: Sets the gaps (gutters) between sashes.\n * - --sci-sashbox-splitter-background-color: Sets the background color of the splitter.\n * - --sci-sashbox-splitter-background-color-hover: Sets the background color of the splitter when hovering it.\n * - --sci-sashbox-splitter-size: Sets the size of the splitter along the main axis.\n * - --sci-sashbox-splitter-size-hover: Sets the size of the splitter along the main axis when hovering it.\n * - --sci-sashbox-splitter-touch-target-size: Sets the touch target size to move the splitter (accessibility).\n * - --sci-sashbox-splitter-cross-axis-size: Sets the splitter size along the cross axis.\n * - --sci-sashbox-splitter-border-radius: Sets the border radius of the splitter.\n * - --sci-sashbox-splitter-opacity-active: Sets the opacity of the splitter while the user moves the splitter.\n * - --sci-sashbox-splitter-opacity-hover: Sets the opacity of the splitter when hovering it.\n *\n * Example:\n *\n * ```scss\n * sci-sashbox {\n * --sci-sashbox-splitter-background-color: black;\n * --sci-sashbox-splitter-background-color-hover: black;\n * }\n * ```\n */\n@Component({\n selector: 'sci-sashbox',\n templateUrl: './sashbox.component.html',\n styleUrls: ['./sashbox.component.scss'],\n imports: [\n SciSplitterComponent,\n SciElementRefDirective,\n SashComponent,\n ],\n providers: [{\n provide: SciSashBoxAccessor,\n useFactory: provideSashBoxAccessor,\n }],\n host: {\n '[attr.data-direction]': 'direction()',\n },\n})\nexport class SciSashboxComponent {\n\n /**\n * Specifies if to lay out sashes in a row (which is by default) or column arrangement.\n */\n public readonly direction = input<'column' | 'row'>('row');\n\n /**\n * Notifies when start sashing.\n */\n public readonly sashStart = output<void>();\n\n /**\n * Emits an array with new sash sizes when sashing ends.\n *\n * The array contains the sash sizes in display order.\n *\n * TODO [Angular 20] BREAKING CHANGE: Change signature from `number[]` to `{[key: string]: number}` and remove {@link sashEnd2}.\n */\n public readonly sashEnd = output<number[]>();\n\n /**\n * Emits an object with new sash sizes when sashing ends.\n *\n * Each sash size is associated with its {@link SciSashDirective.key} or its display position (zero-based) if not set.\n *\n * Note: This output will be renamed to `sashEnd` in version 20, changing the signature of {@link sashEnd} from `number[]` to `{[key: string]: number}`.\n *\n * TODO [Angular 20] BREAKING CHANGE: Replace with {@link sashEnd}.\n */\n public readonly sashEnd2 = output<{[key: string]: number}>();\n\n private readonly _host = inject(ElementRef).nativeElement as HTMLElement;\n private readonly _contentChildren = contentChildren(SciSashDirective);\n\n /** @internal */\n public readonly sashes = this.computeSashes(this._contentChildren);\n /** @internal */\n public afterFirstRender = signal(false);\n\n @HostBinding('class.sashing')\n protected sashing = false;\n\n @HostBinding('style.--ɵsci-sashbox-max-height')\n protected maxHeight: number | undefined;\n\n @HostBinding('style.--ɵsci-sashbox-max-width')\n protected maxWidth: number | undefined;\n\n constructor() {\n this.detectFirstRendering();\n }\n\n protected onSashStart(): void {\n this.sashing = true;\n\n // Avoid overflow when sashing.\n const hostBounds = this._host.getBoundingClientRect();\n this.maxHeight = hostBounds.height;\n this.maxWidth = hostBounds.width;\n this.sashStart.emit();\n\n // Set the effective sash size as the flex-basis for non-fixed sashes (as sashing operates on pixel deltas).\n this.sashes().forEach(sash => {\n if (!sash.isFixedSize()) {\n sash.updateFlexProperties({\n flexGrow: 0,\n flexShrink: 1,\n flexBasis: `${sash.component().size}px`,\n });\n }\n });\n }\n\n protected onSashEnd(): void {\n this.sashing = false;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n\n // Unset the flex-basis for non-fixed sashes and set the flex-grow accordingly.\n const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());\n const sashSizes = this.sashes().reduce((acc, sash, i) => acc.set(sash.computeKey(i), sash.component().size), new Map<string, number>());\n\n this.sashes().forEach((sash, i) => {\n if (!sash.isFixedSize()) {\n sash.updateFlexProperties({\n flexGrow: pixelToFlexGrowFactor * sashSizes.get(sash.computeKey(i))!,\n flexShrink: 1,\n flexBasis: '0',\n });\n }\n });\n\n this.sashEnd.emit(Array.from(sashSizes.values()));\n this.sashEnd2.emit(Object.fromEntries(sashSizes));\n }\n\n protected onSash(splitter: HTMLElement, sashIndex: number, moveEvent: SplitterMoveEvent): void {\n NgZone.assertNotInAngularZone();\n\n const distance = moveEvent.distance;\n if (distance === 0) {\n return;\n }\n\n // Compute the splitter position.\n const splitterRect = splitter.getBoundingClientRect();\n const splitterStart = (this.direction() === 'row' ? splitterRect.left : splitterRect.top);\n const splitterEnd = (this.direction() === 'row' ? splitterRect.left + splitterRect.width : splitterRect.top + splitterRect.height);\n\n // Ignore the event if outside the splitter's action scope.\n const eventPos = moveEvent.position.clientPos;\n // The sash should not grow after moved the mouse pointer beyond the left bounds of the sash and now moving the mouse pointer back toward the current sash.\n if (distance > 0 && eventPos < splitterStart) {\n return;\n }\n\n // The sash should not shrink after moved the mouse pointer beyond the right bounds of the sash and now moving the mouse pointer back toward the current sash.\n if (distance < 0 && eventPos > splitterEnd) {\n return;\n }\n\n // Compute the new sash sizes.\n const sash1 = this.sashes()[sashIndex]!;\n const sash2 = this.sashes()[sashIndex + 1]!;\n\n const sashSize1 = sash1.component().size;\n const sashSize2 = sash2.component().size;\n\n const sashMinSize1 = sash1.minSize() ? this.toPixel(sash1.minSize()!) : 0;\n const sashMinSize2 = sash2.minSize() ? this.toPixel(sash2.minSize()!) : 0;\n\n const newSashSize1 = between(Math.round(sashSize1 + distance), {min: sashMinSize1, max: sashSize1 + sashSize2 - sashMinSize2});\n const newSashSize2 = between(Math.round(sashSize2 - distance), {min: sashMinSize2, max: sashSize1 + sashSize2 - sashMinSize1});\n\n // Set the new computed sash sizes.\n sash1.updateFlexProperties({flexBasis: `${newSashSize1}px`});\n sash2.updateFlexProperties({flexBasis: `${newSashSize2}px`});\n }\n\n protected onSashReset(sashIndex: number): void {\n const sash1 = this.sashes()[sashIndex]!;\n const sash2 = this.sashes()[sashIndex + 1]!;\n const equalSashSize = (sash1.component().size + sash2.component().size) / 2;\n const pixelToFlexGrowFactor = computePixelToFlexGrowFactor(this.sashes());\n\n const sashSizesAfterReset = this.sashes().reduce((acc, sash, index) => {\n const size = index === sashIndex || index === sashIndex + 1 ? equalSashSize : sash.component().size;\n return acc.set(sash.computeKey(index), size);\n }, new Map<string, number>());\n\n [sash1, sash2].forEach(sash => {\n if (sash.isFixedSize()) {\n sash.updateFlexProperties({flexBasis: `${equalSashSize}px`});\n }\n else {\n sash.updateFlexProperties({flexGrow: pixelToFlexGrowFactor * equalSashSize});\n }\n });\n\n this.sashStart.emit();\n this.sashEnd.emit(Array.from(sashSizesAfterReset.values()));\n this.sashEnd2.emit(Object.fromEntries(sashSizesAfterReset));\n }\n\n private toPixel(value: string | number): number {\n if (typeof value === 'number') {\n return value;\n }\n if (value.endsWith('%')) {\n const hostBounds = this._host.getBoundingClientRect();\n const hostSize = (this.direction() === 'row' ? hostBounds.width : hostBounds.height);\n return parseInt(value, 10) * hostSize / 100;\n }\n return parseInt(value, 10);\n }\n\n /**\n * Detects when rendered this component for the first time.\n */\n private detectFirstRendering(): void {\n afterNextRender({\n read: () => this.afterFirstRender.set(true),\n });\n }\n\n /**\n * Mirrors the provided signal. If animated sashes are being removed, delays emission until the animation completes,\n * effectively removing the element after the animation.\n *\n * Delayed removal is required for CDK Portals to not remove displayed content immediately.\n */\n private computeSashes(contentChildren: Signal<readonly SciSashDirective[]>): Signal<readonly SciSashDirective[]> {\n const differ = inject(IterableDiffers).find([]).create<SciSashDirective>();\n const sashes = signal<readonly SciSashDirective[]>([]);\n\n effect(() => {\n // Compute removed sashes to be removed with an animation.\n const removedAnimatedSashes = new Array<SciSashDirective>();\n differ.diff(contentChildren())?.forEachRemovedItem(({item: sash}) => untracked(() => {\n if (sash.animate()) {\n removedAnimatedSashes.push(sash);\n }\n }));\n\n // Emit if no sashes are removed with an animation.\n if (!removedAnimatedSashes.length) {\n sashes.set(contentChildren());\n return;\n }\n\n // Delay emission until a leave animation completes.\n removedAnimatedSashes.forEach(sash => {\n // Start the leave animation.\n const done = sash.component().startLeaveAnimation();\n // Track animation completion, re-running this effect to finally emit the sashes.\n done();\n });\n });\n\n return sashes;\n }\n}\n\nfunction between(value: number, minmax: {min: number; max: number}): number {\n return Math.min(minmax.max, Math.max(minmax.min, value));\n}\n\n/**\n * Returns the factor to compute the flex-grow proportion from the pixel size of a sash.\n */\nfunction computePixelToFlexGrowFactor(sashes: readonly SciSashDirective[]): number {\n const flexibleSashes = sashes.filter(sash => !sash.isFixedSize());\n\n const proportionSum = flexibleSashes.reduce((sum, sash) => sum + Number(sash.size()), 0);\n const pixelSum = flexibleSashes.reduce((sum, sash) => sum + sash.component().size, 0);\n\n return proportionSum / pixelSum;\n}\n\nfunction provideSashBoxAccessor(): SciSashBoxAccessor {\n const component = inject(SciSashboxComponent);\n\n return new class implements SciSashBoxAccessor {\n public readonly sashes = component.sashes;\n public readonly direction = component.direction;\n public readonly afterFirstRender = component.afterFirstRender;\n }();\n}\n","@for (sash of sashes(); track sash; let i = $index; let first = $first; let last = $last) {\n <sci-sash [sash]=\"sash\"\n [class.first]=\"first\"\n [class.last]=\"last\"\n [style.flex-grow]=\"sash.flexProperties().flexGrow\"\n [style.flex-shrink]=\"sash.flexProperties().flexShrink\"\n [style.flex-basis]=\"sash.flexProperties().flexBasis\"/>\n @if (!last) {\n <sci-splitter sciElementRef #sciElementRef=\"sciElementRef\"\n [orientation]=\"direction() === 'row' ? 'vertical' : 'horizontal'\"\n (start)=\"onSashStart()\"\n (move)=\"onSash(sciElementRef.host, i, $event)\"\n (end)=\"onSashEnd()\"\n (reset)=\"onSashReset(i)\"/>\n }\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\nimport {NgModule} from '@angular/core';\nimport {SciSashboxComponent} from './sashbox.component';\nimport {SciSashDirective} from './sash.directive';\n\n/**\n * Provides a sashbox component that lays out its children in a row or column arrangement and places a splitter between each child.\n *\n * ### Usage:\n *\n * ```html\n * <sci-sashbox direction=\"row\">\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"2\">\n * ...\n * </ng-template>\n *\n * <ng-template sciSash size=\"1\">\n * ...\n * </ng-template>\n * </sci-sashbox>\n * ```\n *\n * @deprecated since version 19.0.0; Import standalone component and directive instead; API will be removed in a future release.\n */\n@NgModule({ // TODO [Angular 20] Remove deprecated NgModule\n imports: [\n SciSashboxComponent,\n SciSashDirective,\n ],\n exports: [\n SciSashboxComponent,\n SciSashDirective,\n ],\n})\nexport class SciSashboxModule {\n}\n","/*\n * Copyright (c) 2018-2019 Swiss Federal Railways\n *\n * This program and the accompanying materials are made\n * available under the terms of the Eclipse Public License 2.0\n * which is available at https://www.eclipse.org/legal/epl-2.0/\n *\n * SPDX-License-Identifier: EPL-2.0\n */\n\n/*\n * Secondary entrypoint: '@scion/components/sashbox'\n *\n * @see https://github.com/ng-packagr/ng-packagr/blob/master/docs/secondary-entrypoints.md\n */\nexport {SciSashboxModule} from './sashbox.module';\nexport {SciSashboxComponent} from './sashbox.component';\nexport {SciSashDirective} from './sash.directive';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@scion/components",
|
|
3
|
-
"version": "19.1
|
|
3
|
+
"version": "19.2.1",
|
|
4
4
|
"description": "Provides a collection of Angular components and directives primarily for use in SCION libraries such as `@scion/workbench` and `@scion/microfrontend-platform`. This library is not a comprehensive component library as its focus is on SCION requirements.",
|
|
5
5
|
"license": "EPL-2.0",
|
|
6
6
|
"private": false,
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Signal } from '@angular/core';
|
|
2
|
+
import { SciSashDirective } from '../sash.directive';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
/**
|
|
5
|
+
* Represents a {@link SciSashDirective} in the DOM, displaying the specified sash template.
|
|
6
|
+
*/
|
|
7
|
+
export declare class SashComponent {
|
|
8
|
+
/**
|
|
9
|
+
* Specifies the sash representing this component.
|
|
10
|
+
*/
|
|
11
|
+
readonly sash: import("@angular/core").InputSignal<SciSashDirective>;
|
|
12
|
+
private readonly _host;
|
|
13
|
+
private readonly _cd;
|
|
14
|
+
private readonly _sashBoxAccessor;
|
|
15
|
+
protected readonly animationState: import("@angular/core").WritableSignal<"enter" | "leave" | null>;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Starts the leave animation, returning a signal to track animation completion.
|
|
19
|
+
*/
|
|
20
|
+
startLeaveAnimation(): Signal<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Notifies when ending the animation.
|
|
23
|
+
*/
|
|
24
|
+
protected onAnimationEnd(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Gets the size of this sash in pixel.
|
|
27
|
+
*/
|
|
28
|
+
get size(): number;
|
|
29
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SashComponent, never>;
|
|
30
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SashComponent, "sci-sash", never, { "sash": { "alias": "sash"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
31
|
+
}
|
|
@@ -35,12 +35,21 @@ export declare class SciSashDirective {
|
|
|
35
35
|
*/
|
|
36
36
|
readonly minSize: import("@angular/core").InputSignal<string | number | undefined>;
|
|
37
37
|
/**
|
|
38
|
-
*
|
|
38
|
+
* Specifies an optional key to identify this sash.
|
|
39
39
|
*
|
|
40
|
-
*
|
|
40
|
+
* The key is used as the property key in the object emitted by {@link SciSashboxComponent.sashEnd2} to associate the size of this sash.
|
|
41
41
|
*/
|
|
42
42
|
readonly key: import("@angular/core").InputSignal<string | undefined>;
|
|
43
|
+
/**
|
|
44
|
+
* Controls whether to animate the entering and leaving of this sash, only if fixed-sized. Defaults to `false`.
|
|
45
|
+
*
|
|
46
|
+
* Enabling animation will mimic the behavior of a side panel that slides in or out.
|
|
47
|
+
*
|
|
48
|
+
* Note: Animates only sashes added or removed after the initial rendering.
|
|
49
|
+
*/
|
|
50
|
+
readonly animate: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
|
|
43
51
|
private readonly _sashBoxAccessor;
|
|
52
|
+
private readonly _component;
|
|
44
53
|
/**
|
|
45
54
|
* Flex properties computed based on the configured {@link size}. Properties are updated when moving this sash.
|
|
46
55
|
*/
|
|
@@ -57,5 +66,5 @@ export declare class SciSashDirective {
|
|
|
57
66
|
*/
|
|
58
67
|
private normalizeFlexGrow;
|
|
59
68
|
static ɵfac: i0.ɵɵFactoryDeclaration<SciSashDirective, never>;
|
|
60
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<SciSashDirective, "ng-template[sciSash]", ["sciSash"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "minSize": { "alias": "minSize"; "required": false; "isSignal": true; }; "key": { "alias": "key"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
69
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<SciSashDirective, "ng-template[sciSash]", ["sciSash"], { "size": { "alias": "size"; "required": false; "isSignal": true; }; "minSize": { "alias": "minSize"; "required": false; "isSignal": true; }; "key": { "alias": "key"; "required": false; "isSignal": true; }; "animate": { "alias": "animate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
61
70
|
}
|
|
@@ -6,4 +6,5 @@ import { Signal } from '@angular/core';
|
|
|
6
6
|
export declare abstract class SciSashBoxAccessor {
|
|
7
7
|
abstract readonly sashes: Signal<readonly SciSashDirective[]>;
|
|
8
8
|
abstract readonly direction: Signal<'column' | 'row'>;
|
|
9
|
+
abstract readonly afterFirstRender: Signal<boolean>;
|
|
9
10
|
}
|
|
@@ -84,16 +84,27 @@ export declare class SciSashboxComponent {
|
|
|
84
84
|
[key: string]: number;
|
|
85
85
|
}>;
|
|
86
86
|
private readonly _host;
|
|
87
|
+
private readonly _contentChildren;
|
|
87
88
|
protected sashing: boolean;
|
|
88
89
|
protected maxHeight: number | undefined;
|
|
89
90
|
protected maxWidth: number | undefined;
|
|
91
|
+
constructor();
|
|
90
92
|
protected onSashStart(): void;
|
|
91
93
|
protected onSashEnd(): void;
|
|
92
94
|
protected onSash(splitter: HTMLElement, sashIndex: number, moveEvent: SplitterMoveEvent): void;
|
|
93
95
|
protected onSashReset(sashIndex: number): void;
|
|
94
|
-
protected get isColumnDirection(): boolean;
|
|
95
|
-
protected get isRowDirection(): boolean;
|
|
96
96
|
private toPixel;
|
|
97
|
+
/**
|
|
98
|
+
* Detects when rendered this component for the first time.
|
|
99
|
+
*/
|
|
100
|
+
private detectFirstRendering;
|
|
101
|
+
/**
|
|
102
|
+
* Mirrors the provided signal. If animated sashes are being removed, delays emission until the animation completes,
|
|
103
|
+
* effectively removing the element after the animation.
|
|
104
|
+
*
|
|
105
|
+
* Delayed removal is required for CDK Portals to not remove displayed content immediately.
|
|
106
|
+
*/
|
|
107
|
+
private computeSashes;
|
|
97
108
|
static ɵfac: i0.ɵɵFactoryDeclaration<SciSashboxComponent, never>;
|
|
98
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<SciSashboxComponent, "sci-sashbox", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; }, { "sashStart": "sashStart"; "sashEnd": "sashEnd"; "sashEnd2": "sashEnd2"; }, ["
|
|
109
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<SciSashboxComponent, "sci-sashbox", never, { "direction": { "alias": "direction"; "required": false; "isSignal": true; }; }, { "sashStart": "sashStart"; "sashEnd": "sashEnd"; "sashEnd2": "sashEnd2"; }, ["_contentChildren"], never, true, never>;
|
|
99
110
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { SciSashDirective } from './sash.directive';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/**
|
|
4
|
-
* Initializes {SashDirective} with the target {HTMLDivElement}.
|
|
5
|
-
*/
|
|
6
|
-
export declare class SciSashInitializerDirective {
|
|
7
|
-
readonly sash: import("@angular/core").InputSignal<SciSashDirective>;
|
|
8
|
-
constructor();
|
|
9
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<SciSashInitializerDirective, never>;
|
|
10
|
-
static ɵdir: i0.ɵɵDirectiveDeclaration<SciSashInitializerDirective, "div[sciSashInitializer].sash", never, { "sash": { "alias": "sciSashInitializer"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
11
|
-
}
|