@ojiepermana/angular-theme 22.0.33 → 22.0.35

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.
@@ -149,10 +149,10 @@ class LayoutService {
149
149
  getStoredAppearanceOrDefault(fallback) {
150
150
  return this.readStoredAppearance() ?? fallback;
151
151
  }
152
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Service });
153
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: LayoutService });
152
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutService, deps: [], target: i0.ɵɵFactoryTarget.Service });
153
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.3", ngImport: i0, type: LayoutService });
154
154
  }
155
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutService, decorators: [{
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutService, decorators: [{
156
156
  type: Service
157
157
  }] });
158
158
 
@@ -311,10 +311,10 @@ class LayoutLoadingService {
311
311
  isBrowser() {
312
312
  return isPlatformBrowser(this.platformId);
313
313
  }
314
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Service });
315
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService });
314
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutLoadingService, deps: [], target: i0.ɵɵFactoryTarget.Service });
315
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.3", ngImport: i0, type: LayoutLoadingService });
316
316
  }
317
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingService, decorators: [{
317
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutLoadingService, decorators: [{
318
318
  type: Service
319
319
  }], ctorParameters: () => [] });
320
320
 
@@ -0,0 +1,589 @@
1
+ import * as i0 from '@angular/core';
2
+ import { input, booleanAttribute, Component, computed } from '@angular/core';
3
+ import { NavigationHeaderInitialComponent, NavigationHeaderTitleComponent, NavigationFooterActionComponent, NavigationFooterInitialComponent, NavigationFooterTitleComponent, NavigationSidebarComponent, NavigationHeaderComponent, NavigationFooterComponent, NavigationDockbarComponent, NavigationNavbarComponent, NavigationFlyoutComponent, NavigationContainerComponent } from '@ojiepermana/angular-navigation';
4
+ import { IconComponent } from '@ojiepermana/angular-component/icon';
5
+ import { NgTemplateOutlet } from '@angular/common';
6
+ import { LayoutComponent, LayoutVerticalComponent, LayoutHorizontalComponent, LayoutEmptyComponent, LayoutFluidComponent, LayoutNavigationComponent, LayoutContentComponent } from '@ojiepermana/angular-theme/layout';
7
+ import { LAYOUT_DEFAULT_SURFACE, LAYOUT_DEFAULT_APPEARANCE, LAYOUT_DEFAULT_WIDTH, LAYOUT_DEFAULT_TYPE } from '@ojiepermana/angular-theme/layout/types';
8
+
9
+ /**
10
+ * Bentuk identitas yang dikonsumsi wrapper layout. Library hanya mendefinisikan
11
+ * strukturnya; nilai konkret (brand/user) disediakan consumer sebagai input.
12
+ */
13
+
14
+ /**
15
+ * Slot brand untuk `<NavigationHeader>`: inisial/logo + judul. Murni input-driven.
16
+ *
17
+ * `compact` (dockbar / rail ikon-only) menyembunyikan judul. `host.class = 'contents'`
18
+ * membuat `NavigationHeaderInitial` + `NavigationHeaderTitle` tetap menjadi flex-child
19
+ * langsung baris header; auto-hide judul saat sidebar collapsed (via `NAVIGATION_SHELL`)
20
+ * tetap berlaku karena DI mengalir lewat live tree ke `<Navigation>`.
21
+ */
22
+ class LayoutBrand {
23
+ /** Identitas brand (nama, ikon, judul, subjudul). */
24
+ brand = input.required(/* @ts-ignore */
25
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
26
+ /** Sembunyikan judul, sisakan inisial saja (dockbar / rail ikon-only). */
27
+ compact = input(false, { ...(ngDevMode ? { debugName: "compact" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
28
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutBrand, deps: [], target: i0.ɵɵFactoryTarget.Component });
29
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutBrand, isStandalone: true, selector: "LayoutBrand", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, compact: { classPropertyName: "compact", publicName: "compact", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
30
+ <NavigationHeaderInitial [name]="brand().name" [icon]="brand().icon" />
31
+ @if (!compact()) {
32
+ <NavigationHeaderTitle [title]="brand().title" [subtitle]="brand().subtitle" />
33
+ }
34
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationHeaderInitialComponent, selector: "NavigationHeaderInitial", inputs: ["name", "src", "initials", "icon", "class"] }, { kind: "component", type: NavigationHeaderTitleComponent, selector: "NavigationHeaderTitle", inputs: ["title", "subtitle", "class"] }] });
35
+ }
36
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutBrand, decorators: [{
37
+ type: Component,
38
+ args: [{
39
+ selector: 'LayoutBrand',
40
+ imports: [NavigationHeaderInitialComponent, NavigationHeaderTitleComponent],
41
+ host: { class: 'contents' },
42
+ template: `
43
+ <NavigationHeaderInitial [name]="brand().name" [icon]="brand().icon" />
44
+ @if (!compact()) {
45
+ <NavigationHeaderTitle [title]="brand().title" [subtitle]="brand().subtitle" />
46
+ }
47
+ `,
48
+ }]
49
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], compact: [{ type: i0.Input, args: [{ isSignal: true, alias: "compact", required: false }] }] } });
50
+
51
+ /**
52
+ * Slot user untuk `<NavigationFooter>`: identitas (opsional) + aksi logout. Murni input-driven.
53
+ *
54
+ * `detailed` menampilkan inisial + nama (sidebar penuh); tanpanya hanya tombol logout.
55
+ * `host.class = 'contents'` membuat anak menjadi flex-child langsung footer — `ml-auto` &
56
+ * auto-hide saat collapsed (via `NAVIGATION_SHELL`) tetap berlaku.
57
+ */
58
+ class LayoutUser {
59
+ /** Identitas user (nama + email). */
60
+ user = input.required(/* @ts-ignore */
61
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
62
+ /** Tampilkan identitas user (inisial + nama), bukan hanya tombol logout. */
63
+ detailed = input(false, { ...(ngDevMode ? { debugName: "detailed" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
64
+ /** Label aksesibilitas tombol logout. */
65
+ logoutLabel = input('Logout', /* @ts-ignore */
66
+ ...(ngDevMode ? [{ debugName: "logoutLabel" }] : /* istanbul ignore next */ []));
67
+ /** Material symbol untuk tombol logout. */
68
+ logoutIcon = input('logout', /* @ts-ignore */
69
+ ...(ngDevMode ? [{ debugName: "logoutIcon" }] : /* istanbul ignore next */ []));
70
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutUser, deps: [], target: i0.ɵɵFactoryTarget.Component });
71
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutUser, isStandalone: true, selector: "LayoutUser", inputs: { user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, detailed: { classPropertyName: "detailed", publicName: "detailed", isSignal: true, isRequired: false, transformFunction: null }, logoutLabel: { classPropertyName: "logoutLabel", publicName: "logoutLabel", isSignal: true, isRequired: false, transformFunction: null }, logoutIcon: { classPropertyName: "logoutIcon", publicName: "logoutIcon", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
72
+ @if (detailed()) {
73
+ <NavigationFooterInitial [name]="user().name" />
74
+ <NavigationFooterTitle [title]="user().name" [subtitle]="user().email" />
75
+ }
76
+
77
+ <NavigationFooterAction>
78
+ <button
79
+ type="button"
80
+ [attr.aria-label]="logoutLabel()"
81
+ [attr.title]="logoutLabel()"
82
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
83
+ >
84
+ <Icon [name]="logoutIcon()" [size]="18" />
85
+ </button>
86
+ </NavigationFooterAction>
87
+ `, isInline: true, dependencies: [{ kind: "component", type: IconComponent, selector: "Icon", inputs: ["name", "class", "size", "fill", "weight", "grade", "opticalSize"] }, { kind: "component", type: NavigationFooterActionComponent, selector: "NavigationFooterAction", inputs: ["class"] }, { kind: "component", type: NavigationFooterInitialComponent, selector: "NavigationFooterInitial", inputs: ["name", "src", "initials", "icon", "class"] }, { kind: "component", type: NavigationFooterTitleComponent, selector: "NavigationFooterTitle", inputs: ["title", "subtitle", "class"] }] });
88
+ }
89
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutUser, decorators: [{
90
+ type: Component,
91
+ args: [{
92
+ selector: 'LayoutUser',
93
+ imports: [
94
+ IconComponent,
95
+ NavigationFooterActionComponent,
96
+ NavigationFooterInitialComponent,
97
+ NavigationFooterTitleComponent,
98
+ ],
99
+ host: { class: 'contents' },
100
+ template: `
101
+ @if (detailed()) {
102
+ <NavigationFooterInitial [name]="user().name" />
103
+ <NavigationFooterTitle [title]="user().name" [subtitle]="user().email" />
104
+ }
105
+
106
+ <NavigationFooterAction>
107
+ <button
108
+ type="button"
109
+ [attr.aria-label]="logoutLabel()"
110
+ [attr.title]="logoutLabel()"
111
+ class="inline-flex h-8 w-8 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
112
+ >
113
+ <Icon [name]="logoutIcon()" [size]="18" />
114
+ </button>
115
+ </NavigationFooterAction>
116
+ `,
117
+ }]
118
+ }], propDecorators: { user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], detailed: [{ type: i0.Input, args: [{ isSignal: true, alias: "detailed", required: false }] }], logoutLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoutLabel", required: false }] }], logoutIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "logoutIcon", required: false }] }] } });
119
+
120
+ /**
121
+ * Tipe nav: sidebar vertikal collapsible (default). Brand header + identitas user di footer.
122
+ *
123
+ * `host.class = 'contents'` membuat `<NavigationSidebar>` menjadi anak efektif `<Navigation>`
124
+ * (h-full, shell-classes), sementara DI `NAVIGATION_SHELL` tetap mengalir lewat live tree dan
125
+ * `<NavigationHeader>` tetap direct child untuk content-projection library.
126
+ */
127
+ class LayoutNavSidebar {
128
+ brand = input.required(/* @ts-ignore */
129
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
130
+ user = input.required(/* @ts-ignore */
131
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
132
+ /** Appearance dari shell (`[appearance]`); `flat` menambahkan border kanan pemisah konten. */
133
+ appearance = input('flat', /* @ts-ignore */
134
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
135
+ /** `flat` → border kanan; selaras border bawah navbar (`border-[1.5px] border-border`). */
136
+ shellClass = computed(() => this.appearance() === 'flat' ? 'border-r-[1.5px] border-border' : '', /* @ts-ignore */
137
+ ...(ngDevMode ? [{ debugName: "shellClass" }] : /* istanbul ignore next */ []));
138
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavSidebar, deps: [], target: i0.ɵɵFactoryTarget.Component });
139
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutNavSidebar, isStandalone: true, selector: "LayoutNavSidebar", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
140
+ <NavigationSidebar nav-sidebar-collapse [class]="shellClass()">
141
+ <NavigationHeader>
142
+ <LayoutBrand [brand]="brand()" />
143
+ </NavigationHeader>
144
+ <NavigationFooter class="px-3">
145
+ <LayoutUser [user]="user()" detailed />
146
+ </NavigationFooter>
147
+ </NavigationSidebar>
148
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationSidebarComponent, selector: "NavigationSidebar", inputs: ["position", "collapsed", "nav-sidebar-collapse", "previewExpanded", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: NavigationFooterComponent, selector: "NavigationFooter", inputs: ["class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }, { kind: "component", type: LayoutUser, selector: "LayoutUser", inputs: ["user", "detailed", "logoutLabel", "logoutIcon"] }] });
149
+ }
150
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavSidebar, decorators: [{
151
+ type: Component,
152
+ args: [{
153
+ selector: 'LayoutNavSidebar',
154
+ imports: [
155
+ NavigationSidebarComponent,
156
+ NavigationHeaderComponent,
157
+ NavigationFooterComponent,
158
+ LayoutBrand,
159
+ LayoutUser,
160
+ ],
161
+ host: { class: 'contents' },
162
+ template: `
163
+ <NavigationSidebar nav-sidebar-collapse [class]="shellClass()">
164
+ <NavigationHeader>
165
+ <LayoutBrand [brand]="brand()" />
166
+ </NavigationHeader>
167
+ <NavigationFooter class="px-3">
168
+ <LayoutUser [user]="user()" detailed />
169
+ </NavigationFooter>
170
+ </NavigationSidebar>
171
+ `,
172
+ }]
173
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }] } });
174
+
175
+ /**
176
+ * Tipe nav: rail ikon vertikal (dockbar). Brand compact (inisial saja) + aksi logout.
177
+ * Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
178
+ */
179
+ class LayoutNavDockbar {
180
+ brand = input.required(/* @ts-ignore */
181
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
182
+ user = input.required(/* @ts-ignore */
183
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
184
+ /** Appearance dari shell (`[appearance]`); `flat` menambahkan border kanan pemisah konten. */
185
+ appearance = input('flat', /* @ts-ignore */
186
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
187
+ /** `flat` → border kanan; selaras border bawah navbar (`border-[1.5px] border-border`). */
188
+ shellClass = computed(() => this.appearance() === 'flat' ? 'border-r-[1.5px] border-border' : '', /* @ts-ignore */
189
+ ...(ngDevMode ? [{ debugName: "shellClass" }] : /* istanbul ignore next */ []));
190
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavDockbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
191
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutNavDockbar, isStandalone: true, selector: "LayoutNavDockbar", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
192
+ <NavigationDockbar [class]="shellClass()">
193
+ <NavigationHeader>
194
+ <LayoutBrand [brand]="brand()" compact />
195
+ </NavigationHeader>
196
+ <NavigationFooter class="px-3">
197
+ <LayoutUser [user]="user()" />
198
+ </NavigationFooter>
199
+ </NavigationDockbar>
200
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationDockbarComponent, selector: "NavigationDockbar", inputs: ["mode", "position", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: NavigationFooterComponent, selector: "NavigationFooter", inputs: ["class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }, { kind: "component", type: LayoutUser, selector: "LayoutUser", inputs: ["user", "detailed", "logoutLabel", "logoutIcon"] }] });
201
+ }
202
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavDockbar, decorators: [{
203
+ type: Component,
204
+ args: [{
205
+ selector: 'LayoutNavDockbar',
206
+ imports: [
207
+ NavigationDockbarComponent,
208
+ NavigationHeaderComponent,
209
+ NavigationFooterComponent,
210
+ LayoutBrand,
211
+ LayoutUser,
212
+ ],
213
+ host: { class: 'contents' },
214
+ template: `
215
+ <NavigationDockbar [class]="shellClass()">
216
+ <NavigationHeader>
217
+ <LayoutBrand [brand]="brand()" compact />
218
+ </NavigationHeader>
219
+ <NavigationFooter class="px-3">
220
+ <LayoutUser [user]="user()" />
221
+ </NavigationFooter>
222
+ </NavigationDockbar>
223
+ `,
224
+ }]
225
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }] } });
226
+
227
+ /**
228
+ * Tipe nav: top bar item inline (navbar, horizontal). `appearance` selaras shell
229
+ * (`flat | border-rail`). Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
230
+ */
231
+ class LayoutNavNavbar {
232
+ brand = input.required(/* @ts-ignore */
233
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
234
+ user = input.required(/* @ts-ignore */
235
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
236
+ /** Appearance dari shell (`[nav-appearance]`). */
237
+ appearance = input('flat', /* @ts-ignore */
238
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
239
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavNavbar, deps: [], target: i0.ɵɵFactoryTarget.Component });
240
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutNavNavbar, isStandalone: true, selector: "LayoutNavNavbar", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
241
+ <NavigationNavbar [nav-appearance]="appearance()" class="border-b-[1.5px] border-border">
242
+ <NavigationHeader>
243
+ <LayoutBrand [brand]="brand()" />
244
+ </NavigationHeader>
245
+ <NavigationFooter class="px-3">
246
+ <LayoutUser [user]="user()" />
247
+ </NavigationFooter>
248
+ </NavigationNavbar>
249
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationNavbarComponent, selector: "NavigationNavbar", inputs: ["nav-position", "nav-appearance", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: NavigationFooterComponent, selector: "NavigationFooter", inputs: ["class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }, { kind: "component", type: LayoutUser, selector: "LayoutUser", inputs: ["user", "detailed", "logoutLabel", "logoutIcon"] }] });
250
+ }
251
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavNavbar, decorators: [{
252
+ type: Component,
253
+ args: [{
254
+ selector: 'LayoutNavNavbar',
255
+ imports: [
256
+ NavigationNavbarComponent,
257
+ NavigationHeaderComponent,
258
+ NavigationFooterComponent,
259
+ LayoutBrand,
260
+ LayoutUser,
261
+ ],
262
+ host: { class: 'contents' },
263
+ template: `
264
+ <NavigationNavbar [nav-appearance]="appearance()" class="border-b-[1.5px] border-border">
265
+ <NavigationHeader>
266
+ <LayoutBrand [brand]="brand()" />
267
+ </NavigationHeader>
268
+ <NavigationFooter class="px-3">
269
+ <LayoutUser [user]="user()" />
270
+ </NavigationFooter>
271
+ </NavigationNavbar>
272
+ `,
273
+ }]
274
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }] } });
275
+
276
+ /**
277
+ * Tipe nav: top bar dengan tombol trigger flyout (horizontal). `appearance` selaras shell.
278
+ * Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
279
+ */
280
+ class LayoutNavFlyout {
281
+ brand = input.required(/* @ts-ignore */
282
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
283
+ user = input.required(/* @ts-ignore */
284
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
285
+ /** Appearance dari shell (`[nav-appearance]`). */
286
+ appearance = input('flat', /* @ts-ignore */
287
+ ...(ngDevMode ? [{ debugName: "appearance" }] : /* istanbul ignore next */ []));
288
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavFlyout, deps: [], target: i0.ɵɵFactoryTarget.Component });
289
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutNavFlyout, isStandalone: true, selector: "LayoutNavFlyout", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
290
+ <NavigationFlyout
291
+ [nav-appearance]="appearance()"
292
+ label="Menu"
293
+ icon="apps"
294
+ class="border-b-[1.5px] border-border"
295
+ >
296
+ <NavigationHeader>
297
+ <LayoutBrand [brand]="brand()" />
298
+ </NavigationHeader>
299
+ <NavigationFooter class="px-3">
300
+ <LayoutUser [user]="user()" />
301
+ </NavigationFooter>
302
+ </NavigationFlyout>
303
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationFlyoutComponent, selector: "NavigationFlyout", inputs: ["label", "icon", "icon-only", "icon-position", "trigger-variant", "trigger-floating", "trigger-class", "nav-position", "nav-appearance", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: NavigationFooterComponent, selector: "NavigationFooter", inputs: ["class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }, { kind: "component", type: LayoutUser, selector: "LayoutUser", inputs: ["user", "detailed", "logoutLabel", "logoutIcon"] }] });
304
+ }
305
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavFlyout, decorators: [{
306
+ type: Component,
307
+ args: [{
308
+ selector: 'LayoutNavFlyout',
309
+ imports: [
310
+ NavigationFlyoutComponent,
311
+ NavigationHeaderComponent,
312
+ NavigationFooterComponent,
313
+ LayoutBrand,
314
+ LayoutUser,
315
+ ],
316
+ host: { class: 'contents' },
317
+ template: `
318
+ <NavigationFlyout
319
+ [nav-appearance]="appearance()"
320
+ label="Menu"
321
+ icon="apps"
322
+ class="border-b-[1.5px] border-border"
323
+ >
324
+ <NavigationHeader>
325
+ <LayoutBrand [brand]="brand()" />
326
+ </NavigationHeader>
327
+ <NavigationFooter class="px-3">
328
+ <LayoutUser [user]="user()" />
329
+ </NavigationFooter>
330
+ </NavigationFlyout>
331
+ `,
332
+ }]
333
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }] } });
334
+
335
+ /**
336
+ * Tipe nav: sidebar brand-only untuk varian `empty` / `fluid` (nav disembunyikan oleh
337
+ * `LayoutNavigation`, jadi tanpa collapse & footer). Lihat {@link LayoutNavSidebar} untuk
338
+ * alasan `host.class = 'contents'`.
339
+ */
340
+ class LayoutNavMinimal {
341
+ brand = input.required(/* @ts-ignore */
342
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
343
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavMinimal, deps: [], target: i0.ɵɵFactoryTarget.Component });
344
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutNavMinimal, isStandalone: true, selector: "LayoutNavMinimal", inputs: { brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
345
+ <NavigationSidebar>
346
+ <NavigationHeader>
347
+ <LayoutBrand [brand]="brand()" />
348
+ </NavigationHeader>
349
+ </NavigationSidebar>
350
+ `, isInline: true, dependencies: [{ kind: "component", type: NavigationSidebarComponent, selector: "NavigationSidebar", inputs: ["position", "collapsed", "nav-sidebar-collapse", "previewExpanded", "class"] }, { kind: "component", type: NavigationHeaderComponent, selector: "NavigationHeader", inputs: ["toggle", "class"] }, { kind: "component", type: LayoutBrand, selector: "LayoutBrand", inputs: ["brand", "compact"] }] });
351
+ }
352
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavMinimal, decorators: [{
353
+ type: Component,
354
+ args: [{
355
+ selector: 'LayoutNavMinimal',
356
+ imports: [NavigationSidebarComponent, NavigationHeaderComponent, LayoutBrand],
357
+ host: { class: 'contents' },
358
+ template: `
359
+ <NavigationSidebar>
360
+ <NavigationHeader>
361
+ <LayoutBrand [brand]="brand()" />
362
+ </NavigationHeader>
363
+ </NavigationSidebar>
364
+ `,
365
+ }]
366
+ }], propDecorators: { brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }] } });
367
+
368
+ /**
369
+ * Wrapper layout shell siap pakai — consumer cukup memberi data input, tidak perlu merakit
370
+ * `Layout > LayoutVertical/Horizontal/Empty/Fluid > LayoutNavigation > Navigation > tipe-nav`.
371
+ *
372
+ * ```html
373
+ * <LayoutWrapperDefault
374
+ * [surface]="surface" [layout-appearance]="appearance" [width]="width"
375
+ * [layout-type]="layoutType" [nav-type]="navType"
376
+ * [data]="navItems" [brand]="brand" [user]="user"
377
+ * >
378
+ * <router-outlet /> <!-- konten halaman diproyeksikan ke LayoutContent -->
379
+ * </LayoutWrapperDefault>
380
+ * ```
381
+ *
382
+ * `register*` default (LayoutService) tetap tanggung jawab consumer; wrapper ini murni
383
+ * presentational — dua sumbu (`effectiveLayoutType` → wrapper, `navKind` → tipe nav) di atas
384
+ * satu skeleton bersama. DI aman: `<Navigation>` mem-*provide* `NAVIGATION_SHELL` di dalam
385
+ * `#body`; tipe nav `display:contents` sehingga `<NavigationXxx>` jadi anak efektif `<Navigation>`.
386
+ */
387
+ class LayoutWrapperDefault {
388
+ /** Surface latar shell (mis. `grid`, `flat`). */
389
+ surface = input(LAYOUT_DEFAULT_SURFACE, /* @ts-ignore */
390
+ ...(ngDevMode ? [{ debugName: "surface" }] : /* istanbul ignore next */ []));
391
+ /** Appearance shell & nav (`flat | border-rail`). */
392
+ appearance = input(LAYOUT_DEFAULT_APPEARANCE, { ...(ngDevMode ? { debugName: "appearance" } : /* istanbul ignore next */ {}), alias: 'layout-appearance' });
393
+ /** Lebar frame (`full`, `container`, dst.). */
394
+ width = input(LAYOUT_DEFAULT_WIDTH, /* @ts-ignore */
395
+ ...(ngDevMode ? [{ debugName: "width" }] : /* istanbul ignore next */ []));
396
+ /** Tipe layout dasar (`vertical | horizontal | empty | fluid`); `empty`/`fluid` override nav. */
397
+ layoutType = input(LAYOUT_DEFAULT_TYPE, { ...(ngDevMode ? { debugName: "layoutType" } : /* istanbul ignore next */ {}), alias: 'layout-type' });
398
+ /** Tipe navigasi (`sidebar | dockbar | navbar | flyout`); diabaikan saat `empty`/`fluid`. */
399
+ navType = input('sidebar', { ...(ngDevMode ? { debugName: "navType" } : /* istanbul ignore next */ {}), alias: 'nav-type' });
400
+ /** Item navigasi. */
401
+ data = input.required(/* @ts-ignore */
402
+ ...(ngDevMode ? [{ debugName: "data" }] : /* istanbul ignore next */ []));
403
+ /** Identitas brand. */
404
+ brand = input.required(/* @ts-ignore */
405
+ ...(ngDevMode ? [{ debugName: "brand" }] : /* istanbul ignore next */ []));
406
+ /** Identitas user. */
407
+ user = input.required(/* @ts-ignore */
408
+ ...(ngDevMode ? [{ debugName: "user" }] : /* istanbul ignore next */ []));
409
+ /** Wrapper layout & nilai `<Layout [layout-type]>`: navbar/flyout = horizontal, sisanya vertical. */
410
+ effectiveLayoutType = computed(() => {
411
+ const layoutType = this.layoutType();
412
+ if (layoutType === 'empty' || layoutType === 'fluid') {
413
+ return layoutType;
414
+ }
415
+ return this.navType() === 'navbar' || this.navType() === 'flyout' ? 'horizontal' : 'vertical';
416
+ }, /* @ts-ignore */
417
+ ...(ngDevMode ? [{ debugName: "effectiveLayoutType" }] : /* istanbul ignore next */ []));
418
+ /** Tipe nav di dalam `#body`: `empty`/`fluid` → `brand` (header-only); selain itu `nav-type`. */
419
+ navKind = computed(() => {
420
+ const layoutType = this.layoutType();
421
+ return layoutType === 'empty' || layoutType === 'fluid' ? 'brand' : this.navType();
422
+ }, /* @ts-ignore */
423
+ ...(ngDevMode ? [{ debugName: "navKind" }] : /* istanbul ignore next */ []));
424
+ /** Lebar host `<Navigation>`: penuh-tinggi (vertical) atau penuh-lebar (horizontal). */
425
+ navClass = computed(() => this.effectiveLayoutType() === 'horizontal' ? 'w-full' : 'h-full', /* @ts-ignore */
426
+ ...(ngDevMode ? [{ debugName: "navClass" }] : /* istanbul ignore next */ []));
427
+ /** Kelas `<LayoutContent>`: `fluid` membatasi lebar & memusatkan; selain itu padding biasa. */
428
+ contentClass = computed(() => this.effectiveLayoutType() === 'fluid' ? 'w-full max-w-3xl p-6' : 'p-6', /* @ts-ignore */
429
+ ...(ngDevMode ? [{ debugName: "contentClass" }] : /* istanbul ignore next */ []));
430
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutWrapperDefault, deps: [], target: i0.ɵɵFactoryTarget.Component });
431
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutWrapperDefault, isStandalone: true, selector: "LayoutWrapperDefault", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "layout-appearance", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, layoutType: { classPropertyName: "layoutType", publicName: "layout-type", isSignal: true, isRequired: false, transformFunction: null }, navType: { classPropertyName: "navType", publicName: "nav-type", isSignal: true, isRequired: false, transformFunction: null }, data: { classPropertyName: "data", publicName: "data", isSignal: true, isRequired: true, transformFunction: null }, brand: { classPropertyName: "brand", publicName: "brand", isSignal: true, isRequired: true, transformFunction: null }, user: { classPropertyName: "user", publicName: "user", isSignal: true, isRequired: true, transformFunction: null } }, host: { classAttribute: "contents" }, ngImport: i0, template: `
432
+ <Layout
433
+ [surface]="surface()"
434
+ [layout-appearance]="appearance()"
435
+ [width]="width()"
436
+ [layout-type]="effectiveLayoutType()"
437
+ >
438
+ <!-- Skeleton bersama: dipakai ulang oleh setiap wrapper di @switch bawah. -->
439
+ <ng-template #body>
440
+ <LayoutNavigation ariaLabel="Primary navigation">
441
+ <Navigation id="main" [data]="data()" [class]="navClass()">
442
+ @switch (navKind()) {
443
+ @case ('navbar') {
444
+ <LayoutNavNavbar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
445
+ }
446
+ @case ('flyout') {
447
+ <LayoutNavFlyout [brand]="brand()" [user]="user()" [appearance]="appearance()" />
448
+ }
449
+ @case ('dockbar') {
450
+ <LayoutNavDockbar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
451
+ }
452
+ @case ('brand') {
453
+ <LayoutNavMinimal [brand]="brand()" />
454
+ }
455
+ @default {
456
+ <LayoutNavSidebar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
457
+ }
458
+ }
459
+ </Navigation>
460
+ </LayoutNavigation>
461
+
462
+ <LayoutContent [class]="contentClass()">
463
+ <ng-content />
464
+ </LayoutContent>
465
+ </ng-template>
466
+
467
+ @switch (effectiveLayoutType()) {
468
+ @case ('empty') {
469
+ <LayoutEmpty>
470
+ <ng-container [ngTemplateOutlet]="body" />
471
+ </LayoutEmpty>
472
+ }
473
+ @case ('fluid') {
474
+ <LayoutFluid>
475
+ <ng-container [ngTemplateOutlet]="body" />
476
+ </LayoutFluid>
477
+ }
478
+ @case ('horizontal') {
479
+ <LayoutHorizontal>
480
+ <ng-container [ngTemplateOutlet]="body" />
481
+ </LayoutHorizontal>
482
+ }
483
+ @default {
484
+ <LayoutVertical>
485
+ <ng-container [ngTemplateOutlet]="body" />
486
+ </LayoutVertical>
487
+ }
488
+ }
489
+ </Layout>
490
+ `, isInline: true, dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LayoutComponent, selector: "Layout", inputs: ["surface", "appearance", "layout-appearance", "width", "layout-type", "class"] }, { kind: "component", type: LayoutVerticalComponent, selector: "LayoutVertical", inputs: ["class"] }, { kind: "component", type: LayoutHorizontalComponent, selector: "LayoutHorizontal", inputs: ["class"] }, { kind: "component", type: LayoutEmptyComponent, selector: "LayoutEmpty", inputs: ["class"] }, { kind: "component", type: LayoutFluidComponent, selector: "LayoutFluid", inputs: ["class"] }, { kind: "component", type: LayoutNavigationComponent, selector: "LayoutNavigation", inputs: ["ariaLabel", "railOffset", "class"] }, { kind: "component", type: LayoutContentComponent, selector: "LayoutContent", inputs: ["class"] }, { kind: "component", type: NavigationContainerComponent, selector: "Navigation", inputs: ["id", "data", "ariaLabel", "compact", "collapse-tree", "class", "itemClass", "nav-group-class", "activeIds", "activeUrl", "openedIds"], outputs: ["openedIdsChange", "itemSelected"] }, { kind: "component", type: LayoutNavSidebar, selector: "LayoutNavSidebar", inputs: ["brand", "user", "appearance"] }, { kind: "component", type: LayoutNavDockbar, selector: "LayoutNavDockbar", inputs: ["brand", "user", "appearance"] }, { kind: "component", type: LayoutNavNavbar, selector: "LayoutNavNavbar", inputs: ["brand", "user", "appearance"] }, { kind: "component", type: LayoutNavFlyout, selector: "LayoutNavFlyout", inputs: ["brand", "user", "appearance"] }, { kind: "component", type: LayoutNavMinimal, selector: "LayoutNavMinimal", inputs: ["brand"] }] });
491
+ }
492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutWrapperDefault, decorators: [{
493
+ type: Component,
494
+ args: [{
495
+ selector: 'LayoutWrapperDefault',
496
+ host: { class: 'contents' },
497
+ imports: [
498
+ NgTemplateOutlet,
499
+ LayoutComponent,
500
+ LayoutVerticalComponent,
501
+ LayoutHorizontalComponent,
502
+ LayoutEmptyComponent,
503
+ LayoutFluidComponent,
504
+ LayoutNavigationComponent,
505
+ LayoutContentComponent,
506
+ NavigationContainerComponent,
507
+ LayoutNavSidebar,
508
+ LayoutNavDockbar,
509
+ LayoutNavNavbar,
510
+ LayoutNavFlyout,
511
+ LayoutNavMinimal,
512
+ ],
513
+ template: `
514
+ <Layout
515
+ [surface]="surface()"
516
+ [layout-appearance]="appearance()"
517
+ [width]="width()"
518
+ [layout-type]="effectiveLayoutType()"
519
+ >
520
+ <!-- Skeleton bersama: dipakai ulang oleh setiap wrapper di @switch bawah. -->
521
+ <ng-template #body>
522
+ <LayoutNavigation ariaLabel="Primary navigation">
523
+ <Navigation id="main" [data]="data()" [class]="navClass()">
524
+ @switch (navKind()) {
525
+ @case ('navbar') {
526
+ <LayoutNavNavbar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
527
+ }
528
+ @case ('flyout') {
529
+ <LayoutNavFlyout [brand]="brand()" [user]="user()" [appearance]="appearance()" />
530
+ }
531
+ @case ('dockbar') {
532
+ <LayoutNavDockbar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
533
+ }
534
+ @case ('brand') {
535
+ <LayoutNavMinimal [brand]="brand()" />
536
+ }
537
+ @default {
538
+ <LayoutNavSidebar [brand]="brand()" [user]="user()" [appearance]="appearance()" />
539
+ }
540
+ }
541
+ </Navigation>
542
+ </LayoutNavigation>
543
+
544
+ <LayoutContent [class]="contentClass()">
545
+ <ng-content />
546
+ </LayoutContent>
547
+ </ng-template>
548
+
549
+ @switch (effectiveLayoutType()) {
550
+ @case ('empty') {
551
+ <LayoutEmpty>
552
+ <ng-container [ngTemplateOutlet]="body" />
553
+ </LayoutEmpty>
554
+ }
555
+ @case ('fluid') {
556
+ <LayoutFluid>
557
+ <ng-container [ngTemplateOutlet]="body" />
558
+ </LayoutFluid>
559
+ }
560
+ @case ('horizontal') {
561
+ <LayoutHorizontal>
562
+ <ng-container [ngTemplateOutlet]="body" />
563
+ </LayoutHorizontal>
564
+ }
565
+ @default {
566
+ <LayoutVertical>
567
+ <ng-container [ngTemplateOutlet]="body" />
568
+ </LayoutVertical>
569
+ }
570
+ }
571
+ </Layout>
572
+ `,
573
+ }]
574
+ }], propDecorators: { surface: [{ type: i0.Input, args: [{ isSignal: true, alias: "surface", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout-appearance", required: false }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], layoutType: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout-type", required: false }] }], navType: [{ type: i0.Input, args: [{ isSignal: true, alias: "nav-type", required: false }] }], data: [{ type: i0.Input, args: [{ isSignal: true, alias: "data", required: true }] }], brand: [{ type: i0.Input, args: [{ isSignal: true, alias: "brand", required: true }] }], user: [{ type: i0.Input, args: [{ isSignal: true, alias: "user", required: true }] }] } });
575
+
576
+ /*
577
+ * Public API of @ojiepermana/angular-theme/layout/wrapper
578
+ *
579
+ * Wrapper blok-jadi untuk layout shell: consumer cukup menyediakan data input
580
+ * (surface, appearance, width, layout-type, nav-type, navigation data, brand, user)
581
+ * tanpa merakit komponen bersarang. `register*` default tetap di consumer.
582
+ */
583
+ // Identitas (bentuk data yang disediakan consumer)
584
+
585
+ /**
586
+ * Generated bundle index. Do not edit.
587
+ */
588
+
589
+ export { LayoutBrand, LayoutNavDockbar, LayoutNavFlyout, LayoutNavMinimal, LayoutNavNavbar, LayoutNavSidebar, LayoutUser, LayoutWrapperDefault };
@@ -39,8 +39,8 @@ class LayoutLoadingComponent {
39
39
  constructor() {
40
40
  inject(DestroyRef).onDestroy(() => this.loading.unregisterHost(this.hostId));
41
41
  }
42
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: LayoutLoadingComponent, isStandalone: true, selector: "LayoutLoading", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "attr.data-state": "state()" } }, ngImport: i0, template: `
42
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutLoadingComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
43
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutLoadingComponent, isStandalone: true, selector: "LayoutLoading", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "hostClasses()", "attr.data-state": "state()" } }, ngImport: i0, template: `
44
44
  @if (isPrimary() && loading.active()) {
45
45
  <div
46
46
  role="progressbar"
@@ -58,7 +58,7 @@ class LayoutLoadingComponent {
58
58
  }
59
59
  `, isInline: true });
60
60
  }
61
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutLoadingComponent, decorators: [{
61
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutLoadingComponent, decorators: [{
62
62
  type: Component,
63
63
  args: [{
64
64
  selector: 'LayoutLoading',
@@ -199,8 +199,8 @@ class LayoutComponent {
199
199
  ? 'h-full w-full lg:container lg:mx-auto'
200
200
  : 'h-full w-full';
201
201
  }
202
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
203
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: LayoutComponent, isStandalone: true, selector: "Layout", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, layoutAppearanceAttribute: { classPropertyName: "layoutAppearanceAttribute", publicName: "layout-appearance", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "layout-type", 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-width": "resolvedWidth()", "attr.data-layout-type": "resolvedType()" } }, ngImport: i0, template: `
202
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
203
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutComponent, isStandalone: true, selector: "Layout", inputs: { surface: { classPropertyName: "surface", publicName: "surface", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, layoutAppearanceAttribute: { classPropertyName: "layoutAppearanceAttribute", publicName: "layout-appearance", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, type: { classPropertyName: "type", publicName: "layout-type", 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-width": "resolvedWidth()", "attr.data-layout-type": "resolvedType()" } }, ngImport: i0, template: `
204
204
  <LayoutLoading />
205
205
 
206
206
  <div data-layout-stage [class]="frameStageClasses()">
@@ -307,7 +307,7 @@ class LayoutComponent {
307
307
  </div>
308
308
  `, isInline: true, dependencies: [{ kind: "component", type: LayoutLoadingComponent, selector: "LayoutLoading", inputs: ["class", "ariaLabel"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
309
309
  }
310
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutComponent, decorators: [{
310
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutComponent, decorators: [{
311
311
  type: Component,
312
312
  args: [{
313
313
  selector: 'Layout',
@@ -438,10 +438,10 @@ class LayoutVerticalComponent {
438
438
  constructor() {
439
439
  this.layout.setType('vertical', { persist: false });
440
440
  }
441
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutVerticalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: LayoutVerticalComponent, isStandalone: true, selector: "LayoutVertical", 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 });
441
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutVerticalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
442
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutVerticalComponent, isStandalone: true, selector: "LayoutVertical", 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 });
443
443
  }
444
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutVerticalComponent, decorators: [{
444
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutVerticalComponent, decorators: [{
445
445
  type: Component,
446
446
  args: [{
447
447
  selector: 'LayoutVertical',
@@ -463,10 +463,10 @@ class LayoutHorizontalComponent {
463
463
  constructor() {
464
464
  this.layout.setType('horizontal', { persist: false });
465
465
  }
466
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutHorizontalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
467
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: LayoutHorizontalComponent, isStandalone: true, selector: "LayoutHorizontal", 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 });
466
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutHorizontalComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
467
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutHorizontalComponent, isStandalone: true, selector: "LayoutHorizontal", 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 });
468
468
  }
469
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutHorizontalComponent, decorators: [{
469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutHorizontalComponent, decorators: [{
470
470
  type: Component,
471
471
  args: [{
472
472
  selector: 'LayoutHorizontal',
@@ -488,10 +488,10 @@ class LayoutEmptyComponent {
488
488
  constructor() {
489
489
  this.layout.setType('empty', { persist: false });
490
490
  }
491
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutEmptyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
492
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: LayoutEmptyComponent, isStandalone: true, selector: "LayoutEmpty", 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 });
491
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutEmptyComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
492
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutEmptyComponent, isStandalone: true, selector: "LayoutEmpty", 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 });
493
493
  }
494
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutEmptyComponent, decorators: [{
494
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutEmptyComponent, decorators: [{
495
495
  type: Component,
496
496
  args: [{
497
497
  selector: 'LayoutEmpty',
@@ -513,10 +513,10 @@ class LayoutFluidComponent {
513
513
  constructor() {
514
514
  this.layout.setType('fluid', { persist: false });
515
515
  }
516
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutFluidComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
517
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: LayoutFluidComponent, isStandalone: true, selector: "LayoutFluid", 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 });
516
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutFluidComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
517
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutFluidComponent, isStandalone: true, selector: "LayoutFluid", 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 });
518
518
  }
519
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutFluidComponent, decorators: [{
519
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutFluidComponent, decorators: [{
520
520
  type: Component,
521
521
  args: [{
522
522
  selector: 'LayoutFluid',
@@ -557,8 +557,8 @@ class LayoutNavigationComponent {
557
557
  (layoutType === 'empty' || layoutType === 'fluid') && 'hidden', this.class());
558
558
  }, /* @ts-ignore */
559
559
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
560
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
561
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: LayoutNavigationComponent, isStandalone: true, selector: "LayoutNavigation", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, railOffset: { classPropertyName: "railOffset", publicName: "railOffset", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, properties: { "class": "classes()", "attr.aria-label": "ariaLabel() || null", "attr.data-layout-type": "layout.type()", "attr.data-layout-appearance": "layout.appearance()", "attr.data-layout-nav-rail-offset": "resolvedRailOffset()" } }, queries: [{ propertyName: "projectedNav", first: true, predicate: NavigationContainerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
560
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavigationComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
561
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: LayoutNavigationComponent, isStandalone: true, selector: "LayoutNavigation", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, railOffset: { classPropertyName: "railOffset", publicName: "railOffset", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "role": "navigation" }, properties: { "class": "classes()", "attr.aria-label": "ariaLabel() || null", "attr.data-layout-type": "layout.type()", "attr.data-layout-appearance": "layout.appearance()", "attr.data-layout-nav-rail-offset": "resolvedRailOffset()" } }, queries: [{ propertyName: "projectedNav", first: true, predicate: NavigationContainerComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
562
562
  @if (showsVerticalRail()) {
563
563
  <div
564
564
  aria-hidden="true"
@@ -581,7 +581,7 @@ class LayoutNavigationComponent {
581
581
  <ng-content />
582
582
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
583
583
  }
584
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutNavigationComponent, decorators: [{
584
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutNavigationComponent, decorators: [{
585
585
  type: Component,
586
586
  args: [{
587
587
  selector: 'LayoutNavigation',
@@ -630,10 +630,10 @@ class LayoutContentComponent {
630
630
  layoutType === 'fluid' && 'max-h-full max-w-full', this.layout.width() === 'container' && 'w-full lg:container lg:mx-auto', this.class());
631
631
  }, /* @ts-ignore */
632
632
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
633
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
634
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: LayoutContentComponent, isStandalone: true, selector: "LayoutContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-layout-type": "layout.type()", "attr.data-layout-width": "layout.width()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
633
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
634
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: LayoutContentComponent, isStandalone: true, selector: "LayoutContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.data-layout-type": "layout.type()", "attr.data-layout-width": "layout.width()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
635
635
  }
636
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: LayoutContentComponent, decorators: [{
636
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: LayoutContentComponent, decorators: [{
637
637
  type: Component,
638
638
  args: [{
639
639
  selector: 'LayoutContent',
@@ -108,10 +108,10 @@ class PageStateService {
108
108
  this.sideOpenRequestVersionState.update((version) => version + 1);
109
109
  return open;
110
110
  }
111
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
112
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageStateService });
111
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
112
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageStateService });
113
113
  }
114
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageStateService, decorators: [{
114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageStateService, decorators: [{
115
115
  type: Injectable
116
116
  }] });
117
117
 
@@ -186,10 +186,10 @@ class PageSideComponent {
186
186
  onCleanup(() => defaultView.removeEventListener('keydown', handler));
187
187
  });
188
188
  }
189
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageSideComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
190
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageSideComponent, isStandalone: true, selector: "PageSide", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "resolvedId", "attr.data-page-slot": "\"side\"", "attr.data-page-side-mode": "resolvedMode()", "attr.data-page-side-open": "page.sideOpen()", "attr.data-page-position": "resolvedPosition()", "attr.aria-hidden": "ariaHidden()", "style.--page-side-width": "resolvedWidth()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
189
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageSideComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
190
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageSideComponent, isStandalone: true, selector: "PageSide", inputs: { mode: { classPropertyName: "mode", publicName: "mode", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, closeOnEsc: { classPropertyName: "closeOnEsc", publicName: "closeOnEsc", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "class": "classes()", "attr.id": "resolvedId", "attr.data-page-slot": "\"side\"", "attr.data-page-side-mode": "resolvedMode()", "attr.data-page-side-open": "page.sideOpen()", "attr.data-page-position": "resolvedPosition()", "attr.aria-hidden": "ariaHidden()", "style.--page-side-width": "resolvedWidth()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
191
191
  }
192
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageSideComponent, decorators: [{
192
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageSideComponent, decorators: [{
193
193
  type: Component,
194
194
  args: [{
195
195
  selector: 'PageSide',
@@ -282,8 +282,8 @@ class PageComponent {
282
282
  handleBackdropClick() {
283
283
  this.page.closeSide();
284
284
  }
285
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
286
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.2", type: PageComponent, isStandalone: true, selector: "Page", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, sideMode: { classPropertyName: "sideMode", publicName: "sideMode", isSignal: true, isRequired: false, transformFunction: null }, sideOpen: { classPropertyName: "sideOpen", publicName: "sideOpen", isSignal: true, isRequired: false, transformFunction: null }, sideWidth: { classPropertyName: "sideWidth", publicName: "sideWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sideOpenChange: "sideOpenChange" }, host: { properties: { "class": "hostClasses()", "attr.data-page-variant": "variant()", "attr.data-page-height": "height()", "attr.data-page-scroll": "scroll()", "attr.data-page-position": "resolvedPosition()", "attr.data-page-side-mode": "resolvedSideMode()", "attr.data-page-side-open": "page.sideOpen()", "style.--page-side-width": "sideWidth()" } }, providers: [PageStateService], queries: [{ propertyName: "projectedSide", first: true, predicate: PageSideComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
285
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
286
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.3", type: PageComponent, isStandalone: true, selector: "Page", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, scroll: { classPropertyName: "scroll", publicName: "scroll", isSignal: true, isRequired: false, transformFunction: null }, position: { classPropertyName: "position", publicName: "position", isSignal: true, isRequired: false, transformFunction: null }, sideMode: { classPropertyName: "sideMode", publicName: "sideMode", isSignal: true, isRequired: false, transformFunction: null }, sideOpen: { classPropertyName: "sideOpen", publicName: "sideOpen", isSignal: true, isRequired: false, transformFunction: null }, sideWidth: { classPropertyName: "sideWidth", publicName: "sideWidth", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { sideOpenChange: "sideOpenChange" }, host: { properties: { "class": "hostClasses()", "attr.data-page-variant": "variant()", "attr.data-page-height": "height()", "attr.data-page-scroll": "scroll()", "attr.data-page-position": "resolvedPosition()", "attr.data-page-side-mode": "resolvedSideMode()", "attr.data-page-side-open": "page.sideOpen()", "style.--page-side-width": "sideWidth()" } }, providers: [PageStateService], queries: [{ propertyName: "projectedSide", first: true, predicate: PageSideComponent, descendants: true, isSignal: true }], ngImport: i0, template: `
287
287
  @if (showsOverlayBackdrop()) {
288
288
  <button
289
289
  type="button"
@@ -309,7 +309,7 @@ class PageComponent {
309
309
  </div>
310
310
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
311
311
  }
312
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageComponent, decorators: [{
312
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageComponent, decorators: [{
313
313
  type: Component,
314
314
  args: [{
315
315
  selector: 'Page',
@@ -367,8 +367,8 @@ class PageSideToggleComponent {
367
367
  handleClick() {
368
368
  this.toggled.emit(this.page.toggleSide());
369
369
  }
370
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageSideToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
371
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageSideToggleComponent, isStandalone: true, selector: "PageSideToggle", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggled: "toggled" }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
370
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageSideToggleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
371
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageSideToggleComponent, isStandalone: true, selector: "PageSideToggle", inputs: { ariaLabel: { classPropertyName: "ariaLabel", publicName: "ariaLabel", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { toggled: "toggled" }, host: { properties: { "class": "hostClasses()" } }, ngImport: i0, template: `
372
372
  <button
373
373
  type="button"
374
374
  [class]="buttonClasses()"
@@ -382,7 +382,7 @@ class PageSideToggleComponent {
382
382
  </button>
383
383
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
384
384
  }
385
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageSideToggleComponent, decorators: [{
385
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageSideToggleComponent, decorators: [{
386
386
  type: Component,
387
387
  args: [{
388
388
  selector: 'PageSideToggle',
@@ -417,10 +417,10 @@ class PageHeaderComponent {
417
417
  ...(ngDevMode ? [{ debugName: "resolvedHeight" }] : /* istanbul ignore next */ []));
418
418
  classes = computed(() => cn('block shrink-0 border-b border-border bg-background', this.class(), this.resolvedHeight() === 'fix' && 'h-12 overflow-hidden'), /* @ts-ignore */
419
419
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
420
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
421
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageHeaderComponent, isStandalone: true, selector: "PageHeader", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "header" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
420
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageHeaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
421
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageHeaderComponent, isStandalone: true, selector: "PageHeader", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "header" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
422
422
  }
423
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageHeaderComponent, decorators: [{
423
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageHeaderComponent, decorators: [{
424
424
  type: Component,
425
425
  args: [{
426
426
  selector: 'PageHeader',
@@ -440,10 +440,10 @@ class PageContentComponent {
440
440
  ...(ngDevMode ? [{ debugName: "resolvedScroll" }] : /* istanbul ignore next */ []));
441
441
  classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()), /* @ts-ignore */
442
442
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
443
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
444
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageContentComponent, isStandalone: true, selector: "PageContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "content" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
443
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageContentComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
444
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageContentComponent, isStandalone: true, selector: "PageContent", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "content" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
445
445
  }
446
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageContentComponent, decorators: [{
446
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageContentComponent, decorators: [{
447
447
  type: Component,
448
448
  args: [{
449
449
  selector: 'PageContent',
@@ -463,10 +463,10 @@ class PageDashboardComponent {
463
463
  ...(ngDevMode ? [{ debugName: "resolvedScroll" }] : /* istanbul ignore next */ []));
464
464
  classes = computed(() => buildPageBodyClasses(this.resolvedScroll(), this.class()), /* @ts-ignore */
465
465
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
466
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageDashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
467
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageDashboardComponent, isStandalone: true, selector: "PageDashboard", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "dashboard" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
466
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageDashboardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
467
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageDashboardComponent, isStandalone: true, selector: "PageDashboard", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "dashboard" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
468
468
  }
469
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageDashboardComponent, decorators: [{
469
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageDashboardComponent, decorators: [{
470
470
  type: Component,
471
471
  args: [{
472
472
  selector: 'PageDashboard',
@@ -486,10 +486,10 @@ class PageFooterComponent {
486
486
  ...(ngDevMode ? [{ debugName: "resolvedHeight" }] : /* istanbul ignore next */ []));
487
487
  classes = computed(() => cn('block shrink-0 border-t border-border bg-background', this.class(), this.resolvedHeight() === 'fix' && 'h-12 overflow-hidden'), /* @ts-ignore */
488
488
  ...(ngDevMode ? [{ debugName: "classes" }] : /* istanbul ignore next */ []));
489
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
490
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.2", type: PageFooterComponent, isStandalone: true, selector: "PageFooter", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "footer" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
489
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageFooterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
490
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "22.0.3", type: PageFooterComponent, isStandalone: true, selector: "PageFooter", inputs: { class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null } }, host: { attributes: { "data-page-slot": "footer" }, properties: { "class": "classes()" } }, ngImport: i0, template: `<ng-content />`, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
491
491
  }
492
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: PageFooterComponent, decorators: [{
492
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: PageFooterComponent, decorators: [{
493
493
  type: Component,
494
494
  args: [{
495
495
  selector: 'PageFooter',
@@ -120,10 +120,10 @@ class ThemeModeService {
120
120
  return;
121
121
  }
122
122
  }
123
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeModeService, deps: [], target: i0.ɵɵFactoryTarget.Service });
124
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: ThemeModeService });
123
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: ThemeModeService, deps: [], target: i0.ɵɵFactoryTarget.Service });
124
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.3", ngImport: i0, type: ThemeModeService });
125
125
  }
126
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeModeService, decorators: [{
126
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: ThemeModeService, decorators: [{
127
127
  type: Service
128
128
  }], ctorParameters: () => [] });
129
129
 
@@ -213,10 +213,10 @@ class ThemeSeasonService {
213
213
  return;
214
214
  }
215
215
  }
216
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeSeasonService, deps: [], target: i0.ɵɵFactoryTarget.Service });
217
- static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.2", ngImport: i0, type: ThemeSeasonService });
216
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: ThemeSeasonService, deps: [], target: i0.ɵɵFactoryTarget.Service });
217
+ static ɵprov = i0.ɵɵngDeclareService({ minVersion: "22.0.0", version: "22.0.3", ngImport: i0, type: ThemeSeasonService });
218
218
  }
219
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.2", ngImport: i0, type: ThemeSeasonService, decorators: [{
219
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.3", ngImport: i0, type: ThemeSeasonService, decorators: [{
220
220
  type: Service
221
221
  }], ctorParameters: () => [] });
222
222
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojiepermana/angular-theme",
3
- "version": "22.0.33",
3
+ "version": "22.0.35",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/edsis/angular.git"
@@ -13,8 +13,8 @@
13
13
  "@angular/common": ">=22.0.0",
14
14
  "@angular/core": ">=22.0.0",
15
15
  "@angular/router": ">=22.0.0",
16
- "@ojiepermana/angular-navigation": "^22.0.33",
17
- "@ojiepermana/angular-component": "^22.0.33",
16
+ "@ojiepermana/angular-navigation": "^22.0.35",
17
+ "@ojiepermana/angular-component": "^22.0.35",
18
18
  "rxjs": ">=7.8.0"
19
19
  },
20
20
  "dependencies": {
@@ -48,6 +48,10 @@
48
48
  "types": "./types/ojiepermana-angular-theme-layout-types.d.ts",
49
49
  "default": "./fesm2022/ojiepermana-angular-theme-layout-types.mjs"
50
50
  },
51
+ "./layout/wrapper": {
52
+ "types": "./types/ojiepermana-angular-theme-layout-wrapper.d.ts",
53
+ "default": "./fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs"
54
+ },
51
55
  "./page": {
52
56
  "types": "./types/ojiepermana-angular-theme-page.d.ts",
53
57
  "default": "./fesm2022/ojiepermana-angular-theme-page.mjs"
@@ -0,0 +1,183 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NavigationType, NavigationItem } from '@ojiepermana/angular-navigation';
3
+
4
+ /**
5
+ * Bentuk identitas yang dikonsumsi wrapper layout. Library hanya mendefinisikan
6
+ * strukturnya; nilai konkret (brand/user) disediakan consumer sebagai input.
7
+ */
8
+ interface BrandIdentity {
9
+ /** Nama untuk inisial/aria pada slot header. */
10
+ readonly name: string;
11
+ /** Material symbol untuk logo; `null` → pakai inisial dari `name`. */
12
+ readonly icon: string | null;
13
+ /** Judul brand. */
14
+ readonly title: string;
15
+ /** Subjudul brand. */
16
+ readonly subtitle: string;
17
+ }
18
+ interface UserIdentity {
19
+ /** Nama lengkap user (inisial + judul footer). */
20
+ readonly name: string;
21
+ /** Email / baris sekunder footer. */
22
+ readonly email: string;
23
+ }
24
+
25
+ /**
26
+ * Slot brand untuk `<NavigationHeader>`: inisial/logo + judul. Murni input-driven.
27
+ *
28
+ * `compact` (dockbar / rail ikon-only) menyembunyikan judul. `host.class = 'contents'`
29
+ * membuat `NavigationHeaderInitial` + `NavigationHeaderTitle` tetap menjadi flex-child
30
+ * langsung baris header; auto-hide judul saat sidebar collapsed (via `NAVIGATION_SHELL`)
31
+ * tetap berlaku karena DI mengalir lewat live tree ke `<Navigation>`.
32
+ */
33
+ declare class LayoutBrand {
34
+ /** Identitas brand (nama, ikon, judul, subjudul). */
35
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
36
+ /** Sembunyikan judul, sisakan inisial saja (dockbar / rail ikon-only). */
37
+ readonly compact: _angular_core.InputSignalWithTransform<boolean, unknown>;
38
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutBrand, never>;
39
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutBrand, "LayoutBrand", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "compact": { "alias": "compact"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
40
+ }
41
+
42
+ /**
43
+ * Slot user untuk `<NavigationFooter>`: identitas (opsional) + aksi logout. Murni input-driven.
44
+ *
45
+ * `detailed` menampilkan inisial + nama (sidebar penuh); tanpanya hanya tombol logout.
46
+ * `host.class = 'contents'` membuat anak menjadi flex-child langsung footer — `ml-auto` &
47
+ * auto-hide saat collapsed (via `NAVIGATION_SHELL`) tetap berlaku.
48
+ */
49
+ declare class LayoutUser {
50
+ /** Identitas user (nama + email). */
51
+ readonly user: _angular_core.InputSignal<UserIdentity>;
52
+ /** Tampilkan identitas user (inisial + nama), bukan hanya tombol logout. */
53
+ readonly detailed: _angular_core.InputSignalWithTransform<boolean, unknown>;
54
+ /** Label aksesibilitas tombol logout. */
55
+ readonly logoutLabel: _angular_core.InputSignal<string>;
56
+ /** Material symbol untuk tombol logout. */
57
+ readonly logoutIcon: _angular_core.InputSignal<string>;
58
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutUser, never>;
59
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutUser, "LayoutUser", never, { "user": { "alias": "user"; "required": true; "isSignal": true; }; "detailed": { "alias": "detailed"; "required": false; "isSignal": true; }; "logoutLabel": { "alias": "logoutLabel"; "required": false; "isSignal": true; }; "logoutIcon": { "alias": "logoutIcon"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
60
+ }
61
+
62
+ /**
63
+ * Tipe nav: sidebar vertikal collapsible (default). Brand header + identitas user di footer.
64
+ *
65
+ * `host.class = 'contents'` membuat `<NavigationSidebar>` menjadi anak efektif `<Navigation>`
66
+ * (h-full, shell-classes), sementara DI `NAVIGATION_SHELL` tetap mengalir lewat live tree dan
67
+ * `<NavigationHeader>` tetap direct child untuk content-projection library.
68
+ */
69
+ declare class LayoutNavSidebar {
70
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
71
+ readonly user: _angular_core.InputSignal<UserIdentity>;
72
+ /** Appearance dari shell (`[appearance]`); `flat` menambahkan border kanan pemisah konten. */
73
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
74
+ /** `flat` → border kanan; selaras border bawah navbar (`border-[1.5px] border-border`). */
75
+ protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "">;
76
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavSidebar, never>;
77
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavSidebar, "LayoutNavSidebar", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
78
+ }
79
+
80
+ /**
81
+ * Tipe nav: rail ikon vertikal (dockbar). Brand compact (inisial saja) + aksi logout.
82
+ * Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
83
+ */
84
+ declare class LayoutNavDockbar {
85
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
86
+ readonly user: _angular_core.InputSignal<UserIdentity>;
87
+ /** Appearance dari shell (`[appearance]`); `flat` menambahkan border kanan pemisah konten. */
88
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
89
+ /** `flat` → border kanan; selaras border bawah navbar (`border-[1.5px] border-border`). */
90
+ protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "">;
91
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavDockbar, never>;
92
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavDockbar, "LayoutNavDockbar", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
93
+ }
94
+
95
+ /**
96
+ * Tipe nav: top bar item inline (navbar, horizontal). `appearance` selaras shell
97
+ * (`flat | border-rail`). Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
98
+ */
99
+ declare class LayoutNavNavbar {
100
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
101
+ readonly user: _angular_core.InputSignal<UserIdentity>;
102
+ /** Appearance dari shell (`[nav-appearance]`). */
103
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
104
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavNavbar, never>;
105
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavNavbar, "LayoutNavNavbar", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
106
+ }
107
+
108
+ /**
109
+ * Tipe nav: top bar dengan tombol trigger flyout (horizontal). `appearance` selaras shell.
110
+ * Lihat {@link LayoutNavSidebar} untuk alasan `host.class = 'contents'`.
111
+ */
112
+ declare class LayoutNavFlyout {
113
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
114
+ readonly user: _angular_core.InputSignal<UserIdentity>;
115
+ /** Appearance dari shell (`[nav-appearance]`). */
116
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
117
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavFlyout, never>;
118
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavFlyout, "LayoutNavFlyout", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
119
+ }
120
+
121
+ /**
122
+ * Tipe nav: sidebar brand-only untuk varian `empty` / `fluid` (nav disembunyikan oleh
123
+ * `LayoutNavigation`, jadi tanpa collapse & footer). Lihat {@link LayoutNavSidebar} untuk
124
+ * alasan `host.class = 'contents'`.
125
+ */
126
+ declare class LayoutNavMinimal {
127
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
128
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavMinimal, never>;
129
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutNavMinimal, "LayoutNavMinimal", never, { "brand": { "alias": "brand"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
130
+ }
131
+
132
+ /** Tipe nav yang dirender `@switch (navKind())`. `brand` = sidebar header-only (empty/fluid). */
133
+ type NavKind = NavigationType | 'brand';
134
+ /**
135
+ * Wrapper layout shell siap pakai — consumer cukup memberi data input, tidak perlu merakit
136
+ * `Layout > LayoutVertical/Horizontal/Empty/Fluid > LayoutNavigation > Navigation > tipe-nav`.
137
+ *
138
+ * ```html
139
+ * <LayoutWrapperDefault
140
+ * [surface]="surface" [layout-appearance]="appearance" [width]="width"
141
+ * [layout-type]="layoutType" [nav-type]="navType"
142
+ * [data]="navItems" [brand]="brand" [user]="user"
143
+ * >
144
+ * <router-outlet /> <!-- konten halaman diproyeksikan ke LayoutContent -->
145
+ * </LayoutWrapperDefault>
146
+ * ```
147
+ *
148
+ * `register*` default (LayoutService) tetap tanggung jawab consumer; wrapper ini murni
149
+ * presentational — dua sumbu (`effectiveLayoutType` → wrapper, `navKind` → tipe nav) di atas
150
+ * satu skeleton bersama. DI aman: `<Navigation>` mem-*provide* `NAVIGATION_SHELL` di dalam
151
+ * `#body`; tipe nav `display:contents` sehingga `<NavigationXxx>` jadi anak efektif `<Navigation>`.
152
+ */
153
+ declare class LayoutWrapperDefault {
154
+ /** Surface latar shell (mis. `grid`, `flat`). */
155
+ readonly surface: _angular_core.InputSignal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
156
+ /** Appearance shell & nav (`flat | border-rail`). */
157
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
158
+ /** Lebar frame (`full`, `container`, dst.). */
159
+ readonly width: _angular_core.InputSignal<"full" | "wide" | "container" | "fluid">;
160
+ /** Tipe layout dasar (`vertical | horizontal | empty | fluid`); `empty`/`fluid` override nav. */
161
+ readonly layoutType: _angular_core.InputSignal<"fluid" | "vertical" | "horizontal" | "empty">;
162
+ /** Tipe navigasi (`sidebar | dockbar | navbar | flyout`); diabaikan saat `empty`/`fluid`. */
163
+ readonly navType: _angular_core.InputSignal<NavigationType>;
164
+ /** Item navigasi. */
165
+ readonly data: _angular_core.InputSignal<readonly NavigationItem[]>;
166
+ /** Identitas brand. */
167
+ readonly brand: _angular_core.InputSignal<BrandIdentity>;
168
+ /** Identitas user. */
169
+ readonly user: _angular_core.InputSignal<UserIdentity>;
170
+ /** Wrapper layout & nilai `<Layout [layout-type]>`: navbar/flyout = horizontal, sisanya vertical. */
171
+ protected readonly effectiveLayoutType: _angular_core.Signal<"fluid" | "vertical" | "horizontal" | "empty">;
172
+ /** Tipe nav di dalam `#body`: `empty`/`fluid` → `brand` (header-only); selain itu `nav-type`. */
173
+ protected readonly navKind: _angular_core.Signal<NavKind>;
174
+ /** Lebar host `<Navigation>`: penuh-tinggi (vertical) atau penuh-lebar (horizontal). */
175
+ protected readonly navClass: _angular_core.Signal<"w-full" | "h-full">;
176
+ /** Kelas `<LayoutContent>`: `fluid` membatasi lebar & memusatkan; selain itu padding biasa. */
177
+ protected readonly contentClass: _angular_core.Signal<"w-full max-w-3xl p-6" | "p-6">;
178
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutWrapperDefault, never>;
179
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<LayoutWrapperDefault, "LayoutWrapperDefault", never, { "surface": { "alias": "surface"; "required": false; "isSignal": true; }; "appearance": { "alias": "layout-appearance"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "layoutType": { "alias": "layout-type"; "required": false; "isSignal": true; }; "navType": { "alias": "nav-type"; "required": false; "isSignal": true; }; "data": { "alias": "data"; "required": true; "isSignal": true; }; "brand": { "alias": "brand"; "required": true; "isSignal": true; }; "user": { "alias": "user"; "required": true; "isSignal": true; }; }, {}, never, ["*"], true, never>;
180
+ }
181
+
182
+ export { LayoutBrand, LayoutNavDockbar, LayoutNavFlyout, LayoutNavMinimal, LayoutNavNavbar, LayoutNavSidebar, LayoutUser, LayoutWrapperDefault };
183
+ export type { BrandIdentity, UserIdentity };