@ojiepermana/angular-theme 22.0.36 → 22.0.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +25 -12
  2. package/fesm2022/ojiepermana-angular-theme-layout-types.mjs +10 -1
  3. package/fesm2022/ojiepermana-angular-theme-layout-wrapper.mjs +72 -22
  4. package/fesm2022/ojiepermana-angular-theme-layout.mjs +117 -45
  5. package/fesm2022/ojiepermana-angular-theme-page.mjs +251 -101
  6. package/fesm2022/ojiepermana-angular-theme-styles.mjs +19 -0
  7. package/layout/README.md +41 -36
  8. package/package.json +3 -3
  9. package/page/README.md +53 -15
  10. package/styles/README.md +11 -3
  11. package/styles/css/base/components.css +212 -0
  12. package/styles/css/base/theme.css +117 -49
  13. package/styles/css/base/tokens.css +98 -48
  14. package/styles/css/color/amber.css +2 -0
  15. package/styles/css/color/blue.css +2 -0
  16. package/styles/css/color/cyan.css +2 -0
  17. package/styles/css/color/emerald.css +2 -0
  18. package/styles/css/color/fuchsia.css +2 -0
  19. package/styles/css/color/green.css +2 -0
  20. package/styles/css/color/indigo.css +2 -0
  21. package/styles/css/color/lime.css +2 -0
  22. package/styles/css/color/orange.css +2 -0
  23. package/styles/css/color/pink.css +2 -0
  24. package/styles/css/color/purple.css +2 -0
  25. package/styles/css/color/red.css +2 -0
  26. package/styles/css/color/rose.css +2 -0
  27. package/styles/css/color/sky.css +2 -0
  28. package/styles/css/color/teal.css +2 -0
  29. package/styles/css/color/violet.css +2 -0
  30. package/styles/css/color/yellow.css +2 -0
  31. package/styles/css/neutral/gray.css +2 -0
  32. package/styles/css/neutral/mauve.css +2 -0
  33. package/styles/css/neutral/mist.css +2 -0
  34. package/styles/css/neutral/neutral.css +2 -0
  35. package/styles/css/neutral/olive.css +2 -0
  36. package/styles/css/neutral/slate.css +2 -0
  37. package/styles/css/neutral/stone.css +2 -0
  38. package/styles/css/neutral/taupe.css +2 -0
  39. package/styles/css/neutral/zinc.css +2 -0
  40. package/styles/css/space/index.css +6 -3
  41. package/types/ojiepermana-angular-theme-layout-services.d.ts +1 -1
  42. package/types/ojiepermana-angular-theme-layout-types.d.ts +1 -1
  43. package/types/ojiepermana-angular-theme-layout-wrapper.d.ts +40 -7
  44. package/types/ojiepermana-angular-theme-layout.d.ts +4 -2
  45. package/types/ojiepermana-angular-theme-page.d.ts +88 -36
  46. package/types/ojiepermana-angular-theme-styles.d.ts +1 -0
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 173 15% 40%;
16
16
  --border: 173 23% 87%;
17
17
  --input: 173 23% 87%;
18
+ --layout-grid-line: 173 23% 82%;
18
19
  --primary: 173 75% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 173 45% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 173 15% 64%;
39
40
  --border: 173 19% 18%;
40
41
  --input: 173 19% 18%;
42
+ --layout-grid-line: 173 19% 23%;
41
43
  --primary: 173 75% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 173 38% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 258 17% 40%;
16
16
  --border: 258 26% 87%;
17
17
  --input: 258 26% 87%;
18
+ --layout-grid-line: 258 26% 82%;
18
19
  --primary: 258 86% 48%;
19
20
  --primary-foreground: 0 0% 100%;
20
21
  --accent: 258 52% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 258 17% 64%;
39
40
  --border: 258 22% 18%;
40
41
  --input: 258 22% 18%;
42
+ --layout-grid-line: 258 22% 23%;
41
43
  --primary: 258 86% 58%;
42
44
  --primary-foreground: 0 0% 100%;
43
45
  --accent: 258 43% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 48 19% 40%;
16
16
  --border: 48 29% 87%;
17
17
  --input: 48 29% 87%;
18
+ --layout-grid-line: 48 29% 82%;
18
19
  --primary: 48 96% 48%;
19
20
  --primary-foreground: 0 0% 12%;
20
21
  --accent: 48 58% 94%;
@@ -38,6 +39,7 @@
38
39
  --muted-foreground: 48 19% 64%;
39
40
  --border: 48 24% 18%;
40
41
  --input: 48 24% 18%;
42
+ --layout-grid-line: 48 24% 23%;
41
43
  --primary: 48 96% 58%;
