import * as _angular_core from '@angular/core'; import { Signal, InjectionToken, PipeTransform } from '@angular/core'; import * as i1$1 from '@angular/common'; import * as i1 from '@angular/router'; import { Params } from '@angular/router'; import { SdStorage } from '@sdcorejs/angular/services'; import { SdViewport } from '@sdcorejs/angular/services/viewport'; import * as _sdcorejs_angular_modules_layout from '@sdcorejs/angular/modules/layout'; import { MaybeAsync } from '@sdcorejs/utils/models'; import { Observable } from 'rxjs'; declare class HomeRoutingModule { static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵmod: _angular_core.ɵɵNgModuleDeclaration; static ɵinj: _angular_core.ɵɵInjectorDeclaration; } declare class HomeModule { static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵmod: _angular_core.ɵɵNgModuleDeclaration; static ɵinj: _angular_core.ɵɵInjectorDeclaration; } declare class NotFoundModule { static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵmod: _angular_core.ɵɵNgModuleDeclaration; static ɵinj: _angular_core.ɵɵInjectorDeclaration; } declare class ForbiddenModule { static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵmod: _angular_core.ɵɵNgModuleDeclaration; static ɵinj: _angular_core.ɵɵInjectorDeclaration; } type SdLayoutMenu = SdLayoutRootMenu | SdLayoutChildrenMenu; type Menus = SdLayoutMenu[]; interface SdLayoutRootMenu { id?: string; path: string; queryParams?: Params; icon?: string; iconUrl?: string; title: string; permissionKey?: string; permission: string | string[] | boolean | (() => boolean); level?: number; tooltipTitle?: string; } interface SdLayoutChildrenMenu { id?: string; icon?: string; iconUrl?: string; title?: string; children?: (SdLayoutRootMenu | SdLayoutChildrenMenu)[]; level?: number; tooltipTitle?: string; } declare class SdLayoutStorageService { #private; readonly isShowSidebar: SdStorage; readonly menuLockStatus: SdStorage; readonly lastActiveMenuGroupId: SdStorage; readonly pinnedMenuGroup: SdStorage; readonly pinnedMenuKeys: SdStorage; readonly recentMenuKeys: SdStorage; readonly versionStates: SdStorage>; readPinnedMenuKeys(menus: SdLayoutMenu[]): string[]; writePinnedMenuKeys(keys: string[]): void; readRecentMenuKeys(menus: SdLayoutMenu[], maximum?: number): string[]; writeRecentMenuKeys(keys: string[]): void; readVersionState(version: 1 | 2 | 3): SdLayoutVersionState; patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } interface SdLayoutVersionState { activeGroupKey?: string; locked?: boolean; collapsed?: boolean; } type SdLayoutViewport = SdViewport; declare const SD_LAYOUT_VIEWPORT: _angular_core.InjectionToken; /** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */ declare class SdLayoutResponsiveService { #private; readonly viewportWidth: _angular_core.Signal; isMobile(breakpoint: number): boolean; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } /** Consumer-owned account action invoked without arguments by the shared user menu. */ type SdLayoutAccountAction = () => void | Promise; /** Notification badge source and the action that opens the consumer's notification experience. */ interface SdLayoutNotificationConfiguration { /** * Số lượng thông báo chưa đọc. Hỗ trợ giá trị tĩnh hoặc nguồn reactive dài hạn. */ count: number | Signal | Observable; /** * Tác vụ do consumer xử lý khi người dùng chọn thông báo. */ action: SdLayoutAccountAction; } interface ISdLayoutConfiguration { homeUrl?: string; mobileBreakpoint?: number; sidebar: ISdSidebarConfiguration | (() => MaybeAsync); userInfo: SdLayoutUserInfo | (() => MaybeAsync); signout: SdLayoutAccountAction; changePassword?: SdLayoutAccountAction; /** * Tác vụ chỉnh sửa hồ sơ do consumer cung cấp. */ updateProfile?: SdLayoutAccountAction; /** * Tác vụ mở thiết lập tài khoản do consumer cung cấp. */ setting?: SdLayoutAccountAction; /** * Cấu hình số lượng và tác vụ thông báo của tài khoản. */ notification?: SdLayoutNotificationConfiguration; } /** Optional role metadata rendered below the user's email when `text` is non-empty. */ interface SdLayoutUserRole { text: string; /** Icon name resolved by `SdIcon`. */ icon?: string; /** CSS color applied to the role metadata. */ color?: string; } interface SdLayoutUserInfo { /** * Tên đăng nhập hoặc tên định danh của người dùng. * Thường dùng làm định danh rút gọn hoặc fallback hiển thị nếu user chưa cập nhật fullName. */ username?: string; /** * Địa chỉ thư điện tử của người dùng. * Thường được hiển thị bên dưới tên người dùng trong popup/menu thông tin tài khoản. */ email?: string; /** * Họ và tên đầy đủ của người dùng. * Đây là thông tin được ưu tiên hiển thị chính trên giao diện (VD: góc phải màn hình, lời chào). */ fullName?: string; /** * Hình đại diện (avatar) của người dùng. * Nếu để trống, hệ thống sẽ tự động lấy ký tự đầu tiên của fullName hoặc username để tạo avatar mặc định. * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ. */ avatar?: string; /** * Chức vụ hoặc vai trò hiển thị cùng thông tin người dùng. * Không render khi `text` rỗng. */ role?: SdLayoutUserRole; } declare const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024; interface SidebarConfigurationBase { brandColor?: string; brandLightColor?: string; logoUrl?: string; defaultTitle?: string; pin?: { enabled?: boolean; }; } type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3; interface SidebarConfigurationV1 extends SidebarConfigurationBase { version: 1; /** * Màu brand chính. * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover. * Ví dụ: #1890ff, rgb(24,144,255) */ brandColor?: string; /** * Màu brand nhạt (light). * Dùng cho background, hover nhẹ. */ brandLightColor?: string; /** * URL logo hiển thị ở sidebar. * Nên đặt trong thư mục public hoặc dùng URL CDN. */ logoUrl?: string; /** * Title mặc định của hệ thống. * Nếu menu không truyền title thì sẽ dùng giá trị này. * @default "Back Office" */ defaultTitle?: string; /** * Cấu hình tính năng ghim menu. * - `enabled`: bật/tắt tính năng ghim. * Hệ thống mặc định là false */ pin?: { enabled?: boolean; }; } interface SidebarConfigurationV2 extends SidebarConfigurationBase { version: 2; interaction?: 'click' | 'hover-lock'; primaryMenuIds?: string[]; } interface SidebarConfigurationV3 extends SidebarConfigurationBase { version: 3; defaultCollapsed?: boolean; recent?: { enabled?: boolean; maxItems?: number; }; } interface ResolvedSidebarRecentConfiguration { enabled: boolean; maxItems: number; } declare function normalizeLayoutMobileBreakpoint(value: number | undefined): number; declare function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock'; declare function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration; declare function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1; declare function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2; declare function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3; declare const SD_LAYOUT_CONFIGURATION: InjectionToken; declare class SdLayoutNavigationStateService { #private; readonly pinnedKeys: _angular_core.WritableSignal; readonly recentKeys: _angular_core.WritableSignal; readonly pinnedMenus: _angular_core.Signal<(_sdcorejs_angular_modules_layout.SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; readonly recentMenus: _angular_core.Signal<(_sdcorejs_angular_modules_layout.SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; hydrate(menus: SdLayoutMenu[], recentMaximum?: number): void; togglePinned(menu: SdLayoutMenu): void; recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void; patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void; versionState(version: 1 | 2 | 3): SdLayoutVersionState; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } declare function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors?: string[]): string; declare function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[]; declare function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum?: number): SdLayoutMenu[]; declare function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[]; declare function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[]; declare class SdLayoutService { #private; userInfo: _angular_core.WritableSignal; sidebar: _angular_core.WritableSignal; constructor(); static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } declare class SdPageComponent { private el; title: _angular_core.InputSignal; description: _angular_core.InputSignal; noHeader: _angular_core.InputSignalWithTransform; constructor(); static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SdLayoutComponent { #private; menusInput: _angular_core.InputSignal; menus: _angular_core.Signal; userInfo: _angular_core.WritableSignal<_sdcorejs_angular_modules_layout.SdLayoutUserInfo | undefined>; sidebar: _angular_core.WritableSignal<_sdcorejs_angular_modules_layout.ISdSidebarConfiguration | undefined>; sidebarV1: _angular_core.Signal; sidebarV2: _angular_core.Signal; sidebarV3: _angular_core.Signal; mobileBreakpoint: number; isMobile: _angular_core.Signal; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SidebarMobileV1Component { #private; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; isShowSidebar: _angular_core.WritableSignal; titleMenuGroup: _angular_core.WritableSignal; constructor(); openSidebar: () => void; onToggle: (_data: boolean | null) => void; onPopupOfSideBarOpened: () => void; onPopupOfSideBarClosed: () => void; onExpandSideBar: () => void; onMouseleaveSideBar: () => void; onTitleMenuGroupChanged: (title: string | undefined) => void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SidebarMobileOverlayComponent { #private; isShowSidebar: _angular_core.InputSignal; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; showSideBar: _angular_core.OutputEmitterRef; expandSideBar: _angular_core.OutputEmitterRef; popupUserMenuOpened: _angular_core.OutputEmitterRef; popupUserMenuClosed: _angular_core.OutputEmitterRef; titleMenuGroupChanged: _angular_core.OutputEmitterRef; titleMenuGroup: _angular_core.WritableSignal; currentPath: _angular_core.WritableSignal; expandedMobileGroups: _angular_core.WritableSignal>; constructor(); toggleMobileGroup(groupId: string | undefined): void; isExpanded(groupId: string | undefined): boolean; navigate(args: { path?: string; queryParams?: Params; }): void; onClose(): void; hasChildren(menu: SdLayoutMenu): boolean; getChildren(menu: SdLayoutMenu): SdLayoutMenu[]; getPath(menu: SdLayoutMenu): string | undefined; getQueryParams(menu: SdLayoutMenu): Params; onUserMenuOpened: () => void; onUserMenuClosed: () => void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } interface SdLayoutMenuTreeNode { menu: SdLayoutMenu; key: string; title: string; depth: number; paddingLeft: number; isGroup: boolean; isActive: boolean; isPinned: boolean; isPinVisible: boolean; } declare class SdLayoutMenuTreeComponent { #private; menus: _angular_core.InputSignal; query: _angular_core.InputSignal; activePath: _angular_core.InputSignal; pinnedKeys: _angular_core.InputSignal; showPin: _angular_core.InputSignal; pinVisibility: _angular_core.InputSignal<"hover" | "always">; navigate: _angular_core.OutputEmitterRef; togglePinned: _angular_core.OutputEmitterRef; nodes: _angular_core.Signal; constructor(); onNavigate(menu: SdLayoutMenu): void; onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void; onPinHoverStart(key: string): void; onPinHoverEnd(key: string): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SdLayoutUserMenuComponent { #private; private readonly trigger; private readonly menu; userInfo: _angular_core.InputSignal; signout: _angular_core.InputSignal; changePassword: _angular_core.InputSignal; updateProfile: _angular_core.InputSignal; setting: _angular_core.InputSignal; notification: _angular_core.InputSignal; compact: _angular_core.InputSignal; presentation: _angular_core.InputSignal<"disclosure" | "mobile" | "mobile-inline">; opened: _angular_core.OutputEmitterRef; closed: _angular_core.OutputEmitterRef; isOpen: _angular_core.WritableSignal; avatar: _angular_core.Signal; displayName: _angular_core.Signal; role: _angular_core.Signal<{ text: string; icon?: string; color?: string; } | undefined>; signoutAction: _angular_core.Signal; changePasswordAction: _angular_core.Signal; updateProfileAction: _angular_core.Signal; settingAction: _angular_core.Signal; notificationConfiguration: _angular_core.Signal; notificationAction: _angular_core.Signal; notificationCount: _angular_core.Signal; notificationBadge: _angular_core.Signal; constructor(); open(): void; toggle(): void; close(restoreFocus?: boolean): void; onMenuKeydown(event: KeyboardEvent): void; runChangePassword(): void; runSignout(): void; runUpdateProfile(): void; runSetting(): void; runNotification(): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } interface SidebarV2RailItem { menu: SdLayoutMenu; key: string; title: string; } declare class SidebarV2Component { #private; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; activeGroupKey: _angular_core.WritableSignal; isFlyoutOpen: _angular_core.WritableSignal; isFlyoutLocked: _angular_core.WritableSignal; searchText: _angular_core.WritableSignal; activePath: _angular_core.WritableSignal; interaction: _angular_core.Signal<"click" | "hover-lock">; railItems: _angular_core.Signal; activeGroup: _angular_core.Signal; contextMenus: _angular_core.Signal; pinnedKeys: _angular_core.WritableSignal; constructor(); selectGroup(menu: SdLayoutMenu): void; previewGroup(menu: SdLayoutMenu): void; leaveFlyout(): void; closeFromBackdrop(): void; closeFromEscape(): void; closeFromNavigation(): void; onNavigate(menu: SdLayoutMenu): void; onTogglePinned(menu: SdLayoutMenu): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SidebarMobileV2Component { #private; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; primaryMenus: _angular_core.Signal; overflowMenus: _angular_core.Signal; isSheetOpen: _angular_core.WritableSignal; sheetGroupKey: _angular_core.WritableSignal; sheetTitle: _angular_core.WritableSignal; sheetMenus: _angular_core.WritableSignal; searchText: _angular_core.WritableSignal; activePath: _angular_core.WritableSignal; pinnedKeys: _angular_core.WritableSignal; constructor(); openMore(trigger?: EventTarget | null): void; activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void; closeSheet(restoreFocus?: boolean): void; onSheetKeydown(event: KeyboardEvent): void; onNavigate(menu: SdLayoutMenu): void; onTogglePinned(menu: SdLayoutMenu): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SidebarV3Component { #private; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; isCollapsed: _angular_core.WritableSignal; searchText: _angular_core.WritableSignal; activePath: _angular_core.WritableSignal; searchResults: _angular_core.Signal; recentConfiguration: _angular_core.Signal<_sdcorejs_angular_modules_layout.ResolvedSidebarRecentConfiguration>; pinnedKeys: _angular_core.WritableSignal; pinnedMenus: _angular_core.Signal<(SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; recentMenus: _angular_core.Signal<(SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; collapsedItems: _angular_core.Signal<{ menu: SdLayoutMenu; key: string; title: string; }[]>; constructor(); toggleCollapsed(): void; activateCollapsedMenu(menu: SdLayoutMenu): void; navigateMenu(menu: SdLayoutMenu): void; onTogglePinned(menu: SdLayoutMenu): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class SidebarMobileV3Component { #private; private readonly trigger; menus: _angular_core.InputSignal; userInfo: _angular_core.InputSignal; sidebar: _angular_core.InputSignal; isDrawerOpen: _angular_core.WritableSignal; searchText: _angular_core.WritableSignal; activePath: _angular_core.WritableSignal; searchResults: _angular_core.Signal; recentConfiguration: _angular_core.Signal<_sdcorejs_angular_modules_layout.ResolvedSidebarRecentConfiguration>; pinnedKeys: _angular_core.WritableSignal; pinnedMenus: _angular_core.Signal<(SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; recentMenus: _angular_core.Signal<(SdLayoutRootMenu | _sdcorejs_angular_modules_layout.SdLayoutChildrenMenu)[]>; constructor(); openDrawer(trigger?: EventTarget | null): void; closeFromBackdrop(): void; closeFromEscape(): void; closeFromNavigation(): void; onDrawerKeydown(event: KeyboardEvent): void; navigateMenu(menu: SdLayoutMenu): void; onTogglePinned(menu: SdLayoutMenu): void; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵcmp: _angular_core.ɵɵComponentDeclaration; } declare class MenuPipe implements PipeTransform { #private; private permissionService; /** Inserted by Angular inject() migration for backwards compatibility */ constructor(...args: unknown[]); transform(menus: SdLayoutMenu[]): SdLayoutMenu[]; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵpipe: _angular_core.ɵɵPipeDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } declare class MenuFocusPipe implements PipeTransform { #private; transform(routePath: string, menuItem: SdLayoutMenu): boolean; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵpipe: _angular_core.ɵɵPipeDeclaration; static ɵprov: _angular_core.ɵɵInjectableDeclaration; } declare class HighlightSearchPipe implements PipeTransform { #private; transform(value: string, keyword: string, args?: { color?: string; }): string; static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵpipe: _angular_core.ɵɵPipeDeclaration; } declare class SdLayoutModule { static ɵfac: _angular_core.ɵɵFactoryDeclaration; static ɵmod: _angular_core.ɵɵNgModuleDeclaration; static ɵinj: _angular_core.ɵɵInjectorDeclaration; } export { DEFAULT_LAYOUT_MOBILE_BREAKPOINT, ForbiddenModule, HighlightSearchPipe, HomeModule, MenuFocusPipe, MenuPipe, NotFoundModule, SD_LAYOUT_CONFIGURATION, SD_LAYOUT_VIEWPORT, SdLayoutComponent, SdLayoutMenuTreeComponent, SdLayoutModule, SdLayoutNavigationStateService, SdLayoutResponsiveService, SdLayoutService, SdLayoutStorageService, SdLayoutUserMenuComponent, SdPageComponent, SidebarMobileOverlayComponent, SidebarMobileV1Component, SidebarMobileV2Component, SidebarMobileV3Component, SidebarV2Component, SidebarV3Component, flattenMenuLeaves, getMenuStableKey, normalizeLayoutMobileBreakpoint, normalizeSidebarConfiguration, resolveMenuKeys, resolveSidebarV2Interaction, resolveSidebarV3Recent, searchMenuLeaves, selectPrimaryMenuGroups }; export type { ISdLayoutConfiguration, ISdSidebarConfiguration, Menus, ResolvedSidebarRecentConfiguration, SdLayoutAccountAction, SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutNotificationConfiguration, SdLayoutRootMenu, SdLayoutUserInfo, SdLayoutUserRole, SdLayoutVersionState, SdLayoutViewport, SidebarConfigurationBase, SidebarConfigurationV1, SidebarConfigurationV2, SidebarConfigurationV3 };