@edsis/ui 0.0.3 → 21.3.7
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.
|
@@ -4,10 +4,10 @@ import { cn } from '@edsis/ui/utils';
|
|
|
4
4
|
import { isPlatformBrowser } from '@angular/common';
|
|
5
5
|
import { UiNavComponent } from '@edsis/ui/nav';
|
|
6
6
|
|
|
7
|
-
const UI_LAYOUT_TYPES = ['vertical', 'horizontal', 'empty'];
|
|
7
|
+
const UI_LAYOUT_TYPES = ['vertical', 'horizontal', 'empty', 'fluid'];
|
|
8
8
|
const UI_LAYOUT_SURFACES = ['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal'];
|
|
9
9
|
const UI_LAYOUT_STYLES = ['flat', 'border-rail'];
|
|
10
|
-
const UI_LAYOUT_WIDTHS = ['full', 'wide', 'container'];
|
|
10
|
+
const UI_LAYOUT_WIDTHS = ['full', 'wide', 'container', 'fluid'];
|
|
11
11
|
const UI_LAYOUT_DEFAULT_SURFACE = 'flat';
|
|
12
12
|
const UI_LAYOUT_DEFAULT_TYPE = 'vertical';
|
|
13
13
|
const UI_LAYOUT_DEFAULT_STYLE = 'flat';
|
|
@@ -86,24 +86,36 @@ class LayoutService {
|
|
|
86
86
|
}
|
|
87
87
|
this.setWidth(width);
|
|
88
88
|
}
|
|
89
|
-
setSurface(surface) {
|
|
89
|
+
setSurface(surface, options = {}) {
|
|
90
90
|
this.surfaceState.set(surface);
|
|
91
|
+
if (options.persist === false) {
|
|
92
|
+
return;
|
|
93
|
+
}
|
|
91
94
|
this.writeStorage(UI_LAYOUT_SURFACE_STORAGE_KEY, surface);
|
|
92
95
|
}
|
|
93
|
-
setType(type) {
|
|
96
|
+
setType(type, options = {}) {
|
|
94
97
|
this.typeState.set(type);
|
|
98
|
+
if (options.persist === false) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
95
101
|
this.writeStorage(UI_LAYOUT_TYPE_STORAGE_KEY, type);
|
|
96
102
|
}
|
|
97
|
-
setAppearance(appearance) {
|
|
103
|
+
setAppearance(appearance, options = {}) {
|
|
98
104
|
this.styleState.set(appearance);
|
|
105
|
+
if (options.persist === false) {
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
99
108
|
this.writeStorage(UI_LAYOUT_APPEARANCE_STORAGE_KEY, appearance);
|
|
100
109
|
this.removeStorage(UI_LAYOUT_STYLE_STORAGE_KEY);
|
|
101
110
|
}
|
|
102
|
-
setStyle(style) {
|
|
103
|
-
this.setAppearance(style);
|
|
111
|
+
setStyle(style, options = {}) {
|
|
112
|
+
this.setAppearance(style, options);
|
|
104
113
|
}
|
|
105
|
-
setWidth(width) {
|
|
114
|
+
setWidth(width, options = {}) {
|
|
106
115
|
this.widthState.set(width);
|
|
116
|
+
if (options.persist === false) {
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
107
119
|
this.writeStorage(UI_LAYOUT_WIDTH_STORAGE_KEY, width);
|
|
108
120
|
}
|
|
109
121
|
getStoredSurface() {
|
|
@@ -204,34 +216,36 @@ class UiLayoutComponent {
|
|
|
204
216
|
resolvedStyle = computed(() => this.layout.style(), ...(ngDevMode ? [{ debugName: "resolvedStyle" }] : /* istanbul ignore next */ []));
|
|
205
217
|
resolvedWidth = computed(() => this.width() ?? this.layout.width(), ...(ngDevMode ? [{ debugName: "resolvedWidth" }] : /* istanbul ignore next */ []));
|
|
206
218
|
isBorderRail = computed(() => this.resolvedAppearance() === 'border-rail', ...(ngDevMode ? [{ debugName: "isBorderRail" }] : /* istanbul ignore next */ []));
|
|
219
|
+
isFluidFrame = computed(() => this.resolvedWidth() === 'fluid' && this.layout.type() === 'fluid', ...(ngDevMode ? [{ debugName: "isFluidFrame" }] : /* istanbul ignore next */ []));
|
|
207
220
|
showsHorizontalInsetRails = computed(() => {
|
|
208
221
|
const layoutType = this.layout.type();
|
|
209
222
|
return this.isBorderRail() && (layoutType === 'horizontal' || layoutType === 'vertical');
|
|
210
223
|
}, ...(ngDevMode ? [{ debugName: "showsHorizontalInsetRails" }] : /* istanbul ignore next */ []));
|
|
211
|
-
|
|
212
|
-
railAnchorClasses = computed(() =>
|
|
213
|
-
contentShellClasses = computed(() => cn('relative z-10 h-
|
|
214
|
-
hostClasses = computed(() => cn('relative isolate
|
|
215
|
-
frameClasses = computed(() => cn('relative
|
|
224
|
+
frameStageClasses = computed(() => cn('relative grid min-h-0 min-w-0 grid-cols-1 grid-rows-1', this.frameSizeClasses()), ...(ngDevMode ? [{ debugName: "frameStageClasses" }] : /* istanbul ignore next */ []));
|
|
225
|
+
railAnchorClasses = computed(() => 'relative h-full min-h-0 w-full min-w-0', ...(ngDevMode ? [{ debugName: "railAnchorClasses" }] : /* istanbul ignore next */ []));
|
|
226
|
+
contentShellClasses = computed(() => cn('relative z-10 min-h-0 min-w-0', this.isFluidFrame() ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full', this.isBorderRail() ? 'overflow-visible' : 'overflow-hidden'), ...(ngDevMode ? [{ debugName: "contentShellClasses" }] : /* istanbul ignore next */ []));
|
|
227
|
+
hostClasses = computed(() => cn('relative isolate h-dvh w-full min-w-0 box-border overflow-hidden text-foreground', this.isFluidFrame() ? 'grid place-items-center' : 'block', this.surfaceClasses(), this.widthPaddingClasses(), this.class()), ...(ngDevMode ? [{ debugName: "hostClasses" }] : /* istanbul ignore next */ []));
|
|
228
|
+
frameClasses = computed(() => cn('relative min-h-0 min-w-0 border-border bg-background/55 backdrop-blur-xs', this.frameSizeClasses(), this.isBorderRail() ? 'overflow-visible border-2' : 'overflow-hidden border'), ...(ngDevMode ? [{ debugName: "frameClasses" }] : /* istanbul ignore next */ []));
|
|
229
|
+
frameLayerClasses = computed(() => cn('col-start-1 row-start-1', this.frameClasses()), ...(ngDevMode ? [{ debugName: "frameLayerClasses" }] : /* istanbul ignore next */ []));
|
|
216
230
|
constructor() {
|
|
217
231
|
effect(() => {
|
|
218
232
|
const surface = this.surface();
|
|
219
233
|
if (surface !== null) {
|
|
220
|
-
this.layout.setSurface(surface);
|
|
234
|
+
this.layout.setSurface(surface, { persist: false });
|
|
221
235
|
}
|
|
222
236
|
else {
|
|
223
237
|
this.layout.registerSurface(UI_LAYOUT_DEFAULT_SURFACE);
|
|
224
238
|
}
|
|
225
239
|
const appearance = this.appearanceInput();
|
|
226
240
|
if (appearance !== null) {
|
|
227
|
-
this.layout.setAppearance(appearance);
|
|
241
|
+
this.layout.setAppearance(appearance, { persist: false });
|
|
228
242
|
}
|
|
229
243
|
else {
|
|
230
244
|
this.layout.registerAppearance(UI_LAYOUT_DEFAULT_STYLE);
|
|
231
245
|
}
|
|
232
246
|
const width = this.width();
|
|
233
247
|
if (width !== null) {
|
|
234
|
-
this.layout.setWidth(width);
|
|
248
|
+
this.layout.setWidth(width, { persist: false });
|
|
235
249
|
}
|
|
236
250
|
else {
|
|
237
251
|
this.layout.registerWidth(UI_LAYOUT_DEFAULT_WIDTH);
|
|
@@ -252,24 +266,32 @@ class UiLayoutComponent {
|
|
|
252
266
|
return 'bg-background';
|
|
253
267
|
}
|
|
254
268
|
}
|
|
255
|
-
|
|
269
|
+
widthPaddingClasses() {
|
|
256
270
|
switch (this.resolvedWidth()) {
|
|
257
271
|
case 'wide':
|
|
258
272
|
return 'p-4 lg:p-12';
|
|
259
273
|
case 'container':
|
|
260
274
|
return 'p-4 lg:px-0 lg:py-16';
|
|
275
|
+
case 'fluid':
|
|
276
|
+
return 'p-4 sm:p-6 lg:p-8';
|
|
261
277
|
default:
|
|
262
278
|
return 'p-4';
|
|
263
279
|
}
|
|
264
280
|
}
|
|
265
|
-
|
|
266
|
-
|
|
281
|
+
frameSizeClasses() {
|
|
282
|
+
if (this.isFluidFrame()) {
|
|
283
|
+
return 'h-auto w-auto max-h-full max-w-full';
|
|
284
|
+
}
|
|
285
|
+
return this.resolvedWidth() === 'container' ? 'h-full w-full lg:container lg:mx-auto' : 'h-full w-full';
|
|
267
286
|
}
|
|
268
287
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
269
288
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.15", type: UiLayoutComponent, isStandalone: true, selector: "ui-layout", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, layoutStyleAttribute: { classPropertyName: "layoutStyleAttribute", publicName: "layout-style", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "attr.data-surface": "resolvedSurface()", "attr.data-layout-appearance": "resolvedAppearance()", "attr.data-layout-style": "resolvedStyle()", "attr.data-layout-width": "resolvedWidth()", "attr.data-layout-type": "layout.type()" } }, ngImport: i0, template: `
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
<div
|
|
289
|
+
<div data-layout-stage [class]="frameStageClasses()">
|
|
290
|
+
@if (isBorderRail()) {
|
|
291
|
+
<div
|
|
292
|
+
aria-hidden="true"
|
|
293
|
+
data-layout-rail
|
|
294
|
+
class="pointer-events-none col-start-1 row-start-1 z-0 overflow-visible">
|
|
273
295
|
<div data-layout-rail-anchor [class]="railAnchorClasses()">
|
|
274
296
|
<div
|
|
275
297
|
data-layout-rail-top-left-horizontal
|
|
@@ -314,12 +336,12 @@ class UiLayoutComponent {
|
|
|
314
336
|
}
|
|
315
337
|
</div>
|
|
316
338
|
</div>
|
|
317
|
-
|
|
318
|
-
}
|
|
339
|
+
}
|
|
319
340
|
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
341
|
+
<div data-layout-frame [class]="frameLayerClasses()">
|
|
342
|
+
<div [class]="contentShellClasses()">
|
|
343
|
+
<ng-content />
|
|
344
|
+
</div>
|
|
323
345
|
</div>
|
|
324
346
|
</div>
|
|
325
347
|
`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -338,9 +360,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
338
360
|
'[attr.data-layout-type]': 'layout.type()',
|
|
339
361
|
},
|
|
340
362
|
template: `
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
<div
|
|
363
|
+
<div data-layout-stage [class]="frameStageClasses()">
|
|
364
|
+
@if (isBorderRail()) {
|
|
365
|
+
<div
|
|
366
|
+
aria-hidden="true"
|
|
367
|
+
data-layout-rail
|
|
368
|
+
class="pointer-events-none col-start-1 row-start-1 z-0 overflow-visible">
|
|
344
369
|
<div data-layout-rail-anchor [class]="railAnchorClasses()">
|
|
345
370
|
<div
|
|
346
371
|
data-layout-rail-top-left-horizontal
|
|
@@ -385,12 +410,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
385
410
|
}
|
|
386
411
|
</div>
|
|
387
412
|
</div>
|
|
388
|
-
|
|
389
|
-
}
|
|
413
|
+
}
|
|
390
414
|
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
415
|
+
<div data-layout-frame [class]="frameLayerClasses()">
|
|
416
|
+
<div [class]="contentShellClasses()">
|
|
417
|
+
<ng-content />
|
|
418
|
+
</div>
|
|
394
419
|
</div>
|
|
395
420
|
</div>
|
|
396
421
|
`,
|
|
@@ -402,7 +427,7 @@ class UiLayoutVerticalComponent {
|
|
|
402
427
|
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
403
428
|
classes = computed(() => cn('grid h-full min-h-0 w-full min-w-0 grid-cols-[auto_minmax(0,1fr)]', this.layout.style() === 'border-rail' ? 'overflow-visible' : 'overflow-hidden', this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
404
429
|
constructor() {
|
|
405
|
-
this.layout.setType('vertical');
|
|
430
|
+
this.layout.setType('vertical', { persist: false });
|
|
406
431
|
}
|
|
407
432
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutVerticalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
408
433
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiLayoutVerticalComponent, isStandalone: true, selector: "ui-layout-vertical", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-layout-type": "vertical" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -425,7 +450,7 @@ class UiLayoutHorizontalComponent {
|
|
|
425
450
|
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
426
451
|
classes = computed(() => cn('flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden', this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
427
452
|
constructor() {
|
|
428
|
-
this.layout.setType('horizontal');
|
|
453
|
+
this.layout.setType('horizontal', { persist: false });
|
|
429
454
|
}
|
|
430
455
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutHorizontalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
431
456
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiLayoutHorizontalComponent, isStandalone: true, selector: "ui-layout-horizontal", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-layout-type": "horizontal" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -448,7 +473,7 @@ class UiLayoutEmptyComponent {
|
|
|
448
473
|
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
449
474
|
classes = computed(() => cn('h-full min-h-0 w-full min-w-0 overflow-hidden', this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
450
475
|
constructor() {
|
|
451
|
-
this.layout.setType('empty');
|
|
476
|
+
this.layout.setType('empty', { persist: false });
|
|
452
477
|
}
|
|
453
478
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutEmptyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
454
479
|
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiLayoutEmptyComponent, isStandalone: true, selector: "ui-layout-empty", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-layout-type": "empty" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
@@ -466,6 +491,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
466
491
|
}]
|
|
467
492
|
}], ctorParameters: () => [], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
468
493
|
|
|
494
|
+
class UiLayoutFluidComponent {
|
|
495
|
+
layout = inject(LayoutService);
|
|
496
|
+
class = input('', ...(ngDevMode ? [{ debugName: "class" }] : /* istanbul ignore next */ []));
|
|
497
|
+
classes = computed(() => cn('grid min-h-0 min-w-0 place-items-center overflow-auto', this.layout.width() === 'fluid' ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full', this.class()), ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
|
|
498
|
+
constructor() {
|
|
499
|
+
this.layout.setType('fluid', { persist: false });
|
|
500
|
+
}
|
|
501
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutFluidComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
502
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.2.15", type: UiLayoutFluidComponent, isStandalone: true, selector: "ui-layout-fluid", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-layout-type": "fluid" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
503
|
+
}
|
|
504
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImport: i0, type: UiLayoutFluidComponent, decorators: [{
|
|
505
|
+
type: Component,
|
|
506
|
+
args: [{
|
|
507
|
+
selector: 'ui-layout-fluid',
|
|
508
|
+
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
509
|
+
host: {
|
|
510
|
+
'[class]': 'classes()',
|
|
511
|
+
'data-layout-type': 'fluid',
|
|
512
|
+
},
|
|
513
|
+
template: `<ng-content />`,
|
|
514
|
+
}]
|
|
515
|
+
}], ctorParameters: () => [], propDecorators: { class: [{ type: i0.Input, args: [{ isSignal: true, alias: "class", required: false }] }] } });
|
|
516
|
+
|
|
469
517
|
class UiLayoutNavComponent {
|
|
470
518
|
layout = inject(LayoutService);
|
|
471
519
|
projectedNav = contentChild(UiNavComponent, ...(ngDevMode ? [{ debugName: "projectedNav" }] : /* istanbul ignore next */ []));
|
|
@@ -568,5 +616,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.15", ngImpo
|
|
|
568
616
|
* Generated bundle index. Do not edit.
|
|
569
617
|
*/
|
|
570
618
|
|
|
571
|
-
export { LayoutService, UI_LAYOUT_APPEARANCE_STORAGE_KEY, UI_LAYOUT_DEFAULT_STYLE, UI_LAYOUT_DEFAULT_SURFACE, UI_LAYOUT_DEFAULT_TYPE, UI_LAYOUT_DEFAULT_WIDTH, UI_LAYOUT_STYLES, UI_LAYOUT_STYLE_STORAGE_KEY, UI_LAYOUT_SURFACES, UI_LAYOUT_SURFACE_STORAGE_KEY, UI_LAYOUT_TYPES, UI_LAYOUT_TYPE_STORAGE_KEY, UI_LAYOUT_WIDTHS, UI_LAYOUT_WIDTH_STORAGE_KEY, UiLayoutComponent, UiLayoutContentComponent, UiLayoutEmptyComponent, UiLayoutHorizontalComponent, UiLayoutNavComponent, UiLayoutVerticalComponent, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
|
|
619
|
+
export { LayoutService, UI_LAYOUT_APPEARANCE_STORAGE_KEY, UI_LAYOUT_DEFAULT_STYLE, UI_LAYOUT_DEFAULT_SURFACE, UI_LAYOUT_DEFAULT_TYPE, UI_LAYOUT_DEFAULT_WIDTH, UI_LAYOUT_STYLES, UI_LAYOUT_STYLE_STORAGE_KEY, UI_LAYOUT_SURFACES, UI_LAYOUT_SURFACE_STORAGE_KEY, UI_LAYOUT_TYPES, UI_LAYOUT_TYPE_STORAGE_KEY, UI_LAYOUT_WIDTHS, UI_LAYOUT_WIDTH_STORAGE_KEY, UiLayoutComponent, UiLayoutContentComponent, UiLayoutEmptyComponent, UiLayoutFluidComponent, UiLayoutHorizontalComponent, UiLayoutNavComponent, UiLayoutVerticalComponent, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
|
|
572
620
|
//# sourceMappingURL=edsis-ui-layout.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"edsis-ui-layout.mjs","sources":["../../../library/ui/layout/types/layout.types.ts","../../../library/ui/layout/services/layout.service.ts","../../../library/ui/layout/ui-layout.component.ts","../../../library/ui/layout/vertical/ui-layout-vertical.component.ts","../../../library/ui/layout/horizontal/ui-layout-horizontal.component.ts","../../../library/ui/layout/empty/ui-layout-empty.component.ts","../../../library/ui/layout/nav/ui-layout-nav.component.ts","../../../library/ui/layout/content/ui-layout-content.component.ts","../../../library/ui/layout/edsis-ui-layout.ts"],"sourcesContent":["import type { Signal } from '@angular/core';\n\nexport const UI_LAYOUT_TYPES = ['vertical', 'horizontal', 'empty'] as const;\nexport const UI_LAYOUT_SURFACES = ['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal'] as const;\nexport const UI_LAYOUT_STYLES = ['flat', 'border-rail'] as const;\nexport const UI_LAYOUT_WIDTHS = ['full', 'wide', 'container'] as const;\n\nexport type UiLayoutType = (typeof UI_LAYOUT_TYPES)[number];\nexport type UiLayoutSurface = (typeof UI_LAYOUT_SURFACES)[number];\nexport type UiLayoutStyle = (typeof UI_LAYOUT_STYLES)[number];\nexport type UiLayoutWidth = (typeof UI_LAYOUT_WIDTHS)[number];\n\nexport const UI_LAYOUT_DEFAULT_SURFACE: UiLayoutSurface = 'flat';\nexport const UI_LAYOUT_DEFAULT_TYPE: UiLayoutType = 'vertical';\nexport const UI_LAYOUT_DEFAULT_STYLE: UiLayoutStyle = 'flat';\nexport const UI_LAYOUT_DEFAULT_WIDTH: UiLayoutWidth = 'full';\n\nexport const UI_LAYOUT_SURFACE_STORAGE_KEY = 'layout-surface';\nexport const UI_LAYOUT_APPEARANCE_STORAGE_KEY = 'layout-appearance';\nexport const UI_LAYOUT_TYPE_STORAGE_KEY = 'layout-type';\nexport const UI_LAYOUT_STYLE_STORAGE_KEY = 'layout-style';\nexport const UI_LAYOUT_WIDTH_STORAGE_KEY = 'layout-width';\n\nexport interface UiLayoutContextValue {\n surface: Signal<UiLayoutSurface>;\n type: Signal<UiLayoutType>;\n appearance: Signal<UiLayoutStyle>;\n style: Signal<UiLayoutStyle>;\n width: Signal<UiLayoutWidth>;\n}\n\nexport function isUiLayoutSurface(value: string | null): value is UiLayoutSurface {\n return value !== null && (UI_LAYOUT_SURFACES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutType(value: string | null): value is UiLayoutType {\n return value !== null && (UI_LAYOUT_TYPES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutStyle(value: string | null): value is UiLayoutStyle {\n return value !== null && (UI_LAYOUT_STYLES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutWidth(value: string | null): value is UiLayoutWidth {\n return value !== null && (UI_LAYOUT_WIDTHS as readonly string[]).includes(value);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport {\n UI_LAYOUT_APPEARANCE_STORAGE_KEY,\n isUiLayoutSurface,\n isUiLayoutStyle,\n isUiLayoutType,\n isUiLayoutWidth,\n UI_LAYOUT_DEFAULT_SURFACE,\n UI_LAYOUT_DEFAULT_STYLE,\n UI_LAYOUT_DEFAULT_TYPE,\n UI_LAYOUT_DEFAULT_WIDTH,\n UI_LAYOUT_SURFACE_STORAGE_KEY,\n UI_LAYOUT_STYLE_STORAGE_KEY,\n UI_LAYOUT_TYPE_STORAGE_KEY,\n UI_LAYOUT_WIDTH_STORAGE_KEY,\n type UiLayoutSurface,\n type UiLayoutStyle,\n type UiLayoutType,\n type UiLayoutWidth,\n} from '../types/layout.types';\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly surfaceState = signal<UiLayoutSurface>(this.getStoredSurface());\n private readonly typeState = signal<UiLayoutType>(this.getStoredType());\n private readonly styleState = signal<UiLayoutStyle>(this.getStoredStyle());\n private readonly widthState = signal<UiLayoutWidth>(this.getStoredWidth());\n\n readonly surface = this.surfaceState.asReadonly();\n readonly type = this.typeState.asReadonly();\n readonly appearance = this.styleState.asReadonly();\n readonly style = this.styleState.asReadonly();\n readonly width = this.widthState.asReadonly();\n\n registerDefaults(defaults: {\n surface?: UiLayoutSurface;\n appearance?: UiLayoutStyle;\n type?: UiLayoutType;\n width?: UiLayoutWidth;\n }): this {\n if (defaults.surface !== undefined) {\n this.registerSurface(defaults.surface);\n }\n\n if (defaults.appearance !== undefined) {\n this.registerAppearance(defaults.appearance);\n }\n\n if (defaults.type !== undefined) {\n this.registerType(defaults.type);\n }\n\n if (defaults.width !== undefined) {\n this.registerWidth(defaults.width);\n }\n\n return this;\n }\n\n registerSurface(surface: UiLayoutSurface): void {\n const storedSurface = this.readStorage(UI_LAYOUT_SURFACE_STORAGE_KEY);\n\n if (isUiLayoutSurface(storedSurface)) {\n this.surfaceState.set(storedSurface);\n return;\n }\n\n this.setSurface(surface);\n }\n\n registerType(type: UiLayoutType): void {\n const storedType = this.readStorage(UI_LAYOUT_TYPE_STORAGE_KEY);\n\n if (isUiLayoutType(storedType)) {\n this.typeState.set(storedType);\n return;\n }\n\n this.setType(type);\n }\n\n registerAppearance(appearance: UiLayoutStyle): void {\n this.setAppearance(this.getStoredAppearanceOrDefault(appearance));\n }\n\n registerStyle(style: UiLayoutStyle): void {\n this.registerAppearance(style);\n }\n\n registerWidth(width: UiLayoutWidth): void {\n const storedWidth = this.readStorage(UI_LAYOUT_WIDTH_STORAGE_KEY);\n\n if (isUiLayoutWidth(storedWidth)) {\n this.widthState.set(storedWidth);\n return;\n }\n\n this.setWidth(width);\n }\n\n setSurface(surface: UiLayoutSurface): void {\n this.surfaceState.set(surface);\n this.writeStorage(UI_LAYOUT_SURFACE_STORAGE_KEY, surface);\n }\n\n setType(type: UiLayoutType): void {\n this.typeState.set(type);\n this.writeStorage(UI_LAYOUT_TYPE_STORAGE_KEY, type);\n }\n\n setAppearance(appearance: UiLayoutStyle): void {\n this.styleState.set(appearance);\n this.writeStorage(UI_LAYOUT_APPEARANCE_STORAGE_KEY, appearance);\n this.removeStorage(UI_LAYOUT_STYLE_STORAGE_KEY);\n }\n\n setStyle(style: UiLayoutStyle): void {\n this.setAppearance(style);\n }\n\n setWidth(width: UiLayoutWidth): void {\n this.widthState.set(width);\n this.writeStorage(UI_LAYOUT_WIDTH_STORAGE_KEY, width);\n }\n\n getStoredSurface(): UiLayoutSurface {\n const value = this.readStorage(UI_LAYOUT_SURFACE_STORAGE_KEY);\n return isUiLayoutSurface(value) ? value : UI_LAYOUT_DEFAULT_SURFACE;\n }\n\n getStoredType(): UiLayoutType {\n const value = this.readStorage(UI_LAYOUT_TYPE_STORAGE_KEY);\n return isUiLayoutType(value) ? value : UI_LAYOUT_DEFAULT_TYPE;\n }\n\n getStoredAppearance(): UiLayoutStyle {\n const value = this.readStoredAppearance();\n return value ?? UI_LAYOUT_DEFAULT_STYLE;\n }\n\n getStoredStyle(): UiLayoutStyle {\n return this.getStoredAppearance();\n }\n\n getStoredWidth(): UiLayoutWidth {\n const value = this.readStorage(UI_LAYOUT_WIDTH_STORAGE_KEY);\n return isUiLayoutWidth(value) ? value : UI_LAYOUT_DEFAULT_WIDTH;\n }\n\n private readStorage(key: string): string | null {\n const storage = this.getStorage();\n if (!storage) {\n return null;\n }\n\n try {\n return storage.getItem(key);\n } catch {\n return null;\n }\n }\n\n private removeStorage(key: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.removeItem(key);\n } catch {\n return;\n }\n }\n\n private writeStorage(key: string, value: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.setItem(key, value);\n } catch {\n return;\n }\n }\n\n private getStorage(): Storage | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n\n try {\n return localStorage;\n } catch {\n return null;\n }\n }\n\n private readStoredAppearance(): UiLayoutStyle | null {\n const appearance = this.readStorage(UI_LAYOUT_APPEARANCE_STORAGE_KEY);\n if (isUiLayoutStyle(appearance)) {\n return appearance;\n }\n\n const legacyStyle = this.readStorage(UI_LAYOUT_STYLE_STORAGE_KEY);\n return isUiLayoutStyle(legacyStyle) ? legacyStyle : null;\n }\n\n private getStoredAppearanceOrDefault(fallback: UiLayoutStyle): UiLayoutStyle {\n return this.readStoredAppearance() ?? fallback;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from './services/layout.service';\nimport {\n UI_LAYOUT_DEFAULT_STYLE,\n UI_LAYOUT_DEFAULT_SURFACE,\n UI_LAYOUT_DEFAULT_WIDTH,\n type UiLayoutStyle,\n type UiLayoutSurface,\n type UiLayoutWidth,\n} from './types/layout.types';\n\n@Component({\n selector: 'ui-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-surface]': 'resolvedSurface()',\n '[attr.data-layout-appearance]': 'resolvedAppearance()',\n '[attr.data-layout-style]': 'resolvedStyle()',\n '[attr.data-layout-width]': 'resolvedWidth()',\n '[attr.data-layout-type]': 'layout.type()',\n },\n template: `\n @if (isBorderRail()) {\n <div aria-hidden=\"true\" data-layout-rail class=\"pointer-events-none absolute inset-0 z-0\">\n <div [class]=\"railPaddingClasses()\">\n <div data-layout-rail-anchor [class]=\"railAnchorClasses()\">\n <div\n data-layout-rail-top-left-horizontal\n class=\"absolute top-0 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-left-vertical\n class=\"absolute bottom-full left-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-top-right-horizontal\n class=\"absolute top-0 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-right-vertical\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-bottom-left-horizontal\n class=\"absolute bottom-0 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-left-vertical\n class=\"absolute top-full left-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-bottom-right-horizontal\n class=\"absolute bottom-0 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-right-vertical\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n\n @if (showsHorizontalInsetRails()) {\n <div data-layout-horizontal-top-rail class=\"absolute inset-x-0 top-12 h-0.5 bg-border\"></div>\n <div\n data-layout-horizontal-top-left-extension\n class=\"absolute top-12 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-top-right-extension\n class=\"absolute top-12 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div data-layout-horizontal-bottom-rail class=\"absolute inset-x-0 bottom-12 h-0.5 bg-border\"></div>\n <div\n data-layout-horizontal-bottom-left-extension\n class=\"absolute bottom-12 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-bottom-right-extension\n class=\"absolute bottom-12 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n }\n </div>\n </div>\n </div>\n }\n\n <div [class]=\"frameClasses()\">\n <div [class]=\"contentShellClasses()\">\n <ng-content />\n </div>\n </div>\n `,\n})\nexport class UiLayoutComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly surface = input<UiLayoutSurface | null>(null);\n readonly appearance = input<UiLayoutStyle | null>(null);\n readonly layoutStyleAttribute = input<UiLayoutStyle | null>(null, { alias: 'layout-style' });\n readonly width = input<UiLayoutWidth | null>(null);\n readonly class = input<string>('');\n\n protected readonly appearanceInput = computed(() => this.appearance() ?? this.layoutStyleAttribute());\n protected readonly resolvedSurface = computed(() => this.surface() ?? this.layout.surface());\n protected readonly resolvedAppearance = computed(() => this.appearanceInput() ?? this.layout.appearance());\n protected readonly resolvedStyle = computed(() => this.layout.style());\n protected readonly resolvedWidth = computed(() => this.width() ?? this.layout.width());\n protected readonly isBorderRail = computed(() => this.resolvedAppearance() === 'border-rail');\n protected readonly showsHorizontalInsetRails = computed(() => {\n const layoutType = this.layout.type();\n return this.isBorderRail() && (layoutType === 'horizontal' || layoutType === 'vertical');\n });\n protected readonly railPaddingClasses = computed(() => cn('h-full w-full', this.widthClasses()));\n protected readonly railAnchorClasses = computed(() =>\n cn('relative h-full min-h-0 min-w-0', this.frameWidthClasses()),\n );\n protected readonly contentShellClasses = computed(() =>\n cn('relative z-10 h-full min-h-0 w-full min-w-0', this.isBorderRail() ? 'overflow-visible' : 'overflow-hidden'),\n );\n\n protected readonly hostClasses = computed(() =>\n cn(\n 'relative isolate block h-dvh w-full min-w-0 box-border overflow-hidden text-foreground',\n this.surfaceClasses(),\n this.widthClasses(),\n this.class(),\n ),\n );\n\n protected readonly frameClasses = computed(() =>\n cn(\n 'relative h-full min-h-0 min-w-0 border-border bg-background/55 backdrop-blur-xs',\n this.frameWidthClasses(),\n this.isBorderRail() ? 'overflow-visible border-2' : 'overflow-hidden border',\n ),\n );\n\n constructor() {\n effect(() => {\n const surface = this.surface();\n if (surface !== null) {\n this.layout.setSurface(surface);\n } else {\n this.layout.registerSurface(UI_LAYOUT_DEFAULT_SURFACE);\n }\n\n const appearance = this.appearanceInput();\n if (appearance !== null) {\n this.layout.setAppearance(appearance);\n } else {\n this.layout.registerAppearance(UI_LAYOUT_DEFAULT_STYLE);\n }\n\n const width = this.width();\n if (width !== null) {\n this.layout.setWidth(width);\n } else {\n this.layout.registerWidth(UI_LAYOUT_DEFAULT_WIDTH);\n }\n });\n }\n\n private surfaceClasses(): string {\n switch (this.resolvedSurface()) {\n case 'grid':\n return '[--ui-layout-grid-size:2rem] bg-background bg-[linear-gradient(rgba(148,163,184,0.18)_1px,transparent_1px),linear-gradient(to_right,rgba(148,163,184,0.18)_1px,transparent_1px)] bg-position-[center_center] bg-size-[var(--ui-layout-grid-size)_var(--ui-layout-grid-size)]';\n case 'honeycome':\n return 'bg-background bg-[radial-gradient(circle_at_0_0,rgba(148,163,184,0.22)_1px,transparent_1.5px)] bg-position-[center_center] bg-size-[1.25rem_1.25rem]';\n case 'line-vertical':\n return 'bg-background bg-[linear-gradient(to_right,rgba(148,163,184,0.22)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n case 'line-horizontal':\n return 'bg-background bg-[linear-gradient(rgba(148,163,184,0.22)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n default:\n return 'bg-background';\n }\n }\n\n private widthClasses(): string {\n switch (this.resolvedWidth()) {\n case 'wide':\n return 'p-4 lg:p-12';\n case 'container':\n return 'p-4 lg:px-0 lg:py-16';\n default:\n return 'p-4';\n }\n }\n\n private frameWidthClasses(): string {\n return this.resolvedWidth() === 'container' ? 'w-full lg:container lg:mx-auto' : 'w-full';\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-vertical',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'vertical',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutVerticalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn(\n 'grid h-full min-h-0 w-full min-w-0 grid-cols-[auto_minmax(0,1fr)]',\n this.layout.style() === 'border-rail' ? 'overflow-visible' : 'overflow-hidden',\n this.class(),\n ),\n );\n\n constructor() {\n this.layout.setType('vertical');\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'horizontal',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutHorizontalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn('flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden', this.class()),\n );\n\n constructor() {\n this.layout.setType('horizontal');\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'empty',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutEmptyComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => cn('h-full min-h-0 w-full min-w-0 overflow-hidden', this.class()));\n\n constructor() {\n this.layout.setType('empty');\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, inject, input } from '@angular/core';\nimport { UiNavComponent } from '@edsis/ui/nav';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n role: 'navigation',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-appearance]': 'layout.appearance()',\n '[attr.data-layout-style]': 'layout.style()',\n '[attr.data-layout-nav-rail-offset]': 'resolvedRailOffset()',\n },\n template: `\n @if (showsVerticalRail()) {\n <div\n aria-hidden=\"true\"\n data-layout-nav-rail\n class=\"pointer-events-none absolute inset-y-0 right-0 z-20 w-0.5 transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none\"\n [style.transform]=\"railTransform()\">\n <div data-layout-nav-rail-line class=\"absolute inset-y-0 right-0 w-0.5 bg-border\"></div>\n <div\n data-layout-nav-rail-top\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-nav-rail-bottom\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n </div>\n }\n\n <ng-content />\n `,\n})\nexport class UiLayoutNavComponent {\n protected readonly layout = inject(LayoutService);\n protected readonly projectedNav = contentChild(UiNavComponent);\n\n readonly ariaLabel = input<string>('Layout navigation');\n readonly railOffset = input<string | null>(null);\n readonly class = input<string>('');\n protected readonly showsVerticalRail = computed(\n () => this.layout.type() === 'vertical' && this.layout.appearance() === 'border-rail',\n );\n protected readonly resolvedRailOffset = computed(\n () => this.railOffset() ?? this.projectedNav()?.previewRailOffset() ?? '0px',\n );\n protected readonly railTransform = computed(() => `translateX(${this.resolvedRailOffset()})`);\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n const showsVerticalRail = this.showsVerticalRail();\n\n return cn(\n 'relative block min-h-0 min-w-0',\n layoutType === 'horizontal' && 'h-12 min-h-12 w-full shrink-0 overflow-visible',\n layoutType === 'vertical' &&\n (showsVerticalRail\n ? 'h-full w-max max-w-full shrink-0 overflow-visible'\n : 'h-full w-max max-w-full shrink-0 overflow-hidden'),\n layoutType === 'empty' && 'hidden',\n this.class(),\n );\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-width]': 'layout.width()',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutContentComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n\n return cn(\n 'block min-h-0 min-w-0 overflow-auto',\n layoutType === 'horizontal' && 'flex-1',\n layoutType === 'vertical' && 'h-full',\n layoutType === 'empty' && 'h-full w-full',\n this.layout.width() === 'container' && 'w-full lg:container lg:mx-auto',\n this.class(),\n );\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"edsis-ui-layout.mjs","sources":["../../../library/ui/layout/types/layout.types.ts","../../../library/ui/layout/services/layout.service.ts","../../../library/ui/layout/ui-layout.component.ts","../../../library/ui/layout/vertical/ui-layout-vertical.component.ts","../../../library/ui/layout/horizontal/ui-layout-horizontal.component.ts","../../../library/ui/layout/empty/ui-layout-empty.component.ts","../../../library/ui/layout/fluid/ui-layout-fluid.component.ts","../../../library/ui/layout/nav/ui-layout-nav.component.ts","../../../library/ui/layout/content/ui-layout-content.component.ts","../../../library/ui/layout/edsis-ui-layout.ts"],"sourcesContent":["import type { Signal } from '@angular/core';\n\nexport const UI_LAYOUT_TYPES = ['vertical', 'horizontal', 'empty', 'fluid'] as const;\nexport const UI_LAYOUT_SURFACES = ['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal'] as const;\nexport const UI_LAYOUT_STYLES = ['flat', 'border-rail'] as const;\nexport const UI_LAYOUT_WIDTHS = ['full', 'wide', 'container', 'fluid'] as const;\n\nexport type UiLayoutType = (typeof UI_LAYOUT_TYPES)[number];\nexport type UiLayoutSurface = (typeof UI_LAYOUT_SURFACES)[number];\nexport type UiLayoutStyle = (typeof UI_LAYOUT_STYLES)[number];\nexport type UiLayoutWidth = (typeof UI_LAYOUT_WIDTHS)[number];\n\nexport const UI_LAYOUT_DEFAULT_SURFACE: UiLayoutSurface = 'flat';\nexport const UI_LAYOUT_DEFAULT_TYPE: UiLayoutType = 'vertical';\nexport const UI_LAYOUT_DEFAULT_STYLE: UiLayoutStyle = 'flat';\nexport const UI_LAYOUT_DEFAULT_WIDTH: UiLayoutWidth = 'full';\n\nexport const UI_LAYOUT_SURFACE_STORAGE_KEY = 'layout-surface';\nexport const UI_LAYOUT_APPEARANCE_STORAGE_KEY = 'layout-appearance';\nexport const UI_LAYOUT_TYPE_STORAGE_KEY = 'layout-type';\nexport const UI_LAYOUT_STYLE_STORAGE_KEY = 'layout-style';\nexport const UI_LAYOUT_WIDTH_STORAGE_KEY = 'layout-width';\n\nexport interface UiLayoutContextValue {\n surface: Signal<UiLayoutSurface>;\n type: Signal<UiLayoutType>;\n appearance: Signal<UiLayoutStyle>;\n style: Signal<UiLayoutStyle>;\n width: Signal<UiLayoutWidth>;\n}\n\nexport function isUiLayoutSurface(value: string | null): value is UiLayoutSurface {\n return value !== null && (UI_LAYOUT_SURFACES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutType(value: string | null): value is UiLayoutType {\n return value !== null && (UI_LAYOUT_TYPES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutStyle(value: string | null): value is UiLayoutStyle {\n return value !== null && (UI_LAYOUT_STYLES as readonly string[]).includes(value);\n}\n\nexport function isUiLayoutWidth(value: string | null): value is UiLayoutWidth {\n return value !== null && (UI_LAYOUT_WIDTHS as readonly string[]).includes(value);\n}\n","import { isPlatformBrowser } from '@angular/common';\nimport { inject, Injectable, PLATFORM_ID, signal } from '@angular/core';\nimport {\n UI_LAYOUT_APPEARANCE_STORAGE_KEY,\n isUiLayoutSurface,\n isUiLayoutStyle,\n isUiLayoutType,\n isUiLayoutWidth,\n UI_LAYOUT_DEFAULT_SURFACE,\n UI_LAYOUT_DEFAULT_STYLE,\n UI_LAYOUT_DEFAULT_TYPE,\n UI_LAYOUT_DEFAULT_WIDTH,\n UI_LAYOUT_SURFACE_STORAGE_KEY,\n UI_LAYOUT_STYLE_STORAGE_KEY,\n UI_LAYOUT_TYPE_STORAGE_KEY,\n UI_LAYOUT_WIDTH_STORAGE_KEY,\n type UiLayoutSurface,\n type UiLayoutStyle,\n type UiLayoutType,\n type UiLayoutWidth,\n} from '../types/layout.types';\n\ninterface LayoutMutationOptions {\n persist?: boolean;\n}\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly platformId = inject(PLATFORM_ID);\n private readonly surfaceState = signal<UiLayoutSurface>(this.getStoredSurface());\n private readonly typeState = signal<UiLayoutType>(this.getStoredType());\n private readonly styleState = signal<UiLayoutStyle>(this.getStoredStyle());\n private readonly widthState = signal<UiLayoutWidth>(this.getStoredWidth());\n\n readonly surface = this.surfaceState.asReadonly();\n readonly type = this.typeState.asReadonly();\n readonly appearance = this.styleState.asReadonly();\n readonly style = this.styleState.asReadonly();\n readonly width = this.widthState.asReadonly();\n\n registerDefaults(defaults: {\n surface?: UiLayoutSurface;\n appearance?: UiLayoutStyle;\n type?: UiLayoutType;\n width?: UiLayoutWidth;\n }): this {\n if (defaults.surface !== undefined) {\n this.registerSurface(defaults.surface);\n }\n\n if (defaults.appearance !== undefined) {\n this.registerAppearance(defaults.appearance);\n }\n\n if (defaults.type !== undefined) {\n this.registerType(defaults.type);\n }\n\n if (defaults.width !== undefined) {\n this.registerWidth(defaults.width);\n }\n\n return this;\n }\n\n registerSurface(surface: UiLayoutSurface): void {\n const storedSurface = this.readStorage(UI_LAYOUT_SURFACE_STORAGE_KEY);\n\n if (isUiLayoutSurface(storedSurface)) {\n this.surfaceState.set(storedSurface);\n return;\n }\n\n this.setSurface(surface);\n }\n\n registerType(type: UiLayoutType): void {\n const storedType = this.readStorage(UI_LAYOUT_TYPE_STORAGE_KEY);\n\n if (isUiLayoutType(storedType)) {\n this.typeState.set(storedType);\n return;\n }\n\n this.setType(type);\n }\n\n registerAppearance(appearance: UiLayoutStyle): void {\n this.setAppearance(this.getStoredAppearanceOrDefault(appearance));\n }\n\n registerStyle(style: UiLayoutStyle): void {\n this.registerAppearance(style);\n }\n\n registerWidth(width: UiLayoutWidth): void {\n const storedWidth = this.readStorage(UI_LAYOUT_WIDTH_STORAGE_KEY);\n\n if (isUiLayoutWidth(storedWidth)) {\n this.widthState.set(storedWidth);\n return;\n }\n\n this.setWidth(width);\n }\n\n setSurface(surface: UiLayoutSurface, options: LayoutMutationOptions = {}): void {\n this.surfaceState.set(surface);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(UI_LAYOUT_SURFACE_STORAGE_KEY, surface);\n }\n\n setType(type: UiLayoutType, options: LayoutMutationOptions = {}): void {\n this.typeState.set(type);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(UI_LAYOUT_TYPE_STORAGE_KEY, type);\n }\n\n setAppearance(appearance: UiLayoutStyle, options: LayoutMutationOptions = {}): void {\n this.styleState.set(appearance);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(UI_LAYOUT_APPEARANCE_STORAGE_KEY, appearance);\n this.removeStorage(UI_LAYOUT_STYLE_STORAGE_KEY);\n }\n\n setStyle(style: UiLayoutStyle, options: LayoutMutationOptions = {}): void {\n this.setAppearance(style, options);\n }\n\n setWidth(width: UiLayoutWidth, options: LayoutMutationOptions = {}): void {\n this.widthState.set(width);\n\n if (options.persist === false) {\n return;\n }\n\n this.writeStorage(UI_LAYOUT_WIDTH_STORAGE_KEY, width);\n }\n\n getStoredSurface(): UiLayoutSurface {\n const value = this.readStorage(UI_LAYOUT_SURFACE_STORAGE_KEY);\n return isUiLayoutSurface(value) ? value : UI_LAYOUT_DEFAULT_SURFACE;\n }\n\n getStoredType(): UiLayoutType {\n const value = this.readStorage(UI_LAYOUT_TYPE_STORAGE_KEY);\n return isUiLayoutType(value) ? value : UI_LAYOUT_DEFAULT_TYPE;\n }\n\n getStoredAppearance(): UiLayoutStyle {\n const value = this.readStoredAppearance();\n return value ?? UI_LAYOUT_DEFAULT_STYLE;\n }\n\n getStoredStyle(): UiLayoutStyle {\n return this.getStoredAppearance();\n }\n\n getStoredWidth(): UiLayoutWidth {\n const value = this.readStorage(UI_LAYOUT_WIDTH_STORAGE_KEY);\n return isUiLayoutWidth(value) ? value : UI_LAYOUT_DEFAULT_WIDTH;\n }\n\n private readStorage(key: string): string | null {\n const storage = this.getStorage();\n if (!storage) {\n return null;\n }\n\n try {\n return storage.getItem(key);\n } catch {\n return null;\n }\n }\n\n private removeStorage(key: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.removeItem(key);\n } catch {\n return;\n }\n }\n\n private writeStorage(key: string, value: string): void {\n const storage = this.getStorage();\n if (!storage) {\n return;\n }\n\n try {\n storage.setItem(key, value);\n } catch {\n return;\n }\n }\n\n private getStorage(): Storage | null {\n if (!isPlatformBrowser(this.platformId)) {\n return null;\n }\n\n try {\n return localStorage;\n } catch {\n return null;\n }\n }\n\n private readStoredAppearance(): UiLayoutStyle | null {\n const appearance = this.readStorage(UI_LAYOUT_APPEARANCE_STORAGE_KEY);\n if (isUiLayoutStyle(appearance)) {\n return appearance;\n }\n\n const legacyStyle = this.readStorage(UI_LAYOUT_STYLE_STORAGE_KEY);\n return isUiLayoutStyle(legacyStyle) ? legacyStyle : null;\n }\n\n private getStoredAppearanceOrDefault(fallback: UiLayoutStyle): UiLayoutStyle {\n return this.readStoredAppearance() ?? fallback;\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, effect, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from './services/layout.service';\nimport {\n UI_LAYOUT_DEFAULT_STYLE,\n UI_LAYOUT_DEFAULT_SURFACE,\n UI_LAYOUT_DEFAULT_WIDTH,\n type UiLayoutStyle,\n type UiLayoutSurface,\n type UiLayoutWidth,\n} from './types/layout.types';\n\n@Component({\n selector: 'ui-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-surface]': 'resolvedSurface()',\n '[attr.data-layout-appearance]': 'resolvedAppearance()',\n '[attr.data-layout-style]': 'resolvedStyle()',\n '[attr.data-layout-width]': 'resolvedWidth()',\n '[attr.data-layout-type]': 'layout.type()',\n },\n template: `\n <div data-layout-stage [class]=\"frameStageClasses()\">\n @if (isBorderRail()) {\n <div\n aria-hidden=\"true\"\n data-layout-rail\n class=\"pointer-events-none col-start-1 row-start-1 z-0 overflow-visible\">\n <div data-layout-rail-anchor [class]=\"railAnchorClasses()\">\n <div\n data-layout-rail-top-left-horizontal\n class=\"absolute top-0 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-left-vertical\n class=\"absolute bottom-full left-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-top-right-horizontal\n class=\"absolute top-0 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-top-right-vertical\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-bottom-left-horizontal\n class=\"absolute bottom-0 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-left-vertical\n class=\"absolute top-full left-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-rail-bottom-right-horizontal\n class=\"absolute bottom-0 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-rail-bottom-right-vertical\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n\n @if (showsHorizontalInsetRails()) {\n <div data-layout-horizontal-top-rail class=\"absolute inset-x-0 top-12 h-0.5 bg-border\"></div>\n <div\n data-layout-horizontal-top-left-extension\n class=\"absolute top-12 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-top-right-extension\n class=\"absolute top-12 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div data-layout-horizontal-bottom-rail class=\"absolute inset-x-0 bottom-12 h-0.5 bg-border\"></div>\n <div\n data-layout-horizontal-bottom-left-extension\n class=\"absolute bottom-12 right-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n <div\n data-layout-horizontal-bottom-right-extension\n class=\"absolute bottom-12 left-full h-0.5 w-[calc((100vw-100%)/2)] bg-border\"></div>\n }\n </div>\n </div>\n }\n\n <div data-layout-frame [class]=\"frameLayerClasses()\">\n <div [class]=\"contentShellClasses()\">\n <ng-content />\n </div>\n </div>\n </div>\n `,\n})\nexport class UiLayoutComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly surface = input<UiLayoutSurface | null>(null);\n readonly appearance = input<UiLayoutStyle | null>(null);\n readonly layoutStyleAttribute = input<UiLayoutStyle | null>(null, { alias: 'layout-style' });\n readonly width = input<UiLayoutWidth | null>(null);\n readonly class = input<string>('');\n\n protected readonly appearanceInput = computed(() => this.appearance() ?? this.layoutStyleAttribute());\n protected readonly resolvedSurface = computed(() => this.surface() ?? this.layout.surface());\n protected readonly resolvedAppearance = computed(() => this.appearanceInput() ?? this.layout.appearance());\n protected readonly resolvedStyle = computed(() => this.layout.style());\n protected readonly resolvedWidth = computed(() => this.width() ?? this.layout.width());\n protected readonly isBorderRail = computed(() => this.resolvedAppearance() === 'border-rail');\n protected readonly isFluidFrame = computed(() => this.resolvedWidth() === 'fluid' && this.layout.type() === 'fluid');\n protected readonly showsHorizontalInsetRails = computed(() => {\n const layoutType = this.layout.type();\n return this.isBorderRail() && (layoutType === 'horizontal' || layoutType === 'vertical');\n });\n protected readonly frameStageClasses = computed(() =>\n cn('relative grid min-h-0 min-w-0 grid-cols-1 grid-rows-1', this.frameSizeClasses()),\n );\n protected readonly railAnchorClasses = computed(() => 'relative h-full min-h-0 w-full min-w-0');\n protected readonly contentShellClasses = computed(() =>\n cn(\n 'relative z-10 min-h-0 min-w-0',\n this.isFluidFrame() ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full',\n this.isBorderRail() ? 'overflow-visible' : 'overflow-hidden',\n ),\n );\n\n protected readonly hostClasses = computed(() =>\n cn(\n 'relative isolate h-dvh w-full min-w-0 box-border overflow-hidden text-foreground',\n this.isFluidFrame() ? 'grid place-items-center' : 'block',\n this.surfaceClasses(),\n this.widthPaddingClasses(),\n this.class(),\n ),\n );\n\n protected readonly frameClasses = computed(() =>\n cn(\n 'relative min-h-0 min-w-0 border-border bg-background/55 backdrop-blur-xs',\n this.frameSizeClasses(),\n this.isBorderRail() ? 'overflow-visible border-2' : 'overflow-hidden border',\n ),\n );\n protected readonly frameLayerClasses = computed(() => cn('col-start-1 row-start-1', this.frameClasses()));\n\n constructor() {\n effect(() => {\n const surface = this.surface();\n if (surface !== null) {\n this.layout.setSurface(surface, { persist: false });\n } else {\n this.layout.registerSurface(UI_LAYOUT_DEFAULT_SURFACE);\n }\n\n const appearance = this.appearanceInput();\n if (appearance !== null) {\n this.layout.setAppearance(appearance, { persist: false });\n } else {\n this.layout.registerAppearance(UI_LAYOUT_DEFAULT_STYLE);\n }\n\n const width = this.width();\n if (width !== null) {\n this.layout.setWidth(width, { persist: false });\n } else {\n this.layout.registerWidth(UI_LAYOUT_DEFAULT_WIDTH);\n }\n });\n }\n\n private surfaceClasses(): string {\n switch (this.resolvedSurface()) {\n case 'grid':\n return '[--ui-layout-grid-size:2rem] bg-background bg-[linear-gradient(rgba(148,163,184,0.18)_1px,transparent_1px),linear-gradient(to_right,rgba(148,163,184,0.18)_1px,transparent_1px)] bg-position-[center_center] bg-size-[var(--ui-layout-grid-size)_var(--ui-layout-grid-size)]';\n case 'honeycome':\n return 'bg-background bg-[radial-gradient(circle_at_0_0,rgba(148,163,184,0.22)_1px,transparent_1.5px)] bg-position-[center_center] bg-size-[1.25rem_1.25rem]';\n case 'line-vertical':\n return 'bg-background bg-[linear-gradient(to_right,rgba(148,163,184,0.22)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n case 'line-horizontal':\n return 'bg-background bg-[linear-gradient(rgba(148,163,184,0.22)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2rem_2rem]';\n default:\n return 'bg-background';\n }\n }\n\n private widthPaddingClasses(): string {\n switch (this.resolvedWidth()) {\n case 'wide':\n return 'p-4 lg:p-12';\n case 'container':\n return 'p-4 lg:px-0 lg:py-16';\n case 'fluid':\n return 'p-4 sm:p-6 lg:p-8';\n default:\n return 'p-4';\n }\n }\n\n private frameSizeClasses(): string {\n if (this.isFluidFrame()) {\n return 'h-auto w-auto max-h-full max-w-full';\n }\n\n return this.resolvedWidth() === 'container' ? 'h-full w-full lg:container lg:mx-auto' : 'h-full w-full';\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-vertical',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'vertical',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutVerticalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn(\n 'grid h-full min-h-0 w-full min-w-0 grid-cols-[auto_minmax(0,1fr)]',\n this.layout.style() === 'border-rail' ? 'overflow-visible' : 'overflow-hidden',\n this.class(),\n ),\n );\n\n constructor() {\n this.layout.setType('vertical', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'horizontal',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutHorizontalComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn('flex h-full min-h-0 w-full min-w-0 flex-col overflow-hidden', this.class()),\n );\n\n constructor() {\n this.layout.setType('horizontal', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'empty',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutEmptyComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => cn('h-full min-h-0 w-full min-w-0 overflow-hidden', this.class()));\n\n constructor() {\n this.layout.setType('empty', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-fluid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n 'data-layout-type': 'fluid',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutFluidComponent {\n private readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() =>\n cn(\n 'grid min-h-0 min-w-0 place-items-center overflow-auto',\n this.layout.width() === 'fluid' ? 'h-auto w-auto max-h-full max-w-full' : 'h-full w-full',\n this.class(),\n ),\n );\n\n constructor() {\n this.layout.setType('fluid', { persist: false });\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, contentChild, inject, input } from '@angular/core';\nimport { UiNavComponent } from '@edsis/ui/nav';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-nav',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n role: 'navigation',\n '[attr.aria-label]': 'ariaLabel() || null',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-appearance]': 'layout.appearance()',\n '[attr.data-layout-style]': 'layout.style()',\n '[attr.data-layout-nav-rail-offset]': 'resolvedRailOffset()',\n },\n template: `\n @if (showsVerticalRail()) {\n <div\n aria-hidden=\"true\"\n data-layout-nav-rail\n class=\"pointer-events-none absolute inset-y-0 right-0 z-20 w-0.5 transition-transform duration-300 ease-[cubic-bezier(0.22,1,0.36,1)] motion-reduce:transition-none\"\n [style.transform]=\"railTransform()\">\n <div data-layout-nav-rail-line class=\"absolute inset-y-0 right-0 w-0.5 bg-border\"></div>\n <div\n data-layout-nav-rail-top\n class=\"absolute bottom-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n <div\n data-layout-nav-rail-bottom\n class=\"absolute top-full right-0 h-[calc((100dvh-100%)/2)] w-0.5 bg-border\"></div>\n </div>\n }\n\n <ng-content />\n `,\n})\nexport class UiLayoutNavComponent {\n protected readonly layout = inject(LayoutService);\n protected readonly projectedNav = contentChild(UiNavComponent);\n\n readonly ariaLabel = input<string>('Layout navigation');\n readonly railOffset = input<string | null>(null);\n readonly class = input<string>('');\n protected readonly showsVerticalRail = computed(\n () => this.layout.type() === 'vertical' && this.layout.appearance() === 'border-rail',\n );\n protected readonly resolvedRailOffset = computed(\n () => this.railOffset() ?? this.projectedNav()?.previewRailOffset() ?? '0px',\n );\n protected readonly railTransform = computed(() => `translateX(${this.resolvedRailOffset()})`);\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n const showsVerticalRail = this.showsVerticalRail();\n\n return cn(\n 'relative block min-h-0 min-w-0',\n layoutType === 'horizontal' && 'h-12 min-h-12 w-full shrink-0 overflow-visible',\n layoutType === 'vertical' &&\n (showsVerticalRail\n ? 'h-full w-max max-w-full shrink-0 overflow-visible'\n : 'h-full w-max max-w-full shrink-0 overflow-hidden'),\n layoutType === 'empty' && 'hidden',\n this.class(),\n );\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { cn } from '@edsis/ui/utils';\nimport { LayoutService } from '../services/layout.service';\n\n@Component({\n selector: 'ui-layout-content',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[class]': 'classes()',\n '[attr.data-layout-type]': 'layout.type()',\n '[attr.data-layout-width]': 'layout.width()',\n },\n template: `<ng-content />`,\n})\nexport class UiLayoutContentComponent {\n protected readonly layout = inject(LayoutService);\n\n readonly class = input<string>('');\n\n protected readonly classes = computed(() => {\n const layoutType = this.layout.type();\n\n return cn(\n 'block min-h-0 min-w-0 overflow-auto',\n layoutType === 'horizontal' && 'flex-1',\n layoutType === 'vertical' && 'h-full',\n layoutType === 'empty' && 'h-full w-full',\n this.layout.width() === 'container' && 'w-full lg:container lg:mx-auto',\n this.class(),\n );\n });\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;AAEO,MAAM,eAAe,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO;AACnE,MAAM,kBAAkB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB;MACrF,gBAAgB,GAAG,CAAC,MAAM,EAAE,aAAa;AAC/C,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO;AAO9D,MAAM,yBAAyB,GAAoB;AACnD,MAAM,sBAAsB,GAAiB;AAC7C,MAAM,uBAAuB,GAAkB;AAC/C,MAAM,uBAAuB,GAAkB;AAE/C,MAAM,6BAA6B,GAAG;AACtC,MAAM,gCAAgC,GAAG;AACzC,MAAM,0BAA0B,GAAG;AACnC,MAAM,2BAA2B,GAAG;AACpC,MAAM,2BAA2B,GAAG;AAUrC,SAAU,iBAAiB,CAAC,KAAoB,EAAA;IACpD,OAAO,KAAK,KAAK,IAAI,IAAK,kBAAwC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACpF;AAEM,SAAU,cAAc,CAAC,KAAoB,EAAA;IACjD,OAAO,KAAK,KAAK,IAAI,IAAK,eAAqC,CAAC,QAAQ,CAAC,KAAK,CAAC;AACjF;AAEM,SAAU,eAAe,CAAC,KAAoB,EAAA;IAClD,OAAO,KAAK,KAAK,IAAI,IAAK,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAClF;AAEM,SAAU,eAAe,CAAC,KAAoB,EAAA;IAClD,OAAO,KAAK,KAAK,IAAI,IAAK,gBAAsC,CAAC,QAAQ,CAAC,KAAK,CAAC;AAClF;;MClBa,aAAa,CAAA;AACP,IAAA,UAAU,GAAG,MAAM,CAAC,WAAW,CAAC;IAChC,YAAY,GAAG,MAAM,CAAkB,IAAI,CAAC,gBAAgB,EAAE,mFAAC;IAC/D,SAAS,GAAG,MAAM,CAAe,IAAI,CAAC,aAAa,EAAE,gFAAC;IACtD,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,cAAc,EAAE,iFAAC;IACzD,UAAU,GAAG,MAAM,CAAgB,IAAI,CAAC,cAAc,EAAE,iFAAC;AAEjE,IAAA,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AACxC,IAAA,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE;AAClC,IAAA,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AACzC,IAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AACpC,IAAA,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AAE7C,IAAA,gBAAgB,CAAC,QAKhB,EAAA;AACC,QAAA,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE;AAClC,YAAA,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC;QACxC;AAEA,QAAA,IAAI,QAAQ,CAAC,UAAU,KAAK,SAAS,EAAE;AACrC,YAAA,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC,UAAU,CAAC;QAC9C;AAEA,QAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE;AAC/B,YAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC;QAClC;AAEA,QAAA,IAAI,QAAQ,CAAC,KAAK,KAAK,SAAS,EAAE;AAChC,YAAA,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpC;AAEA,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,eAAe,CAAC,OAAwB,EAAA;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC;AAErE,QAAA,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE;AACpC,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,CAAC;YACpC;QACF;AAEA,QAAA,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;IAC1B;AAEA,IAAA,YAAY,CAAC,IAAkB,EAAA;QAC7B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC;AAE/D,QAAA,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE;AAC9B,YAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC;YAC9B;QACF;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC;IACpB;AAEA,IAAA,kBAAkB,CAAC,UAAyB,EAAA;QAC1C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,4BAA4B,CAAC,UAAU,CAAC,CAAC;IACnE;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;AAChC,QAAA,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;IAChC;AAEA,IAAA,aAAa,CAAC,KAAoB,EAAA;QAChC,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC;AAEjE,QAAA,IAAI,eAAe,CAAC,WAAW,CAAC,EAAE;AAChC,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,WAAW,CAAC;YAChC;QACF;AAEA,QAAA,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;IACtB;AAEA,IAAA,UAAU,CAAC,OAAwB,EAAE,OAAA,GAAiC,EAAE,EAAA;AACtE,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC;AAE9B,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,6BAA6B,EAAE,OAAO,CAAC;IAC3D;AAEA,IAAA,OAAO,CAAC,IAAkB,EAAE,OAAA,GAAiC,EAAE,EAAA;AAC7D,QAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC;AAExB,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,0BAA0B,EAAE,IAAI,CAAC;IACrD;AAEA,IAAA,aAAa,CAAC,UAAyB,EAAE,OAAA,GAAiC,EAAE,EAAA;AAC1E,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;AAE/B,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,gCAAgC,EAAE,UAAU,CAAC;AAC/D,QAAA,IAAI,CAAC,aAAa,CAAC,2BAA2B,CAAC;IACjD;AAEA,IAAA,QAAQ,CAAC,KAAoB,EAAE,OAAA,GAAiC,EAAE,EAAA;AAChE,QAAA,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC;IACpC;AAEA,IAAA,QAAQ,CAAC,KAAoB,EAAE,OAAA,GAAiC,EAAE,EAAA;AAChE,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;AAE1B,QAAA,IAAI,OAAO,CAAC,OAAO,KAAK,KAAK,EAAE;YAC7B;QACF;AAEA,QAAA,IAAI,CAAC,YAAY,CAAC,2BAA2B,EAAE,KAAK,CAAC;IACvD;IAEA,gBAAgB,GAAA;QACd,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,6BAA6B,CAAC;AAC7D,QAAA,OAAO,iBAAiB,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,yBAAyB;IACrE;IAEA,aAAa,GAAA;QACX,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,0BAA0B,CAAC;AAC1D,QAAA,OAAO,cAAc,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,sBAAsB;IAC/D;IAEA,mBAAmB,GAAA;AACjB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,oBAAoB,EAAE;QACzC,OAAO,KAAK,IAAI,uBAAuB;IACzC;IAEA,cAAc,GAAA;AACZ,QAAA,OAAO,IAAI,CAAC,mBAAmB,EAAE;IACnC;IAEA,cAAc,GAAA;QACZ,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC;AAC3D,QAAA,OAAO,eAAe,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,uBAAuB;IACjE;AAEQ,IAAA,WAAW,CAAC,GAAW,EAAA;AAC7B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC;QAC7B;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;AAEQ,IAAA,aAAa,CAAC,GAAW,EAAA;AAC/B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QACzB;AAAE,QAAA,MAAM;YACN;QACF;IACF;IAEQ,YAAY,CAAC,GAAW,EAAE,KAAa,EAAA;AAC7C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,IAAI,CAAC,OAAO,EAAE;YACZ;QACF;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;QAC7B;AAAE,QAAA,MAAM;YACN;QACF;IACF;IAEQ,UAAU,GAAA;QAChB,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;AACvC,YAAA,OAAO,IAAI;QACb;AAEA,QAAA,IAAI;AACF,YAAA,OAAO,YAAY;QACrB;AAAE,QAAA,MAAM;AACN,YAAA,OAAO,IAAI;QACb;IACF;IAEQ,oBAAoB,GAAA;QAC1B,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,gCAAgC,CAAC;AACrE,QAAA,IAAI,eAAe,CAAC,UAAU,CAAC,EAAE;AAC/B,YAAA,OAAO,UAAU;QACnB;QAEA,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,2BAA2B,CAAC;AACjE,QAAA,OAAO,eAAe,CAAC,WAAW,CAAC,GAAG,WAAW,GAAG,IAAI;IAC1D;AAEQ,IAAA,4BAA4B,CAAC,QAAuB,EAAA;AAC1D,QAAA,OAAO,IAAI,CAAC,oBAAoB,EAAE,IAAI,QAAQ;IAChD;wGAnNW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cADA,MAAM,EAAA,CAAA;;4FACnB,aAAa,EAAA,UAAA,EAAA,CAAA;kBADzB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MC0DrB,iBAAiB,CAAA;AACT,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAExC,IAAA,OAAO,GAAG,KAAK,CAAyB,IAAI,8EAAC;AAC7C,IAAA,UAAU,GAAG,KAAK,CAAuB,IAAI,iFAAC;IAC9C,oBAAoB,GAAG,KAAK,CAAuB,IAAI,4FAAI,KAAK,EAAE,cAAc,EAAA,CAAG;AACnF,IAAA,KAAK,GAAG,KAAK,CAAuB,IAAI,4EAAC;AACzC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,sFAAC;AAClF,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,sFAAC;AACzE,IAAA,kBAAkB,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,yFAAC;AACvF,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,oFAAC;AACnD,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,oFAAC;AACnE,IAAA,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,kBAAkB,EAAE,KAAK,aAAa,mFAAC;IAC1E,YAAY,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,KAAK,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,OAAO,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,cAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAAC;AACjG,IAAA,yBAAyB,GAAG,QAAQ,CAAC,MAAK;QAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACrC,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,KAAK,UAAU,KAAK,YAAY,IAAI,UAAU,KAAK,UAAU,CAAC;AAC1F,IAAA,CAAC,gGAAC;AACiB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAC9C,EAAE,CAAC,uDAAuD,EAAE,IAAI,CAAC,gBAAgB,EAAE,CAAC,wFACrF;IACkB,iBAAiB,GAAG,QAAQ,CAAC,MAAM,wCAAwC,wFAAC;AAC5E,IAAA,mBAAmB,GAAG,QAAQ,CAAC,MAChD,EAAE,CACA,+BAA+B,EAC/B,IAAI,CAAC,YAAY,EAAE,GAAG,qCAAqC,GAAG,eAAe,EAC7E,IAAI,CAAC,YAAY,EAAE,GAAG,kBAAkB,GAAG,iBAAiB,CAC7D,0FACF;AAEkB,IAAA,WAAW,GAAG,QAAQ,CAAC,MACxC,EAAE,CACA,kFAAkF,EAClF,IAAI,CAAC,YAAY,EAAE,GAAG,yBAAyB,GAAG,OAAO,EACzD,IAAI,CAAC,cAAc,EAAE,EACrB,IAAI,CAAC,mBAAmB,EAAE,EAC1B,IAAI,CAAC,KAAK,EAAE,CACb,kFACF;AAEkB,IAAA,YAAY,GAAG,QAAQ,CAAC,MACzC,EAAE,CACA,0EAA0E,EAC1E,IAAI,CAAC,gBAAgB,EAAE,EACvB,IAAI,CAAC,YAAY,EAAE,GAAG,2BAA2B,GAAG,wBAAwB,CAC7E,mFACF;AACkB,IAAA,iBAAiB,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,yBAAyB,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,wFAAC;AAEzG,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE;AAC9B,YAAA,IAAI,OAAO,KAAK,IAAI,EAAE;AACpB,gBAAA,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACrD;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,yBAAyB,CAAC;YACxD;AAEA,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,UAAU,KAAK,IAAI,EAAE;AACvB,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YAC3D;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,kBAAkB,CAAC,uBAAuB,CAAC;YACzD;AAEA,YAAA,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE;AAC1B,YAAA,IAAI,KAAK,KAAK,IAAI,EAAE;AAClB,gBAAA,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;YACjD;iBAAO;AACL,gBAAA,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,uBAAuB,CAAC;YACpD;AACF,QAAA,CAAC,CAAC;IACJ;IAEQ,cAAc,GAAA;AACpB,QAAA,QAAQ,IAAI,CAAC,eAAe,EAAE;AAC5B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,8QAA8Q;AACvR,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,sJAAsJ;AAC/J,YAAA,KAAK,eAAe;AAClB,gBAAA,OAAO,yIAAyI;AAClJ,YAAA,KAAK,iBAAiB;AACpB,gBAAA,OAAO,gIAAgI;AACzI,YAAA;AACE,gBAAA,OAAO,eAAe;;IAE5B;IAEQ,mBAAmB,GAAA;AACzB,QAAA,QAAQ,IAAI,CAAC,aAAa,EAAE;AAC1B,YAAA,KAAK,MAAM;AACT,gBAAA,OAAO,aAAa;AACtB,YAAA,KAAK,WAAW;AACd,gBAAA,OAAO,sBAAsB;AAC/B,YAAA,KAAK,OAAO;AACV,gBAAA,OAAO,mBAAmB;AAC5B,YAAA;AACE,gBAAA,OAAO,KAAK;;IAElB;IAEQ,gBAAgB,GAAA;AACtB,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE;AACvB,YAAA,OAAO,qCAAqC;QAC9C;AAEA,QAAA,OAAO,IAAI,CAAC,aAAa,EAAE,KAAK,WAAW,GAAG,uCAAuC,GAAG,eAAe;IACzG;wGA9GW,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,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,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,oBAAA,EAAA,EAAA,iBAAA,EAAA,sBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,6BAAA,EAAA,sBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA7DlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAxE7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,WAAW;oBACrB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,eAAe;AAC1B,wBAAA,qBAAqB,EAAE,mBAAmB;AAC1C,wBAAA,+BAA+B,EAAE,sBAAsB;AACvD,wBAAA,0BAA0B,EAAE,iBAAiB;AAC7C,wBAAA,0BAA0B,EAAE,iBAAiB;AAC7C,wBAAA,yBAAyB,EAAE,eAAe;AAC3C,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2DT,EAAA,CAAA;AACF,iBAAA;;;MCtEY,yBAAyB,CAAA;AACnB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CACA,mEAAmE,EACnE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,aAAa,GAAG,kBAAkB,GAAG,iBAAiB,EAC9E,IAAI,CAAC,KAAK,EAAE,CACb,8EACF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACrD;wGAfW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,yBAAyB,kTAF1B,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBATrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;oBAC9B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,UAAU;AAC/B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,2BAA2B,CAAA;AACrB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CAAC,6DAA6D,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,8EAChF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IACvD;wGAXW,2BAA2B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAA3B,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,2BAA2B,sTAF5B,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,2BAA2B,EAAA,UAAA,EAAA,CAAA;kBATvC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;oBAChC,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,YAAY;AACjC,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,sBAAsB,CAAA;AAChB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,+CAA+C,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,8EAAC;AAE9G,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClD;wGATW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,4SAFvB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBATlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,OAAO;AAC5B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCCY,sBAAsB,CAAA;AAChB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MACpC,EAAE,CACA,uDAAuD,EACvD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,OAAO,GAAG,qCAAqC,GAAG,eAAe,EACzF,IAAI,CAAC,KAAK,EAAE,CACb,8EACF;AAED,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;IAClD;wGAfW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,sBAAsB,4SAFvB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBATlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,kBAAkB,EAAE,OAAO;AAC5B,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;MCyBY,oBAAoB,CAAA;AACZ,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAC9B,IAAA,YAAY,GAAG,YAAY,CAAC,cAAc,mFAAC;AAErD,IAAA,SAAS,GAAG,KAAK,CAAS,mBAAmB,gFAAC;AAC9C,IAAA,UAAU,GAAG,KAAK,CAAgB,IAAI,iFAAC;AACvC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;IACf,iBAAiB,GAAG,QAAQ,CAC7C,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,UAAU,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,aAAa,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CACtF;IACkB,kBAAkB,GAAG,QAAQ,CAC9C,MAAM,IAAI,CAAC,UAAU,EAAE,IAAI,IAAI,CAAC,YAAY,EAAE,EAAE,iBAAiB,EAAE,IAAI,KAAK,EAAA,IAAA,SAAA,GAAA,CAAA,EAAA,SAAA,EAAA,oBAAA,EAAA,CAAA,8BAAA,EAAA,CAAA,CAC7E;AACkB,IAAA,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAA,WAAA,EAAc,IAAI,CAAC,kBAAkB,EAAE,CAAA,CAAA,CAAG,oFAAC;AAE1E,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACrC,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,EAAE;AAElD,QAAA,OAAO,EAAE,CACP,gCAAgC,EAChC,UAAU,KAAK,YAAY,IAAI,gDAAgD,EAC/E,UAAU,KAAK,UAAU;AACvB,aAAC;AACC,kBAAE;AACF,kBAAE,kDAAkD,CAAC,EACzD,UAAU,KAAK,OAAO,IAAI,QAAQ,EAClC,IAAI,CAAC,KAAK,EAAE,CACb;AACH,IAAA,CAAC,8EAAC;wGA7BS,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAApB,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,SAAA,EAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,UAAA,EAAA,WAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,iBAAA,EAAA,YAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,MAAA,EAAA,YAAA,EAAA,EAAA,UAAA,EAAA,EAAA,OAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,eAAA,EAAA,6BAAA,EAAA,qBAAA,EAAA,wBAAA,EAAA,gBAAA,EAAA,kCAAA,EAAA,sBAAA,EAAA,EAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,cAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAEgB,cAAc,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAtBnD;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEU,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAhChC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,eAAe;oBACzB,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,IAAI,EAAE,YAAY;AAClB,wBAAA,mBAAmB,EAAE,qBAAqB;AAC1C,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,+BAA+B,EAAE,qBAAqB;AACtD,wBAAA,0BAA0B,EAAE,gBAAgB;AAC5C,wBAAA,oCAAoC,EAAE,sBAAsB;AAC7D,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;AAkBT,EAAA,CAAA;AACF,iBAAA;iGAGgD,cAAc,CAAA,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,SAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,WAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,UAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,YAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA,KAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,KAAA,EAAA,OAAA,EAAA,QAAA,EAAA,KAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MCzBlD,wBAAwB,CAAA;AAChB,IAAA,MAAM,GAAG,MAAM,CAAC,aAAa,CAAC;AAExC,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,4EAAC;AAEf,IAAA,OAAO,GAAG,QAAQ,CAAC,MAAK;QACzC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AAErC,QAAA,OAAO,EAAE,CACP,qCAAqC,EACrC,UAAU,KAAK,YAAY,IAAI,QAAQ,EACvC,UAAU,KAAK,UAAU,IAAI,QAAQ,EACrC,UAAU,KAAK,OAAO,IAAI,eAAe,EACzC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,WAAW,IAAI,gCAAgC,EACvE,IAAI,CAAC,KAAK,EAAE,CACb;AACH,IAAA,CAAC,8EAAC;wGAhBS,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,uVAFzB,CAAA,cAAA,CAAgB,EAAA,QAAA,EAAA,IAAA,EAAA,eAAA,EAAA,EAAA,CAAA,uBAAA,CAAA,MAAA,EAAA,CAAA;;4FAEf,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAVpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;oBAC7B,eAAe,EAAE,uBAAuB,CAAC,MAAM;AAC/C,oBAAA,IAAI,EAAE;AACJ,wBAAA,SAAS,EAAE,WAAW;AACtB,wBAAA,yBAAyB,EAAE,eAAe;AAC1C,wBAAA,0BAA0B,EAAE,gBAAgB;AAC7C,qBAAA;AACD,oBAAA,QAAQ,EAAE,CAAA,cAAA,CAAgB;AAC3B,iBAAA;;;ACbD;;AAEG;;;;"}
|
package/layout/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @edsis/ui/layout
|
|
2
2
|
|
|
3
|
-
Primitive layout projection untuk menyusun shell UI dengan satu root `ui-layout`, satu variant layout (`vertical`, `horizontal`, atau `
|
|
3
|
+
Primitive layout projection untuk menyusun shell UI dengan satu root `ui-layout`, satu variant layout (`vertical`, `horizontal`, `empty`, atau `fluid`), slot `ui-layout-nav`, dan area `ui-layout-content` yang menjadi scroll container utama.
|
|
4
4
|
|
|
5
5
|
README ini mendokumentasikan seluruh API publik yang diekspor oleh package agar consumer bisa memahami kontrak komponen, type, service, dan perilaku layout tanpa perlu membaca source code.
|
|
6
6
|
|
|
@@ -14,6 +14,7 @@ import {
|
|
|
14
14
|
UiLayoutComponent,
|
|
15
15
|
UiLayoutContentComponent,
|
|
16
16
|
UiLayoutEmptyComponent,
|
|
17
|
+
UiLayoutFluidComponent,
|
|
17
18
|
UiLayoutHorizontalComponent,
|
|
18
19
|
UiLayoutNavComponent,
|
|
19
20
|
UiLayoutVerticalComponent,
|
|
@@ -65,10 +66,10 @@ Struktur yang direkomendasikan adalah sebagai berikut.
|
|
|
65
66
|
|
|
66
67
|
```html
|
|
67
68
|
<ui-layout>
|
|
68
|
-
<ui-layout-vertical | ui-layout-horizontal | ui-layout-empty>
|
|
69
|
+
<ui-layout-vertical | ui-layout-horizontal | ui-layout-empty | ui-layout-fluid>
|
|
69
70
|
<ui-layout-nav>...</ui-layout-nav>
|
|
70
71
|
<ui-layout-content>...</ui-layout-content>
|
|
71
|
-
</ui-layout-vertical | ui-layout-horizontal | ui-layout-empty>
|
|
72
|
+
</ui-layout-vertical | ui-layout-horizontal | ui-layout-empty | ui-layout-fluid>
|
|
72
73
|
</ui-layout>
|
|
73
74
|
```
|
|
74
75
|
|
|
@@ -77,6 +78,7 @@ Aturan penggunaannya:
|
|
|
77
78
|
- Gunakan tepat satu variant layout di dalam `ui-layout`.
|
|
78
79
|
- Untuk layout `vertical` dan `horizontal`, urutan child yang umum adalah `ui-layout-nav` lalu `ui-layout-content`.
|
|
79
80
|
- Untuk layout `empty`, biasanya cukup `ui-layout-content`.
|
|
81
|
+
- Untuk layout `fluid`, child dapat berupa konten page tunggal yang ingin dipusatkan terhadap frame.
|
|
80
82
|
- `ui-layout-content` adalah area yang memiliki `overflow-auto`, jadi konten utama sebaiknya ditempatkan di sana.
|
|
81
83
|
- Pada mode `vertical`, lebar nav mengikuti kontennya sendiri (`w-max`), bukan dipaksa oleh root layout.
|
|
82
84
|
|
|
@@ -120,6 +122,16 @@ Aturan penggunaannya:
|
|
|
120
122
|
</ui-layout>
|
|
121
123
|
```
|
|
122
124
|
|
|
125
|
+
### Fluid
|
|
126
|
+
|
|
127
|
+
```html
|
|
128
|
+
<ui-layout surface="grid" appearance="border-rail" width="fluid">
|
|
129
|
+
<ui-layout-fluid>
|
|
130
|
+
<section class="w-full max-w-xl border border-border bg-card/90 p-6">Content</section>
|
|
131
|
+
</ui-layout-fluid>
|
|
132
|
+
</ui-layout>
|
|
133
|
+
```
|
|
134
|
+
|
|
123
135
|
## Pola page-level yang direkomendasikan
|
|
124
136
|
|
|
125
137
|
Untuk halaman yang memiliki default sendiri tetapi tetap harus tunduk pada nilai local storage yang sudah tersimpan, pakai `LayoutService.registerDefaults(...)` sekali di level page, lalu bind root `ui-layout` ke signal service.
|
|
@@ -184,13 +196,15 @@ Inputs:
|
|
|
184
196
|
|
|
185
197
|
Behavior:
|
|
186
198
|
|
|
187
|
-
-
|
|
188
|
-
-
|
|
199
|
+
- Jika consumer memberi input manual `surface`, `appearance`, atau `width`, nilai itu dipakai sebagai override in-memory untuk instance aktif tanpa menulis `localStorage`.
|
|
200
|
+
- Jika input manual kosong, primitive mendaftarkan default `surface`, `appearance`, dan `width` ke `LayoutService` hanya saat local storage belum memiliki nilai valid.
|
|
201
|
+
- Nilai visual final selalu dibaca kembali dari `LayoutService`, sehingga child primitive tetap membaca state yang sama selama instance aktif.
|
|
189
202
|
- Menambahkan atribut host `data-surface`, `data-layout-appearance`, `data-layout-style`, `data-layout-width`, dan `data-layout-type`.
|
|
190
|
-
- Root tidak menyediakan input `type`. Type aktif dikendalikan oleh variant layout yang dirender, atau oleh consumer melalui `LayoutService.registerDefaults({ type })` sebelum template mengevaluasi `layout.type()`.
|
|
203
|
+
- Root tidak menyediakan input `type`. Type aktif dikendalikan oleh variant layout yang dirender sebagai override in-memory, atau oleh consumer melalui `LayoutService.registerDefaults({ type })` sebelum template mengevaluasi `layout.type()`.
|
|
191
204
|
- Selalu merender frame border.
|
|
192
205
|
- Jika `appearance="border-rail"`, root menambah rail dekoratif di empat sudut frame dan memanjangkan garis sudut itu sampai tepi viewport.
|
|
193
206
|
- Jika `width="container"`, frame dipusatkan mulai breakpoint `lg` dengan container behavior.
|
|
207
|
+
- Jika `width="fluid"` dan variant aktif adalah `ui-layout-fluid`, frame akan shrink mengikuti tinggi dan lebar konten lalu dipusatkan terhadap viewport.
|
|
194
208
|
|
|
195
209
|
### `UiLayoutVerticalComponent`
|
|
196
210
|
|
|
@@ -206,7 +220,7 @@ Inputs:
|
|
|
206
220
|
|
|
207
221
|
Behavior:
|
|
208
222
|
|
|
209
|
-
- Mengatur `LayoutService.type` menjadi `'vertical'`.
|
|
223
|
+
- Mengatur `LayoutService.type` menjadi `'vertical'` hanya untuk state aktif dan tidak menulis `localStorage`.
|
|
210
224
|
- Menggunakan grid `grid-cols-[auto_minmax(0,1fr)]`.
|
|
211
225
|
- Dalam mode `border-rail`, host dibuat `overflow-visible` agar rail nav/frame dapat mengekstensi keluar area frame.
|
|
212
226
|
|
|
@@ -224,7 +238,7 @@ Inputs:
|
|
|
224
238
|
|
|
225
239
|
Behavior:
|
|
226
240
|
|
|
227
|
-
- Mengatur `LayoutService.type` menjadi `'horizontal'`.
|
|
241
|
+
- Mengatur `LayoutService.type` menjadi `'horizontal'` hanya untuk state aktif dan tidak menulis `localStorage`.
|
|
228
242
|
- Menggunakan flex column untuk menyusun nav dan content.
|
|
229
243
|
- Tidak merender rail nav vertikal khusus.
|
|
230
244
|
|
|
@@ -242,7 +256,7 @@ Inputs:
|
|
|
242
256
|
|
|
243
257
|
Behavior:
|
|
244
258
|
|
|
245
|
-
- Mengatur `LayoutService.type` menjadi `'empty'`.
|
|
259
|
+
- Mengatur `LayoutService.type` menjadi `'empty'` hanya untuk state aktif dan tidak menulis `localStorage`.
|
|
246
260
|
- Menyediakan wrapper penuh untuk satu area konten.
|
|
247
261
|
- `ui-layout-nav` akan tersembunyi jika tetap dirender di mode ini.
|
|
248
262
|
|
|
@@ -320,16 +334,18 @@ Gunakan `appearance` di template Angular. Alias `layout-style` tetap tersedia un
|
|
|
320
334
|
|
|
321
335
|
Nilai `width` yang tersedia berasal dari `UI_LAYOUT_WIDTHS`.
|
|
322
336
|
|
|
323
|
-
| Nilai | Perilaku
|
|
324
|
-
| ------------- |
|
|
325
|
-
| `'full'` | Root menggunakan padding `p-4`, frame dan content tetap full width.
|
|
326
|
-
| `'wide'` | Di bawah `lg` tampil seperti `full`, mulai `lg` memakai padding `p-12` di root.
|
|
327
|
-
| `'container'` | Di bawah `lg` tampil seperti `full`, mulai `lg` root memakai `py-16` tanpa padding horizontal, lalu frame/content dipusatkan dengan container behavior.
|
|
337
|
+
| Nilai | Perilaku |
|
|
338
|
+
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
339
|
+
| `'full'` | Root menggunakan padding `p-4`, frame dan content tetap full width. |
|
|
340
|
+
| `'wide'` | Di bawah `lg` tampil seperti `full`, mulai `lg` memakai padding `p-12` di root. |
|
|
341
|
+
| `'container'` | Di bawah `lg` tampil seperti `full`, mulai `lg` root memakai `py-16` tanpa padding horizontal, lalu frame/content dipusatkan dengan container behavior. |
|
|
342
|
+
| `'fluid'` | Dipakai untuk `ui-layout-fluid`: root dan rail menjadi kanvas centering, frame shrink mengikuti ukuran konten, lalu tetap dibatasi `max-width` dan `max-height` viewport. |
|
|
328
343
|
|
|
329
344
|
Ringkasnya:
|
|
330
345
|
|
|
331
346
|
- `wide` dan `container` sengaja collapse ke tampilan `full` di bawah breakpoint `lg`.
|
|
332
347
|
- Perbedaan utama `container` muncul mulai `lg`, saat frame dan content tidak lagi full bleed secara horizontal.
|
|
348
|
+
- `fluid` ditujukan untuk halaman tunggal seperti auth, splash, atau status page yang membutuhkan frame auto-centered di kedua sumbu.
|
|
333
349
|
|
|
334
350
|
## `LayoutService`
|
|
335
351
|
|
|
@@ -353,30 +369,31 @@ Readonly signals:
|
|
|
353
369
|
|
|
354
370
|
Methods:
|
|
355
371
|
|
|
356
|
-
| Method | Signature
|
|
357
|
-
| --------------------- |
|
|
358
|
-
| `registerSurface` | `(surface: UiLayoutSurface) => void`
|
|
359
|
-
| `registerType` | `(type: UiLayoutType) => void`
|
|
360
|
-
| `registerAppearance` | `(appearance: UiLayoutStyle) => void`
|
|
361
|
-
| `registerStyle` | `(style: UiLayoutStyle) => void`
|
|
362
|
-
| `registerWidth` | `(width: UiLayoutWidth) => void`
|
|
363
|
-
| `registerDefaults` | `(defaults: { surface?, appearance?, type?, width? }) => this`
|
|
364
|
-
| `setSurface` | `(surface: UiLayoutSurface) => void`
|
|
365
|
-
| `setType` | `(type: UiLayoutType) => void`
|
|
366
|
-
| `setAppearance` | `(appearance: UiLayoutStyle) => void`
|
|
367
|
-
| `setStyle` | `(style: UiLayoutStyle) => void`
|
|
368
|
-
| `setWidth` | `(width: UiLayoutWidth) => void`
|
|
369
|
-
| `getStoredSurface` | `() => UiLayoutSurface`
|
|
370
|
-
| `getStoredType` | `() => UiLayoutType`
|
|
371
|
-
| `getStoredAppearance` | `() => UiLayoutStyle`
|
|
372
|
-
| `getStoredStyle` | `() => UiLayoutStyle`
|
|
373
|
-
| `getStoredWidth` | `() => UiLayoutWidth`
|
|
372
|
+
| Method | Signature | Deskripsi |
|
|
373
|
+
| --------------------- | ---------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
374
|
+
| `registerSurface` | `(surface: UiLayoutSurface) => void` | Mendaftarkan fallback `layout-surface` ke local storage hanya jika storage belum memiliki nilai valid. Jika sudah ada nilai valid, service tetap memakai nilai yang tersimpan. |
|
|
375
|
+
| `registerType` | `(type: UiLayoutType) => void` | Mendaftarkan fallback `layout-type` ke local storage hanya jika storage belum memiliki nilai valid. Jika sudah ada nilai valid, service tetap memakai nilai yang tersimpan. |
|
|
376
|
+
| `registerAppearance` | `(appearance: UiLayoutStyle) => void` | Mendaftarkan fallback `layout-appearance` ke local storage hanya jika storage belum memiliki nilai valid. Jika sudah ada nilai valid, service tetap memakai nilai yang tersimpan. |
|
|
377
|
+
| `registerStyle` | `(style: UiLayoutStyle) => void` | Alias kompatibilitas untuk `registerAppearance(...)`. |
|
|
378
|
+
| `registerWidth` | `(width: UiLayoutWidth) => void` | Mendaftarkan fallback `layout-width` ke local storage hanya jika storage belum memiliki nilai valid. Jika sudah ada nilai valid, service tetap memakai nilai yang tersimpan. |
|
|
379
|
+
| `registerDefaults` | `(defaults: { surface?, appearance?, type?, width? }) => this` | Mendaftarkan beberapa fallback sekaligus. Ini adalah API yang direkomendasikan untuk page-level default karena consumer cukup memanggil satu method dan tetap menghormati nilai storage yang sudah valid. |
|
|
380
|
+
| `setSurface` | `(surface: UiLayoutSurface, options?: { persist?: boolean }) => void` | Menulis surface ke signal. Secara default juga menulis `localStorage`, tetapi consumer dapat memakai `persist: false` untuk override sementara. |
|
|
381
|
+
| `setType` | `(type: UiLayoutType, options?: { persist?: boolean }) => void` | Menulis type ke signal. Secara default juga menulis `localStorage`, tetapi consumer dapat memakai `persist: false` untuk override sementara. |
|
|
382
|
+
| `setAppearance` | `(appearance: UiLayoutStyle, options?: { persist?: boolean }) => void` | Menulis appearance ke signal. Secara default juga menulis `layout-appearance`, tetapi consumer dapat memakai `persist: false` untuk override sementara. |
|
|
383
|
+
| `setStyle` | `(style: UiLayoutStyle, options?: { persist?: boolean }) => void` | Alias kompatibilitas untuk `setAppearance(...)`, termasuk opsi `persist`. |
|
|
384
|
+
| `setWidth` | `(width: UiLayoutWidth, options?: { persist?: boolean }) => void` | Menulis width ke signal. Secara default juga menulis `localStorage`, tetapi consumer dapat memakai `persist: false` untuk override sementara. |
|
|
385
|
+
| `getStoredSurface` | `() => UiLayoutSurface` | Membaca surface yang valid dari storage atau default. |
|
|
386
|
+
| `getStoredType` | `() => UiLayoutType` | Membaca type yang valid dari storage atau default. |
|
|
387
|
+
| `getStoredAppearance` | `() => UiLayoutStyle` | Membaca appearance yang valid dari storage atau default. |
|
|
388
|
+
| `getStoredStyle` | `() => UiLayoutStyle` | Alias kompatibilitas untuk `getStoredAppearance()`. |
|
|
389
|
+
| `getStoredWidth` | `() => UiLayoutWidth` | Membaca width yang valid dari storage atau default. |
|
|
374
390
|
|
|
375
391
|
Persistence behavior:
|
|
376
392
|
|
|
377
393
|
- Storage key: `layout-surface`, `layout-type`, `layout-appearance`, dan `layout-width`.
|
|
378
394
|
- Default value: `flat`, `vertical`, `flat`, dan `full`.
|
|
379
395
|
- `registerDefaults(...)` adalah API yang direkomendasikan untuk menetapkan default per halaman tanpa menimpa nilai valid yang sudah tersimpan sebelumnya.
|
|
396
|
+
- Manual template input pada `ui-layout` dan variant layout yang dirender consumer hanya mengubah state aktif; keduanya tidak lagi menulis `localStorage`.
|
|
380
397
|
- Method `registerSurface(...)`, `registerType(...)`, `registerAppearance(...)`, dan `registerWidth(...)` tetap tersedia bila consumer memang perlu registrasi yang lebih granular.
|
|
381
398
|
- Legacy storage key `layout-style` masih dibaca untuk kompatibilitas dan akan dibersihkan ketika appearance ditulis ulang ke `layout-appearance`.
|
|
382
399
|
- Aman untuk SSR karena hanya mengakses `localStorage` saat runtime browser tersedia.
|
|
@@ -408,20 +425,20 @@ Seluruh symbol berikut diekspor dari `@edsis/ui/layout/types`.
|
|
|
408
425
|
|
|
409
426
|
| Symbol | Nilai |
|
|
410
427
|
| ---------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
411
|
-
| `UiLayoutType` | `vertical`, `horizontal`, `empty`
|
|
428
|
+
| `UiLayoutType` | `vertical`, `horizontal`, `empty`, `fluid` |
|
|
412
429
|
| `UiLayoutSurface` | `flat`, `grid`, `honeycome`, `line-vertical`, `line-horizontal` |
|
|
413
430
|
| `UiLayoutStyle` | `flat`, `border-rail` |
|
|
414
|
-
| `UiLayoutWidth` | `full`, `wide`, `container`
|
|
431
|
+
| `UiLayoutWidth` | `full`, `wide`, `container`, `fluid` |
|
|
415
432
|
| `UiLayoutContextValue` | Objekt berbentuk `{ surface, type, appearance, style, width }` yang masing-masing berupa readonly signal. |
|
|
416
433
|
|
|
417
434
|
### Constants
|
|
418
435
|
|
|
419
436
|
| Symbol | Nilai |
|
|
420
437
|
| ---------------------------------- | ------------------------------------------------------------------- |
|
|
421
|
-
| `UI_LAYOUT_TYPES` | `['vertical', 'horizontal', 'empty']`
|
|
438
|
+
| `UI_LAYOUT_TYPES` | `['vertical', 'horizontal', 'empty', 'fluid']` |
|
|
422
439
|
| `UI_LAYOUT_SURFACES` | `['flat', 'grid', 'honeycome', 'line-vertical', 'line-horizontal']` |
|
|
423
440
|
| `UI_LAYOUT_STYLES` | `['flat', 'border-rail']` |
|
|
424
|
-
| `UI_LAYOUT_WIDTHS` | `['full', 'wide', 'container']`
|
|
441
|
+
| `UI_LAYOUT_WIDTHS` | `['full', 'wide', 'container', 'fluid']` |
|
|
425
442
|
| `UI_LAYOUT_DEFAULT_SURFACE` | `'flat'` |
|
|
426
443
|
| `UI_LAYOUT_DEFAULT_TYPE` | `'vertical'` |
|
|
427
444
|
| `UI_LAYOUT_DEFAULT_STYLE` | `'flat'` |
|
package/package.json
CHANGED
|
@@ -8,7 +8,7 @@ declare abstract class MenuFocusableItem {
|
|
|
8
8
|
readonly inset: _angular_core.InputSignal<boolean>;
|
|
9
9
|
readonly class: _angular_core.InputSignal<string>;
|
|
10
10
|
readonly variant: _angular_core.InputSignal<MenuItemVariant>;
|
|
11
|
-
readonly selected: _angular_core.OutputEmitterRef<
|
|
11
|
+
readonly selected: _angular_core.OutputEmitterRef<MouseEvent | KeyboardEvent>;
|
|
12
12
|
get disabled(): boolean;
|
|
13
13
|
focus(): void;
|
|
14
14
|
getLabel(): string;
|
|
@@ -2,10 +2,10 @@ import * as _angular_core from '@angular/core';
|
|
|
2
2
|
import { Signal } from '@angular/core';
|
|
3
3
|
import { UiNavComponent } from '@edsis/ui/nav';
|
|
4
4
|
|
|
5
|
-
declare const UI_LAYOUT_TYPES: readonly ["vertical", "horizontal", "empty"];
|
|
5
|
+
declare const UI_LAYOUT_TYPES: readonly ["vertical", "horizontal", "empty", "fluid"];
|
|
6
6
|
declare const UI_LAYOUT_SURFACES: readonly ["flat", "grid", "honeycome", "line-vertical", "line-horizontal"];
|
|
7
7
|
declare const UI_LAYOUT_STYLES: readonly ["flat", "border-rail"];
|
|
8
|
-
declare const UI_LAYOUT_WIDTHS: readonly ["full", "wide", "container"];
|
|
8
|
+
declare const UI_LAYOUT_WIDTHS: readonly ["full", "wide", "container", "fluid"];
|
|
9
9
|
type UiLayoutType = (typeof UI_LAYOUT_TYPES)[number];
|
|
10
10
|
type UiLayoutSurface = (typeof UI_LAYOUT_SURFACES)[number];
|
|
11
11
|
type UiLayoutStyle = (typeof UI_LAYOUT_STYLES)[number];
|
|
@@ -31,6 +31,9 @@ declare function isUiLayoutType(value: string | null): value is UiLayoutType;
|
|
|
31
31
|
declare function isUiLayoutStyle(value: string | null): value is UiLayoutStyle;
|
|
32
32
|
declare function isUiLayoutWidth(value: string | null): value is UiLayoutWidth;
|
|
33
33
|
|
|
34
|
+
interface LayoutMutationOptions {
|
|
35
|
+
persist?: boolean;
|
|
36
|
+
}
|
|
34
37
|
declare class LayoutService {
|
|
35
38
|
private readonly platformId;
|
|
36
39
|
private readonly surfaceState;
|
|
@@ -38,10 +41,10 @@ declare class LayoutService {
|
|
|
38
41
|
private readonly styleState;
|
|
39
42
|
private readonly widthState;
|
|
40
43
|
readonly surface: _angular_core.Signal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
|
|
41
|
-
readonly type: _angular_core.Signal<"vertical" | "horizontal" | "empty">;
|
|
44
|
+
readonly type: _angular_core.Signal<"vertical" | "horizontal" | "empty" | "fluid">;
|
|
42
45
|
readonly appearance: _angular_core.Signal<"flat" | "border-rail">;
|
|
43
46
|
readonly style: _angular_core.Signal<"flat" | "border-rail">;
|
|
44
|
-
readonly width: _angular_core.Signal<"full" | "wide" | "container">;
|
|
47
|
+
readonly width: _angular_core.Signal<"fluid" | "full" | "wide" | "container">;
|
|
45
48
|
registerDefaults(defaults: {
|
|
46
49
|
surface?: UiLayoutSurface;
|
|
47
50
|
appearance?: UiLayoutStyle;
|
|
@@ -53,11 +56,11 @@ declare class LayoutService {
|
|
|
53
56
|
registerAppearance(appearance: UiLayoutStyle): void;
|
|
54
57
|
registerStyle(style: UiLayoutStyle): void;
|
|
55
58
|
registerWidth(width: UiLayoutWidth): void;
|
|
56
|
-
setSurface(surface: UiLayoutSurface): void;
|
|
57
|
-
setType(type: UiLayoutType): void;
|
|
58
|
-
setAppearance(appearance: UiLayoutStyle): void;
|
|
59
|
-
setStyle(style: UiLayoutStyle): void;
|
|
60
|
-
setWidth(width: UiLayoutWidth): void;
|
|
59
|
+
setSurface(surface: UiLayoutSurface, options?: LayoutMutationOptions): void;
|
|
60
|
+
setType(type: UiLayoutType, options?: LayoutMutationOptions): void;
|
|
61
|
+
setAppearance(appearance: UiLayoutStyle, options?: LayoutMutationOptions): void;
|
|
62
|
+
setStyle(style: UiLayoutStyle, options?: LayoutMutationOptions): void;
|
|
63
|
+
setWidth(width: UiLayoutWidth, options?: LayoutMutationOptions): void;
|
|
61
64
|
getStoredSurface(): UiLayoutSurface;
|
|
62
65
|
getStoredType(): UiLayoutType;
|
|
63
66
|
getStoredAppearance(): UiLayoutStyle;
|
|
@@ -78,24 +81,26 @@ declare class UiLayoutComponent {
|
|
|
78
81
|
readonly surface: _angular_core.InputSignal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal" | null>;
|
|
79
82
|
readonly appearance: _angular_core.InputSignal<"flat" | "border-rail" | null>;
|
|
80
83
|
readonly layoutStyleAttribute: _angular_core.InputSignal<"flat" | "border-rail" | null>;
|
|
81
|
-
readonly width: _angular_core.InputSignal<"full" | "wide" | "container" | null>;
|
|
84
|
+
readonly width: _angular_core.InputSignal<"fluid" | "full" | "wide" | "container" | null>;
|
|
82
85
|
readonly class: _angular_core.InputSignal<string>;
|
|
83
86
|
protected readonly appearanceInput: _angular_core.Signal<"flat" | "border-rail" | null>;
|
|
84
87
|
protected readonly resolvedSurface: _angular_core.Signal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
|
|
85
88
|
protected readonly resolvedAppearance: _angular_core.Signal<"flat" | "border-rail">;
|
|
86
89
|
protected readonly resolvedStyle: _angular_core.Signal<"flat" | "border-rail">;
|
|
87
|
-
protected readonly resolvedWidth: _angular_core.Signal<"full" | "wide" | "container">;
|
|
90
|
+
protected readonly resolvedWidth: _angular_core.Signal<"fluid" | "full" | "wide" | "container">;
|
|
88
91
|
protected readonly isBorderRail: _angular_core.Signal<boolean>;
|
|
92
|
+
protected readonly isFluidFrame: _angular_core.Signal<boolean>;
|
|
89
93
|
protected readonly showsHorizontalInsetRails: _angular_core.Signal<boolean>;
|
|
90
|
-
protected readonly
|
|
94
|
+
protected readonly frameStageClasses: _angular_core.Signal<string>;
|
|
91
95
|
protected readonly railAnchorClasses: _angular_core.Signal<string>;
|
|
92
96
|
protected readonly contentShellClasses: _angular_core.Signal<string>;
|
|
93
97
|
protected readonly hostClasses: _angular_core.Signal<string>;
|
|
94
98
|
protected readonly frameClasses: _angular_core.Signal<string>;
|
|
99
|
+
protected readonly frameLayerClasses: _angular_core.Signal<string>;
|
|
95
100
|
constructor();
|
|
96
101
|
private surfaceClasses;
|
|
97
|
-
private
|
|
98
|
-
private
|
|
102
|
+
private widthPaddingClasses;
|
|
103
|
+
private frameSizeClasses;
|
|
99
104
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiLayoutComponent, never>;
|
|
100
105
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLayoutComponent, "ui-layout", never, { "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "layoutStyleAttribute": { "alias": "layout-style"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
101
106
|
}
|
|
@@ -127,6 +132,15 @@ declare class UiLayoutEmptyComponent {
|
|
|
127
132
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLayoutEmptyComponent, "ui-layout-empty", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
128
133
|
}
|
|
129
134
|
|
|
135
|
+
declare class UiLayoutFluidComponent {
|
|
136
|
+
private readonly layout;
|
|
137
|
+
readonly class: _angular_core.InputSignal<string>;
|
|
138
|
+
protected readonly classes: _angular_core.Signal<string>;
|
|
139
|
+
constructor();
|
|
140
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<UiLayoutFluidComponent, never>;
|
|
141
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLayoutFluidComponent, "ui-layout-fluid", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
142
|
+
}
|
|
143
|
+
|
|
130
144
|
declare class UiLayoutNavComponent {
|
|
131
145
|
protected readonly layout: LayoutService;
|
|
132
146
|
protected readonly projectedNav: _angular_core.Signal<UiNavComponent | undefined>;
|
|
@@ -149,5 +163,5 @@ declare class UiLayoutContentComponent {
|
|
|
149
163
|
static ɵcmp: _angular_core.ɵɵComponentDeclaration<UiLayoutContentComponent, "ui-layout-content", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
|
|
150
164
|
}
|
|
151
165
|
|
|
152
|
-
export { LayoutService, UI_LAYOUT_APPEARANCE_STORAGE_KEY, UI_LAYOUT_DEFAULT_STYLE, UI_LAYOUT_DEFAULT_SURFACE, UI_LAYOUT_DEFAULT_TYPE, UI_LAYOUT_DEFAULT_WIDTH, UI_LAYOUT_STYLES, UI_LAYOUT_STYLE_STORAGE_KEY, UI_LAYOUT_SURFACES, UI_LAYOUT_SURFACE_STORAGE_KEY, UI_LAYOUT_TYPES, UI_LAYOUT_TYPE_STORAGE_KEY, UI_LAYOUT_WIDTHS, UI_LAYOUT_WIDTH_STORAGE_KEY, UiLayoutComponent, UiLayoutContentComponent, UiLayoutEmptyComponent, UiLayoutHorizontalComponent, UiLayoutNavComponent, UiLayoutVerticalComponent, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
|
|
166
|
+
export { LayoutService, UI_LAYOUT_APPEARANCE_STORAGE_KEY, UI_LAYOUT_DEFAULT_STYLE, UI_LAYOUT_DEFAULT_SURFACE, UI_LAYOUT_DEFAULT_TYPE, UI_LAYOUT_DEFAULT_WIDTH, UI_LAYOUT_STYLES, UI_LAYOUT_STYLE_STORAGE_KEY, UI_LAYOUT_SURFACES, UI_LAYOUT_SURFACE_STORAGE_KEY, UI_LAYOUT_TYPES, UI_LAYOUT_TYPE_STORAGE_KEY, UI_LAYOUT_WIDTHS, UI_LAYOUT_WIDTH_STORAGE_KEY, UiLayoutComponent, UiLayoutContentComponent, UiLayoutEmptyComponent, UiLayoutFluidComponent, UiLayoutHorizontalComponent, UiLayoutNavComponent, UiLayoutVerticalComponent, isUiLayoutStyle, isUiLayoutSurface, isUiLayoutType, isUiLayoutWidth };
|
|
153
167
|
export type { UiLayoutContextValue, UiLayoutStyle, UiLayoutSurface, UiLayoutType, UiLayoutWidth };
|