42
44
  --primary-foreground: 0 0% 10%;
43
45
  --accent: 48 48% 18%;
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 220 9% 42%;
16
16
  --border: 220 9% 88%;
17
17
  --input: 220 9% 88%;
18
+ --layout-grid-line: 220 9% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='gray'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 220 6% 64%;
31
32
  --border: 220 9% 17%;
32
33
  --input: 220 9% 17%;
34
+ --layout-grid-line: 220 9% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 280 6% 42%;
16
16
  --border: 280 6% 88%;
17
17
  --input: 280 6% 88%;
18
+ --layout-grid-line: 280 6% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='mauve'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 280 4% 64%;
31
32
  --border: 280 6% 17%;
32
33
  --input: 280 6% 17%;
34
+ --layout-grid-line: 280 6% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 200 14% 42%;
16
16
  --border: 200 14% 88%;
17
17
  --input: 200 14% 88%;
18
+ --layout-grid-line: 200 14% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='mist'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 200 10% 64%;
31
32
  --border: 200 14% 17%;
32
33
  --input: 200 14% 17%;
34
+ --layout-grid-line: 200 14% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 0 0% 42%;
16
16
  --border: 0 0% 88%;
17
17
  --input: 0 0% 88%;
18
+ --layout-grid-line: 0 0% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='neutral'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 0 0% 64%;
31
32
  --border: 0 0% 17%;
32
33
  --input: 0 0% 17%;
34
+ --layout-grid-line: 0 0% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 80 8% 42%;
16
16
  --border: 80 8% 88%;
17
17
  --input: 80 8% 88%;
18
+ --layout-grid-line: 80 8% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='olive'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 80 6% 64%;
31
32
  --border: 80 8% 17%;
32
33
  --input: 80 8% 17%;
34
+ --layout-grid-line: 80 8% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 215 16% 42%;
16
16
  --border: 215 16% 88%;
17
17
  --input: 215 16% 88%;
18
+ --layout-grid-line: 215 16% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='slate'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 215 11% 64%;
31
32
  --border: 215 16% 17%;
32
33
  --input: 215 16% 17%;
34
+ --layout-grid-line: 215 16% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 30 6% 42%;
16
16
  --border: 30 6% 88%;
17
17
  --input: 30 6% 88%;
18
+ --layout-grid-line: 30 6% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='stone'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 30 4% 64%;
31
32
  --border: 30 6% 17%;
32
33
  --input: 30 6% 17%;
34
+ --layout-grid-line: 30 6% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 28 10% 42%;
16
16
  --border: 28 10% 88%;
17
17
  --input: 28 10% 88%;
18
+ --layout-grid-line: 28 10% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='taupe'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 28 7% 64%;
31
32
  --border: 28 10% 17%;
32
33
  --input: 28 10% 17%;
34
+ --layout-grid-line: 28 10% 22%;
33
35
  }
34
36
  }
@@ -15,6 +15,7 @@
15
15
  --muted-foreground: 240 5% 42%;
16
16
  --border: 240 5% 88%;
17
17
  --input: 240 5% 88%;
18
+ --layout-grid-line: 240 5% 82%;
18
19
  }
19
20
 
20
21
  html[theme-neutral='zinc'][data-mode='dark'] {
@@ -30,5 +31,6 @@
30
31
  --muted-foreground: 240 4% 64%;
31
32
  --border: 240 5% 17%;
32
33
  --input: 240 5% 17%;
34
+ --layout-grid-line: 240 5% 22%;
33
35
  }
34
36
  }
@@ -9,16 +9,19 @@
9
9
  * html[theme-space='x'] (0,1,1) beats the :root default (0,1,0).
10
10
  */
11
11
  @layer tokens {
12
+ /* Even ~16% steps around the 0.25rem baseline so each preset is a perceptible,
13
+ * proportional change rather than an uneven nudge. normal stays the Tailwind
14
+ * default (no-op). */
12
15
  html[theme-space='compact'] {
13
- --spacing-base: 0.2rem;
16
+ --spacing-base: 0.215rem;
14
17
  }
15
18
  html[theme-space='normal'] {
16
19
  --spacing-base: 0.25rem;
17
20
  }
18
21
  html[theme-space='relaxed'] {
19
- --spacing-base: 0.28rem;
22
+ --spacing-base: 0.29rem;
20
23
  }
21
24
  html[theme-space='spacious'] {
22
- --spacing-base: 0.32rem;
25
+ --spacing-base: 0.33rem;
23
26
  }
24
27
  }
