@ojiepermana/angular 21.1.15 → 21.1.17

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.
@@ -20,12 +20,13 @@ Shared services, types, and primitives stay in the generic libraries:
20
20
 
21
21
  ## Public entrypoint
22
22
 
23
- Published consumers should import Etos through the short public entrypoint:
23
+ Published consumers should import Etos providers and Etos-owned UI through the short public entrypoint. Shell UI can also be imported through deeper shell aliases:
24
24
 
25
25
  ```ts
26
26
  import {
27
27
  EtosLayoutComponent,
28
28
  EtosThemeSwitcherComponent,
29
+ ShellPagesComponent,
29
30
  provideEtosBrand,
30
31
  provideEtosLayout,
31
32
  provideEtosTheme,
@@ -33,6 +34,9 @@ import {
33
34
  type EtosThemeSwitcherQuickAction,
34
35
  type EtosThemeSwitcherUserInfo,
35
36
  } from '@ojiepermana/angular/etos';
37
+
38
+ import { EtosLayoutComponent } from '@ojiepermana/angular/etos/shell/layout';
39
+ import { ShellPagesComponent } from '@ojiepermana/angular/etos/shell/pages';
36
40
  ```
37
41
 
38
42
  `@ojiepermana/angular/etos` currently exports:
@@ -42,6 +46,12 @@ import {
42
46
  - `provideEtosLayout()` to install only the Etos layout wrapper over the shared layout provider.
43
47
  - `EtosLayoutComponent` to render the Etos shell from the current layout mode.
44
48
  - `EtosThemeSwitcherComponent` and related types for the profile/preferences UI.
49
+ - `ShellPagesComponent` for the fixed-header, scroll-main, optional-footer page shell.
50
+
51
+ Shell-specific UI is exported through deeper entrypoints:
52
+
53
+ - `@ojiepermana/angular/etos/shell/layout` aliases `EtosLayoutComponent`.
54
+ - `@ojiepermana/angular/etos/shell/pages` aliases `ShellPagesComponent`.
45
55
 
46
56
  ## Provider setup
47
57
 
@@ -118,8 +128,8 @@ This is the same composition pattern used by the Etos demo:
118
128
  ```ts
119
129
  import { ChangeDetectionStrategy, Component } from '@angular/core';
120
130
  import { RouterLink } from '@angular/router';
131
+ import { EtosLayoutComponent } from '@ojiepermana/angular/etos/shell/layout';
121
132
  import {
122
- EtosLayoutComponent,
123
133
  type EtosThemeSwitcherQuickAction,
124
134
  EtosThemeSwitcherComponent,
125
135
  type EtosThemeSwitcherUserInfo,
@@ -0,0 +1,15 @@
1
+ /**
2
+ * @ojiepermana/angular/etos — published Etos brand stylesheet.
3
+ *
4
+ * Import before Tailwind, then import the shared Tailwind token bridge.
5
+ */
6
+ @import '@ojiepermana/angular/theme/styles/themes/library/_layers.css';
7
+ @import '@ojiepermana/angular/theme/styles/themes/mode/index.css';
8
+ @import '@ojiepermana/angular/theme/styles/themes/library/color/index.css';
9
+ @import '@ojiepermana/angular/theme/styles/themes/library/style/index.css';
10
+ @import './color.css';
11
+ @import './style.css';
12
+ @import './layout.css';
13
+ @import '@ojiepermana/angular/theme/styles/themes/library/_tokens.css';
14
+ @import '@ojiepermana/angular/theme/styles/themes/library/_material-overrides.css';
15
+ @import '@ojiepermana/angular/theme/styles/themes/library/_components.css';
@@ -885,18 +885,8 @@ class VerticalLayout {
885
885
  }
886
886
  </sidebar>
887
887
  </nav>
888
- <main class="relative min-w-0 overflow-y-auto">
888
+ <main class="relative min-h-0 min-w-0 overflow-y-auto">
889
889
  <router-outlet />
890
- <div class="pointer-events-none absolute right-4 top-4 z-30">
891
- <div
892
- class="inline-flex min-w-20 items-center justify-center rounded-full border border-brand bg-white/85 px-3 py-1 text-[0.68rem] font-semibold uppercase tracking-[0.18em] text-foreground shadow-sm backdrop-blur-sm"
893
- aria-label="Current breakpoint identifier">
894
- <span class="sm:hidden">mobile</span>
895
- <span class="hidden sm:inline md:hidden">sm</span>
896
- <span class="hidden md:inline lg:hidden">md</span>
897
- <span class="hidden lg:inline">lg</span>
898
- </div>
899
- </div>
900
890
  </main>
901
891
  </div>
902
892
  </div>
@@ -948,18 +938,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
948
938
  }
949
939
  </sidebar>
950
940
  </nav>
951
- <main class="relative min-w-0 overflow-y-auto">
941
+ <main class="relative min-h-0 min-w-0 overflow-y-auto">
952
942
  <router-outlet />
953
- <div class="pointer-events-none absolute right-4 top-4 z-30">
954
- <div
955
- class="inline-flex min-w-20 items-center justify-center rounded-full border border-brand bg-white/85 px-3 py-1 text-[0.68rem] font-semibold uppercase tracking-[0.18em] text-foreground shadow-sm backdrop-blur-sm"
956
- aria-label="Current breakpoint identifier">
957
- <span class="sm:hidden">mobile</span>
958
- <span class="hidden sm:inline md:hidden">sm</span>
959
- <span class="hidden md:inline lg:hidden">md</span>
960
- <span class="hidden lg:inline">lg</span>
961
- </div>
962
- </div>
963
943
  </main>
964
944
  </div>
965
945
  </div>
@@ -1022,6 +1002,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImpo
1022
1002
  }]
1023
1003
  }], propDecorators: { mode: [{ type: i0.Input, args: [{ isSignal: true, alias: "mode", required: false }] }], sidebarHeaderTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarHeaderTemplate", required: false }] }], sidebarFooterTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidebarFooterTemplate", required: false }] }], layoutBrandTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "layoutBrandTemplate", required: false }] }], layoutProfileTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "layoutProfileTemplate", required: false }] }] } });
1024
1004
 
1005
+ class ShellPagesComponent {
1006
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: ShellPagesComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1007
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.12", type: ShellPagesComponent, isStandalone: true, selector: "shell-pages", host: { classAttribute: "block h-full min-h-0" }, ngImport: i0, template: `
1008
+ <div class="flex h-full flex-col overflow-hidden">
1009
+ <header class="flex h-12 min-w-0 shrink-0 items-center gap-2 border-b border-border px-2">
1010
+ <ng-content select="[shell-pages-header]" />
1011
+ </header>
1012
+
1013
+ <main class="min-h-0 flex-1 overflow-y-auto"><ng-content select="[shell-pages-main]" /></main>
1014
+
1015
+ <footer class="flex h-12 min-w-0 shrink-0 items-center gap-2 border-t border-border px-2">
1016
+ <ng-content select="[shell-pages-footer]" />
1017
+ </footer>
1018
+ </div>
1019
+ `, isInline: true, styles: ["footer:empty{display:none}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1020
+ }
1021
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.12", ngImport: i0, type: ShellPagesComponent, decorators: [{
1022
+ type: Component,
1023
+ args: [{ selector: 'shell-pages', changeDetection: ChangeDetectionStrategy.OnPush, host: {
1024
+ class: 'block h-full min-h-0',
1025
+ }, template: `
1026
+ <div class="flex h-full flex-col overflow-hidden">
1027
+ <header class="flex h-12 min-w-0 shrink-0 items-center gap-2 border-b border-border px-2">
1028
+ <ng-content select="[shell-pages-header]" />
1029
+ </header>
1030
+
1031
+ <main class="min-h-0 flex-1 overflow-y-auto"><ng-content select="[shell-pages-main]" /></main>
1032
+
1033
+ <footer class="flex h-12 min-w-0 shrink-0 items-center gap-2 border-t border-border px-2">
1034
+ <ng-content select="[shell-pages-footer]" />
1035
+ </footer>
1036
+ </div>
1037
+ `, styles: ["footer:empty{display:none}\n"] }]
1038
+ }] });
1039
+
1025
1040
  /*
1026
1041
  * Public API Surface of @ojiepermana/angular/etos
1027
1042
  *
@@ -1033,5 +1048,5 @@ const ETOS_BRAND_VERSION = '0.0.1';
1033
1048
  * Generated bundle index. Do not edit.
1034
1049
  */
1035
1050
 
1036
- export { ETOS_BRAND_NAME, ETOS_BRAND_VERSION, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG, EtosLayoutComponent, EtosThemeSwitcherComponent, provideEtosBrand, provideEtosLayout, provideEtosTheme };
1051
+ export { ETOS_BRAND_NAME, ETOS_BRAND_VERSION, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG, EtosLayoutComponent, EtosThemeSwitcherComponent, ShellPagesComponent, provideEtosBrand, provideEtosLayout, provideEtosTheme };
1037
1052
  //# sourceMappingURL=ojiepermana-angular-brand-etos.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ojiepermana-angular-brand-etos.mjs","sources":["../../../projects/angular/brand/etos/core/etos-brand.config.ts","../../../projects/angular/brand/etos/core/etos-brand.provider.ts","../../../projects/angular/brand/etos/component/theme-switcher/theme-switcher.component.ts","../../../projects/angular/brand/etos/shells/layouts/empty/empty.ts","../../../projects/angular/brand/etos/shells/layouts/horizontal/horizontal.ts","../../../projects/angular/brand/etos/shells/layouts/vertical/vertical.ts","../../../projects/angular/brand/etos/shells/layouts/etos.layout.ts","../../../projects/angular/brand/etos/public-api.ts","../../../projects/angular/brand/etos/ojiepermana-angular-brand-etos.ts"],"sourcesContent":["import type { MaterialLayoutConfig } from '@ojiepermana/angular/layout';\nimport type { MaterialThemeConfig } from '@ojiepermana/angular/theme';\n\nexport const ETOS_BRAND_NAME = 'etos';\n\nexport const ETOS_THEME_CONFIG = {\n mode: 'light',\n brand: ETOS_BRAND_NAME,\n} satisfies MaterialThemeConfig;\n\nexport const ETOS_LAYOUT_CONFIG = {\n mode: 'vertical',\n} satisfies MaterialLayoutConfig;\n","import {\n type EnvironmentProviders,\n type Provider,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { type MaterialLayoutConfig, provideMaterialLayout } from '@ojiepermana/angular/layout';\nimport { DEFAULT_NAVIGATION_ID, NavigationService, type NavigationItem } from '@ojiepermana/angular/navigation';\nimport {\n type MaterialThemeConfig,\n type MaterialThemeFeature,\n provideMaterialTheme,\n withMaterialDefaults,\n} from '@ojiepermana/angular/theme';\nimport { ETOS_BRAND_NAME, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG } from './etos-brand.config';\n\nexport interface EtosBrandOptions {\n readonly theme?: MaterialThemeConfig;\n readonly layout?: MaterialLayoutConfig;\n readonly navigation?: NavigationItem[];\n readonly navigationId?: string;\n readonly materialDefaults?: boolean;\n}\n\nexport function provideEtosTheme(\n config: MaterialThemeConfig = {},\n ...features: MaterialThemeFeature[]\n): EnvironmentProviders {\n return provideMaterialTheme(\n {\n ...ETOS_THEME_CONFIG,\n ...config,\n brand: ETOS_BRAND_NAME,\n 'theme-brand': ETOS_BRAND_NAME,\n },\n ...features,\n );\n}\n\nexport function provideEtosLayout(config: MaterialLayoutConfig = {}): EnvironmentProviders {\n return provideMaterialLayout({\n ...ETOS_LAYOUT_CONFIG,\n ...config,\n });\n}\n\nexport function provideEtosBrand(options: EtosBrandOptions = {}): EnvironmentProviders {\n const providers: Array<EnvironmentProviders | Provider> = [\n provideEtosTheme(options.theme, ...(options.materialDefaults === false ? [] : [withMaterialDefaults()])),\n provideEtosLayout(options.layout),\n ];\n\n const navigation = options.navigation;\n if (navigation) {\n providers.push(\n provideEnvironmentInitializer(() => {\n inject(NavigationService).registerItems(options.navigationId ?? DEFAULT_NAVIGATION_ID, navigation);\n }),\n );\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport {\n AvatarComponent,\n AvatarFallbackComponent,\n AvatarImageComponent,\n ButtonComponent,\n PopoverContentDirective,\n PopoverTriggerDirective,\n cn,\n type PopoverAlign,\n type PopoverSide,\n} from '@ojiepermana/angular/component';\nimport { LayoutService, type LayoutMode, type LayoutWidth } from '@ojiepermana/angular/layout';\nimport { UiNavIconComponent } from '@ojiepermana/angular/navigation';\nimport { ThemeService, type ColorScheme } from '@ojiepermana/angular/theme';\n\ninterface ToggleOption<T extends string> {\n readonly value: T;\n readonly label: string;\n readonly icon: string;\n}\n\nexport type EtosThemeSwitcherAction = string;\n\nexport interface EtosThemeSwitcherUserInfo {\n readonly name: string;\n readonly subtitle?: string;\n readonly avatarSrc?: string | null;\n readonly avatarAlt?: string;\n}\n\nexport interface EtosThemeSwitcherNotificationShortcut {\n readonly value?: EtosThemeSwitcherAction;\n readonly icon?: string;\n readonly ariaLabel?: string;\n}\n\ntype EtosThemeSwitcherActionTone = 'default' | 'destructive';\n\nexport interface EtosThemeSwitcherQuickAction {\n readonly value: EtosThemeSwitcherAction;\n readonly label: string;\n readonly icon: string;\n readonly tone?: EtosThemeSwitcherActionTone;\n}\n\nconst THEME_SCHEME_OPTIONS = [\n { value: 'light', label: 'Light', icon: 'light_mode' },\n { value: 'dark', label: 'Dark', icon: 'dark_mode' },\n { value: 'system', label: 'System', icon: 'computer' },\n] as const satisfies readonly ToggleOption<ColorScheme>[];\n\nconst LAYOUT_MODE_OPTIONS = [\n { value: 'horizontal', label: 'Horizontal', icon: 'view_column' },\n { value: 'vertical', label: 'Vertical', icon: 'view_sidebar' },\n { value: 'empty', label: 'Empty', icon: 'crop_square' },\n] as const satisfies readonly ToggleOption<LayoutMode>[];\n\nconst LAYOUT_WIDTH_OPTIONS = [\n { value: 'full', label: 'Full', icon: 'fit_screen' },\n { value: 'container', label: 'Container', icon: 'center_focus_strong' },\n { value: 'wide', label: 'Wide', icon: 'width_wide' },\n] as const satisfies readonly ToggleOption<LayoutWidth>[];\n\nconst SWITCHER_PANEL_OVERLAP_OFFSET = -32;\n\n@Component({\n selector: 'etos-theme-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AvatarComponent,\n AvatarFallbackComponent,\n AvatarImageComponent,\n ButtonComponent,\n PopoverContentDirective,\n PopoverTriggerDirective,\n UiNavIconComponent,\n ],\n host: {\n '[class]': 'hostClasses()',\n },\n template: `\n @if (notificationShortcutConfig(); as shortcut) {\n <button\n type=\"button\"\n ui-button\n variant=\"ghost\"\n size=\"icon\"\n data-trigger-action=\"notifications\"\n [attr.data-value]=\"shortcut.value\"\n [attr.aria-label]=\"shortcut.ariaLabel\"\n [class]=\"notificationButtonClasses()\"\n (click)=\"triggerNotificationAction($event)\">\n <ui-nav-icon [name]=\"shortcut.icon\" [size]=\"18\" class=\"text-current\" />\n </button>\n }\n\n <button\n #trigger=\"uiPopoverTrigger\"\n type=\"button\"\n ui-button\n variant=\"ghost\"\n size=\"icon\"\n [uiPopoverTrigger]=\"preferencesPanel\"\n [side]=\"resolvedPopoverSide()\"\n [align]=\"resolvedPopoverAlign()\"\n [sideOffset]=\"resolvedPopoverSideOffset()\"\n [attr.aria-label]=\"triggerLabel()\"\n [class]=\"triggerButtonClasses(trigger.isOpen())\">\n <ui-avatar class=\"h-8 w-8 border border-border/60 shadow-[inset_0_1px_0_rgba(255,255,255,0.18)]\">\n @if (hasAvatar()) {\n <ui-avatar-image [src]=\"avatarImageSrc()\" [alt]=\"avatarAltText()\" />\n }\n <ui-avatar-fallback class=\"bg-primary text-xs font-semibold tracking-[0.24em] text-primary-foreground\">\n {{ initials() }}\n </ui-avatar-fallback>\n </ui-avatar>\n </button>\n\n <ng-template uiPopoverContent #preferencesPanel=\"uiPopoverContent\">\n <section\n data-etos-theme-switcher-panel\n role=\"dialog\"\n aria-label=\"User Info\"\n class=\"w-[min(21rem,calc(100vw-1.5rem))] overflow-hidden border border-border/70 bg-background text-foreground shadow-[0_18px_48px_rgba(15,23,42,0.12)]\">\n <header class=\"p-5 pb-4\">\n <div class=\"flex items-center gap-4\">\n <ui-avatar class=\"h-14 w-14 border border-border/60 shadow-sm\">\n @if (hasAvatar()) {\n <ui-avatar-image [src]=\"avatarImageSrc()\" [alt]=\"avatarAltText()\" />\n }\n <ui-avatar-fallback class=\"bg-primary text-sm font-semibold tracking-[0.24em] text-primary-foreground\">\n {{ initials() }}\n </ui-avatar-fallback>\n </ui-avatar>\n\n <div class=\"min-w-0 flex min-h-14 flex-1 flex-col justify-center self-center\">\n <div class=\"space-y-px\">\n <h2 class=\"truncate text-[1.1rem] font-semibold leading-none tracking-tight text-foreground\">\n {{ resolvedUserName() }}\n </h2>\n <p class=\"text-sm leading-[0.95rem] text-muted-foreground\">\n {{ resolvedUserSubtitle() }}\n </p>\n </div>\n </div>\n </div>\n </header>\n\n <div class=\"space-y-4 px-5 pb-5\">\n <section\n data-setting=\"theme-scheme\"\n [attr.data-current]=\"themeScheme()\"\n class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of themeSchemeOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"themeOptionClasses(themeScheme() === option.value)\"\n data-setting-option=\"theme-scheme\"\n [attr.data-value]=\"option.value\"\n (click)=\"setThemeScheme(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(themeScheme() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </section>\n\n <section data-setting=\"layout-mode\" [attr.data-current]=\"layoutMode()\" class=\"space-y-2\">\n <div class=\"px-1\">\n <p class=\"text-[0.72rem] font-semibold uppercase tracking-[0.22em] text-muted-foreground\">Layout</p>\n </div>\n <div class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of layoutModeOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"segmentedOptionClasses(layoutMode() === option.value)\"\n data-setting-option=\"layout-mode\"\n [attr.data-value]=\"option.value\"\n (click)=\"setLayoutMode(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(layoutMode() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </div>\n </section>\n\n <section data-setting=\"layout-width\" [attr.data-current]=\"layoutWidth()\" class=\"space-y-2\">\n <div class=\"px-1\">\n <p class=\"text-[0.72rem] font-semibold uppercase tracking-[0.22em] text-muted-foreground\">Width</p>\n </div>\n <div class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of layoutWidthOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"segmentedOptionClasses(layoutWidth() === option.value)\"\n data-setting-option=\"layout-width\"\n [attr.data-value]=\"option.value\"\n (click)=\"setLayoutWidth(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(layoutWidth() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </div>\n </section>\n\n <section class=\"space-y-1 border-t border-border/70 pt-2\">\n <h3 class=\"sr-only\">Quick Actions</h3>\n <div class=\"grid gap-1\">\n @for (action of actionOptions(); track action.value) {\n <button\n type=\"button\"\n ui-button\n variant=\"ghost\"\n [class]=\"actionButtonClasses(action.tone ?? 'default')\"\n data-action-option\n [attr.data-value]=\"action.value\"\n (click)=\"triggerAction(action.value)\">\n <span class=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted/65\">\n <ui-nav-icon\n [name]=\"action.icon\"\n [size]=\"19\"\n [class]=\"actionIconClasses(action.tone ?? 'default')\" />\n </span>\n <span [class]=\"actionLabelClasses(action.tone ?? 'default')\">\n {{ action.label }}\n </span>\n </button>\n }\n </div>\n </section>\n </div>\n </section>\n </ng-template>\n `,\n})\nexport class EtosThemeSwitcherComponent {\n private readonly theme = inject(ThemeService);\n private readonly layout = inject(LayoutService);\n private readonly popoverTrigger = viewChild.required<PopoverTriggerDirective>('trigger');\n\n readonly class = input<string>('');\n readonly userInfo = input<EtosThemeSwitcherUserInfo | null>(null);\n readonly userName = input<string>('User');\n readonly userSubtitle = input<string>('Theme and layout preferences');\n readonly avatarSrc = input<string | null>(null);\n readonly avatarAlt = input<string>('');\n readonly quickActions = input.required<readonly EtosThemeSwitcherQuickAction[]>();\n readonly notificationShortcut = input<EtosThemeSwitcherNotificationShortcut | null>(null);\n readonly showNotificationShortcut = input<boolean>(false);\n readonly popoverSide = input<PopoverSide | null>(null);\n readonly popoverAlign = input<PopoverAlign | null>(null);\n readonly popoverSideOffset = input<number | null>(null);\n readonly actionSelected = output<EtosThemeSwitcherAction>();\n\n protected readonly themeMode = this.theme.mode;\n protected readonly themeScheme = this.theme.scheme;\n protected readonly layoutMode = this.layout.mode;\n protected readonly layoutWidth = this.layout.width;\n\n protected readonly themeSchemeOptions = THEME_SCHEME_OPTIONS;\n protected readonly layoutModeOptions = LAYOUT_MODE_OPTIONS;\n protected readonly layoutWidthOptions = LAYOUT_WIDTH_OPTIONS;\n protected readonly notificationShortcutConfig = computed<Required<EtosThemeSwitcherNotificationShortcut> | null>(\n () => {\n const shortcut = this.notificationShortcut();\n\n if (shortcut) {\n return {\n value: shortcut.value ?? 'notifications',\n icon: shortcut.icon ?? 'notifications',\n ariaLabel: shortcut.ariaLabel ?? `Open notifications for ${this.resolvedUserName()}`,\n };\n }\n\n if (!this.showNotificationShortcut()) {\n return null;\n }\n\n return {\n value: 'notifications',\n icon: 'notifications',\n ariaLabel: `Open notifications for ${this.resolvedUserName()}`,\n };\n },\n );\n protected readonly actionOptions = computed(() => {\n const shortcutValue = this.notificationShortcutConfig()?.value;\n\n if (!shortcutValue) {\n return this.quickActions();\n }\n\n return this.quickActions().filter((action) => action.value !== shortcutValue);\n });\n\n protected readonly hostClasses = computed(() => cn('inline-flex shrink-0 items-center gap-2', this.class()));\n protected readonly resolvedPopoverSide = computed<PopoverSide>(\n () => this.popoverSide() ?? (this.layoutMode() === 'vertical' ? 'top' : 'bottom'),\n );\n protected readonly resolvedPopoverAlign = computed<PopoverAlign>(\n () => this.popoverAlign() ?? (this.layoutMode() === 'vertical' ? 'start' : 'end'),\n );\n protected readonly resolvedPopoverSideOffset = computed(\n () => this.popoverSideOffset() ?? SWITCHER_PANEL_OVERLAP_OFFSET,\n );\n protected readonly resolvedUserName = computed(() => this.userInfo()?.name?.trim() || this.userName());\n protected readonly resolvedUserSubtitle = computed(() => this.userInfo()?.subtitle ?? this.userSubtitle());\n protected readonly resolvedAvatarSrc = computed(() => this.userInfo()?.avatarSrc ?? this.avatarSrc());\n protected readonly resolvedAvatarAlt = computed(() => this.userInfo()?.avatarAlt ?? this.avatarAlt());\n protected readonly hasAvatar = computed(() => !!this.resolvedAvatarSrc());\n protected readonly avatarImageSrc = computed(() => this.resolvedAvatarSrc() ?? '');\n protected readonly avatarAltText = computed(() => this.resolvedAvatarAlt() || `${this.resolvedUserName()} avatar`);\n protected readonly initials = computed(() => this.toInitials(this.resolvedUserName()));\n protected readonly triggerLabel = computed(() => `Open user info for ${this.resolvedUserName()}`);\n\n protected triggerButtonClasses(open: boolean): string {\n return cn(\n 'relative h-8 w-8 rounded-full p-0 transition-colors duration-150 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n open && 'bg-muted/50',\n );\n }\n\n protected notificationButtonClasses(): string {\n return cn(\n 'h-8 w-8 rounded-[var(--layout-frame-radius)] p-0 text-muted-foreground transition-colors duration-150 hover:bg-muted/50 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n );\n }\n\n protected segmentedOptionClasses(active: boolean): string {\n return cn(\n 'h-10 rounded-[var(--layout-frame-radius)] border border-transparent px-[0.3125rem] py-[0.1875rem] text-foreground transition-colors',\n active ? 'bg-background shadow-sm' : 'text-muted-foreground hover:bg-background/70',\n );\n }\n\n protected themeOptionClasses(active: boolean): string {\n return this.segmentedOptionClasses(active);\n }\n\n protected themeIconClasses(active: boolean): string {\n return active ? 'text-foreground' : 'text-muted-foreground';\n }\n\n protected actionButtonClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return cn(\n 'h-12 w-full justify-start gap-2.5 rounded-[var(--layout-frame-radius)] border border-transparent px-2 py-1.5 text-left transition-colors hover:bg-muted/50',\n tone === 'destructive' && 'hover:bg-destructive/8 focus-visible:ring-destructive/30',\n );\n }\n\n protected actionIconClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return tone === 'destructive' ? 'text-destructive' : 'text-foreground';\n }\n\n protected actionLabelClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return tone === 'destructive' ? 'text-sm font-medium text-destructive' : 'text-sm font-medium text-foreground';\n }\n\n protected setThemeScheme(mode: ColorScheme): void {\n this.theme.setScheme(mode);\n }\n\n protected setLayoutMode(mode: LayoutMode): void {\n this.layout.setMode(mode);\n }\n\n protected setLayoutWidth(width: LayoutWidth): void {\n this.layout.setWidth(width);\n }\n\n protected triggerAction(action: EtosThemeSwitcherAction): void {\n this.actionSelected.emit(action);\n this.popoverTrigger().close();\n }\n\n protected triggerNotificationAction(event: Event): void {\n event.stopPropagation();\n\n const shortcut = this.notificationShortcutConfig();\n\n if (!shortcut) {\n return;\n }\n\n this.actionSelected.emit(shortcut.value);\n }\n\n private labelForLayoutMode(mode: LayoutMode): string {\n if (mode === 'horizontal') {\n return 'Horizontal';\n }\n\n if (mode === 'empty') {\n return 'Empty';\n }\n\n return 'Vertical';\n }\n\n private labelForLayoutWidth(width: LayoutWidth): string {\n if (width === 'container') {\n return 'Container';\n }\n\n if (width === 'wide') {\n return 'Wide';\n }\n\n return 'Full';\n }\n\n private toInitials(name: string): string {\n const segments = name.trim().split(/\\s+/).filter(Boolean);\n\n if (segments.length === 0) {\n return 'UI';\n }\n\n if (segments.length === 1) {\n return segments[0].slice(0, 2).toUpperCase();\n }\n\n return `${segments[0][0] ?? ''}${segments[1][0] ?? ''}`.toUpperCase();\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'empty',\n imports: [RouterOutlet],\n template: `\n <div\n class=\"h-dvh overflow-hidden bg-neutral-200 bg-[linear-gradient(rgba(212,212,212,0.45)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.45)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div class=\"relative isolate box-border h-full overflow-hidden py-3\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-y-0 inset-x-0 px-3\">\n <div class=\"relative mx-auto h-full w-full\">\n <div class=\"absolute inset-y-0 left-0 w-px bg-brand\"></div>\n <div class=\"absolute inset-y-0 right-0 w-px bg-brand\"></div>\n </div>\n </div>\n\n <div class=\"h-full min-h-0 border border-brand px-3\">\n <main class=\"mx-auto w-full h-full min-h-0 overflow-y-auto bg-background/65\">\n <router-outlet />\n </main>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyLayout {}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { LayoutService } from '@ojiepermana/angular/layout';\nimport { TopbarComponent } from '@ojiepermana/angular/navigation';\n\n@Component({\n selector: 'horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterOutlet, TopbarComponent],\n host: {\n class: 'block',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <div\n class=\"min-h-screen bg-neutral-200 text-neutral-600 bg-[linear-gradient(rgba(212,212,212,0.45)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.45)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div [class]=\"shellClasses()\">\n <div aria-hidden=\"true\" [class]=\"railOverlayClasses()\">\n <div [class]=\"railGuideClasses()\">\n <div class=\"absolute inset-y-0 left-0 w-px bg-brand\"></div>\n <div class=\"absolute inset-y-0 right-0 w-px bg-brand\"></div>\n </div>\n </div>\n\n <div [class]=\"frameClasses()\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 z-0\">\n <div class=\"absolute inset-x-0 top-11 h-px bg-brand\"></div>\n <div class=\"absolute inset-x-0 bottom-11 h-px bg-brand\"></div>\n </div>\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 z-10\">\n <div [class]=\"maskClasses()\"></div>\n </div>\n <div [class]=\"contentClasses()\">\n <nav class=\"shrink-0\">\n <topbar class=\"shrink-0\" [showHamburger]=\"false\">\n @if (brandTemplate(); as brand) {\n <div topbar-start class=\"min-w-0\">\n <ng-container [ngTemplateOutlet]=\"brand\" />\n </div>\n }\n\n @if (profileTemplate(); as profile) {\n <div topbar-end class=\"flex min-w-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"profile\" />\n </div>\n }\n </topbar>\n </nav>\n <main class=\"min-h-0 flex-1 overflow-auto\">\n <router-outlet />\n </main>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n})\nexport class HorizontalLayout {\n private readonly layout = inject(LayoutService);\n\n readonly brandTemplate = input<TemplateRef<unknown> | null>(null);\n readonly profileTemplate = input<TemplateRef<unknown> | null>(null);\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly shellClasses = computed(() => {\n switch (this.layoutWidth()) {\n case 'full':\n return 'relative isolate box-border h-dvh overflow-hidden py-3';\n case 'wide':\n return 'relative isolate box-border h-dvh overflow-hidden py-3 lg:py-10';\n default:\n return 'relative isolate box-border h-dvh overflow-hidden py-3 lg:py-20';\n }\n });\n\n protected readonly railOverlayClasses = computed(() => {\n const classes = ['pointer-events-none', 'absolute', 'inset-y-0', 'inset-x-0', 'z-20'];\n if (this.layoutWidth() === 'full') {\n classes.push('px-3');\n } else if (this.layoutWidth() === 'wide') {\n classes.push('px-3', 'lg:px-10');\n } else {\n classes.push('px-3', 'lg:px-10');\n }\n return classes.join(' ');\n });\n\n protected readonly railGuideClasses = computed(() =>\n this.layoutWidth() === 'container' ? 'relative mx-auto h-full w-full max-w-7xl' : 'relative mx-auto h-full w-full',\n );\n\n protected readonly frameClasses = computed(() => {\n const classes = ['relative', 'z-10', 'h-full', 'min-h-0', 'border', 'border-brand'];\n if (this.layoutWidth() === 'full') {\n classes.push('px-3');\n } else if (this.layoutWidth() === 'wide') {\n classes.push('px-3', 'lg:px-10');\n } else {\n classes.push('px-3', 'lg:px-10');\n }\n return classes.join(' ');\n });\n\n protected readonly maskClasses = computed(() => {\n const classes = ['h-full', 'bg-position-[center_center]', 'bg-size-[2.775rem_2.775rem]'];\n if (this.layoutWidth() === 'container') {\n classes.unshift('mx-auto', 'w-full', 'max-w-7xl');\n } else {\n classes.unshift('mx-auto', 'w-full');\n }\n return classes.join(' ');\n });\n\n protected readonly contentClasses = computed(() => {\n const classes = [\n 'relative',\n 'z-20',\n 'mx-auto',\n 'flex',\n 'h-full',\n 'min-h-0',\n 'flex-col',\n 'overflow-hidden',\n 'bg-background/65',\n ];\n if (this.layoutWidth() === 'container') {\n classes.push('w-full', 'max-w-7xl');\n } else {\n classes.push('w-full');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterOutlet } from '@angular/router';\n\nimport { SidebarComponent, type SidebarAppearance, type SidebarPosition } from '@ojiepermana/angular/navigation';\nimport { LayoutService } from '@ojiepermana/angular/layout';\n\n@Component({\n selector: 'vertical',\n imports: [NgTemplateOutlet, RouterOutlet, SidebarComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-dvh overflow-hidden',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <!-- prettier-ignore -->\n <div class=\"h-full overflow-hidden bg-neutral-200 bg-[linear-gradient(rgba(212,212,212,0.65)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.65)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div [class]=\"shellClasses()\">\n <div [class]=\"frameClasses()\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-x-0 inset-y-8\">\n <div class=\"absolute inset-x-0 top-3.75 h-px bg-brand\"></div>\n <div class=\"absolute inset-x-0 bottom-3.75 h-px bg-brand\"></div>\n </div>\n <div [class]=\"frameBodyClasses()\">\n <div [class]=\"gridClasses()\">\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] left-0 top-[-100vh] z-20 w-px bg-brand\"></div>\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] right-0 top-[-100vh] z-20 w-px bg-brand\"></div>\n <nav class=\"relative h-full min-h-0 shrink-0 overflow-visible border-r border-brand\">\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] left-full top-[-100vh] -z-10 w-px bg-brand\"></div>\n <sidebar\n class=\"h-full\"\n [appearance]=\"sidebarAppearance()\"\n [position]=\"sidebarPosition()\"\n [ariaLabel]=\"ariaLabel()\">\n @if (sidebarHeaderTemplate(); as headerTemplate) {\n <div sidebar-header class=\"contents\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" />\n </div>\n }\n @if (sidebarFooterTemplate(); as footerTemplate) {\n <div sidebar-footer class=\"contents\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\n </div>\n }\n </sidebar>\n </nav>\n <main class=\"relative min-w-0 overflow-y-auto\">\n <router-outlet />\n <div class=\"pointer-events-none absolute right-4 top-4 z-30\">\n <div\n class=\"inline-flex min-w-20 items-center justify-center rounded-full border border-brand bg-white/85 px-3 py-1 text-[0.68rem] font-semibold uppercase tracking-[0.18em] text-foreground shadow-sm backdrop-blur-sm\"\n aria-label=\"Current breakpoint identifier\">\n <span class=\"sm:hidden\">mobile</span>\n <span class=\"hidden sm:inline md:hidden\">sm</span>\n <span class=\"hidden md:inline lg:hidden\">md</span>\n <span class=\"hidden lg:inline\">lg</span>\n </div>\n </div>\n </main>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n})\nexport class VerticalLayout {\n private readonly layout = inject(LayoutService);\n\n readonly sidebarAppearance = input<SidebarAppearance>('default');\n readonly sidebarPosition = input<SidebarPosition>('left');\n readonly ariaLabel = input<string>('Primary');\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly shellClasses = computed(() => {\n switch (this.layoutWidth()) {\n case 'full':\n return 'relative isolate h-full overflow-hidden py-2';\n case 'wide':\n return 'relative isolate h-full overflow-hidden py-2 lg:py-10';\n default:\n return 'relative isolate h-full overflow-hidden py-2 lg:py-18';\n }\n });\n\n protected readonly frameClasses = computed(() => {\n if (this.layoutWidth() === 'wide') {\n return 'relative h-full border-y border-brand';\n }\n\n return '-mx-18 relative h-full border-y border-brand';\n });\n\n protected readonly frameBodyClasses = computed(() => {\n if (this.layoutWidth() === 'wide') {\n return 'h-full lg:px-10';\n }\n\n return 'h-full px-20';\n });\n\n protected readonly gridClasses = computed(() => {\n const classes = [\n 'relative',\n 'mx-auto',\n 'grid',\n 'h-full',\n 'w-full',\n 'max-w-full',\n 'grid-cols-[auto_minmax(0,1fr)]',\n 'items-stretch',\n 'bg-background/65',\n ];\n\n switch (this.layoutWidth()) {\n case 'container':\n classes.push('lg:max-w-[var(--layout-vertical-shell-max-width)]');\n break;\n default:\n break;\n }\n\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { LayoutService, type LayoutMode } from '@ojiepermana/angular/layout';\nimport { EmptyLayout } from './empty/empty';\nimport { HorizontalLayout } from './horizontal/horizontal';\nimport { VerticalLayout } from './vertical/vertical';\n\n@Component({\n selector: 'etos-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [EmptyLayout, HorizontalLayout, VerticalLayout],\n host: {\n class: 'contents',\n '[attr.data-layout-mode]': 'resolvedMode()',\n },\n template: `\n @switch (resolvedMode()) {\n @case ('empty') {\n <empty />\n }\n @case ('horizontal') {\n <horizontal [brandTemplate]=\"layoutBrandTemplate()\" [profileTemplate]=\"layoutProfileTemplate()\" />\n }\n @default {\n <vertical\n [sidebarHeaderTemplate]=\"sidebarHeaderTemplate() ?? layoutBrandTemplate()\"\n [sidebarFooterTemplate]=\"sidebarFooterTemplate() ?? layoutProfileTemplate()\" />\n }\n }\n `,\n})\nexport class EtosLayoutComponent {\n readonly mode = input<LayoutMode | null>(null);\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n readonly layoutBrandTemplate = input<TemplateRef<unknown> | null>(null);\n readonly layoutProfileTemplate = input<TemplateRef<unknown> | null>(null);\n\n private readonly layout = inject(LayoutService);\n protected readonly resolvedMode = computed(() => this.mode() ?? this.layout.mode());\n}\n","/*\n * Public API Surface of @ojiepermana/angular/etos\n *\n * Etos-specific implementation lives under projects/angular/brand/etos.\n */\n\nexport * from './core/etos-brand.config';\nexport * from './core/etos-brand.provider';\nexport * from './component/theme-switcher';\nexport * from './shells/layouts/etos.layout';\n\nexport const ETOS_BRAND_VERSION = '0.0.1';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ojiepermana-angular-brand-etos.mjs","sources":["../../../projects/angular/brand/etos/core/etos-brand.config.ts","../../../projects/angular/brand/etos/core/etos-brand.provider.ts","../../../projects/angular/brand/etos/component/theme-switcher/theme-switcher.component.ts","../../../projects/angular/brand/etos/shells/layouts/empty/empty.ts","../../../projects/angular/brand/etos/shells/layouts/horizontal/horizontal.ts","../../../projects/angular/brand/etos/shells/layouts/vertical/vertical.ts","../../../projects/angular/brand/etos/shells/layouts/etos.layout.ts","../../../projects/angular/brand/etos/shells/pages/shell-pages/shell-pages.ts","../../../projects/angular/brand/etos/public-api.ts","../../../projects/angular/brand/etos/ojiepermana-angular-brand-etos.ts"],"sourcesContent":["import type { MaterialLayoutConfig } from '@ojiepermana/angular/layout';\nimport type { MaterialThemeConfig } from '@ojiepermana/angular/theme';\n\nexport const ETOS_BRAND_NAME = 'etos';\n\nexport const ETOS_THEME_CONFIG = {\n mode: 'light',\n brand: ETOS_BRAND_NAME,\n} satisfies MaterialThemeConfig;\n\nexport const ETOS_LAYOUT_CONFIG = {\n mode: 'vertical',\n} satisfies MaterialLayoutConfig;\n","import {\n type EnvironmentProviders,\n type Provider,\n inject,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { type MaterialLayoutConfig, provideMaterialLayout } from '@ojiepermana/angular/layout';\nimport { DEFAULT_NAVIGATION_ID, NavigationService, type NavigationItem } from '@ojiepermana/angular/navigation';\nimport {\n type MaterialThemeConfig,\n type MaterialThemeFeature,\n provideMaterialTheme,\n withMaterialDefaults,\n} from '@ojiepermana/angular/theme';\nimport { ETOS_BRAND_NAME, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG } from './etos-brand.config';\n\nexport interface EtosBrandOptions {\n readonly theme?: MaterialThemeConfig;\n readonly layout?: MaterialLayoutConfig;\n readonly navigation?: NavigationItem[];\n readonly navigationId?: string;\n readonly materialDefaults?: boolean;\n}\n\nexport function provideEtosTheme(\n config: MaterialThemeConfig = {},\n ...features: MaterialThemeFeature[]\n): EnvironmentProviders {\n return provideMaterialTheme(\n {\n ...ETOS_THEME_CONFIG,\n ...config,\n brand: ETOS_BRAND_NAME,\n 'theme-brand': ETOS_BRAND_NAME,\n },\n ...features,\n );\n}\n\nexport function provideEtosLayout(config: MaterialLayoutConfig = {}): EnvironmentProviders {\n return provideMaterialLayout({\n ...ETOS_LAYOUT_CONFIG,\n ...config,\n });\n}\n\nexport function provideEtosBrand(options: EtosBrandOptions = {}): EnvironmentProviders {\n const providers: Array<EnvironmentProviders | Provider> = [\n provideEtosTheme(options.theme, ...(options.materialDefaults === false ? [] : [withMaterialDefaults()])),\n provideEtosLayout(options.layout),\n ];\n\n const navigation = options.navigation;\n if (navigation) {\n providers.push(\n provideEnvironmentInitializer(() => {\n inject(NavigationService).registerItems(options.navigationId ?? DEFAULT_NAVIGATION_ID, navigation);\n }),\n );\n }\n\n return makeEnvironmentProviders(providers);\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport {\n AvatarComponent,\n AvatarFallbackComponent,\n AvatarImageComponent,\n ButtonComponent,\n PopoverContentDirective,\n PopoverTriggerDirective,\n cn,\n type PopoverAlign,\n type PopoverSide,\n} from '@ojiepermana/angular/component';\nimport { LayoutService, type LayoutMode, type LayoutWidth } from '@ojiepermana/angular/layout';\nimport { UiNavIconComponent } from '@ojiepermana/angular/navigation';\nimport { ThemeService, type ColorScheme } from '@ojiepermana/angular/theme';\n\ninterface ToggleOption<T extends string> {\n readonly value: T;\n readonly label: string;\n readonly icon: string;\n}\n\nexport type EtosThemeSwitcherAction = string;\n\nexport interface EtosThemeSwitcherUserInfo {\n readonly name: string;\n readonly subtitle?: string;\n readonly avatarSrc?: string | null;\n readonly avatarAlt?: string;\n}\n\nexport interface EtosThemeSwitcherNotificationShortcut {\n readonly value?: EtosThemeSwitcherAction;\n readonly icon?: string;\n readonly ariaLabel?: string;\n}\n\ntype EtosThemeSwitcherActionTone = 'default' | 'destructive';\n\nexport interface EtosThemeSwitcherQuickAction {\n readonly value: EtosThemeSwitcherAction;\n readonly label: string;\n readonly icon: string;\n readonly tone?: EtosThemeSwitcherActionTone;\n}\n\nconst THEME_SCHEME_OPTIONS = [\n { value: 'light', label: 'Light', icon: 'light_mode' },\n { value: 'dark', label: 'Dark', icon: 'dark_mode' },\n { value: 'system', label: 'System', icon: 'computer' },\n] as const satisfies readonly ToggleOption<ColorScheme>[];\n\nconst LAYOUT_MODE_OPTIONS = [\n { value: 'horizontal', label: 'Horizontal', icon: 'view_column' },\n { value: 'vertical', label: 'Vertical', icon: 'view_sidebar' },\n { value: 'empty', label: 'Empty', icon: 'crop_square' },\n] as const satisfies readonly ToggleOption<LayoutMode>[];\n\nconst LAYOUT_WIDTH_OPTIONS = [\n { value: 'full', label: 'Full', icon: 'fit_screen' },\n { value: 'container', label: 'Container', icon: 'center_focus_strong' },\n { value: 'wide', label: 'Wide', icon: 'width_wide' },\n] as const satisfies readonly ToggleOption<LayoutWidth>[];\n\nconst SWITCHER_PANEL_OVERLAP_OFFSET = -32;\n\n@Component({\n selector: 'etos-theme-switcher',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n AvatarComponent,\n AvatarFallbackComponent,\n AvatarImageComponent,\n ButtonComponent,\n PopoverContentDirective,\n PopoverTriggerDirective,\n UiNavIconComponent,\n ],\n host: {\n '[class]': 'hostClasses()',\n },\n template: `\n @if (notificationShortcutConfig(); as shortcut) {\n <button\n type=\"button\"\n ui-button\n variant=\"ghost\"\n size=\"icon\"\n data-trigger-action=\"notifications\"\n [attr.data-value]=\"shortcut.value\"\n [attr.aria-label]=\"shortcut.ariaLabel\"\n [class]=\"notificationButtonClasses()\"\n (click)=\"triggerNotificationAction($event)\">\n <ui-nav-icon [name]=\"shortcut.icon\" [size]=\"18\" class=\"text-current\" />\n </button>\n }\n\n <button\n #trigger=\"uiPopoverTrigger\"\n type=\"button\"\n ui-button\n variant=\"ghost\"\n size=\"icon\"\n [uiPopoverTrigger]=\"preferencesPanel\"\n [side]=\"resolvedPopoverSide()\"\n [align]=\"resolvedPopoverAlign()\"\n [sideOffset]=\"resolvedPopoverSideOffset()\"\n [attr.aria-label]=\"triggerLabel()\"\n [class]=\"triggerButtonClasses(trigger.isOpen())\">\n <ui-avatar class=\"h-8 w-8 border border-border/60 shadow-[inset_0_1px_0_rgba(255,255,255,0.18)]\">\n @if (hasAvatar()) {\n <ui-avatar-image [src]=\"avatarImageSrc()\" [alt]=\"avatarAltText()\" />\n }\n <ui-avatar-fallback class=\"bg-primary text-xs font-semibold tracking-[0.24em] text-primary-foreground\">\n {{ initials() }}\n </ui-avatar-fallback>\n </ui-avatar>\n </button>\n\n <ng-template uiPopoverContent #preferencesPanel=\"uiPopoverContent\">\n <section\n data-etos-theme-switcher-panel\n role=\"dialog\"\n aria-label=\"User Info\"\n class=\"w-[min(21rem,calc(100vw-1.5rem))] overflow-hidden border border-border/70 bg-background text-foreground shadow-[0_18px_48px_rgba(15,23,42,0.12)]\">\n <header class=\"p-5 pb-4\">\n <div class=\"flex items-center gap-4\">\n <ui-avatar class=\"h-14 w-14 border border-border/60 shadow-sm\">\n @if (hasAvatar()) {\n <ui-avatar-image [src]=\"avatarImageSrc()\" [alt]=\"avatarAltText()\" />\n }\n <ui-avatar-fallback class=\"bg-primary text-sm font-semibold tracking-[0.24em] text-primary-foreground\">\n {{ initials() }}\n </ui-avatar-fallback>\n </ui-avatar>\n\n <div class=\"min-w-0 flex min-h-14 flex-1 flex-col justify-center self-center\">\n <div class=\"space-y-px\">\n <h2 class=\"truncate text-[1.1rem] font-semibold leading-none tracking-tight text-foreground\">\n {{ resolvedUserName() }}\n </h2>\n <p class=\"text-sm leading-[0.95rem] text-muted-foreground\">\n {{ resolvedUserSubtitle() }}\n </p>\n </div>\n </div>\n </div>\n </header>\n\n <div class=\"space-y-4 px-5 pb-5\">\n <section\n data-setting=\"theme-scheme\"\n [attr.data-current]=\"themeScheme()\"\n class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of themeSchemeOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"themeOptionClasses(themeScheme() === option.value)\"\n data-setting-option=\"theme-scheme\"\n [attr.data-value]=\"option.value\"\n (click)=\"setThemeScheme(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(themeScheme() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </section>\n\n <section data-setting=\"layout-mode\" [attr.data-current]=\"layoutMode()\" class=\"space-y-2\">\n <div class=\"px-1\">\n <p class=\"text-[0.72rem] font-semibold uppercase tracking-[0.22em] text-muted-foreground\">Layout</p>\n </div>\n <div class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of layoutModeOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"segmentedOptionClasses(layoutMode() === option.value)\"\n data-setting-option=\"layout-mode\"\n [attr.data-value]=\"option.value\"\n (click)=\"setLayoutMode(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(layoutMode() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </div>\n </section>\n\n <section data-setting=\"layout-width\" [attr.data-current]=\"layoutWidth()\" class=\"space-y-2\">\n <div class=\"px-1\">\n <p class=\"text-[0.72rem] font-semibold uppercase tracking-[0.22em] text-muted-foreground\">Width</p>\n </div>\n <div class=\"rounded-(--layout-frame-radius) bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-3 gap-1\">\n @for (option of layoutWidthOptions; track option.value) {\n <button\n type=\"button\"\n ui-button\n size=\"sm\"\n variant=\"ghost\"\n [class]=\"segmentedOptionClasses(layoutWidth() === option.value)\"\n data-setting-option=\"layout-width\"\n [attr.data-value]=\"option.value\"\n (click)=\"setLayoutWidth(option.value)\">\n <span class=\"inline-flex items-center gap-2.5\">\n <ui-nav-icon\n [name]=\"option.icon\"\n [size]=\"18\"\n [class]=\"themeIconClasses(layoutWidth() === option.value)\" />\n <span class=\"text-sm font-semibold leading-none\">{{ option.label }}</span>\n </span>\n </button>\n }\n </div>\n </div>\n </section>\n\n <section class=\"space-y-1 border-t border-border/70 pt-2\">\n <h3 class=\"sr-only\">Quick Actions</h3>\n <div class=\"grid gap-1\">\n @for (action of actionOptions(); track action.value) {\n <button\n type=\"button\"\n ui-button\n variant=\"ghost\"\n [class]=\"actionButtonClasses(action.tone ?? 'default')\"\n data-action-option\n [attr.data-value]=\"action.value\"\n (click)=\"triggerAction(action.value)\">\n <span class=\"inline-flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted/65\">\n <ui-nav-icon\n [name]=\"action.icon\"\n [size]=\"19\"\n [class]=\"actionIconClasses(action.tone ?? 'default')\" />\n </span>\n <span [class]=\"actionLabelClasses(action.tone ?? 'default')\">\n {{ action.label }}\n </span>\n </button>\n }\n </div>\n </section>\n </div>\n </section>\n </ng-template>\n `,\n})\nexport class EtosThemeSwitcherComponent {\n private readonly theme = inject(ThemeService);\n private readonly layout = inject(LayoutService);\n private readonly popoverTrigger = viewChild.required<PopoverTriggerDirective>('trigger');\n\n readonly class = input<string>('');\n readonly userInfo = input<EtosThemeSwitcherUserInfo | null>(null);\n readonly userName = input<string>('User');\n readonly userSubtitle = input<string>('Theme and layout preferences');\n readonly avatarSrc = input<string | null>(null);\n readonly avatarAlt = input<string>('');\n readonly quickActions = input.required<readonly EtosThemeSwitcherQuickAction[]>();\n readonly notificationShortcut = input<EtosThemeSwitcherNotificationShortcut | null>(null);\n readonly showNotificationShortcut = input<boolean>(false);\n readonly popoverSide = input<PopoverSide | null>(null);\n readonly popoverAlign = input<PopoverAlign | null>(null);\n readonly popoverSideOffset = input<number | null>(null);\n readonly actionSelected = output<EtosThemeSwitcherAction>();\n\n protected readonly themeMode = this.theme.mode;\n protected readonly themeScheme = this.theme.scheme;\n protected readonly layoutMode = this.layout.mode;\n protected readonly layoutWidth = this.layout.width;\n\n protected readonly themeSchemeOptions = THEME_SCHEME_OPTIONS;\n protected readonly layoutModeOptions = LAYOUT_MODE_OPTIONS;\n protected readonly layoutWidthOptions = LAYOUT_WIDTH_OPTIONS;\n protected readonly notificationShortcutConfig = computed<Required<EtosThemeSwitcherNotificationShortcut> | null>(\n () => {\n const shortcut = this.notificationShortcut();\n\n if (shortcut) {\n return {\n value: shortcut.value ?? 'notifications',\n icon: shortcut.icon ?? 'notifications',\n ariaLabel: shortcut.ariaLabel ?? `Open notifications for ${this.resolvedUserName()}`,\n };\n }\n\n if (!this.showNotificationShortcut()) {\n return null;\n }\n\n return {\n value: 'notifications',\n icon: 'notifications',\n ariaLabel: `Open notifications for ${this.resolvedUserName()}`,\n };\n },\n );\n protected readonly actionOptions = computed(() => {\n const shortcutValue = this.notificationShortcutConfig()?.value;\n\n if (!shortcutValue) {\n return this.quickActions();\n }\n\n return this.quickActions().filter((action) => action.value !== shortcutValue);\n });\n\n protected readonly hostClasses = computed(() => cn('inline-flex shrink-0 items-center gap-2', this.class()));\n protected readonly resolvedPopoverSide = computed<PopoverSide>(\n () => this.popoverSide() ?? (this.layoutMode() === 'vertical' ? 'top' : 'bottom'),\n );\n protected readonly resolvedPopoverAlign = computed<PopoverAlign>(\n () => this.popoverAlign() ?? (this.layoutMode() === 'vertical' ? 'start' : 'end'),\n );\n protected readonly resolvedPopoverSideOffset = computed(\n () => this.popoverSideOffset() ?? SWITCHER_PANEL_OVERLAP_OFFSET,\n );\n protected readonly resolvedUserName = computed(() => this.userInfo()?.name?.trim() || this.userName());\n protected readonly resolvedUserSubtitle = computed(() => this.userInfo()?.subtitle ?? this.userSubtitle());\n protected readonly resolvedAvatarSrc = computed(() => this.userInfo()?.avatarSrc ?? this.avatarSrc());\n protected readonly resolvedAvatarAlt = computed(() => this.userInfo()?.avatarAlt ?? this.avatarAlt());\n protected readonly hasAvatar = computed(() => !!this.resolvedAvatarSrc());\n protected readonly avatarImageSrc = computed(() => this.resolvedAvatarSrc() ?? '');\n protected readonly avatarAltText = computed(() => this.resolvedAvatarAlt() || `${this.resolvedUserName()} avatar`);\n protected readonly initials = computed(() => this.toInitials(this.resolvedUserName()));\n protected readonly triggerLabel = computed(() => `Open user info for ${this.resolvedUserName()}`);\n\n protected triggerButtonClasses(open: boolean): string {\n return cn(\n 'relative h-8 w-8 rounded-full p-0 transition-colors duration-150 hover:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n open && 'bg-muted/50',\n );\n }\n\n protected notificationButtonClasses(): string {\n return cn(\n 'h-8 w-8 rounded-[var(--layout-frame-radius)] p-0 text-muted-foreground transition-colors duration-150 hover:bg-muted/50 hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background',\n );\n }\n\n protected segmentedOptionClasses(active: boolean): string {\n return cn(\n 'h-10 rounded-[var(--layout-frame-radius)] border border-transparent px-[0.3125rem] py-[0.1875rem] text-foreground transition-colors',\n active ? 'bg-background shadow-sm' : 'text-muted-foreground hover:bg-background/70',\n );\n }\n\n protected themeOptionClasses(active: boolean): string {\n return this.segmentedOptionClasses(active);\n }\n\n protected themeIconClasses(active: boolean): string {\n return active ? 'text-foreground' : 'text-muted-foreground';\n }\n\n protected actionButtonClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return cn(\n 'h-12 w-full justify-start gap-2.5 rounded-[var(--layout-frame-radius)] border border-transparent px-2 py-1.5 text-left transition-colors hover:bg-muted/50',\n tone === 'destructive' && 'hover:bg-destructive/8 focus-visible:ring-destructive/30',\n );\n }\n\n protected actionIconClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return tone === 'destructive' ? 'text-destructive' : 'text-foreground';\n }\n\n protected actionLabelClasses(tone: EtosThemeSwitcherActionTone = 'default'): string {\n return tone === 'destructive' ? 'text-sm font-medium text-destructive' : 'text-sm font-medium text-foreground';\n }\n\n protected setThemeScheme(mode: ColorScheme): void {\n this.theme.setScheme(mode);\n }\n\n protected setLayoutMode(mode: LayoutMode): void {\n this.layout.setMode(mode);\n }\n\n protected setLayoutWidth(width: LayoutWidth): void {\n this.layout.setWidth(width);\n }\n\n protected triggerAction(action: EtosThemeSwitcherAction): void {\n this.actionSelected.emit(action);\n this.popoverTrigger().close();\n }\n\n protected triggerNotificationAction(event: Event): void {\n event.stopPropagation();\n\n const shortcut = this.notificationShortcutConfig();\n\n if (!shortcut) {\n return;\n }\n\n this.actionSelected.emit(shortcut.value);\n }\n\n private labelForLayoutMode(mode: LayoutMode): string {\n if (mode === 'horizontal') {\n return 'Horizontal';\n }\n\n if (mode === 'empty') {\n return 'Empty';\n }\n\n return 'Vertical';\n }\n\n private labelForLayoutWidth(width: LayoutWidth): string {\n if (width === 'container') {\n return 'Container';\n }\n\n if (width === 'wide') {\n return 'Wide';\n }\n\n return 'Full';\n }\n\n private toInitials(name: string): string {\n const segments = name.trim().split(/\\s+/).filter(Boolean);\n\n if (segments.length === 0) {\n return 'UI';\n }\n\n if (segments.length === 1) {\n return segments[0].slice(0, 2).toUpperCase();\n }\n\n return `${segments[0][0] ?? ''}${segments[1][0] ?? ''}`.toUpperCase();\n }\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n@Component({\n selector: 'empty',\n imports: [RouterOutlet],\n template: `\n <div\n class=\"h-dvh overflow-hidden bg-neutral-200 bg-[linear-gradient(rgba(212,212,212,0.45)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.45)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div class=\"relative isolate box-border h-full overflow-hidden py-3\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-y-0 inset-x-0 px-3\">\n <div class=\"relative mx-auto h-full w-full\">\n <div class=\"absolute inset-y-0 left-0 w-px bg-brand\"></div>\n <div class=\"absolute inset-y-0 right-0 w-px bg-brand\"></div>\n </div>\n </div>\n\n <div class=\"h-full min-h-0 border border-brand px-3\">\n <main class=\"mx-auto w-full h-full min-h-0 overflow-y-auto bg-background/65\">\n <router-outlet />\n </main>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class EmptyLayout {}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { LayoutService } from '@ojiepermana/angular/layout';\nimport { TopbarComponent } from '@ojiepermana/angular/navigation';\n\n@Component({\n selector: 'horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgTemplateOutlet, RouterOutlet, TopbarComponent],\n host: {\n class: 'block',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <div\n class=\"min-h-screen bg-neutral-200 text-neutral-600 bg-[linear-gradient(rgba(212,212,212,0.45)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.45)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div [class]=\"shellClasses()\">\n <div aria-hidden=\"true\" [class]=\"railOverlayClasses()\">\n <div [class]=\"railGuideClasses()\">\n <div class=\"absolute inset-y-0 left-0 w-px bg-brand\"></div>\n <div class=\"absolute inset-y-0 right-0 w-px bg-brand\"></div>\n </div>\n </div>\n\n <div [class]=\"frameClasses()\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 z-0\">\n <div class=\"absolute inset-x-0 top-11 h-px bg-brand\"></div>\n <div class=\"absolute inset-x-0 bottom-11 h-px bg-brand\"></div>\n </div>\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-0 z-10\">\n <div [class]=\"maskClasses()\"></div>\n </div>\n <div [class]=\"contentClasses()\">\n <nav class=\"shrink-0\">\n <topbar class=\"shrink-0\" [showHamburger]=\"false\">\n @if (brandTemplate(); as brand) {\n <div topbar-start class=\"min-w-0\">\n <ng-container [ngTemplateOutlet]=\"brand\" />\n </div>\n }\n\n @if (profileTemplate(); as profile) {\n <div topbar-end class=\"flex min-w-0 items-center\">\n <ng-container [ngTemplateOutlet]=\"profile\" />\n </div>\n }\n </topbar>\n </nav>\n <main class=\"min-h-0 flex-1 overflow-auto\">\n <router-outlet />\n </main>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n})\nexport class HorizontalLayout {\n private readonly layout = inject(LayoutService);\n\n readonly brandTemplate = input<TemplateRef<unknown> | null>(null);\n readonly profileTemplate = input<TemplateRef<unknown> | null>(null);\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly shellClasses = computed(() => {\n switch (this.layoutWidth()) {\n case 'full':\n return 'relative isolate box-border h-dvh overflow-hidden py-3';\n case 'wide':\n return 'relative isolate box-border h-dvh overflow-hidden py-3 lg:py-10';\n default:\n return 'relative isolate box-border h-dvh overflow-hidden py-3 lg:py-20';\n }\n });\n\n protected readonly railOverlayClasses = computed(() => {\n const classes = ['pointer-events-none', 'absolute', 'inset-y-0', 'inset-x-0', 'z-20'];\n if (this.layoutWidth() === 'full') {\n classes.push('px-3');\n } else if (this.layoutWidth() === 'wide') {\n classes.push('px-3', 'lg:px-10');\n } else {\n classes.push('px-3', 'lg:px-10');\n }\n return classes.join(' ');\n });\n\n protected readonly railGuideClasses = computed(() =>\n this.layoutWidth() === 'container' ? 'relative mx-auto h-full w-full max-w-7xl' : 'relative mx-auto h-full w-full',\n );\n\n protected readonly frameClasses = computed(() => {\n const classes = ['relative', 'z-10', 'h-full', 'min-h-0', 'border', 'border-brand'];\n if (this.layoutWidth() === 'full') {\n classes.push('px-3');\n } else if (this.layoutWidth() === 'wide') {\n classes.push('px-3', 'lg:px-10');\n } else {\n classes.push('px-3', 'lg:px-10');\n }\n return classes.join(' ');\n });\n\n protected readonly maskClasses = computed(() => {\n const classes = ['h-full', 'bg-position-[center_center]', 'bg-size-[2.775rem_2.775rem]'];\n if (this.layoutWidth() === 'container') {\n classes.unshift('mx-auto', 'w-full', 'max-w-7xl');\n } else {\n classes.unshift('mx-auto', 'w-full');\n }\n return classes.join(' ');\n });\n\n protected readonly contentClasses = computed(() => {\n const classes = [\n 'relative',\n 'z-20',\n 'mx-auto',\n 'flex',\n 'h-full',\n 'min-h-0',\n 'flex-col',\n 'overflow-hidden',\n 'bg-background/65',\n ];\n if (this.layoutWidth() === 'container') {\n classes.push('w-full', 'max-w-7xl');\n } else {\n classes.push('w-full');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { RouterOutlet } from '@angular/router';\n\nimport { SidebarComponent, type SidebarAppearance, type SidebarPosition } from '@ojiepermana/angular/navigation';\nimport { LayoutService } from '@ojiepermana/angular/layout';\n\n@Component({\n selector: 'vertical',\n imports: [NgTemplateOutlet, RouterOutlet, SidebarComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-dvh overflow-hidden',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <!-- prettier-ignore -->\n <div class=\"h-full overflow-hidden bg-neutral-200 bg-[linear-gradient(rgba(212,212,212,0.65)_1px,transparent_1px),linear-gradient(to_right,rgba(212,212,212,0.65)_1px,transparent_1px)] bg-position-[center_center] bg-size-[2.775rem_2.775rem]\">\n <div [class]=\"shellClasses()\">\n <div [class]=\"frameClasses()\">\n <div aria-hidden=\"true\" class=\"pointer-events-none absolute inset-x-0 inset-y-8\">\n <div class=\"absolute inset-x-0 top-3.75 h-px bg-brand\"></div>\n <div class=\"absolute inset-x-0 bottom-3.75 h-px bg-brand\"></div>\n </div>\n <div [class]=\"frameBodyClasses()\">\n <div [class]=\"gridClasses()\">\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] left-0 top-[-100vh] z-20 w-px bg-brand\"></div>\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] right-0 top-[-100vh] z-20 w-px bg-brand\"></div>\n <nav class=\"relative h-full min-h-0 shrink-0 overflow-visible border-r border-brand\">\n <div\n aria-hidden=\"true\"\n class=\"pointer-events-none absolute bottom-[-100vh] left-full top-[-100vh] -z-10 w-px bg-brand\"></div>\n <sidebar\n class=\"h-full\"\n [appearance]=\"sidebarAppearance()\"\n [position]=\"sidebarPosition()\"\n [ariaLabel]=\"ariaLabel()\">\n @if (sidebarHeaderTemplate(); as headerTemplate) {\n <div sidebar-header class=\"contents\">\n <ng-container [ngTemplateOutlet]=\"headerTemplate\" />\n </div>\n }\n @if (sidebarFooterTemplate(); as footerTemplate) {\n <div sidebar-footer class=\"contents\">\n <ng-container [ngTemplateOutlet]=\"footerTemplate\" />\n </div>\n }\n </sidebar>\n </nav>\n <main class=\"relative min-h-0 min-w-0 overflow-y-auto\">\n <router-outlet />\n </main>\n </div>\n </div>\n </div>\n </div>\n </div>\n `,\n styles: ``,\n})\nexport class VerticalLayout {\n private readonly layout = inject(LayoutService);\n\n readonly sidebarAppearance = input<SidebarAppearance>('default');\n readonly sidebarPosition = input<SidebarPosition>('left');\n readonly ariaLabel = input<string>('Primary');\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly shellClasses = computed(() => {\n switch (this.layoutWidth()) {\n case 'full':\n return 'relative isolate h-full overflow-hidden py-2';\n case 'wide':\n return 'relative isolate h-full overflow-hidden py-2 lg:py-10';\n default:\n return 'relative isolate h-full overflow-hidden py-2 lg:py-18';\n }\n });\n\n protected readonly frameClasses = computed(() => {\n if (this.layoutWidth() === 'wide') {\n return 'relative h-full border-y border-brand';\n }\n\n return '-mx-18 relative h-full border-y border-brand';\n });\n\n protected readonly frameBodyClasses = computed(() => {\n if (this.layoutWidth() === 'wide') {\n return 'h-full lg:px-10';\n }\n\n return 'h-full px-20';\n });\n\n protected readonly gridClasses = computed(() => {\n const classes = [\n 'relative',\n 'mx-auto',\n 'grid',\n 'h-full',\n 'w-full',\n 'max-w-full',\n 'grid-cols-[auto_minmax(0,1fr)]',\n 'items-stretch',\n 'bg-background/65',\n ];\n\n switch (this.layoutWidth()) {\n case 'container':\n classes.push('lg:max-w-[var(--layout-vertical-shell-max-width)]');\n break;\n default:\n break;\n }\n\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, type TemplateRef } from '@angular/core';\nimport { LayoutService, type LayoutMode } from '@ojiepermana/angular/layout';\nimport { EmptyLayout } from './empty/empty';\nimport { HorizontalLayout } from './horizontal/horizontal';\nimport { VerticalLayout } from './vertical/vertical';\n\n@Component({\n selector: 'etos-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [EmptyLayout, HorizontalLayout, VerticalLayout],\n host: {\n class: 'contents',\n '[attr.data-layout-mode]': 'resolvedMode()',\n },\n template: `\n @switch (resolvedMode()) {\n @case ('empty') {\n <empty />\n }\n @case ('horizontal') {\n <horizontal [brandTemplate]=\"layoutBrandTemplate()\" [profileTemplate]=\"layoutProfileTemplate()\" />\n }\n @default {\n <vertical\n [sidebarHeaderTemplate]=\"sidebarHeaderTemplate() ?? layoutBrandTemplate()\"\n [sidebarFooterTemplate]=\"sidebarFooterTemplate() ?? layoutProfileTemplate()\" />\n }\n }\n `,\n})\nexport class EtosLayoutComponent {\n readonly mode = input<LayoutMode | null>(null);\n readonly sidebarHeaderTemplate = input<TemplateRef<unknown> | null>(null);\n readonly sidebarFooterTemplate = input<TemplateRef<unknown> | null>(null);\n readonly layoutBrandTemplate = input<TemplateRef<unknown> | null>(null);\n readonly layoutProfileTemplate = input<TemplateRef<unknown> | null>(null);\n\n private readonly layout = inject(LayoutService);\n protected readonly resolvedMode = computed(() => this.mode() ?? this.layout.mode());\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\n\n@Component({\n selector: 'shell-pages',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n class: 'block h-full min-h-0',\n },\n template: `\n <div class=\"flex h-full flex-col overflow-hidden\">\n <header class=\"flex h-12 min-w-0 shrink-0 items-center gap-2 border-b border-border px-2\">\n <ng-content select=\"[shell-pages-header]\" />\n </header>\n\n <main class=\"min-h-0 flex-1 overflow-y-auto\"><ng-content select=\"[shell-pages-main]\" /></main>\n\n <footer class=\"flex h-12 min-w-0 shrink-0 items-center gap-2 border-t border-border px-2\">\n <ng-content select=\"[shell-pages-footer]\" />\n </footer>\n </div>\n `,\n styles: `\n footer:empty {\n display: none;\n }\n `,\n})\nexport class ShellPagesComponent {}\n","/*\n * Public API Surface of @ojiepermana/angular/etos\n *\n * Etos-specific implementation lives under projects/angular/brand/etos.\n */\n\nexport * from './core/etos-brand.config';\nexport * from './core/etos-brand.provider';\nexport * from './component/theme-switcher';\nexport * from './shells/layouts/etos.layout';\nexport * from './shells/pages/shell-pages';\n\nexport const ETOS_BRAND_VERSION = '0.0.1';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -38,8 +38,8 @@ async function generate(target, workspaceRoot) {
38
38
  // public-api barrel is emitted last so it sees the final feature set.
39
39
  files.push(...(0, public_api_1.emitPublicApi)(ir, target));
40
40
  const laidOut = target.splitByDomain ? (0, per_domain_1.relayoutPerDomain)(files, ir, target) : files;
41
- const wrapped = applyMode(laidOut, ir, target);
42
41
  const outputDir = (0, node_path_1.isAbsolute)(target.output) ? target.output : (0, node_path_1.resolve)(workspaceRoot, target.output);
42
+ const wrapped = applyMode(laidOut, ir, target, workspaceRoot, outputDir);
43
43
  return {
44
44
  target,
45
45
  outputDir,
@@ -52,12 +52,12 @@ async function generate(target, workspaceRoot) {
52
52
  },
53
53
  };
54
54
  }
55
- function applyMode(files, ir, target) {
55
+ function applyMode(files, ir, target, workspaceRoot, outputDir) {
56
56
  switch (target.mode) {
57
57
  case 'library':
58
- return (0, index_1.writeLibrary)(files, ir, target);
58
+ return (0, index_1.writeLibrary)(files, ir, target, workspaceRoot, outputDir);
59
59
  case 'secondary-entrypoint':
60
- return (0, index_1.writeSecondaryEntrypoint)(files, ir, target);
60
+ return (0, index_1.writeSecondaryEntrypoint)(files, ir, target, workspaceRoot, outputDir);
61
61
  case 'standalone':
62
62
  default:
63
63
  return (0, index_1.writeStandalone)(files);
@@ -293,7 +293,7 @@ function emitPublicApis(ir, target, mapping) {
293
293
  }
294
294
  if (target.features.metadata) {
295
295
  sharedLines.push(`export * from './metadata-types';`);
296
- sharedLines.push(`export * from './validators';`);
296
+ sharedLines.push(`export * from './validators/index';`);
297
297
  sharedLines.push('');
298
298
  }
299
299
  if (target.features.navigation) {
@@ -321,6 +321,14 @@ function emitPublicApis(ir, target, mapping) {
321
321
  if (ownedModels.length)
322
322
  lines.push('');
323
323
  }
324
+ if (target.features.metadata) {
325
+ const tags = (mapping.domainServices.get(domain) ?? []).slice().sort();
326
+ for (const tag of tags) {
327
+ lines.push(`export { ${(0, template_1.camelCase)(tag)}OperationRules } from './permissions/${(0, template_1.kebabCase)(tag)}';`);
328
+ }
329
+ if (tags.length)
330
+ lines.push('');
331
+ }
324
332
  if (target.features.services) {
325
333
  const tags = mapping.domainServices.get(domain) ?? [];
326
334
  for (const tag of tags.sort()) {
@@ -3,7 +3,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.writeStandalone = writeStandalone;
4
4
  exports.writeLibrary = writeLibrary;
5
5
  exports.writeSecondaryEntrypoint = writeSecondaryEntrypoint;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
6
8
  const template_1 = require("../render/template");
9
+ const ROOT_ENTRYPOINT = '';
10
+ const VIRTUAL_ROOT = '/__sdk__';
7
11
  /**
8
12
  * No-op writer for the standalone mode — returns emitted files unchanged. Kept
9
13
  * as a named function so modes are composable from a single switch at the
@@ -16,10 +20,11 @@ function writeStandalone(files) {
16
20
  * Library mode: add `ng-package.json`, `package.json`, and a top-level README
17
21
  * so the `output` folder can be built with ng-packagr directly.
18
22
  */
19
- function writeLibrary(files, ir, target) {
23
+ function writeLibrary(files, ir, target, workspaceRoot, outputDir) {
24
+ const normalizedFiles = rewriteCrossEntrypointImports(files, target, workspaceRoot, outputDir);
20
25
  const ngPackage = {
21
- $schema: '../../node_modules/ng-packagr/ng-package.schema.json',
22
- dest: `../dist/${target.packageName.replace(/^@/, '').replace(/\//g, '-')}`,
26
+ $schema: toPosixPath((0, node_path_1.relative)(outputDir, (0, node_path_1.resolve)(workspaceRoot, 'node_modules/ng-packagr/ng-package.schema.json'))),
27
+ dest: toPosixPath((0, node_path_1.relative)(outputDir, (0, node_path_1.resolve)(workspaceRoot, 'dist', packageSlug(target.packageName)))),
23
28
  lib: { entryFile: 'public-api.ts' },
24
29
  };
25
30
  const pkg = {
@@ -34,9 +39,9 @@ function writeLibrary(files, ir, target) {
34
39
  sideEffects: false,
35
40
  };
36
41
  return [
37
- ...files,
42
+ ...normalizedFiles,
38
43
  createNgPackageFile('ng-package.json', ngPackage),
39
- ...createNestedEntrypointNgPackages(files),
44
+ ...createNestedEntrypointNgPackages(normalizedFiles),
40
45
  {
41
46
  path: 'package.json',
42
47
  content: (0, template_1.finalize)(JSON.stringify(pkg, null, 2)),
@@ -53,11 +58,154 @@ function writeLibrary(files, ir, target) {
53
58
  * existing library (e.g. `projects/angular/sdk-api/`) so ng-packagr picks it
54
59
  * up automatically as a secondary entrypoint of the parent library.
55
60
  */
56
- function writeSecondaryEntrypoint(files, _ir, _target) {
61
+ function writeSecondaryEntrypoint(files, _ir, target, workspaceRoot, outputDir) {
62
+ const normalizedFiles = rewriteCrossEntrypointImports(files, target, workspaceRoot, outputDir);
57
63
  const ngPackage = {
58
64
  lib: { entryFile: 'public-api.ts' },
59
65
  };
60
- return [...files, createNgPackageFile('ng-package.json', ngPackage), ...createNestedEntrypointNgPackages(files)];
66
+ return [
67
+ ...normalizedFiles,
68
+ createNgPackageFile('ng-package.json', ngPackage),
69
+ ...createNestedEntrypointNgPackages(normalizedFiles),
70
+ ];
71
+ }
72
+ function rewriteCrossEntrypointImports(files, target, workspaceRoot, outputDir) {
73
+ const entrypointDirs = collectEntrypointDirs(files);
74
+ if (entrypointDirs.length <= 1) {
75
+ return [...files];
76
+ }
77
+ const packageImportBase = resolvePackageImportBase(target, workspaceRoot, outputDir);
78
+ if (!packageImportBase) {
79
+ return [...files];
80
+ }
81
+ const knownFiles = new Set(files.map((file) => file.path));
82
+ return files.map((file) => {
83
+ const owner = findEntrypointOwner(file.path, entrypointDirs);
84
+ if (owner === ROOT_ENTRYPOINT) {
85
+ return file;
86
+ }
87
+ return {
88
+ ...file,
89
+ content: file.content.replace(/(from\s+['"])([^'"]+)(['"])/g, (_match, prefix, spec, suffix) => {
90
+ const nextSpec = rewriteModuleSpecifier(spec, file.path, owner, entrypointDirs, knownFiles, packageImportBase);
91
+ return `${prefix}${nextSpec}${suffix}`;
92
+ }),
93
+ };
94
+ });
95
+ }
96
+ function rewriteModuleSpecifier(specifier, currentPath, currentOwner, entrypointDirs, knownFiles, packageImportBase) {
97
+ if (!specifier.startsWith('./') && !specifier.startsWith('../')) {
98
+ return specifier;
99
+ }
100
+ const targetPath = resolveVirtualFilePath(currentPath, specifier, knownFiles);
101
+ if (!targetPath) {
102
+ return specifier;
103
+ }
104
+ const targetOwner = findEntrypointOwner(targetPath, entrypointDirs);
105
+ if (targetOwner === currentOwner) {
106
+ return specifier;
107
+ }
108
+ return buildEntrypointImport(packageImportBase, targetOwner);
109
+ }
110
+ function resolveVirtualFilePath(currentPath, specifier, knownFiles) {
111
+ const currentAbs = node_path_1.posix.join(VIRTUAL_ROOT, currentPath);
112
+ const resolved = node_path_1.posix.normalize(node_path_1.posix.join((0, node_path_1.dirname)(currentAbs), specifier));
113
+ const candidates = [`${resolved}.ts`, `${resolved}/index.ts`, `${resolved}/public-api.ts`, resolved];
114
+ for (const candidate of candidates) {
115
+ if (!candidate.startsWith(`${VIRTUAL_ROOT}/`)) {
116
+ continue;
117
+ }
118
+ const relativePath = candidate.slice(VIRTUAL_ROOT.length + 1);
119
+ if (knownFiles.has(relativePath)) {
120
+ return relativePath;
121
+ }
122
+ }
123
+ return undefined;
124
+ }
125
+ function resolvePackageImportBase(target, workspaceRoot, outputDir) {
126
+ if (target.mode === 'library') {
127
+ return target.packageName;
128
+ }
129
+ if (target.mode !== 'secondary-entrypoint') {
130
+ return '';
131
+ }
132
+ return inferSecondaryEntrypointPackageName(workspaceRoot, outputDir, target.packageName);
133
+ }
134
+ function inferSecondaryEntrypointPackageName(workspaceRoot, outputDir, fallback) {
135
+ let currentDir = outputDir;
136
+ let nearestPackageDir;
137
+ let nearestPackagrDir;
138
+ while (isWithinWorkspace(currentDir, workspaceRoot)) {
139
+ const packageJsonPath = (0, node_path_1.resolve)(currentDir, 'package.json');
140
+ if ((0, node_fs_1.existsSync)(packageJsonPath)) {
141
+ nearestPackageDir ??= currentDir;
142
+ if ((0, node_fs_1.existsSync)((0, node_path_1.resolve)(currentDir, 'ng-package.json'))) {
143
+ nearestPackagrDir = currentDir;
144
+ break;
145
+ }
146
+ }
147
+ if (currentDir === workspaceRoot) {
148
+ break;
149
+ }
150
+ const parentDir = (0, node_path_1.dirname)(currentDir);
151
+ if (parentDir === currentDir) {
152
+ break;
153
+ }
154
+ currentDir = parentDir;
155
+ }
156
+ const packageDir = nearestPackagrDir ?? nearestPackageDir;
157
+ if (!packageDir) {
158
+ return fallback;
159
+ }
160
+ const packageName = readPackageName(packageDir);
161
+ if (!packageName) {
162
+ return fallback;
163
+ }
164
+ const relativeOutput = toPosixPath((0, node_path_1.relative)(packageDir, outputDir)).replace(/^\.\//, '');
165
+ if (!relativeOutput || relativeOutput === '.') {
166
+ return packageName;
167
+ }
168
+ return `${packageName}/${relativeOutput}`;
169
+ }
170
+ function readPackageName(packageDir) {
171
+ const packageJsonPath = (0, node_path_1.resolve)(packageDir, 'package.json');
172
+ if (!(0, node_fs_1.existsSync)(packageJsonPath)) {
173
+ return undefined;
174
+ }
175
+ const raw = JSON.parse((0, node_fs_1.readFileSync)(packageJsonPath, 'utf8'));
176
+ return typeof raw.name === 'string' && raw.name.length > 0 ? raw.name : undefined;
177
+ }
178
+ function isWithinWorkspace(candidate, workspaceRoot) {
179
+ const rel = (0, node_path_1.relative)(workspaceRoot, candidate);
180
+ return rel === '' || (!rel.startsWith('..') && !(0, node_path_1.isAbsolute)(rel));
181
+ }
182
+ function collectEntrypointDirs(files) {
183
+ const dirs = new Set();
184
+ for (const file of files) {
185
+ if (file.path === 'public-api.ts') {
186
+ dirs.add(ROOT_ENTRYPOINT);
187
+ continue;
188
+ }
189
+ if (!file.path.endsWith('/public-api.ts')) {
190
+ continue;
191
+ }
192
+ dirs.add(file.path.slice(0, -'/public-api.ts'.length));
193
+ }
194
+ return [...dirs].sort((left, right) => right.length - left.length || left.localeCompare(right));
195
+ }
196
+ function findEntrypointOwner(filePath, entrypointDirs) {
197
+ for (const entrypointDir of entrypointDirs) {
198
+ if (entrypointDir === ROOT_ENTRYPOINT) {
199
+ continue;
200
+ }
201
+ if (filePath === `${entrypointDir}/public-api.ts` || filePath.startsWith(`${entrypointDir}/`)) {
202
+ return entrypointDir;
203
+ }
204
+ }
205
+ return ROOT_ENTRYPOINT;
206
+ }
207
+ function buildEntrypointImport(packageImportBase, entrypointDir) {
208
+ return entrypointDir ? `${packageImportBase}/${entrypointDir}` : packageImportBase;
61
209
  }
62
210
  function createNestedEntrypointNgPackages(files) {
63
211
  return collectSecondaryEntrypointDirs(files).map((dir) => createNgPackageFile(`${dir}/ng-package.json`, {
@@ -74,6 +222,12 @@ function collectSecondaryEntrypointDirs(files) {
74
222
  }
75
223
  return [...dirs].sort();
76
224
  }
225
+ function packageSlug(packageName) {
226
+ return packageName.replace(/^@/, '').replace(/\//g, '-');
227
+ }
228
+ function toPosixPath(value) {
229
+ return value.split('\\').join('/');
230
+ }
77
231
  function createNgPackageFile(path, content) {
78
232
  return {
79
233
  path,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojiepermana/angular",
3
- "version": "21.1.15",
3
+ "version": "21.1.17",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ojiepermana/angular.git"
@@ -65,11 +65,11 @@
65
65
  "sideEffects": false,
66
66
  "schematics": "./collection.json",
67
67
  "exports": {
68
- "./etos/styles": "./etos/styles/index.css",
68
+ "./etos/styles": "./etos/styles/package.css",
69
69
  "./etos/styles/*": "./etos/styles/*",
70
70
  "./theme/styles": "./theme/styles/index.css",
71
71
  "./theme/styles/*": "./theme/styles/*",
72
- "./theme/tailwind/theme.css": "./theme/styles/themes/taildwind.css",
72
+ "./theme/tailwind/theme.css": "./theme/styles/themes/tailwind.css",
73
73
  "./package.json": {
74
74
  "default": "./package.json"
75
75
  },
@@ -104,6 +104,14 @@
104
104
  "./etos": {
105
105
  "types": "./types/ojiepermana-angular-brand-etos.d.ts",
106
106
  "default": "./fesm2022/ojiepermana-angular-brand-etos.mjs"
107
+ },
108
+ "./etos/shell/layout": {
109
+ "types": "./types/ojiepermana-angular-brand-etos.d.ts",
110
+ "default": "./fesm2022/ojiepermana-angular-brand-etos.mjs"
111
+ },
112
+ "./etos/shell/pages": {
113
+ "types": "./types/ojiepermana-angular-brand-etos.d.ts",
114
+ "default": "./fesm2022/ojiepermana-angular-brand-etos.mjs"
107
115
  }
108
116
  },
109
117
  "module": "fesm2022/ojiepermana-angular.mjs",
@@ -3,4 +3,4 @@
3
3
  *
4
4
  * The Etos implementation now lives under the dedicated `./etos` entrypoint.
5
5
  */
6
- @import '../../../../brand/etos/themes/index.css';
6
+ @import '@ojiepermana/angular/etos/styles';
@@ -109,4 +109,4 @@
109
109
 
110
110
  --font-sans: var(--theme-font-sans);
111
111
  --font-mono: var(--theme-font-mono);
112
- }
112
+ }
@@ -151,7 +151,12 @@ declare class EtosLayoutComponent {
151
151
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosLayoutComponent, "etos-layout", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "sidebarHeaderTemplate": { "alias": "sidebarHeaderTemplate"; "required": false; "isSignal": true; }; "sidebarFooterTemplate": { "alias": "sidebarFooterTemplate"; "required": false; "isSignal": true; }; "layoutBrandTemplate": { "alias": "layoutBrandTemplate"; "required": false; "isSignal": true; }; "layoutProfileTemplate": { "alias": "layoutProfileTemplate"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
152
152
  }
153
153
 
154
+ declare class ShellPagesComponent {
155
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<ShellPagesComponent, never>;
156
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ShellPagesComponent, "shell-pages", never, {}, {}, never, ["[shell-pages-header]", "[shell-pages-main]", "[shell-pages-footer]"], true, never>;
157
+ }
158
+
154
159
  declare const ETOS_BRAND_VERSION = "0.0.1";
155
160
 
156
- export { ETOS_BRAND_NAME, ETOS_BRAND_VERSION, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG, EtosLayoutComponent, EtosThemeSwitcherComponent, provideEtosBrand, provideEtosLayout, provideEtosTheme };
161
+ export { ETOS_BRAND_NAME, ETOS_BRAND_VERSION, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG, EtosLayoutComponent, EtosThemeSwitcherComponent, ShellPagesComponent, provideEtosBrand, provideEtosLayout, provideEtosTheme };
157
162
  export type { EtosBrandOptions, EtosThemeSwitcherAction, EtosThemeSwitcherNotificationShortcut, EtosThemeSwitcherQuickAction, EtosThemeSwitcherUserInfo };