@ojiepermana/angular 21.1.2 → 21.1.5

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ojiepermana-angular-etos.mjs","sources":["../../../projects/angular/etos/public-api.ts","../../../projects/angular/etos/ojiepermana-angular-etos.ts"],"sourcesContent":["/*\n * Public API Surface of @ojiepermana/angular/etos\n *\n * Etos-specific implementation remains isolated in projects/angular/brand/etos.\n */\n\nexport * from '@ojiepermana/angular/brand/etos';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAAA;;;;AAIG;;ACJH;;AAEG"}
1
+ {"version":3,"file":"ojiepermana-angular-etos.mjs","sources":["../../../projects/angular/etos/core/etos-brand.config.ts","../../../projects/angular/etos/core/etos-brand.provider.ts","../../../projects/angular/etos/component/theme-switcher/theme-switcher.component.ts","../../../projects/angular/etos/layouts/etos-empty-layout.component.ts","../../../projects/angular/etos/layouts/etos-horizontal-layout.component.ts","../../../projects/angular/etos/layouts/etos-vertical-layout.component.ts","../../../projects/angular/etos/layouts/etos-layout.component.ts","../../../projects/angular/etos/public-api.ts","../../../projects/angular/etos/ojiepermana-angular-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 width: 'fixed',\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] as const satisfies readonly ToggleOption<LayoutMode>[];\n\nconst LAYOUT_WIDTH_OPTIONS = [\n { value: 'full', label: 'Full', icon: 'fit_screen' },\n { value: 'fixed', label: 'Fixed', icon: 'center_focus_strong' },\n] as const satisfies readonly ToggleOption<LayoutWidth>[];\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]=\"popoverSide()\"\n [align]=\"popoverAlign()\"\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 rounded-[var(--etos-layout-frame-radius)] 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-[var(--etos-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-[var(--etos-layout-frame-radius)] bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-2 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-[var(--etos-layout-frame-radius)] bg-muted/65 p-0.5\">\n <div class=\"grid grid-cols-2 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>('bottom');\n readonly popoverAlign = input<PopoverAlign>('end');\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 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(--etos-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(--etos-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(--etos-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 return mode === 'horizontal' ? 'Horizontal' : 'Vertical';\n }\n\n private labelForLayoutWidth(width: LayoutWidth): string {\n return width === 'full' ? 'Full' : 'Fixed';\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: 'etos-empty-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet],\n host: {\n class: 'etos-layout-empty-host',\n 'data-brand-layout': 'etos-empty',\n },\n template: `\n <main class=\"etos-layout-empty-main\">\n <router-outlet />\n </main>\n `,\n})\nexport class EtosEmptyLayoutComponent {}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { LayoutService } from '@ojiepermana/angular/layout';\nimport { TopbarComponent, type TopbarAppearance } from '@ojiepermana/angular/navigation';\n\n@Component({\n selector: 'etos-horizontal-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, TopbarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-brand-layout]': 'brandLayout',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <div [class]=\"frameClasses()\">\n <ui-topbar\n class=\"etos-layout-topbar\"\n [appearance]=\"topbarAppearance()\"\n [ariaLabel]=\"ariaLabel()\"\n [style.border-bottom-width]=\"dividerBorderWidth()\">\n <div ui-topbar-start class=\"etos-layout-topbar-slot etos-layout-topbar-slot--start\">\n <ng-content select=\"[ui-layout-brand],[ui-topbar-start]\" />\n </div>\n <div ui-topbar-end class=\"etos-layout-topbar-slot etos-layout-topbar-slot--end\">\n <ng-content select=\"[ui-layout-profile],[ui-topbar-end]\" />\n </div>\n </ui-topbar>\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class EtosHorizontalLayoutComponent {\n private readonly layout = inject(LayoutService);\n\n readonly topbarAppearance = input<TopbarAppearance>('default');\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly brandLayout = 'etos-horizontal';\n protected readonly layoutWidth = this.layout.width;\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['etos-layout-host', 'etos-layout-host--horizontal'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-host--fixed');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['etos-layout-frame', 'etos-layout-frame--horizontal'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-frame--fixed');\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['etos-layout-main'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-main--fixed');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { LayoutService } from '@ojiepermana/angular/layout';\nimport { SidebarComponent, type SidebarAppearance, type SidebarPosition } from '@ojiepermana/angular/navigation';\n\n@Component({\n selector: 'etos-vertical-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, SidebarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-brand-layout]': 'brandLayout',\n '[attr.data-layout-width]': 'layoutWidth()',\n },\n template: `\n <div [class]=\"frameClasses()\">\n <ui-sidebar\n class=\"etos-layout-sidebar\"\n [appearance]=\"sidebarAppearance()\"\n [position]=\"sidebarPosition()\"\n [ariaLabel]=\"ariaLabel()\"\n [style.border-left-width]=\"dividerBorderWidth()\"\n [style.border-right-width]=\"dividerBorderWidth()\">\n <div ui-sidebar-header class=\"flex h-full w-full min-w-0 items-center\">\n <ng-content select=\"[ui-layout-brand],[ui-topbar-start],[ui-sidebar-header]\" />\n </div>\n\n <div ui-sidebar-footer class=\"flex h-full w-full min-w-0 items-center justify-between gap-3 px-3\">\n <ng-content select=\"[ui-layout-profile],[ui-topbar-end],[ui-sidebar-footer]\" />\n </div>\n </ui-sidebar>\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class EtosVerticalLayoutComponent {\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\n protected readonly brandLayout = 'etos-vertical';\n protected readonly layoutWidth = this.layout.width;\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['etos-layout-host', 'etos-layout-host--vertical'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-host--fixed');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['etos-layout-frame', 'etos-layout-frame--vertical'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-frame--fixed', 'etos-layout-frame--vertical-fixed');\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['etos-layout-main'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('etos-layout-main--fixed', 'etos-layout-main--vertical-fixed');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, inject, input } from '@angular/core';\nimport { LayoutService } from '@ojiepermana/angular/layout';\nimport { EtosHorizontalLayoutComponent } from './etos-horizontal-layout.component';\nimport { EtosVerticalLayoutComponent } from './etos-vertical-layout.component';\n\n@Component({\n selector: 'etos-layout',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [EtosHorizontalLayoutComponent, EtosVerticalLayoutComponent],\n host: {\n class: 'contents',\n },\n template: `\n @switch (layoutMode()) {\n @case ('horizontal') {\n <etos-horizontal-layout [ariaLabel]=\"ariaLabel()\">\n <ng-content select=\"[ui-layout-brand],[ui-topbar-start]\" />\n <ng-content select=\"[ui-layout-profile],[ui-topbar-end]\" />\n </etos-horizontal-layout>\n }\n @default {\n <etos-vertical-layout [ariaLabel]=\"ariaLabel()\" />\n }\n }\n `,\n})\nexport class EtosLayoutComponent {\n private readonly layout = inject(LayoutService);\n\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly layoutMode = this.layout.mode;\n}\n","/*\n * Public API Surface of @ojiepermana/angular/etos\n *\n * Etos-specific implementation lives directly under projects/angular/etos.\n */\n\nexport * from './core/etos-brand.config';\nexport * from './core/etos-brand.provider';\nexport * from './component/theme-switcher';\nexport * from './layouts/etos-empty-layout.component';\nexport * from './layouts/etos-horizontal-layout.component';\nexport * from './layouts/etos-layout.component';\nexport * from './layouts/etos-vertical-layout.component';\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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"}
@@ -148,14 +148,14 @@ class VerticalLayoutComponent {
148
148
  frameClasses = computed(() => {
149
149
  const classes = ['flex', 'h-full', 'w-full', 'overflow-hidden'];
150
150
  if (this.layoutWidth() === 'fixed') {
151
- classes.push('lg:border', 'lg:border-border', 'lg:rounded-lg', 'lg:shadow-sm');
151
+ classes.push('lg:mx-auto', 'lg:max-w-[97.5rem]', 'lg:border', 'lg:border-border', 'lg:rounded-lg', 'lg:shadow-sm');
152
152
  }
153
153
  return classes.join(' ');
154
154
  }, ...(ngDevMode ? [{ debugName: "frameClasses" }] : /* istanbul ignore next */ []));
155
155
  mainClasses = computed(() => {
156
156
  const classes = ['min-w-0', 'flex-1', 'overflow-auto'];
157
157
  if (this.layoutWidth() === 'fixed') {
158
- classes.push('mx-auto', 'w-full', 'max-w-7xl');
158
+ classes.push('w-full', 'max-w-7xl');
159
159
  }
160
160
  return classes.join(' ');
161
161
  }, ...(ngDevMode ? [{ debugName: "mainClasses" }] : /* istanbul ignore next */ []));
@@ -1 +1 @@
1
- {"version":3,"file":"ojiepermana-angular-layout.mjs","sources":["../../../projects/angular/layout/src/lib/core/layout.tokens.ts","../../../projects/angular/layout/src/lib/core/layout.service.ts","../../../projects/angular/layout/src/lib/vertical/vertical.component.ts","../../../projects/angular/layout/src/lib/horizontal/horizontal.component.ts","../../../projects/angular/layout/src/lib/empty/empty.component.ts","../../../projects/angular/layout/src/lib/core/layout.provider.ts","../../../projects/angular/layout/public-api.ts","../../../projects/angular/layout/ojiepermana-angular-layout.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const LAYOUT_MODES = ['vertical', 'horizontal'] as const;\n\nexport type LayoutMode = (typeof LAYOUT_MODES)[number];\n\nexport const LAYOUT_WIDTHS = ['full', 'fixed'] as const;\n\nexport type LayoutWidth = (typeof LAYOUT_WIDTHS)[number];\n\nexport interface MaterialLayoutConfig {\n /** Initial layout mode. */\n readonly mode?: LayoutMode;\n /** Initial layout width. */\n readonly width?: LayoutWidth;\n /** @deprecated Use `mode` instead. */\n /** Initial layout mode. Defaults to `vertical`. */\n readonly defaultMode?: LayoutMode;\n /** localStorage key used to persist the layout mode. Set to `null` to disable persistence. */\n readonly storageKey?: string | null;\n /** localStorage key used to persist the layout width. Set to `null` to disable persistence. */\n readonly widthStorageKey?: string | null;\n}\n\nexport interface ResolvedMaterialLayoutConfig {\n readonly defaultMode: LayoutMode;\n readonly defaultWidth: LayoutWidth;\n readonly storageKey: string | null;\n readonly widthStorageKey: string | null;\n}\n\nexport const MATERIAL_LAYOUT_CONFIG = new InjectionToken<MaterialLayoutConfig>('MATERIAL_LAYOUT_CONFIG');\n\nexport const DEFAULT_MATERIAL_LAYOUT_CONFIG: ResolvedMaterialLayoutConfig = {\n defaultMode: 'vertical',\n defaultWidth: 'fixed',\n storageKey: 'layout-mode',\n widthStorageKey: 'layout-width',\n};\n\nexport function isLayoutMode(value: string | null | undefined): value is LayoutMode {\n return LAYOUT_MODES.some((mode) => mode === value);\n}\n\nexport function isLayoutWidth(value: string | null | undefined): value is LayoutWidth {\n return LAYOUT_WIDTHS.some((width) => width === value);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, effect, inject, signal } from '@angular/core';\nimport {\n DEFAULT_MATERIAL_LAYOUT_CONFIG,\n MATERIAL_LAYOUT_CONFIG,\n isLayoutMode,\n isLayoutWidth,\n type LayoutMode,\n type LayoutWidth,\n type ResolvedMaterialLayoutConfig,\n} from './layout.tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly config = this.resolveConfig();\n\n private readonly _mode = signal<LayoutMode>(this.readPersistedMode() ?? this.config.defaultMode);\n private readonly _width = signal<LayoutWidth>(this.readPersistedWidth() ?? this.config.defaultWidth);\n\n readonly mode = this._mode.asReadonly();\n readonly width = this._width.asReadonly();\n\n constructor() {\n effect(() => {\n this.persistMode(this._mode());\n });\n\n effect(() => {\n this.persistWidth(this._width());\n });\n }\n\n setMode(mode: LayoutMode): void {\n this._mode.set(mode);\n }\n\n toggleMode(): void {\n this._mode.update((mode) => (mode === 'vertical' ? 'horizontal' : 'vertical'));\n }\n\n setWidth(width: LayoutWidth): void {\n this._width.set(width);\n }\n\n toggleWidth(): void {\n this._width.update((width) => (width === 'fixed' ? 'full' : 'fixed'));\n }\n\n private resolveConfig(): ResolvedMaterialLayoutConfig {\n const config = inject(MATERIAL_LAYOUT_CONFIG, { optional: true }) ?? {};\n const configuredMode = config.mode ?? config.defaultMode;\n const configuredWidth = config.width;\n\n return {\n defaultMode: isLayoutMode(configuredMode) ? configuredMode : DEFAULT_MATERIAL_LAYOUT_CONFIG.defaultMode,\n defaultWidth: isLayoutWidth(configuredWidth) ? configuredWidth : DEFAULT_MATERIAL_LAYOUT_CONFIG.defaultWidth,\n storageKey: config.storageKey ?? DEFAULT_MATERIAL_LAYOUT_CONFIG.storageKey,\n widthStorageKey: config.widthStorageKey ?? DEFAULT_MATERIAL_LAYOUT_CONFIG.widthStorageKey,\n };\n }\n\n private readPersistedMode(): LayoutMode | null {\n const key = this.config.storageKey;\n if (!key) return null;\n try {\n const value = this.document.defaultView?.localStorage?.getItem(key);\n return isLayoutMode(value) ? value : null;\n } catch {\n return null;\n }\n }\n\n private readPersistedWidth(): LayoutWidth | null {\n const key = this.config.widthStorageKey;\n if (!key) return null;\n try {\n const value = this.document.defaultView?.localStorage?.getItem(key);\n return isLayoutWidth(value) ? value : null;\n } catch {\n return null;\n }\n }\n\n private persistMode(mode: LayoutMode): void {\n const key = this.config.storageKey;\n if (!key) return;\n try {\n this.document.defaultView?.localStorage?.setItem(key, mode);\n } catch {\n /* ignore */\n }\n }\n\n private persistWidth(width: LayoutWidth): void {\n const key = this.config.widthStorageKey;\n if (!key) return;\n try {\n this.document.defaultView?.localStorage?.setItem(key, width);\n } catch {\n /* ignore */\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport {\n SidebarComponent,\n type SidebarAppearance,\n type SidebarMode,\n type SidebarPosition,\n} from '@ojiepermana/angular/navigation';\nimport { ThemeService } from '@ojiepermana/angular/theme';\nimport { LayoutService } from '../core/layout.service';\n\n/**\n * Vertical layout — sidebar + main (scrollable).\n *\n * Data navigasi diambil dari `NavigationService` (register via\n * `NavigationService.registerItems()` di bootstrap). Main memegang\n * `<router-outlet>` dan scroll jika konten panjang.\n *\n * Markup:\n * ```html\n * <vertical>\n * <!-- sidebar + router-outlet dirender oleh komponen -->\n * </vertical>\n * ```\n */\n@Component({\n selector: 'vertical',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, SidebarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-layout-width]': 'layoutWidth()',\n '[attr.data-style]': 'themeStyle()',\n },\n template: `\n <div [class]=\"frameClasses()\" [style.border-width]=\"shellBorderWidth()\">\n <ui-sidebar\n [appearance]=\"sidebarAppearance()\"\n [position]=\"sidebarPosition()\"\n [ariaLabel]=\"ariaLabel()\"\n [style.border-left-width]=\"dividerBorderWidth()\"\n [style.border-right-width]=\"dividerBorderWidth()\" />\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class VerticalLayoutComponent {\n private readonly layout = inject(LayoutService);\n private readonly theme = inject(ThemeService);\n\n readonly sidebarAppearance = input<SidebarAppearance>('default');\n readonly sidebarPosition = input<SidebarPosition>('left');\n readonly sidebarMode = input<SidebarMode>('side');\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly themeStyle = this.theme.style;\n protected readonly shellBorderWidth = computed(() => (this.layoutWidth() === 'fixed' ? 'var(--border-width)' : null));\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['block', 'h-dvh', 'w-full', 'overflow-hidden', 'bg-background', 'text-foreground'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('box-border', 'lg:p-8');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['flex', 'h-full', 'w-full', 'overflow-hidden'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('lg:border', 'lg:border-border', 'lg:rounded-lg', 'lg:shadow-sm');\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['min-w-0', 'flex-1', 'overflow-auto'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('mx-auto', 'w-full', 'max-w-7xl');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { TopbarComponent, type TopbarAppearance } from '@ojiepermana/angular/navigation';\nimport { ThemeService } from '@ojiepermana/angular/theme';\nimport { LayoutService } from '../core/layout.service';\n\n/**\n * Horizontal layout — themed topbar + main (scrollable).\n *\n * Data navigasi diambil dari `NavigationService`.\n * Consumer app dapat memproyeksikan brand kiri dan profile kanan.\n *\n * Markup:\n * ```html\n * <horizontal>\n * <a ui-layout-brand>Brand</a>\n * <button ui-layout-profile type=\"button\">Profile</button>\n * </horizontal>\n * ```\n */\n@Component({\n selector: 'horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, TopbarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-layout-width]': 'layoutWidth()',\n '[attr.data-style]': 'themeStyle()',\n },\n template: `\n <div [class]=\"frameClasses()\" [style.border-width]=\"shellBorderWidth()\">\n <ui-topbar\n class=\"w-full shrink-0 border-b border-border\"\n [style.border-bottom-width]=\"dividerBorderWidth()\"\n [appearance]=\"topbarAppearance()\"\n [ariaLabel]=\"ariaLabel()\">\n <div ui-topbar-start class=\"flex min-w-0 items-center\">\n <ng-content select=\"[ui-layout-brand],[ui-topbar-start]\" />\n </div>\n <div ui-topbar-end class=\"flex min-w-0 items-center\">\n <ng-content select=\"[ui-layout-profile],[ui-topbar-end]\" />\n </div>\n </ui-topbar>\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class HorizontalLayoutComponent {\n private readonly layout = inject(LayoutService);\n private readonly theme = inject(ThemeService);\n\n readonly topbarAppearance = input<TopbarAppearance>('default');\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly themeStyle = this.theme.style;\n protected readonly shellBorderWidth = computed(() => (this.layoutWidth() === 'fixed' ? 'var(--border-width)' : null));\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['block', 'h-dvh', 'w-full', 'overflow-hidden', 'bg-background', 'text-foreground'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('box-border', 'lg:p-8');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['flex', 'h-full', 'w-full', 'flex-col', 'overflow-hidden'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('lg:border', 'lg:border-border', 'lg:rounded-lg', 'lg:shadow-sm');\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['min-w-0', 'flex-1', 'overflow-auto'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('mx-auto', 'w-full', 'max-w-7xl');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n/**\n * Empty layout — full-viewport, flex-centered main.\n *\n * Cocok untuk halaman login / error / onboarding (pola shadcn `login-05`).\n * Konten dirender lewat `<router-outlet>`; consumer men-style card / form\n * milik halaman route sendiri.\n *\n * Markup:\n * ```html\n * <empty>\n * <!-- router-outlet dirender oleh komponen -->\n * </empty>\n * ```\n */\n@Component({\n selector: 'empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet],\n host: {\n class: 'flex min-h-dvh w-full items-center justify-center bg-background p-6 text-foreground',\n },\n template: `\n <main class=\"w-full max-w-sm\">\n <router-outlet />\n </main>\n `,\n})\nexport class EmptyLayoutComponent {}\n","import {\n inject,\n type EnvironmentProviders,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { LayoutService } from './layout.service';\nimport { MATERIAL_LAYOUT_CONFIG, type MaterialLayoutConfig } from './layout.tokens';\n\nexport function provideMaterialLayout(config: MaterialLayoutConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MATERIAL_LAYOUT_CONFIG, useValue: config },\n provideEnvironmentInitializer(() => {\n inject(LayoutService);\n }),\n ]);\n}\n","/*\n * Public API Surface of @ojiepermana/angular/layout\n */\n\nexport * from './src/lib/vertical/vertical.component';\nexport * from './src/lib/horizontal/horizontal.component';\nexport * from './src/lib/empty/empty.component';\nexport * from './src/lib/core/layout.tokens';\nexport * from './src/lib/core/layout.service';\nexport * from './src/lib/core/layout.provider';\n\nexport const LAYOUT_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-layout.mjs","sources":["../../../projects/angular/layout/src/lib/core/layout.tokens.ts","../../../projects/angular/layout/src/lib/core/layout.service.ts","../../../projects/angular/layout/src/lib/vertical/vertical.component.ts","../../../projects/angular/layout/src/lib/horizontal/horizontal.component.ts","../../../projects/angular/layout/src/lib/empty/empty.component.ts","../../../projects/angular/layout/src/lib/core/layout.provider.ts","../../../projects/angular/layout/public-api.ts","../../../projects/angular/layout/ojiepermana-angular-layout.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core';\n\nexport const LAYOUT_MODES = ['vertical', 'horizontal'] as const;\n\nexport type LayoutMode = (typeof LAYOUT_MODES)[number];\n\nexport const LAYOUT_WIDTHS = ['full', 'fixed'] as const;\n\nexport type LayoutWidth = (typeof LAYOUT_WIDTHS)[number];\n\nexport interface MaterialLayoutConfig {\n /** Initial layout mode. */\n readonly mode?: LayoutMode;\n /** Initial layout width. */\n readonly width?: LayoutWidth;\n /** @deprecated Use `mode` instead. */\n /** Initial layout mode. Defaults to `vertical`. */\n readonly defaultMode?: LayoutMode;\n /** localStorage key used to persist the layout mode. Set to `null` to disable persistence. */\n readonly storageKey?: string | null;\n /** localStorage key used to persist the layout width. Set to `null` to disable persistence. */\n readonly widthStorageKey?: string | null;\n}\n\nexport interface ResolvedMaterialLayoutConfig {\n readonly defaultMode: LayoutMode;\n readonly defaultWidth: LayoutWidth;\n readonly storageKey: string | null;\n readonly widthStorageKey: string | null;\n}\n\nexport const MATERIAL_LAYOUT_CONFIG = new InjectionToken<MaterialLayoutConfig>('MATERIAL_LAYOUT_CONFIG');\n\nexport const DEFAULT_MATERIAL_LAYOUT_CONFIG: ResolvedMaterialLayoutConfig = {\n defaultMode: 'vertical',\n defaultWidth: 'fixed',\n storageKey: 'layout-mode',\n widthStorageKey: 'layout-width',\n};\n\nexport function isLayoutMode(value: string | null | undefined): value is LayoutMode {\n return LAYOUT_MODES.some((mode) => mode === value);\n}\n\nexport function isLayoutWidth(value: string | null | undefined): value is LayoutWidth {\n return LAYOUT_WIDTHS.some((width) => width === value);\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, effect, inject, signal } from '@angular/core';\nimport {\n DEFAULT_MATERIAL_LAYOUT_CONFIG,\n MATERIAL_LAYOUT_CONFIG,\n isLayoutMode,\n isLayoutWidth,\n type LayoutMode,\n type LayoutWidth,\n type ResolvedMaterialLayoutConfig,\n} from './layout.tokens';\n\n@Injectable({ providedIn: 'root' })\nexport class LayoutService {\n private readonly document = inject(DOCUMENT);\n private readonly config = this.resolveConfig();\n\n private readonly _mode = signal<LayoutMode>(this.readPersistedMode() ?? this.config.defaultMode);\n private readonly _width = signal<LayoutWidth>(this.readPersistedWidth() ?? this.config.defaultWidth);\n\n readonly mode = this._mode.asReadonly();\n readonly width = this._width.asReadonly();\n\n constructor() {\n effect(() => {\n this.persistMode(this._mode());\n });\n\n effect(() => {\n this.persistWidth(this._width());\n });\n }\n\n setMode(mode: LayoutMode): void {\n this._mode.set(mode);\n }\n\n toggleMode(): void {\n this._mode.update((mode) => (mode === 'vertical' ? 'horizontal' : 'vertical'));\n }\n\n setWidth(width: LayoutWidth): void {\n this._width.set(width);\n }\n\n toggleWidth(): void {\n this._width.update((width) => (width === 'fixed' ? 'full' : 'fixed'));\n }\n\n private resolveConfig(): ResolvedMaterialLayoutConfig {\n const config = inject(MATERIAL_LAYOUT_CONFIG, { optional: true }) ?? {};\n const configuredMode = config.mode ?? config.defaultMode;\n const configuredWidth = config.width;\n\n return {\n defaultMode: isLayoutMode(configuredMode) ? configuredMode : DEFAULT_MATERIAL_LAYOUT_CONFIG.defaultMode,\n defaultWidth: isLayoutWidth(configuredWidth) ? configuredWidth : DEFAULT_MATERIAL_LAYOUT_CONFIG.defaultWidth,\n storageKey: config.storageKey ?? DEFAULT_MATERIAL_LAYOUT_CONFIG.storageKey,\n widthStorageKey: config.widthStorageKey ?? DEFAULT_MATERIAL_LAYOUT_CONFIG.widthStorageKey,\n };\n }\n\n private readPersistedMode(): LayoutMode | null {\n const key = this.config.storageKey;\n if (!key) return null;\n try {\n const value = this.document.defaultView?.localStorage?.getItem(key);\n return isLayoutMode(value) ? value : null;\n } catch {\n return null;\n }\n }\n\n private readPersistedWidth(): LayoutWidth | null {\n const key = this.config.widthStorageKey;\n if (!key) return null;\n try {\n const value = this.document.defaultView?.localStorage?.getItem(key);\n return isLayoutWidth(value) ? value : null;\n } catch {\n return null;\n }\n }\n\n private persistMode(mode: LayoutMode): void {\n const key = this.config.storageKey;\n if (!key) return;\n try {\n this.document.defaultView?.localStorage?.setItem(key, mode);\n } catch {\n /* ignore */\n }\n }\n\n private persistWidth(width: LayoutWidth): void {\n const key = this.config.widthStorageKey;\n if (!key) return;\n try {\n this.document.defaultView?.localStorage?.setItem(key, width);\n } catch {\n /* ignore */\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport {\n SidebarComponent,\n type SidebarAppearance,\n type SidebarMode,\n type SidebarPosition,\n} from '@ojiepermana/angular/navigation';\nimport { ThemeService } from '@ojiepermana/angular/theme';\nimport { LayoutService } from '../core/layout.service';\n\n/**\n * Vertical layout — sidebar + main (scrollable).\n *\n * Data navigasi diambil dari `NavigationService` (register via\n * `NavigationService.registerItems()` di bootstrap). Main memegang\n * `<router-outlet>` dan scroll jika konten panjang.\n *\n * Markup:\n * ```html\n * <vertical>\n * <!-- sidebar + router-outlet dirender oleh komponen -->\n * </vertical>\n * ```\n */\n@Component({\n selector: 'vertical',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, SidebarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-layout-width]': 'layoutWidth()',\n '[attr.data-style]': 'themeStyle()',\n },\n template: `\n <div [class]=\"frameClasses()\" [style.border-width]=\"shellBorderWidth()\">\n <ui-sidebar\n [appearance]=\"sidebarAppearance()\"\n [position]=\"sidebarPosition()\"\n [ariaLabel]=\"ariaLabel()\"\n [style.border-left-width]=\"dividerBorderWidth()\"\n [style.border-right-width]=\"dividerBorderWidth()\" />\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class VerticalLayoutComponent {\n private readonly layout = inject(LayoutService);\n private readonly theme = inject(ThemeService);\n\n readonly sidebarAppearance = input<SidebarAppearance>('default');\n readonly sidebarPosition = input<SidebarPosition>('left');\n readonly sidebarMode = input<SidebarMode>('side');\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly themeStyle = this.theme.style;\n protected readonly shellBorderWidth = computed(() => (this.layoutWidth() === 'fixed' ? 'var(--border-width)' : null));\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['block', 'h-dvh', 'w-full', 'overflow-hidden', 'bg-background', 'text-foreground'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('box-border', 'lg:p-8');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['flex', 'h-full', 'w-full', 'overflow-hidden'];\n if (this.layoutWidth() === 'fixed') {\n classes.push(\n 'lg:mx-auto',\n 'lg:max-w-[97.5rem]',\n 'lg:border',\n 'lg:border-border',\n 'lg:rounded-lg',\n 'lg:shadow-sm',\n );\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['min-w-0', 'flex-1', 'overflow-auto'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('w-full', 'max-w-7xl');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\nimport { TopbarComponent, type TopbarAppearance } from '@ojiepermana/angular/navigation';\nimport { ThemeService } from '@ojiepermana/angular/theme';\nimport { LayoutService } from '../core/layout.service';\n\n/**\n * Horizontal layout — themed topbar + main (scrollable).\n *\n * Data navigasi diambil dari `NavigationService`.\n * Consumer app dapat memproyeksikan brand kiri dan profile kanan.\n *\n * Markup:\n * ```html\n * <horizontal>\n * <a ui-layout-brand>Brand</a>\n * <button ui-layout-profile type=\"button\">Profile</button>\n * </horizontal>\n * ```\n */\n@Component({\n selector: 'horizontal',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet, TopbarComponent],\n host: {\n '[class]': 'hostClasses()',\n '[attr.data-layout-width]': 'layoutWidth()',\n '[attr.data-style]': 'themeStyle()',\n },\n template: `\n <div [class]=\"frameClasses()\" [style.border-width]=\"shellBorderWidth()\">\n <ui-topbar\n class=\"w-full shrink-0 border-b border-border\"\n [style.border-bottom-width]=\"dividerBorderWidth()\"\n [appearance]=\"topbarAppearance()\"\n [ariaLabel]=\"ariaLabel()\">\n <div ui-topbar-start class=\"flex min-w-0 items-center\">\n <ng-content select=\"[ui-layout-brand],[ui-topbar-start]\" />\n </div>\n <div ui-topbar-end class=\"flex min-w-0 items-center\">\n <ng-content select=\"[ui-layout-profile],[ui-topbar-end]\" />\n </div>\n </ui-topbar>\n <main [class]=\"mainClasses()\">\n <router-outlet />\n </main>\n </div>\n `,\n})\nexport class HorizontalLayoutComponent {\n private readonly layout = inject(LayoutService);\n private readonly theme = inject(ThemeService);\n\n readonly topbarAppearance = input<TopbarAppearance>('default');\n readonly ariaLabel = input<string>('Primary');\n\n protected readonly layoutWidth = this.layout.width;\n protected readonly themeStyle = this.theme.style;\n protected readonly shellBorderWidth = computed(() => (this.layoutWidth() === 'fixed' ? 'var(--border-width)' : null));\n protected readonly dividerBorderWidth = computed(() => 'var(--border-width)');\n\n protected readonly hostClasses = computed(() => {\n const classes = ['block', 'h-dvh', 'w-full', 'overflow-hidden', 'bg-background', 'text-foreground'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('box-border', 'lg:p-8');\n }\n return classes.join(' ');\n });\n\n protected readonly frameClasses = computed(() => {\n const classes = ['flex', 'h-full', 'w-full', 'flex-col', 'overflow-hidden'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('lg:border', 'lg:border-border', 'lg:rounded-lg', 'lg:shadow-sm');\n }\n return classes.join(' ');\n });\n\n protected readonly mainClasses = computed(() => {\n const classes = ['min-w-0', 'flex-1', 'overflow-auto'];\n if (this.layoutWidth() === 'fixed') {\n classes.push('mx-auto', 'w-full', 'max-w-7xl');\n }\n return classes.join(' ');\n });\n}\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\nimport { RouterOutlet } from '@angular/router';\n\n/**\n * Empty layout — full-viewport, flex-centered main.\n *\n * Cocok untuk halaman login / error / onboarding (pola shadcn `login-05`).\n * Konten dirender lewat `<router-outlet>`; consumer men-style card / form\n * milik halaman route sendiri.\n *\n * Markup:\n * ```html\n * <empty>\n * <!-- router-outlet dirender oleh komponen -->\n * </empty>\n * ```\n */\n@Component({\n selector: 'empty',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [RouterOutlet],\n host: {\n class: 'flex min-h-dvh w-full items-center justify-center bg-background p-6 text-foreground',\n },\n template: `\n <main class=\"w-full max-w-sm\">\n <router-outlet />\n </main>\n `,\n})\nexport class EmptyLayoutComponent {}\n","import {\n inject,\n type EnvironmentProviders,\n makeEnvironmentProviders,\n provideEnvironmentInitializer,\n} from '@angular/core';\nimport { LayoutService } from './layout.service';\nimport { MATERIAL_LAYOUT_CONFIG, type MaterialLayoutConfig } from './layout.tokens';\n\nexport function provideMaterialLayout(config: MaterialLayoutConfig = {}): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: MATERIAL_LAYOUT_CONFIG, useValue: config },\n provideEnvironmentInitializer(() => {\n inject(LayoutService);\n }),\n ]);\n}\n","/*\n * Public API Surface of @ojiepermana/angular/layout\n */\n\nexport * from './src/lib/vertical/vertical.component';\nexport * from './src/lib/horizontal/horizontal.component';\nexport * from './src/lib/empty/empty.component';\nexport * from './src/lib/core/layout.tokens';\nexport * from './src/lib/core/layout.service';\nexport * from './src/lib/core/layout.provider';\n\nexport const LAYOUT_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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ojiepermana/angular",
3
- "version": "21.1.2",
3
+ "version": "21.1.5",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/ojiepermana/angular.git"
@@ -67,8 +67,6 @@
67
67
  "exports": {
68
68
  "./etos/styles": "./etos/styles/index.css",
69
69
  "./etos/styles/*": "./etos/styles/*",
70
- "./brand/etos/styles": "./brand/etos/styles/index.css",
71
- "./brand/etos/styles/*": "./brand/etos/styles/*",
72
70
  "./theme/styles": "./theme/styles/index.css",
73
71
  "./theme/styles/*": "./theme/styles/*",
74
72
  "./theme/tailwind/theme.css": "./theme/styles/themes/taildwind.css",
@@ -79,10 +77,6 @@
79
77
  "types": "./types/ojiepermana-angular.d.ts",
80
78
  "default": "./fesm2022/ojiepermana-angular.mjs"
81
79
  },
82
- "./brand/etos": {
83
- "types": "./types/ojiepermana-angular-brand-etos.d.ts",
84
- "default": "./fesm2022/ojiepermana-angular-brand-etos.mjs"
85
- },
86
80
  "./chart": {
87
81
  "types": "./types/ojiepermana-angular-chart.d.ts",
88
82
  "default": "./fesm2022/ojiepermana-angular-chart.mjs"
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Compatibility entry for the Etos brand stylesheet.
3
3
  *
4
- * The Etos implementation now lives under the brand umbrella package.
4
+ * The Etos implementation now lives under the dedicated `./etos` entrypoint.
5
5
  */
6
6
  @import '@ojiepermana/angular/etos/styles';
@@ -115,7 +115,7 @@ declare class AvatarFallbackComponent {
115
115
  }
116
116
 
117
117
  declare const badgeVariants: (props?: ({
118
- variant?: "default" | "destructive" | "secondary" | "outline" | null | undefined;
118
+ variant?: "default" | "destructive" | "outline" | "secondary" | null | undefined;
119
119
  } & class_variance_authority_types.ClassProp) | undefined) => string;
120
120
  type BadgeVariant = NonNullable<VariantProps<typeof badgeVariants>['variant']>;
121
121
 
@@ -169,7 +169,7 @@ declare class BreadcrumbEllipsisComponent {
169
169
  }
170
170
 
171
171
  declare const buttonVariants: (props?: ({
172
- variant?: "default" | "destructive" | "secondary" | "outline" | "link" | "ghost" | null | undefined;
172
+ variant?: "default" | "destructive" | "outline" | "secondary" | "ghost" | "link" | null | undefined;
173
173
  size?: "default" | "sm" | "lg" | "icon" | null | undefined;
174
174
  } & class_variance_authority_types.ClassProp) | undefined) => string;
175
175
  type ButtonVariant = NonNullable<VariantProps<typeof buttonVariants>['variant']>;
@@ -1 +1,176 @@
1
- export * from '@ojiepermana/angular/brand/etos';
1
+ import * as _angular_core from '@angular/core';
2
+ import { EnvironmentProviders } from '@angular/core';
3
+ import { MaterialLayoutConfig, LayoutMode, LayoutWidth } from '@ojiepermana/angular/layout';
4
+ import { NavigationItem, TopbarAppearance, SidebarAppearance, SidebarPosition } from '@ojiepermana/angular/navigation';
5
+ import { MaterialThemeConfig, MaterialThemeFeature, ColorScheme } from '@ojiepermana/angular/theme';
6
+ import { PopoverSide, PopoverAlign } from '@ojiepermana/angular/component';
7
+
8
+ declare const ETOS_BRAND_NAME = "etos";
9
+ declare const ETOS_THEME_CONFIG: {
10
+ mode: "light";
11
+ brand: "etos";
12
+ };
13
+ declare const ETOS_LAYOUT_CONFIG: {
14
+ mode: "vertical";
15
+ width: "fixed";
16
+ };
17
+
18
+ interface EtosBrandOptions {
19
+ readonly theme?: MaterialThemeConfig;
20
+ readonly layout?: MaterialLayoutConfig;
21
+ readonly navigation?: NavigationItem[];
22
+ readonly navigationId?: string;
23
+ readonly materialDefaults?: boolean;
24
+ }
25
+ declare function provideEtosTheme(config?: MaterialThemeConfig, ...features: MaterialThemeFeature[]): EnvironmentProviders;
26
+ declare function provideEtosLayout(config?: MaterialLayoutConfig): EnvironmentProviders;
27
+ declare function provideEtosBrand(options?: EtosBrandOptions): EnvironmentProviders;
28
+
29
+ type EtosThemeSwitcherAction = string;
30
+ interface EtosThemeSwitcherUserInfo {
31
+ readonly name: string;
32
+ readonly subtitle?: string;
33
+ readonly avatarSrc?: string | null;
34
+ readonly avatarAlt?: string;
35
+ }
36
+ interface EtosThemeSwitcherNotificationShortcut {
37
+ readonly value?: EtosThemeSwitcherAction;
38
+ readonly icon?: string;
39
+ readonly ariaLabel?: string;
40
+ }
41
+ type EtosThemeSwitcherActionTone = 'default' | 'destructive';
42
+ interface EtosThemeSwitcherQuickAction {
43
+ readonly value: EtosThemeSwitcherAction;
44
+ readonly label: string;
45
+ readonly icon: string;
46
+ readonly tone?: EtosThemeSwitcherActionTone;
47
+ }
48
+ declare class EtosThemeSwitcherComponent {
49
+ private readonly theme;
50
+ private readonly layout;
51
+ private readonly popoverTrigger;
52
+ readonly class: _angular_core.InputSignal<string>;
53
+ readonly userInfo: _angular_core.InputSignal<EtosThemeSwitcherUserInfo | null>;
54
+ readonly userName: _angular_core.InputSignal<string>;
55
+ readonly userSubtitle: _angular_core.InputSignal<string>;
56
+ readonly avatarSrc: _angular_core.InputSignal<string | null>;
57
+ readonly avatarAlt: _angular_core.InputSignal<string>;
58
+ readonly quickActions: _angular_core.InputSignal<readonly EtosThemeSwitcherQuickAction[]>;
59
+ readonly notificationShortcut: _angular_core.InputSignal<EtosThemeSwitcherNotificationShortcut | null>;
60
+ readonly showNotificationShortcut: _angular_core.InputSignal<boolean>;
61
+ readonly popoverSide: _angular_core.InputSignal<PopoverSide>;
62
+ readonly popoverAlign: _angular_core.InputSignal<PopoverAlign>;
63
+ readonly actionSelected: _angular_core.OutputEmitterRef<string>;
64
+ protected readonly themeMode: _angular_core.Signal<"light" | "dark">;
65
+ protected readonly themeScheme: _angular_core.Signal<"light" | "dark" | "system">;
66
+ protected readonly layoutMode: _angular_core.Signal<"vertical" | "horizontal">;
67
+ protected readonly layoutWidth: _angular_core.Signal<"full" | "fixed">;
68
+ protected readonly themeSchemeOptions: readonly [{
69
+ readonly value: "light";
70
+ readonly label: "Light";
71
+ readonly icon: "light_mode";
72
+ }, {
73
+ readonly value: "dark";
74
+ readonly label: "Dark";
75
+ readonly icon: "dark_mode";
76
+ }, {
77
+ readonly value: "system";
78
+ readonly label: "System";
79
+ readonly icon: "computer";
80
+ }];
81
+ protected readonly layoutModeOptions: readonly [{
82
+ readonly value: "horizontal";
83
+ readonly label: "Horizontal";
84
+ readonly icon: "view_column";
85
+ }, {
86
+ readonly value: "vertical";
87
+ readonly label: "Vertical";
88
+ readonly icon: "view_sidebar";
89
+ }];
90
+ protected readonly layoutWidthOptions: readonly [{
91
+ readonly value: "full";
92
+ readonly label: "Full";
93
+ readonly icon: "fit_screen";
94
+ }, {
95
+ readonly value: "fixed";
96
+ readonly label: "Fixed";
97
+ readonly icon: "center_focus_strong";
98
+ }];
99
+ protected readonly notificationShortcutConfig: _angular_core.Signal<Required<EtosThemeSwitcherNotificationShortcut> | null>;
100
+ protected readonly actionOptions: _angular_core.Signal<readonly EtosThemeSwitcherQuickAction[]>;
101
+ protected readonly hostClasses: _angular_core.Signal<string>;
102
+ protected readonly resolvedUserName: _angular_core.Signal<string>;
103
+ protected readonly resolvedUserSubtitle: _angular_core.Signal<string>;
104
+ protected readonly resolvedAvatarSrc: _angular_core.Signal<string | null>;
105
+ protected readonly resolvedAvatarAlt: _angular_core.Signal<string>;
106
+ protected readonly hasAvatar: _angular_core.Signal<boolean>;
107
+ protected readonly avatarImageSrc: _angular_core.Signal<string>;
108
+ protected readonly avatarAltText: _angular_core.Signal<string>;
109
+ protected readonly initials: _angular_core.Signal<string>;
110
+ protected readonly triggerLabel: _angular_core.Signal<string>;
111
+ protected triggerButtonClasses(open: boolean): string;
112
+ protected notificationButtonClasses(): string;
113
+ protected segmentedOptionClasses(active: boolean): string;
114
+ protected themeOptionClasses(active: boolean): string;
115
+ protected themeIconClasses(active: boolean): string;
116
+ protected actionButtonClasses(tone?: EtosThemeSwitcherActionTone): string;
117
+ protected actionIconClasses(tone?: EtosThemeSwitcherActionTone): string;
118
+ protected actionLabelClasses(tone?: EtosThemeSwitcherActionTone): string;
119
+ protected setThemeScheme(mode: ColorScheme): void;
120
+ protected setLayoutMode(mode: LayoutMode): void;
121
+ protected setLayoutWidth(width: LayoutWidth): void;
122
+ protected triggerAction(action: EtosThemeSwitcherAction): void;
123
+ protected triggerNotificationAction(event: Event): void;
124
+ private labelForLayoutMode;
125
+ private labelForLayoutWidth;
126
+ private toInitials;
127
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EtosThemeSwitcherComponent, never>;
128
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosThemeSwitcherComponent, "etos-theme-switcher", never, { "class": { "alias": "class"; "required": false; "isSignal": true; }; "userInfo": { "alias": "userInfo"; "required": false; "isSignal": true; }; "userName": { "alias": "userName"; "required": false; "isSignal": true; }; "userSubtitle": { "alias": "userSubtitle"; "required": false; "isSignal": true; }; "avatarSrc": { "alias": "avatarSrc"; "required": false; "isSignal": true; }; "avatarAlt": { "alias": "avatarAlt"; "required": false; "isSignal": true; }; "quickActions": { "alias": "quickActions"; "required": true; "isSignal": true; }; "notificationShortcut": { "alias": "notificationShortcut"; "required": false; "isSignal": true; }; "showNotificationShortcut": { "alias": "showNotificationShortcut"; "required": false; "isSignal": true; }; "popoverSide": { "alias": "popoverSide"; "required": false; "isSignal": true; }; "popoverAlign": { "alias": "popoverAlign"; "required": false; "isSignal": true; }; }, { "actionSelected": "actionSelected"; }, never, never, true, never>;
129
+ }
130
+
131
+ declare class EtosEmptyLayoutComponent {
132
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EtosEmptyLayoutComponent, never>;
133
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosEmptyLayoutComponent, "etos-empty-layout", never, {}, {}, never, never, true, never>;
134
+ }
135
+
136
+ declare class EtosHorizontalLayoutComponent {
137
+ private readonly layout;
138
+ readonly topbarAppearance: _angular_core.InputSignal<TopbarAppearance>;
139
+ readonly ariaLabel: _angular_core.InputSignal<string>;
140
+ protected readonly brandLayout = "etos-horizontal";
141
+ protected readonly layoutWidth: _angular_core.Signal<"full" | "fixed">;
142
+ protected readonly dividerBorderWidth: _angular_core.Signal<string>;
143
+ protected readonly hostClasses: _angular_core.Signal<string>;
144
+ protected readonly frameClasses: _angular_core.Signal<string>;
145
+ protected readonly mainClasses: _angular_core.Signal<string>;
146
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EtosHorizontalLayoutComponent, never>;
147
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosHorizontalLayoutComponent, "etos-horizontal-layout", never, { "topbarAppearance": { "alias": "topbarAppearance"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["[ui-layout-brand],[ui-topbar-start]", "[ui-layout-profile],[ui-topbar-end]"], true, never>;
148
+ }
149
+
150
+ declare class EtosLayoutComponent {
151
+ private readonly layout;
152
+ readonly ariaLabel: _angular_core.InputSignal<string>;
153
+ protected readonly layoutMode: _angular_core.Signal<"vertical" | "horizontal">;
154
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EtosLayoutComponent, never>;
155
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosLayoutComponent, "etos-layout", never, { "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["[ui-layout-brand],[ui-topbar-start]", "[ui-layout-profile],[ui-topbar-end]"], true, never>;
156
+ }
157
+
158
+ declare class EtosVerticalLayoutComponent {
159
+ private readonly layout;
160
+ readonly sidebarAppearance: _angular_core.InputSignal<SidebarAppearance>;
161
+ readonly sidebarPosition: _angular_core.InputSignal<SidebarPosition>;
162
+ readonly ariaLabel: _angular_core.InputSignal<string>;
163
+ protected readonly brandLayout = "etos-vertical";
164
+ protected readonly layoutWidth: _angular_core.Signal<"full" | "fixed">;
165
+ protected readonly dividerBorderWidth: _angular_core.Signal<string>;
166
+ protected readonly hostClasses: _angular_core.Signal<string>;
167
+ protected readonly frameClasses: _angular_core.Signal<string>;
168
+ protected readonly mainClasses: _angular_core.Signal<string>;
169
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<EtosVerticalLayoutComponent, never>;
170
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<EtosVerticalLayoutComponent, "etos-vertical-layout", never, { "sidebarAppearance": { "alias": "sidebarAppearance"; "required": false; "isSignal": true; }; "sidebarPosition": { "alias": "sidebarPosition"; "required": false; "isSignal": true; }; "ariaLabel": { "alias": "ariaLabel"; "required": false; "isSignal": true; }; }, {}, never, ["[ui-layout-brand],[ui-topbar-start],[ui-sidebar-header]", "[ui-layout-profile],[ui-topbar-end],[ui-sidebar-footer]"], true, never>;
171
+ }
172
+
173
+ declare const ETOS_BRAND_VERSION = "0.0.1";
174
+
175
+ export { ETOS_BRAND_NAME, ETOS_BRAND_VERSION, ETOS_LAYOUT_CONFIG, ETOS_THEME_CONFIG, EtosEmptyLayoutComponent, EtosHorizontalLayoutComponent, EtosLayoutComponent, EtosThemeSwitcherComponent, EtosVerticalLayoutComponent, provideEtosBrand, provideEtosLayout, provideEtosTheme };
176
+ export type { EtosBrandOptions, EtosThemeSwitcherAction, EtosThemeSwitcherNotificationShortcut, EtosThemeSwitcherQuickAction, EtosThemeSwitcherUserInfo };
@@ -1,68 +0,0 @@
1
- # Etos Brand
2
-
3
- Etos is isolated as a brand umbrella entrypoint under `projects/angular/brand/etos`.
4
-
5
- Use this folder for Etos-specific implementation:
6
-
7
- - `core/` contains Etos provider composition and brand defaults.
8
- - `themes/` contains Etos color, style, layout, and component-facing CSS.
9
- - `layouts/` contains Etos shell components.
10
- - `navigation/`, `components/`, `assets/`, and `docs/` can be added when Etos needs brand-specific behavior beyond shared primitives.
11
-
12
- Shared services, types, and primitives stay in the generic libraries:
13
-
14
- - `@ojiepermana/angular/theme`
15
- - `@ojiepermana/angular/layout`
16
- - `@ojiepermana/angular/navigation`
17
-
18
- ## Package usage
19
-
20
- Published consumers should import Etos through the short public entrypoint:
21
-
22
- ```ts
23
- import { type EtosBrandOptions, EtosLayoutComponent, provideEtosBrand } from '@ojiepermana/angular/etos';
24
-
25
- export const etosBrandConfig = {
26
- theme: { mode: 'light' },
27
- layout: { mode: 'vertical' },
28
- } satisfies EtosBrandOptions;
29
-
30
- export const appConfig = {
31
- providers: [provideEtosBrand(etosBrandConfig)],
32
- };
33
- ```
34
-
35
- ```ts
36
- @Component({
37
- imports: [EtosLayoutComponent],
38
- template: `<etos-layout />`,
39
- })
40
- export class Pages {}
41
- ```
42
-
43
- App CSS should import the Etos package stylesheet before Tailwind:
44
-
45
- ```css
46
- @import '@ojiepermana/angular/etos/styles';
47
- @import 'tailwindcss';
48
- @import '@ojiepermana/angular/theme/tailwind/theme.css';
49
- ```
50
-
51
- ## Workspace usage in this repository
52
-
53
- The Etos demo under `projects/demo/etos` already uses the short TypeScript entrypoint:
54
-
55
- - `src/app/app.config.ts` imports `provideEtosBrand` from `@ojiepermana/angular/etos`.
56
- - `src/pages/pages.ts` imports `EtosLayoutComponent` from `@ojiepermana/angular/etos`.
57
-
58
- For CSS, the workspace demo currently imports the Etos source stylesheet directly:
59
-
60
- ```css
61
- @import '../../../angular/brand/etos/themes/index.css';
62
- @import 'tailwindcss';
63
- @import '@ojiepermana/angular/theme/tailwind/theme.css';
64
- ```
65
-
66
- That local CSS path is intentional while developing inside this monorepo. Angular resolves bare CSS package imports from `node_modules/@ojiepermana/angular`, while TypeScript imports in the demo resolve through `tsconfig.json` path aliases. After the package is built, published, and installed with the latest exports, consumers should use `@ojiepermana/angular/etos/styles`.
67
-
68
- The older `@ojiepermana/angular/theme/styles/etos.css` path is kept only as a compatibility shim.
@@ -1,4 +0,0 @@
1
- {
2
- "module": "../../fesm2022/ojiepermana-angular-brand-etos.mjs",
3
- "typings": "../../types/ojiepermana-angular-brand-etos.d.ts"
4
- }
@@ -1,21 +0,0 @@
1
- /**
2
- * Etos brand color layer.
3
- */
4
- @layer tokens {
5
- [theme-brand='etos'] {
6
- --primary: 211 95% 29%;
7
- --primary-foreground: 0 0% 100%;
8
- --accent: 211 95% 96%;
9
- --accent-foreground: 211 95% 22%;
10
- --secondary: 211 24% 95%;
11
- --secondary-foreground: 211 75% 24%;
12
- --ring: 211 95% 29%;
13
- }
14
-
15
- [data-mode='dark'][theme-brand='etos'] {
16
- --accent: 211 58% 18%;
17
- --accent-foreground: 211 90% 84%;
18
- --secondary: 211 24% 18%;
19
- --secondary-foreground: 211 82% 84%;
20
- }
21
- }
@@ -1,15 +0,0 @@
1
- /**
2
- * @ojiepermana/angular/etos — complete 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';