@@ -11,7 +11,7 @@ declare class LayoutService {
11
11
  private readonly typeState;
12
12
  private readonly appearanceState;
13
13
  private readonly widthState;
14
- readonly surface: _angular_core.Signal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
14
+ readonly surface: _angular_core.Signal<"flat" | "grid" | "grid-line" | "honeycomb" | "matrix" | "circuit" | "line-vertical" | "line-horizontal">;
15
15
  readonly type: _angular_core.Signal<"vertical" | "horizontal" | "empty" | "fluid">;
16
16
  readonly appearance: _angular_core.Signal<"flat" | "border-rail">;
17
17
  readonly width: _angular_core.Signal<"fluid" | "full" | "wide" | "container">;
@@ -1,7 +1,7 @@
1
1
  import { Signal } from '@angular/core';
2
2
 
3
3
  declare const LAYOUT_TYPES: readonly ["vertical", "horizontal", "empty", "fluid"];
4
- declare const LAYOUT_SURFACES: readonly ["flat", "grid", "honeycome", "line-vertical", "line-horizontal"];
4
+ declare const LAYOUT_SURFACES: readonly ["flat", "grid", "grid-line", "honeycomb", "matrix", "circuit", "line-vertical", "line-horizontal"];
5
5
  declare const LAYOUT_APPEARANCES: readonly ["flat", "border-rail"];
6
6
  declare const LAYOUT_WIDTHS: readonly ["full", "wide", "container", "fluid"];
7
7
  type LayoutType = (typeof LAYOUT_TYPES)[number];
@@ -22,6 +22,22 @@ interface UserIdentity {
22
22
  readonly email: string;
23
23
  }
24
24
 
25
+ /**
26
+ * Registry identitas brand/user yang dipublikasikan shell (mis. `LayoutWrapperDefault`).
27
+ * Surface lain — seperti apps-launcher di `Page` — membacanya agar menampilkan brand/user
28
+ * yang sama dengan flyout nav tanpa menerima input langsung.
29
+ */
30
+ declare class LayoutIdentityService {
31
+ private readonly brandState;
32
+ private readonly userState;
33
+ readonly brand: _angular_core.Signal<BrandIdentity | null>;
34
+ readonly user: _angular_core.Signal<UserIdentity | null>;
35
+ setBrand(brand: BrandIdentity | null): void;
36
+ setUser(user: UserIdentity | null): void;
37
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutIdentityService, never>;
38
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<LayoutIdentityService>;
39
+ }
40
+
25
41
  /**
26
42
  * Slot brand untuk `<NavigationHeader>`: inisial/logo + judul. Murni input-driven.
27
43
  *
@@ -69,10 +85,15 @@ declare class LayoutUser {
69
85
  declare class LayoutNavSidebar {
70
86
  readonly brand: _angular_core.InputSignal<BrandIdentity>;
71
87
  readonly user: _angular_core.InputSignal<UserIdentity>;
72
- /** Appearance dari shell (`[appearance]`); menentukan ketebalan border kanan pemisah konten. */
88
+ /** Appearance dari shell (`[appearance]`); menentukan ketebalan border pemisah. */
73
89
  readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
90
+ protected readonly isBorderRail: _angular_core.Signal<boolean>;
74
91
  /** Border kanan pemisah; ketebalan ikut appearance: `border-rail` 1.5px, `flat` 1px. */
75
92
  protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "border-r border-border">;
93
+ /** Header divider menebal jadi 1.5px di `border-rail` (selaras nav/shell); `flat` pakai default. */
94
+ protected readonly headerClass: _angular_core.Signal<"border-b-[1.5px] border-border" | "">;
95
+ /** Footer divider menebal jadi 1.5px di `border-rail`; `px-3` tetap dipertahankan. */
96
+ protected readonly footerClass: _angular_core.Signal<"px-3 border-t-[1.5px] border-border" | "px-3">;
76
97
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavSidebar, never>;
77
98
  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
99
  }
@@ -84,10 +105,15 @@ declare class LayoutNavSidebar {
84
105
  declare class LayoutNavDockbar {
85
106
  readonly brand: _angular_core.InputSignal<BrandIdentity>;
86
107
  readonly user: _angular_core.InputSignal<UserIdentity>;
87
- /** Appearance dari shell (`[appearance]`); menentukan ketebalan border kanan pemisah konten. */
108
+ /** Appearance dari shell (`[appearance]`); menentukan ketebalan border pemisah. */
88
109
  readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
110
+ protected readonly isBorderRail: _angular_core.Signal<boolean>;
89
111
  /** Border kanan pemisah; ketebalan ikut appearance: `border-rail` 1.5px, `flat` 1px. */
90
112
  protected readonly shellClass: _angular_core.Signal<"border-r-[1.5px] border-border" | "border-r border-border">;
113
+ /** Header divider menebal jadi 1.5px di `border-rail` (selaras nav/shell); `flat` pakai default. */
114
+ protected readonly headerClass: _angular_core.Signal<"border-b-[1.5px] border-border" | "">;
115
+ /** Footer divider menebal jadi 1.5px di `border-rail`; `px-3` tetap dipertahankan. */
116
+ protected readonly footerClass: _angular_core.Signal<"px-3 border-t-[1.5px] border-border" | "px-3">;
91
117
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<LayoutNavDockbar, never>;
92
118
  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
119
  }
@@ -152,7 +178,7 @@ type NavKind = NavigationType | 'brand';
152
178
  */
153
179
  declare class LayoutWrapperDefault {
154
180
  /** Surface latar shell (mis. `grid`, `flat`). */
155
- readonly surface: _angular_core.InputSignal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
181
+ readonly surface: _angular_core.InputSignal<"flat" | "grid" | "grid-line" | "honeycomb" | "matrix" | "circuit" | "line-vertical" | "line-horizontal">;
156
182
  /** Appearance shell & nav (`flat | border-rail`). */
157
183
  readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
158
184
  /** Lebar frame (`full`, `container`, dst.). */
@@ -167,17 +193,24 @@ declare class LayoutWrapperDefault {
167
193
  readonly brand: _angular_core.InputSignal<BrandIdentity>;
168
194
  /** Identitas user. */
169
195
  readonly user: _angular_core.InputSignal<UserIdentity>;
196
+ private readonly identity;
197
+ constructor();
198
+ /**
199
+ * Kelas `<LayoutContent>` yang diatur consumer (mis. padding). Default kosong —
200
+ * library tidak lagi memaksa `p-6`; consumer/`<Page>` yang menentukan spacing.
201
+ */
202
+ readonly contentClassInput: _angular_core.InputSignal<string>;
170
203
  /** Wrapper layout & nilai `<Layout [layout-type]>`: navbar/flyout = horizontal, sisanya vertical. */
171
204
  protected readonly effectiveLayoutType: _angular_core.Signal<"fluid" | "vertical" | "horizontal" | "empty">;
172
205
  /** Tipe nav di dalam `#body`: `empty`/`fluid` → `brand` (header-only); selain itu `nav-type`. */
173
206
  protected readonly navKind: _angular_core.Signal<NavKind>;
174
207
  /** Lebar host `<Navigation>`: penuh-tinggi (vertical) atau penuh-lebar (horizontal). */
175
208
  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">;
209
+ /** Kelas `<LayoutContent>`: `fluid` membatasi lebar & memusatkan; padding diserahkan ke consumer. */
210
+ protected readonly contentClass: _angular_core.Signal<string>;
178
211
  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>;
212
+ 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; }; "contentClassInput": { "alias": "content-class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
180
213
  }
181
214
 
182
- export { LayoutBrand, LayoutNavDockbar, LayoutNavFlyout, LayoutNavMinimal, LayoutNavNavbar, LayoutNavSidebar, LayoutUser, LayoutWrapperDefault };
215
+ export { LayoutBrand, LayoutIdentityService, LayoutNavDockbar, LayoutNavFlyout, LayoutNavMinimal, LayoutNavNavbar, LayoutNavSidebar, LayoutUser, LayoutWrapperDefault };
183
216
  export type { BrandIdentity, UserIdentity };
@@ -6,7 +6,7 @@ export { LAYOUT_APPEARANCES, LAYOUT_APPEARANCE_STORAGE_KEY, LAYOUT_DEFAULT_APPEA
6
6
 
7
7
  declare class LayoutComponent {
8
8
  protected readonly layout: LayoutService;
9
- readonly surface: _angular_core.InputSignal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal" | null>;
9
+ readonly surface: _angular_core.InputSignal<"flat" | "grid" | "grid-line" | "honeycomb" | "matrix" | "circuit" | "line-vertical" | "line-horizontal" | null>;
10
10
  readonly appearance: _angular_core.InputSignal<"flat" | "border-rail" | null>;
11
11
  readonly layoutAppearanceAttribute: _angular_core.InputSignal<"flat" | "border-rail" | null>;
12
12
  readonly width: _angular_core.InputSignal<"full" | "wide" | "container" | "fluid" | null>;
@@ -17,12 +17,14 @@ declare class LayoutComponent {
17
17
  readonly type: _angular_core.InputSignal<"fluid" | "vertical" | "horizontal" | "empty" | null>;
18
18
  readonly class: _angular_core.InputSignal<string>;
19
19
  protected readonly appearanceInput: _angular_core.Signal<"flat" | "border-rail" | null>;
20
- protected readonly resolvedSurface: _angular_core.Signal<"flat" | "grid" | "honeycome" | "line-vertical" | "line-horizontal">;
20
+ protected readonly resolvedSurface: _angular_core.Signal<"flat" | "grid" | "grid-line" | "honeycomb" | "matrix" | "circuit" | "line-vertical" | "line-horizontal">;
21
21
  protected readonly resolvedAppearance: _angular_core.Signal<"flat" | "border-rail">;
22
22
  protected readonly resolvedWidth: _angular_core.Signal<"full" | "wide" | "container" | "fluid">;
23
23
  protected readonly resolvedType: _angular_core.Signal<"fluid" | "vertical" | "horizontal" | "empty">;
24
24
  protected readonly isBorderRail: _angular_core.Signal<boolean>;
25
25
  protected readonly isFluidFrame: _angular_core.Signal<boolean>;
26
+ protected readonly isFullFlat: _angular_core.Signal<boolean>;
27
+ protected readonly isGridLineSurface: _angular_core.Signal<boolean>;
26
28
  protected readonly showsInsetRails: _angular_core.Signal<boolean>;
27
29
  protected readonly frameStageClasses: _angular_core.Signal<string>;
28
30
  protected readonly railAnchorClasses: _angular_core.Signal<string>;
@@ -1,31 +1,78 @@
1
+ import * as _ojiepermana_angular_theme_layout_wrapper from '@ojiepermana/angular-theme/layout/wrapper';
2
+ import * as _ojiepermana_angular_navigation_service from '@ojiepermana/angular-navigation/service';
1
3
  import * as _angular_core from '@angular/core';
2
4
 
5
+ declare class PageHeaderComponent {
6
+ private readonly page;
7
+ readonly class: _angular_core.InputSignal<string>;
8
+ protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
9
+ protected readonly isBorderRail: _angular_core.Signal<boolean>;
10
+ /** Saat tombol apps mengambang di atas header, sisakan ruang kanan agar isi header tidak tertimpa. */
11
+ protected readonly reservesAppsLauncher: _angular_core.Signal<boolean>;
12
+ /** Lebar tombol apps (h-9 w-9 = 36px) + offset kanan (right-2 = 8px) + jarak aman; `null` = tak memesan. */
13
+ protected readonly appsLauncherReservePadding: _angular_core.Signal<"3.5rem" | null>;
14
+ protected readonly classes: _angular_core.Signal<string>;
15
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageHeaderComponent, never>;
16
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "PageHeader", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
17
+ }
18
+ declare class PageContentComponent {
19
+ private readonly page;
20
+ readonly class: _angular_core.InputSignal<string>;
21
+ protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
22
+ protected readonly classes: _angular_core.Signal<string>;
23
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageContentComponent, never>;
24
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageContentComponent, "PageContent", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
25
+ }
26
+ declare class PageDashboardComponent {
27
+ private readonly page;
28
+ readonly class: _angular_core.InputSignal<string>;
29
+ protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
30
+ protected readonly classes: _angular_core.Signal<string>;
31
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageDashboardComponent, never>;
32
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageDashboardComponent, "PageDashboard", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
33
+ }
34
+ declare class PageFooterComponent {
35
+ private readonly page;
36
+ readonly class: _angular_core.InputSignal<string>;
37
+ protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
38
+ protected readonly isBorderRail: _angular_core.Signal<boolean>;
39
+ protected readonly classes: _angular_core.Signal<string>;
40
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageFooterComponent, never>;
41
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageFooterComponent, "PageFooter", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
42
+ }
43
+
3
44
  declare const PAGE_VARIANTS: readonly ["stacked", "side"];
4
45
  declare const PAGE_SIDE_POSITIONS: readonly ["left", "right"];
5
46
  declare const PAGE_SIDE_MODES: readonly ["sticky", "drawer", "overlay"];
6
47
  declare const PAGE_SCROLL_VALUES: readonly ["content", "page"];
7
48
  declare const PAGE_HEIGHT_VALUES: readonly ["auto", "fix"];
49
+ /** Visual appearance shared with the layout/navigation axes — unifies borders. */
50
+ declare const PAGE_APPEARANCES: readonly ["flat", "border-rail"];
8
51
  type PageVariant = (typeof PAGE_VARIANTS)[number];
9
52
  type PageSidePosition = (typeof PAGE_SIDE_POSITIONS)[number];
10
53
  type PageSideMode = (typeof PAGE_SIDE_MODES)[number];
11
54
  type PageScroll = (typeof PAGE_SCROLL_VALUES)[number];
12
55
  type PageHeight = (typeof PAGE_HEIGHT_VALUES)[number];
56
+ type PageAppearance = (typeof PAGE_APPEARANCES)[number];
13
57
  declare const PAGE_DEFAULT_VARIANT: PageVariant;
14
58
  declare const PAGE_DEFAULT_SIDE_POSITION: PageSidePosition;
15
59
  declare const PAGE_DEFAULT_SIDE_MODE: PageSideMode;
16
60
  declare const PAGE_DEFAULT_SCROLL: PageScroll;
17
61
  declare const PAGE_DEFAULT_HEIGHT: PageHeight;
62
+ declare const PAGE_DEFAULT_APPEARANCE: PageAppearance;
18
63
  declare const PAGE_DEFAULT_SIDE_WIDTH = "16rem";
19
64
  declare function isUiPageVariant(value: string | null): value is PageVariant;
20
65
  declare function isUiPageSidePosition(value: string | null): value is PageSidePosition;
21
66
  declare function isUiPageSideMode(value: string | null): value is PageSideMode;
22
67
  declare function isUiPageScroll(value: string | null): value is PageScroll;
23
68
  declare function isUiPageHeight(value: string | null): value is PageHeight;
69
+ declare function isUiPageAppearance(value: string | null): value is PageAppearance;
24
70
 
25
71
  declare class PageStateService {
26
72
  private readonly variantState;
27
73
  private readonly heightState;
28
74
  private readonly scrollState;
75
+ private readonly appearanceState;
29
76
  private readonly positionState;
30
77
  private readonly sideModeState;
31
78
  private readonly internalSideOpenState;
@@ -34,15 +81,19 @@ declare class PageStateService {
34
81
  private readonly sideIdState;
35
82
  private readonly sideOpenRequestState;
36
83
  private readonly sideOpenRequestVersionState;
84
+ /** Aktif saat apps-launcher mengambang di atas `PageHeader`; header memesan ruang kanan agar isinya tidak tertimpa. */
85
+ private readonly appsLauncherReserveState;
37
86
  readonly variant: _angular_core.Signal<"stacked" | "side">;
38
87
  readonly height: _angular_core.Signal<"auto" | "fix">;
39
88
  readonly scroll: _angular_core.Signal<"content" | "page">;
89
+ readonly appearance: _angular_core.Signal<"flat" | "border-rail">;
40
90
  readonly position: _angular_core.Signal<"left" | "right">;
41
91
  readonly sideMode: _angular_core.Signal<"sticky" | "drawer" | "overlay">;
42
92
  readonly sideWidth: _angular_core.Signal<string>;
43
93
  readonly sideId: _angular_core.Signal<string | null>;
44
94
  readonly sideOpenRequest: _angular_core.Signal<boolean | null>;
45
95
  readonly sideOpenRequestVersion: _angular_core.Signal<number>;
96
+ readonly appsLauncherReserve: _angular_core.Signal<boolean>;
46
97
  readonly sideOpen: _angular_core.Signal<boolean>;
47
98
  readonly isSideInteractive: _angular_core.Signal<boolean>;
48
99
  readonly isSideVisible: _angular_core.Signal<boolean>;
@@ -50,6 +101,7 @@ declare class PageStateService {
50
101
  variant: PageVariant;
51
102
  height: PageHeight;
52
103
  scroll: PageScroll;
104
+ appearance: PageAppearance;
53
105
  position: PageSidePosition;
54
106
  sideMode: PageSideMode;
55
107
  sideWidth: string;
@@ -60,6 +112,7 @@ declare class PageStateService {
60
112
  width: string;
61
113
  id: string;
62
114
  }): void;
115
+ setAppsLauncherReserve(reserve: boolean): void;
63
116
  setControlledSideOpen(open: boolean | null): void;
64
117
  setSideOpen(open: boolean): void;
65
118
  openSide(): boolean;
@@ -95,28 +148,60 @@ declare class PageSideComponent {
95
148
 
96
149
  declare class PageComponent {
97
150
  protected readonly page: PageStateService;
151
+ private readonly layout;
152
+ private readonly navigation;
153
+ private readonly identity;
98
154
  protected readonly projectedSide: _angular_core.Signal<PageSideComponent | undefined>;
155
+ protected readonly projectedHeader: _angular_core.Signal<PageHeaderComponent | undefined>;
99
156
  readonly variant: _angular_core.InputSignal<"stacked" | "side">;
100
157
  readonly height: _angular_core.InputSignal<"auto" | "fix">;
101
158
  readonly scroll: _angular_core.InputSignal<"content" | "page">;
159
+ /** Visual appearance shared with the layout (`flat | border-rail`); unifies header/footer borders. */
160
+ readonly appearance: _angular_core.InputSignal<"flat" | "border-rail">;
102
161
  readonly position: _angular_core.InputSignal<"left" | "right">;
103
162
  readonly sideMode: _angular_core.InputSignal<"sticky" | "drawer" | "overlay">;
104
163
  readonly sideOpen: _angular_core.InputSignal<boolean | null>;
105
164
  readonly sideWidth: _angular_core.InputSignal<string>;
106
165
  readonly class: _angular_core.InputSignal<string>;
107
166
  readonly sideOpenChange: _angular_core.OutputEmitterRef<boolean>;
167
+ /** Saat layout `empty`, munculkan tombol apps (flyout main navigation) di pojok kanan-atas. Set `false` untuk menonaktifkan. */
168
+ readonly appsLauncher: _angular_core.InputSignalWithTransform<boolean, unknown>;
169
+ /** Id navigasi yang disurface oleh apps-launcher (default `main`). */
170
+ readonly appsNavId: _angular_core.InputSignal<string>;
171
+ /** Ikon Material untuk tombol apps-launcher. */
172
+ readonly appsIcon: _angular_core.InputSignal<string>;
173
+ /** Label/aria-label tombol apps-launcher (tombol icon-only). */
174
+ readonly appsLabel: _angular_core.InputSignal<string>;
175
+ /** Id unik untuk instance `<Navigation>` apps-launcher; tak boleh memakai id `main` (akan bentrok `claimId`). */
176
+ protected readonly launcherNavId: string;
108
177
  protected readonly resolvedPosition: _angular_core.Signal<"left" | "right">;
109
178
  protected readonly resolvedSideMode: _angular_core.Signal<"sticky" | "drawer" | "overlay">;
110
179
  protected readonly isLeftSide: _angular_core.Signal<boolean>;
111
180
  protected readonly isRightSide: _angular_core.Signal<boolean>;
112
181
  protected readonly showsOverlayBackdrop: _angular_core.Signal<boolean>;
182
+ /** Signal data untuk id yang dipilih; di-recompute hanya saat `appsNavId` berubah. */
183
+ private readonly appsNavSource;
184
+ protected readonly appsNavData: _angular_core.Signal<readonly _ojiepermana_angular_navigation_service.NavigationItem[]>;
185
+ /** Apps-launcher hanya muncul di layout `empty`, saat diaktifkan, dan saat nav target punya data. */
186
+ protected readonly showsAppsLauncher: _angular_core.Signal<boolean>;
187
+ /**
188
+ * Host `<Navigation>` launcher di-absolute ke pojok kanan-atas (hanya membungkus tombol trigger;
189
+ * panel flyout tetap membentang selebar `Page` lewat pengukuran container). Saat ada `PageHeader`,
190
+ * tombol menyatu di dalam pita header (offset rapat); tanpa header, mengambang di atas konten.
191
+ */
192
+ protected readonly appsLauncherHostClass: _angular_core.Signal<string>;
193
+ /** Appearance flyout mengikuti layout (seperti shell flyout); fallback ke appearance `Page`. */
194
+ protected readonly appsLauncherAppearance: _angular_core.Signal<"flat" | "border-rail">;
195
+ /** Brand/user untuk header & footer flyout — sama seperti shell flyout; `null` saat tak ada shell. */
196
+ protected readonly appsBrand: _angular_core.Signal<_ojiepermana_angular_theme_layout_wrapper.BrandIdentity | null>;
197
+ protected readonly appsUser: _angular_core.Signal<_ojiepermana_angular_theme_layout_wrapper.UserIdentity | null>;
113
198
  protected readonly hostClasses: _angular_core.Signal<string>;
114
199
  protected readonly shellClasses: _angular_core.Signal<string>;
115
200
  protected readonly bodyClasses: _angular_core.Signal<string>;
116
201
  constructor();
117
202
  protected handleBackdropClick(): void;
118
203
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageComponent, never>;
119
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageComponent, "Page", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "sideMode": { "alias": "sideMode"; "required": false; "isSignal": true; }; "sideOpen": { "alias": "sideOpen"; "required": false; "isSignal": true; }; "sideWidth": { "alias": "sideWidth"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "sideOpenChange": "sideOpenChange"; }, ["projectedSide"], ["PageHeader", "PageSideToggle", "PageSide", "PageContent, PageDashboard", "PageFooter"], true, never>;
204
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageComponent, "Page", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "scroll": { "alias": "scroll"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "position": { "alias": "position"; "required": false; "isSignal": true; }; "sideMode": { "alias": "sideMode"; "required": false; "isSignal": true; }; "sideOpen": { "alias": "sideOpen"; "required": false; "isSignal": true; }; "sideWidth": { "alias": "sideWidth"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; "appsLauncher": { "alias": "appsLauncher"; "required": false; "isSignal": true; }; "appsNavId": { "alias": "appsNavId"; "required": false; "isSignal": true; }; "appsIcon": { "alias": "appsIcon"; "required": false; "isSignal": true; }; "appsLabel": { "alias": "appsLabel"; "required": false; "isSignal": true; }; }, { "sideOpenChange": "sideOpenChange"; }, ["projectedSide", "projectedHeader"], ["PageHeader", "PageSideToggle", "PageSide", "PageContent, PageDashboard", "PageFooter"], true, never>;
120
205
  }
121
206
 
122
207
  declare class PageSideToggleComponent {
@@ -131,38 +216,5 @@ declare class PageSideToggleComponent {
131
216
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageSideToggleComponent, "PageSideToggle", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; "class": { "alias": "class"; "required": false; "isSignal": true; }; }, { "toggled": "toggled"; }, never, ["*"], true, never>;
132
217
  }
133
218
 
134
- declare class PageHeaderComponent {
135
- private readonly page;
136
- readonly class: _angular_core.InputSignal<string>;
137
- protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
138
- protected readonly classes: _angular_core.Signal<string>;
139
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageHeaderComponent, never>;
140
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageHeaderComponent, "PageHeader", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
141
- }
142
- declare class PageContentComponent {
143
- private readonly page;
144
- readonly class: _angular_core.InputSignal<string>;
145
- protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
146
- protected readonly classes: _angular_core.Signal<string>;
147
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageContentComponent, never>;
148
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageContentComponent, "PageContent", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
149
- }
150
- declare class PageDashboardComponent {
151
- private readonly page;
152
- readonly class: _angular_core.InputSignal<string>;
153
- protected readonly resolvedScroll: _angular_core.Signal<"content" | "page">;
154
- protected readonly classes: _angular_core.Signal<string>;
155
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageDashboardComponent, never>;
156
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageDashboardComponent, "PageDashboard", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
157
- }
158
- declare class PageFooterComponent {
159
- private readonly page;
160
- readonly class: _angular_core.InputSignal<string>;
161
- protected readonly resolvedHeight: _angular_core.Signal<"auto" | "fix">;
162
- protected readonly classes: _angular_core.Signal<string>;
163
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<PageFooterComponent, never>;
164
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<PageFooterComponent, "PageFooter", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
165
- }
166
-
167
- export { PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_MODE, PAGE_DEFAULT_SIDE_POSITION, PAGE_DEFAULT_SIDE_WIDTH, PAGE_DEFAULT_VARIANT, PAGE_HEIGHT_VALUES, PAGE_SCROLL_VALUES, PAGE_SIDE_MODES, PAGE_SIDE_POSITIONS, PAGE_VARIANTS, PageComponent, PageContentComponent, PageDashboardComponent, PageFooterComponent, PageHeaderComponent, PageSideComponent, PageSideToggleComponent, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
168
- export type { PageHeight, PageScroll, PageSideMode, PageSidePosition, PageVariant };
219
+ export { PAGE_APPEARANCES, PAGE_DEFAULT_APPEARANCE, PAGE_DEFAULT_HEIGHT, PAGE_DEFAULT_SCROLL, PAGE_DEFAULT_SIDE_MODE, PAGE_DEFAULT_SIDE_POSITION, PAGE_DEFAULT_SIDE_WIDTH, PAGE_DEFAULT_VARIANT, PAGE_HEIGHT_VALUES, PAGE_SCROLL_VALUES, PAGE_SIDE_MODES, PAGE_SIDE_POSITIONS, PAGE_VARIANTS, PageComponent, PageContentComponent, PageDashboardComponent, PageFooterComponent, PageHeaderComponent, PageSideComponent, PageSideToggleComponent, isUiPageAppearance, isUiPageHeight, isUiPageScroll, isUiPageSideMode, isUiPageSidePosition, isUiPageVariant };
220
+ export type { PageAppearance, PageHeight, PageScroll, PageSideMode, PageSidePosition, PageVariant };
@@ -192,6 +192,7 @@ declare class ThemeRadiusService {
192
192
  private readonly options;
193
193
  private readonly radiusState;
194
194
  readonly radius: i0.Signal<"none" | "sm" | "md" | "lg" | "xl" | "full">;
195
+ readonly radiusPx: i0.Signal<0 | 6 | 10 | 14 | 20 | 9999>;
195
196
  constructor();
196
197
  setRadius(radius: ThemeRadius): void;
197
198
  private ensureDefaults;