{"version":3,"file":"sdcorejs-angular-modules-layout.mjs","sources":["../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/page/page.component.html","../../../projects/sdcorejs-angular/modules/layout/services/menu/menu.utils.ts","../../../projects/sdcorejs-angular/modules/layout/services/storage/storage.service.ts","../../../projects/sdcorejs-angular/modules/layout/configurations/layout.configuration.ts","../../../projects/sdcorejs-angular/modules/layout/services/responsive/responsive.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/navigation-state/navigation-state.service.ts","../../../projects/sdcorejs-angular/modules/layout/services/layout.service.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/menu-focus.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/pipes/high-light-search.pipe.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/user-menu/user-menu.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/user/user.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/components/sidebar/sidebar.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v1/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/menu-tree/menu-tree.component.html","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/shared/search-field/search-field.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v2/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/sidebar-mobile-v3/main.component.html","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.ts","../../../projects/sdcorejs-angular/modules/layout/components/layout-main/layout-main.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/components/home-page/home-page.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/home/guards/home-redirect.guard.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/home/home.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/not-found/not-found.module.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/pages/root/root.component.html","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.routing.ts","../../../projects/sdcorejs-angular/modules/layout/modules/forbidden/forbidden.module.ts","../../../projects/sdcorejs-angular/modules/layout/layout.routing.ts","../../../projects/sdcorejs-angular/modules/layout/layout.module.ts","../../../projects/sdcorejs-angular/modules/layout/sdcorejs-angular-modules-layout.ts"],"sourcesContent":["import { booleanAttribute, Component, effect, ElementRef, inject, input } from '@angular/core';\n\n@Component({\n  selector: 'sd-page',\n  templateUrl: './page.component.html',\n  styleUrl: './page.component.scss',\n})\nexport class SdPageComponent {\n  private el = inject(ElementRef);\n\n  title = input<string>('', { alias: 'title' });\n  description = input<string>('', { alias: 'description' });\n  noHeader = input(false, { transform: booleanAttribute, alias: 'noHeader' });\n\n  constructor() {\n    effect(() => {\n      if (this.title()) {\n        this.el.nativeElement.removeAttribute('title');\n      }\n    });\n  }\n}\n","@if (!noHeader()) {\n  <div class=\"c-page-header bg-white\">\n    <div class=\"p-16 d-flex align-items-center w-full justify-content-between\">\n      <div class=\"d-flex\">\n        <ng-content select=\"[headerLeft]\">\n          <div class=\"d-flex flex-column\">\n            <div class=\"T20M\">{{ title() }}</div>\n            @if (description()) {\n              <div class=\"T14R text-secondary mt-4\">{{ description() }}</div>\n            }\n          </div>\n        </ng-content>\n      </div>\n      <ng-content select=\"[headerRight]\"></ng-content>\n    </div>\n  </div>\n}\n\n<div class=\"c-page-wrapper px-0\">\n  <div class=\"c-page-content\">\n    <ng-content></ng-content>\n  </div>\n</div>\n","import { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutRootMenu } from './menu.model';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\nexport function getMenuStableKey(menu: SdLayoutMenu | null | undefined, ancestors: string[] = []): string {\n  if (!menu || typeof menu !== 'object') return '';\n  if (typeof menu.id === 'string' && menu.id.trim()) return `id:${menu.id.trim()}`;\n  if ('path' in menu && typeof menu.path === 'string' && menu.path.trim()) return `path:${menu.path.trim()}`;\n\n  const title = typeof menu.title === 'string' ? menu.title.trim() : '';\n  const segments = [...ancestors, title]\n    .map(segment => StringUtilities.changeAliasLowerCase(segment).trim().replace(/\\s+/g, '-'))\n    .filter(Boolean);\n  return segments.length ? `group:${segments.join('/')}` : '';\n}\n\nexport function searchMenuLeaves(menus: SdLayoutMenu[], query: string): SdLayoutRootMenu[] {\n  const leaves = flattenMenuLeaves(menus);\n  const normalizedQuery = query?.trim();\n  if (!normalizedQuery) return leaves;\n  return leaves.filter(menu =>\n    [menu.title, menu.tooltipTitle].some(value => value && StringUtilities.aliasIncludes(value, normalizedQuery))\n  );\n}\n\nexport function selectPrimaryMenuGroups(menus: SdLayoutMenu[], requestedIds: string[] | undefined, maximum = 3): SdLayoutMenu[] {\n  const limit = Number.isFinite(maximum) && maximum > 0 ? Math.min(3, Math.floor(maximum)) : 3;\n  const byId = new Map(menus.filter(menu => typeof menu.id === 'string').map(menu => [menu.id!, menu]));\n  const selected: SdLayoutMenu[] = [];\n  const selectedKeys = new Set<string>();\n\n  for (const id of requestedIds ?? []) {\n    const menu = byId.get(id);\n    const key = getMenuStableKey(menu);\n    if (!menu || !key || selectedKeys.has(key)) continue;\n    selected.push(menu);\n    selectedKeys.add(key);\n    if (selected.length === limit) return selected;\n  }\n\n  for (const menu of menus) {\n    const key = getMenuStableKey(menu);\n    if (!key || selectedKeys.has(key)) continue;\n    selected.push(menu);\n    selectedKeys.add(key);\n    if (selected.length === limit) break;\n  }\n  return selected;\n}\n\nexport function resolveMenuKeys(menus: SdLayoutMenu[], keys: string[]): (SdLayoutRootMenu | SdLayoutChildrenMenu)[] {\n  const menuByKey = new Map<string, SdLayoutMenu>();\n  visitMenus(menus, [], (menu, ancestors) => {\n    const key = getMenuStableKey(menu, ancestors);\n    if (key && !menuByKey.has(key)) menuByKey.set(key, menu);\n  });\n  return [...new Set(keys)].map(key => menuByKey.get(key)).filter((menu): menu is SdLayoutMenu => !!menu);\n}\n\nexport function flattenMenuLeaves(menus: SdLayoutMenu[]): SdLayoutRootMenu[] {\n  const leaves: SdLayoutRootMenu[] = [];\n  visitMenus(menus, [], menu => {\n    if ('path' in menu && typeof menu.path === 'string' && menu.path) leaves.push(menu);\n  });\n  return leaves;\n}\n\nfunction visitMenus(\n  menus: SdLayoutMenu[] | undefined,\n  ancestors: string[],\n  visitor: (menu: SdLayoutMenu, ancestors: string[]) => void\n): void {\n  for (const menu of menus ?? []) {\n    if (!menu || typeof menu !== 'object') continue;\n    visitor(menu, ancestors);\n    if ('children' in menu && Array.isArray(menu.children)) {\n      const title = typeof menu.title === 'string' && menu.title.trim() ? menu.title.trim() : getMenuStableKey(menu, ancestors);\n      visitMenus(menu.children, title ? [...ancestors, title] : ancestors, visitor);\n    }\n  }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { SdStorage, SdStorageService } from '@sdcorejs/angular/services';\nimport { SdLayoutChildrenMenu, SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SdLayoutStorageService {\n  readonly #sdStorageService = inject(SdStorageService);\n\n  readonly isShowSidebar: SdStorage<boolean> = this.#sdStorageService.create('cb07c316-ed6d-4620-9e92-53dbef6aa983');\n  readonly menuLockStatus: SdStorage<boolean> = this.#sdStorageService.create('2c2f4816-18b3-4ec3-8177-7b90bff036c3');\n  readonly lastActiveMenuGroupId: SdStorage<string> = this.#sdStorageService.create('2e6961d0-3380-4a94-a6a1-38837560cd96');\n  readonly pinnedMenuGroup: SdStorage<SdLayoutChildrenMenu> = this.#sdStorageService.create('e81da122-5dab-4250-b309-64197fb19d44');\n  readonly pinnedMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('4bdc7f80-9ff4-4fe0-908f-6c9f7fe4100a');\n  readonly recentMenuKeys: SdStorage<string[]> = this.#sdStorageService.create('fb989dc1-f6e7-4b62-a611-861a8f214a51');\n  readonly versionStates: SdStorage<Record<string, SdLayoutVersionState>> = this.#sdStorageService.create(\n    'ca8e4261-fbd4-4209-af88-2dbe278c1a1b'\n  );\n\n  readPinnedMenuKeys(menus: SdLayoutMenu[]): string[] {\n    const storedKeys = this.pinnedMenuKeys.has() ? this.pinnedMenuKeys.get() : this.#getLegacyPinnedKeys();\n    const validKeys = this.#resolveValidKeys(menus, storedKeys ?? []);\n    if (!this.pinnedMenuKeys.has() || !this.#sameKeys(storedKeys ?? [], validKeys)) {\n      this.pinnedMenuKeys.set(validKeys);\n    }\n    return validKeys;\n  }\n\n  writePinnedMenuKeys(keys: string[]): void {\n    this.pinnedMenuKeys.set([...new Set(keys.filter(Boolean))]);\n  }\n\n  readRecentMenuKeys(menus: SdLayoutMenu[], maximum = 5): string[] {\n    const storedKeys = this.recentMenuKeys.get() ?? [];\n    const limit = Number.isFinite(maximum) && maximum > 0 ? Math.floor(maximum) : 5;\n    const validKeys = this.#resolveValidKeys(menus, storedKeys).slice(0, limit);\n    if (!this.#sameKeys(storedKeys, validKeys)) this.recentMenuKeys.set(validKeys);\n    return validKeys;\n  }\n\n  writeRecentMenuKeys(keys: string[]): void {\n    this.recentMenuKeys.set([...new Set(keys.filter(Boolean))]);\n  }\n\n  readVersionState(version: 1 | 2 | 3): SdLayoutVersionState {\n    return this.versionStates.get()?.[String(version)] ?? {};\n  }\n\n  patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): SdLayoutVersionState {\n    const states = this.versionStates.get() ?? {};\n    const nextState = { ...(states[String(version)] ?? {}), ...patch };\n    this.versionStates.set({ ...states, [String(version)]: nextState });\n    return nextState;\n  }\n\n  #getLegacyPinnedKeys(): string[] {\n    const legacyGroup = this.pinnedMenuGroup.get();\n    if (!legacyGroup || !Array.isArray(legacyGroup.children)) return [];\n    return legacyGroup.children.map(menu => getMenuStableKey(menu)).filter(Boolean);\n  }\n\n  #resolveValidKeys(menus: SdLayoutMenu[], keys: string[]): string[] {\n    return resolveMenuKeys(menus, keys)\n      .map(menu => getMenuStableKey(menu))\n      .filter(Boolean);\n  }\n\n  #sameKeys(left: string[], right: string[]): boolean {\n    return left.length === right.length && left.every((key, index) => key === right[index]);\n  }\n}\n\nexport interface SdLayoutVersionState {\n  activeGroupKey?: string;\n  locked?: boolean;\n  collapsed?: boolean;\n}\n","import { InjectionToken, Signal } from '@angular/core';\nimport { MaybeAsync } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\n\n/** Consumer-owned account action invoked without arguments by the shared user menu. */\nexport type SdLayoutAccountAction = () => void | Promise<void>;\n\n/** Notification badge source and the action that opens the consumer's notification experience. */\nexport interface SdLayoutNotificationConfiguration {\n  /**\n   * 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.\n   */\n  count: number | Signal<number> | Observable<number>;\n\n  /**\n   * Tác vụ do consumer xử lý khi người dùng chọn thông báo.\n   */\n  action: SdLayoutAccountAction;\n}\n\nexport interface ISdLayoutConfiguration {\n  homeUrl?: string;\n  mobileBreakpoint?: number;\n  sidebar: ISdSidebarConfiguration | (() => MaybeAsync<ISdSidebarConfiguration>);\n  userInfo: SdLayoutUserInfo | (() => MaybeAsync<SdLayoutUserInfo>);\n  signout: SdLayoutAccountAction;\n  changePassword?: SdLayoutAccountAction;\n\n  /**\n   * Tác vụ chỉnh sửa hồ sơ do consumer cung cấp.\n   */\n  updateProfile?: SdLayoutAccountAction;\n\n  /**\n   * Tác vụ mở thiết lập tài khoản do consumer cung cấp.\n   */\n  setting?: SdLayoutAccountAction;\n\n  /**\n   * Cấu hình số lượng và tác vụ thông báo của tài khoản.\n   */\n  notification?: SdLayoutNotificationConfiguration;\n}\n\n/** Optional role metadata rendered below the user's email when `text` is non-empty. */\nexport interface SdLayoutUserRole {\n  text: string;\n  /** Icon name resolved by `SdIcon`. */\n  icon?: string;\n  /** CSS color applied to the role metadata. */\n  color?: string;\n}\n\nexport interface SdLayoutUserInfo {\n  /**\n   * Tên đăng nhập hoặc tên định danh của người dùng.\n   * 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.\n   */\n  username?: string;\n\n  /**\n   * Địa chỉ thư điện tử của người dùng.\n   * 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.\n   */\n  email?: string;\n\n  /**\n   * Họ và tên đầy đủ của người dùng.\n   * Đâ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).\n   */\n  fullName?: string;\n\n  /**\n   * Hình đại diện (avatar) của người dùng.\n   * 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.\n   * Hỗ trợ các định dạng: URL (http/https), chuỗi base64 (data:image), hoặc đường dẫn nội bộ.\n   */\n  avatar?: string;\n\n  /**\n   * Chức vụ hoặc vai trò hiển thị cùng thông tin người dùng.\n   * Không render khi `text` rỗng.\n   */\n  role?: SdLayoutUserRole;\n}\n\nexport const DEFAULT_LAYOUT_MOBILE_BREAKPOINT = 1024;\n\nexport interface SidebarConfigurationBase {\n  brandColor?: string;\n  brandLightColor?: string;\n  logoUrl?: string;\n  defaultTitle?: string;\n  pin?: {\n    enabled?: boolean;\n  };\n}\n\nexport type ISdSidebarConfiguration = SidebarConfigurationV1 | SidebarConfigurationV2 | SidebarConfigurationV3;\n\nexport interface SidebarConfigurationV1 extends SidebarConfigurationBase {\n  version: 1;\n\n  /**\n   * Màu brand chính.\n   * Nên sử dụng mã màu #HEX hoặc rgb để hỗ trợ opacity khi hover.\n   * Ví dụ: #1890ff, rgb(24,144,255)\n   */\n  brandColor?: string;\n\n  /**\n   * Màu brand nhạt (light).\n   * Dùng cho background, hover nhẹ.\n   */\n  brandLightColor?: string;\n\n  /**\n   * URL logo hiển thị ở sidebar.\n   * Nên đặt trong thư mục public hoặc dùng URL CDN.\n   */\n  logoUrl?: string;\n\n  /**\n   * Title mặc định của hệ thống.\n   * Nếu menu không truyền title thì sẽ dùng giá trị này.\n   * @default \"Back Office\"\n   */\n  defaultTitle?: string;\n\n  /**\n   * Cấu hình tính năng ghim menu.\n   * - `enabled`: bật/tắt tính năng ghim.\n   * Hệ thống mặc định là false\n   */\n  pin?: {\n    enabled?: boolean;\n  };\n}\n\nexport interface SidebarConfigurationV2 extends SidebarConfigurationBase {\n  version: 2;\n  interaction?: 'click' | 'hover-lock';\n  primaryMenuIds?: string[];\n}\n\nexport interface SidebarConfigurationV3 extends SidebarConfigurationBase {\n  version: 3;\n  defaultCollapsed?: boolean;\n  recent?: {\n    enabled?: boolean;\n    maxItems?: number;\n  };\n}\n\nexport interface ResolvedSidebarRecentConfiguration {\n  enabled: boolean;\n  maxItems: number;\n}\n\nexport function normalizeLayoutMobileBreakpoint(value: number | undefined): number {\n  if (!Number.isFinite(value) || Number(value) <= 0) {\n    return DEFAULT_LAYOUT_MOBILE_BREAKPOINT;\n  }\n  return Math.floor(Number(value));\n}\n\nexport function resolveSidebarV2Interaction(sidebar: SidebarConfigurationV2): 'click' | 'hover-lock' {\n  return sidebar.interaction === 'hover-lock' ? 'hover-lock' : 'click';\n}\n\nexport function resolveSidebarV3Recent(sidebar: SidebarConfigurationV3): ResolvedSidebarRecentConfiguration {\n  const configuredLimit = sidebar.recent?.maxItems;\n  const maxItems = Number.isFinite(configuredLimit) && Number(configuredLimit) > 0 ? Math.floor(Number(configuredLimit)) : 5;\n  return {\n    enabled: sidebar.recent?.enabled ?? true,\n    maxItems,\n  };\n}\n\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV1): SidebarConfigurationV1;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV2): SidebarConfigurationV2;\nexport function normalizeSidebarConfiguration(_sidebar: SidebarConfigurationV3): SidebarConfigurationV3;\nexport function normalizeSidebarConfiguration(sidebar: ISdSidebarConfiguration): ISdSidebarConfiguration {\n  if (sidebar.version === 2) {\n    return {\n      ...sidebar,\n      interaction: resolveSidebarV2Interaction(sidebar),\n      primaryMenuIds: [...new Set((sidebar.primaryMenuIds ?? []).filter(id => typeof id === 'string' && id.trim()))].slice(0, 3),\n    };\n  }\n  if (sidebar.version === 3) {\n    return {\n      ...sidebar,\n      defaultCollapsed: sidebar.defaultCollapsed ?? false,\n      recent: resolveSidebarV3Recent(sidebar),\n    };\n  }\n  return sidebar;\n}\n\nexport const SD_LAYOUT_CONFIGURATION = new InjectionToken<ISdLayoutConfiguration>('sd.layout.configuration');\n","import { Injectable, inject } from '@angular/core';\nimport { SD_VIEWPORT, SdViewport, SdViewportService } from '@sdcorejs/angular/services/viewport';\nimport { normalizeLayoutMobileBreakpoint } from '../../configurations';\n\nexport type SdLayoutViewport = SdViewport;\nexport const SD_LAYOUT_VIEWPORT = SD_VIEWPORT;\n\n/** @deprecated Prefer `SdViewportService` from `@sdcorejs/angular/services/viewport`. */\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutResponsiveService {\n  readonly #viewport = inject(SdViewportService);\n  readonly viewportWidth = this.#viewport.width;\n\n  isMobile(breakpoint: number): boolean {\n    return this.viewportWidth() < normalizeLayoutMobileBreakpoint(breakpoint);\n  }\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { ResolvedSidebarRecentConfiguration } from '../../configurations';\nimport { SdLayoutMenu } from '../menu/menu.model';\nimport { getMenuStableKey, resolveMenuKeys } from '../menu/menu.utils';\nimport { SdLayoutStorageService, SdLayoutVersionState } from '../storage/storage.service';\n\n@Injectable({ providedIn: 'root' })\nexport class SdLayoutNavigationStateService {\n  readonly #storage = inject(SdLayoutStorageService);\n  readonly #menus = signal<SdLayoutMenu[]>([]);\n  readonly pinnedKeys = signal<string[]>([]);\n  readonly recentKeys = signal<string[]>([]);\n  readonly pinnedMenus = computed(() => resolveMenuKeys(this.#menus(), this.pinnedKeys()));\n  readonly recentMenus = computed(() => resolveMenuKeys(this.#menus(), this.recentKeys()));\n\n  hydrate(menus: SdLayoutMenu[], recentMaximum = 5): void {\n    this.#menus.set(menus);\n    this.pinnedKeys.set(this.#storage.readPinnedMenuKeys(menus));\n    this.recentKeys.set(this.#storage.readRecentMenuKeys(menus, recentMaximum));\n  }\n\n  togglePinned(menu: SdLayoutMenu): void {\n    const key = getMenuStableKey(menu);\n    if (!key) return;\n    const nextKeys = this.pinnedKeys().includes(key)\n      ? this.pinnedKeys().filter(currentKey => currentKey !== key)\n      : [...this.pinnedKeys(), key];\n    this.pinnedKeys.set(nextKeys);\n    this.#storage.writePinnedMenuKeys(nextKeys);\n  }\n\n  recordRecent(menu: SdLayoutMenu, configuration: ResolvedSidebarRecentConfiguration): void {\n    if (!configuration.enabled) return;\n    const key = getMenuStableKey(menu);\n    if (!key) return;\n    const maximum = Number.isFinite(configuration.maxItems) && configuration.maxItems > 0 ? Math.floor(configuration.maxItems) : 5;\n    const nextKeys = [key, ...this.recentKeys().filter(currentKey => currentKey !== key)].slice(0, maximum);\n    this.recentKeys.set(nextKeys);\n    this.#storage.writeRecentMenuKeys(nextKeys);\n  }\n\n  patchVersionState(version: 1 | 2 | 3, patch: SdLayoutVersionState): void {\n    this.#storage.patchVersionState(version, patch);\n  }\n\n  versionState(version: 1 | 2 | 3): SdLayoutVersionState {\n    return this.#storage.readVersionState(version);\n  }\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { resolveMaybeAsync } from '@sdcorejs/utils/models';\nimport { ISdLayoutConfiguration, ISdSidebarConfiguration, SD_LAYOUT_CONFIGURATION, SdLayoutUserInfo } from '../configurations';\n\n@Injectable({\n  providedIn: 'root', // Có thể đổi thành 'any' hoặc khai báo trong mảng providers của LayoutModule tùy kiến trúc của bạn\n})\nexport class SdLayoutService {\n  // ==========================================\n  // INJECT CONFIGURATIONS\n  // ==========================================\n  // WHY: optional=true cho phép layout module chạy không cần SD_LAYOUT_CONFIGURATION\n  // (use case demo / khởi tạo nhanh). Khi token không có → fallback mock data trong constructor.\n  #layoutConfiguration = inject<ISdLayoutConfiguration | null>(SD_LAYOUT_CONFIGURATION, { optional: true });\n  #i18n = inject(I18nService);\n\n  // ==========================================\n  // SHARED SIGNALS (STATE)\n  // ==========================================\n  userInfo = signal<SdLayoutUserInfo | undefined>(undefined);\n  sidebar = signal<ISdSidebarConfiguration | undefined>(undefined);\n\n  constructor() {\n    if (!this.#layoutConfiguration) {\n      // WHY: cho phép layout module chạy không cần config (use case demo / khởi tạo nhanh).\n      // Fallback dùng mock data đã i18n hóa; thật tế khi tích hợp portal cần provide SD_LAYOUT_CONFIGURATION.\n      // @i18n-ignore dev-facing console.warn — không cần dịch\n      console.warn(\n        // @i18n-ignore\n        '[SdLayoutService] SD_LAYOUT_CONFIGURATION chưa được inject — đang dùng mock data. ' +\n          // @i18n-ignore\n          'Provide token này (xem ISdLayoutConfiguration) để custom user info / sidebar / signout.'\n      );\n      this.userInfo.set(this.#mockUserInfo());\n      this.sidebar.set(this.#mockSidebar());\n      return;\n    }\n    this.#initUserInfo();\n    this.#initSidebar();\n  }\n\n  // ==========================================\n  // PRIVATE METHODS\n  // ==========================================\n  #initUserInfo(): void {\n    const userInfoConfig = this.#layoutConfiguration!.userInfo;\n    if (typeof userInfoConfig === 'function') {\n      resolveMaybeAsync(userInfoConfig()).then(userInfo => this.userInfo.set(userInfo));\n    } else {\n      this.userInfo.set(userInfoConfig);\n    }\n  }\n\n  #initSidebar(): void {\n    const sidebarConfig = this.#layoutConfiguration!.sidebar;\n    if (typeof sidebarConfig === 'function') {\n      resolveMaybeAsync(sidebarConfig()).then(config => this.sidebar.set(config));\n    } else {\n      this.sidebar.set(sidebarConfig);\n    }\n  }\n\n  #mockUserInfo(): SdLayoutUserInfo {\n    return {\n      fullName: this.#i18n.t('core.module.layout.mock.user.full-name'),\n      email: 'demo@example.com',\n      username: 'demo',\n    };\n  }\n\n  #mockSidebar(): ISdSidebarConfiguration {\n    return {\n      version: 1,\n      defaultTitle: 'Back Office',\n    };\n  }\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { Injectable, Pipe, PipeTransform, inject } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu, Menus } from '../services/menu/menu.model';\nimport { Params } from '@angular/router';\nimport { SdPermissionService } from '@sdcorejs/angular/modules/permission';\n// End\n@Pipe({\n  name: 'menu',\n})\n@Injectable({\n  providedIn: 'root',\n})\nexport class MenuPipe implements PipeTransform {\n  private permissionService = inject(SdPermissionService);\n\n  /** Inserted by Angular inject() migration for backwards compatibility */\n  constructor(...args: unknown[]);\n\n  constructor() {}\n  transform(menus: SdLayoutMenu[]): SdLayoutMenu[] {\n    const results: Menus = [];\n    const check = (menu: SdLayoutMenu): SdLayoutMenu | null => {\n      if ('children' in menu) {\n        const children: Menus = [];\n        menu.children?.forEach(childMenu => {\n          childMenu = check(childMenu) as SdLayoutMenu;\n          if (childMenu) {\n            children.push({ ...childMenu, id: this.#getHashIdMenu(childMenu) });\n          }\n        });\n\n        if (!children.length) {\n          return null;\n        }\n\n        return {\n          ...menu,\n          children,\n          id: this.#getHashIdMenu(menu),\n        };\n      }\n\n      if ('permission' in menu) {\n        const path = menu?.path?.includes('http') ? menu.path : menu.path;\n        if (!menu.path) {\n          return null;\n        }\n\n        if (\n          (typeof menu.permission === 'string' || Array.isArray(menu.permission)) &&\n          this.permissionService.hasPermission(menu.permission, menu.permissionKey)\n        ) {\n          return {\n            ...menu,\n            path,\n            id: this.#getHashIdMenu(menu),\n          };\n        }\n\n        if (typeof menu.permission === 'boolean' && menu.permission) {\n          return {\n            ...menu,\n            path,\n            id: this.#getHashIdMenu(menu),\n          };\n        }\n\n        if (typeof menu.permission === 'function' && menu.permission()) {\n          return {\n            ...menu,\n            path,\n            id: this.#getHashIdMenu(menu),\n          };\n        }\n\n        return null;\n      }\n      return {\n        ...menu,\n        id: Utilities.generateUuid(),\n      };\n    };\n\n    menus?.forEach(menu => {\n      menu = check(menu) as SdLayoutMenu;\n      if (menu) {\n        results.push(menu);\n      }\n    });\n    return results;\n  }\n\n  #getHashIdMenu = (menu: SdLayoutMenu): string => {\n    const explicitId = typeof menu.id === 'string' ? menu.id.trim() : '';\n    if (explicitId) return explicitId;\n\n    const extendedMenu = menu as SdLayoutMenu & {\n      path?: string;\n      permission?: string;\n      permissionKey?: string;\n      queryParams?: Params;\n    };\n    const hashKeys: (keyof typeof extendedMenu)[] = [\n      'title',\n      'path',\n      'permission',\n      'permissionKey',\n      'queryParams',\n      'icon',\n      'level',\n      'tooltipTitle',\n    ];\n    const hashData = hashKeys.reduce(\n      (acc, key) => {\n        const value = extendedMenu[key];\n        if (value !== undefined && value !== null) {\n          acc[key as string] = value;\n        }\n        return acc;\n      },\n      {} as Record<string, any>\n    );\n\n    return Object.keys(hashData).length > 0 ? Utilities.hash(hashData) : Utilities.generateUuid();\n  };\n}\n","import { Injectable, Pipe, PipeTransform } from '@angular/core';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdLayoutMenu } from '../services';\n// End\n@Pipe({\n  name: 'menuFocus',\n})\n@Injectable({ providedIn: 'root' })\nexport class MenuFocusPipe implements PipeTransform {\n  transform(routePath: string, menuItem: SdLayoutMenu): boolean {\n    if (!routePath) {\n      return false;\n    }\n    if ('children' in menuItem && menuItem.children) {\n      return menuItem.children.some(child => {\n        return 'path' in child && child.path ? this.#match(routePath, child.path) : false;\n      });\n    }\n    return 'path' in menuItem && this.#match(routePath, menuItem.path);\n  }\n\n  #match = (routePath: string, path: string): boolean => {\n    if (!path) {\n      return false;\n    }\n    if (routePath === path) {\n      return true;\n    }\n    return this.#normalizePath(routePath).startsWith(this.#normalizePath(path));\n  };\n\n  #normalizePath = (p: string): string => {\n    return p.endsWith('/') ? p : p + '/';\n  };\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n@Pipe({\n  name: 'highLightSearch',\n})\nexport class HighlightSearchPipe implements PipeTransform {\n  transform(\n    value: string,\n    keyword: string,\n    args?: {\n      color?: string;\n    }\n  ): string {\n    const { color = '#ffff00' } = args ?? {};\n    keyword = this.#normalizeValue(keyword);\n    if (!keyword || keyword.length < 2) {\n      return value;\n    }\n    value = value?.trim() || '';\n    const regex = new RegExp(StringUtilities.changeAliasLowerCase(keyword), 'gi'); //'gi' for case insensitive and can use 'g' if you want the search to be case sensitive.\n    const aliasLowerCaseStr = StringUtilities.changeAliasLowerCase(value);\n    const strs: string[] = [];\n    let previousOffset = 0;\n    aliasLowerCaseStr.replace(regex, (_, offset) => {\n      strs.push(value.substring(previousOffset, offset));\n      strs.push(`<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`);\n      previousOffset = offset + keyword.length;\n      return `<mark style=\"background-color: ${color}\">${value.substring(offset, offset + keyword.length)}</mark>`;\n    });\n    strs.push(value.substring(previousOffset, value.length));\n    return strs.join('');\n  }\n\n  #normalizeValue = (keyword: string) => {\n    let str: string = keyword?.toString() ?? '';\n    /* eslint-disable no-useless-escape */\n    str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n    str = str.replace(/ + /g, ' ');\n    str = str.trim();\n    return str;\n  };\n}\n","import { DOCUMENT } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  computed,\n  effect,\n  inject,\n  input,\n  isSignal,\n  output,\n  signal,\n  viewChild,\n} from '@angular/core';\nimport { SdAvatar } from '@sdcorejs/angular/components';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { isObservable } from 'rxjs';\nimport {\n  SD_LAYOUT_CONFIGURATION,\n  SdLayoutAccountAction,\n  SdLayoutNotificationConfiguration,\n  SdLayoutUserInfo,\n} from '../../../configurations';\n\n@Component({\n  selector: 'sd-layout-user-menu',\n  standalone: true,\n  imports: [SdAvatar, SdIcon, TranslatePipe],\n  templateUrl: './user-menu.component.html',\n  styleUrl: './user-menu.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutUserMenuComponent {\n  readonly #configuration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #document = inject(DOCUMENT);\n  readonly #host = inject<ElementRef<HTMLElement>>(ElementRef);\n  private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n  private readonly menu = viewChild<ElementRef<HTMLElement>>('menu');\n\n  userInfo = input.required<SdLayoutUserInfo>();\n  signout = input<SdLayoutAccountAction | undefined>();\n  changePassword = input<SdLayoutAccountAction | undefined>();\n  updateProfile = input<SdLayoutAccountAction | undefined>();\n  setting = input<SdLayoutAccountAction | undefined>();\n  notification = input<SdLayoutNotificationConfiguration | undefined>();\n  compact = input(false);\n  presentation = input<'disclosure' | 'mobile' | 'mobile-inline'>('disclosure');\n  opened = output<void>();\n  closed = output<void>();\n  isOpen = signal(false);\n  readonly #observableNotificationCount = signal<number | undefined>(undefined);\n\n  avatar = computed(() => {\n    const user = this.userInfo();\n    return user.avatar || user.fullName || user.username || user.email;\n  });\n  displayName = computed(() => this.userInfo().fullName || this.userInfo().username || this.userInfo().email || 'User');\n  role = computed(() => {\n    const role = this.userInfo().role;\n    const text = role?.text?.trim();\n    return text ? { ...role, text } : undefined;\n  });\n  signoutAction = computed(() => this.signout() ?? this.#configuration?.signout);\n  changePasswordAction = computed(() => this.changePassword() ?? this.#configuration?.changePassword);\n  updateProfileAction = computed(() => this.updateProfile() ?? this.#configuration?.updateProfile);\n  settingAction = computed(() => this.setting() ?? this.#configuration?.setting);\n  notificationConfiguration = computed(() => this.notification() ?? this.#configuration?.notification);\n  notificationAction = computed(() => this.notificationConfiguration()?.action);\n  notificationCount = computed(() => {\n    const source = this.notificationConfiguration()?.count;\n    const value = isSignal(source) ? source() : isObservable(source) ? this.#observableNotificationCount() : source;\n    return this.#normalizeNotificationCount(value);\n  });\n  notificationBadge = computed(() => {\n    const count = this.notificationCount();\n    return count > 99 ? '99+' : count > 0 ? String(count) : undefined;\n  });\n\n  constructor() {\n    // Observable sources may change with component inputs; effect cleanup guarantees one active subscription.\n    effect(onCleanup => {\n      const source = this.notificationConfiguration()?.count;\n      this.#observableNotificationCount.set(undefined);\n      if (!isObservable(source)) return;\n\n      const subscription = source.subscribe(value => this.#observableNotificationCount.set(value));\n      onCleanup(() => subscription.unsubscribe());\n    });\n\n    effect(() => {\n      if (!this.isOpen()) return;\n      this.menu()?.nativeElement.querySelector<HTMLButtonElement>('[role=\"menuitem\"]')?.focus();\n    });\n\n    const onDocumentKeydown = (event: KeyboardEvent): void => {\n      if (!this.isOpen() || event.key !== 'Escape') return;\n      event.preventDefault();\n      this.close();\n    };\n    const onDocumentPointerDown = (event: PointerEvent): void => {\n      if (!this.isOpen()) return;\n      const nodeConstructor = this.#document.defaultView?.Node;\n      if (!nodeConstructor || !(event.target instanceof nodeConstructor) || this.#host.nativeElement.contains(event.target)) return;\n      this.close(false);\n    };\n\n    this.#document.addEventListener('keydown', onDocumentKeydown);\n    this.#document.addEventListener('pointerdown', onDocumentPointerDown);\n    this.#destroyRef.onDestroy(() => {\n      this.#document.removeEventListener('keydown', onDocumentKeydown);\n      this.#document.removeEventListener('pointerdown', onDocumentPointerDown);\n    });\n  }\n\n  open(): void {\n    if (this.isOpen()) return;\n    this.isOpen.set(true);\n    this.opened.emit();\n  }\n\n  toggle(): void {\n    if (this.isOpen()) this.close(false);\n    else this.open();\n  }\n\n  close(restoreFocus = true): void {\n    const wasOpen = this.isOpen();\n    this.isOpen.set(false);\n    if (wasOpen) this.closed.emit();\n    if (restoreFocus) this.trigger()?.nativeElement.focus();\n  }\n\n  onMenuKeydown(event: KeyboardEvent): void {\n    if (event.key === 'Escape') {\n      event.preventDefault();\n      this.close();\n      return;\n    }\n    if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || !(event.currentTarget instanceof HTMLElement)) return;\n\n    const actions = [...event.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]')];\n    if (!actions.length) return;\n    event.preventDefault();\n    const currentIndex = actions.findIndex(action => action === this.#document.activeElement);\n    const nextIndex =\n      event.key === 'Home'\n        ? 0\n        : event.key === 'End'\n          ? actions.length - 1\n          : event.key === 'ArrowDown'\n            ? (currentIndex + 1) % actions.length\n            : (currentIndex - 1 + actions.length) % actions.length;\n    actions[nextIndex].focus();\n  }\n\n  runChangePassword(): void {\n    this.#runAction(this.changePasswordAction());\n  }\n\n  runSignout(): void {\n    this.#runAction(this.signoutAction());\n  }\n\n  runUpdateProfile(): void {\n    this.#runAction(this.updateProfileAction());\n  }\n\n  runSetting(): void {\n    this.#runAction(this.settingAction());\n  }\n\n  runNotification(): void {\n    this.#runAction(this.notificationAction());\n  }\n\n  #runAction(action: SdLayoutAccountAction | undefined): void {\n    action?.();\n    this.close();\n  }\n\n  #normalizeNotificationCount(value: number | undefined): number {\n    return Number.isFinite(value) && Number(value) > 0 ? Math.floor(Number(value)) : 0;\n  }\n}\n","@let _presentation = presentation();\n@let _role = role();\n@let _notificationBadge = notificationBadge();\n<div class=\"sd-layout-user-menu position-relative\">\n  @if (_presentation !== 'disclosure') {\n    <div class=\"sd-layout-user-menu__mobile d-flex flex-column gap-8\">\n      <div\n        data-mobile-account-row\n        class=\"sd-layout-user-menu__mobile-row sd-layout-user-menu__mobile--inline d-flex align-items-center gap-8\">\n        <div data-user-summary class=\"sd-layout-user-menu__summary d-flex align-items-center gap-8 flex-1\">\n          <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n          <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n            <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n            @if (userInfo().email) {\n              <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n            }\n            @if (_role) {\n              <span\n                data-user-role\n                class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n                [style.color]=\"_role.color\">\n                @if (_role.icon) {\n                  <sd-icon [name]=\"_role.icon\"></sd-icon>\n                }\n                {{ _role.text }}\n              </span>\n            }\n          </span>\n        </div>\n        @if (signoutAction()) {\n          <button\n            type=\"button\"\n            data-user-action=\"signout\"\n            class=\"sd-layout-user-menu__action sd-layout-user-menu__signout d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n            (click)=\"runSignout()\">\n            <sd-icon name=\"logout\"></sd-icon>\n            {{ 'core.module.layout.user.logout' | translate }}\n          </button>\n        }\n      </div>\n\n      @if (updateProfileAction() || settingAction() || notificationAction() || changePasswordAction()) {\n        <div data-mobile-account-actions class=\"sd-layout-user-menu__mobile-actions d-flex flex-column gap-4\">\n          @if (updateProfileAction()) {\n            <button\n              type=\"button\"\n              data-user-action=\"update-profile\"\n              class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n              (click)=\"runUpdateProfile()\">\n              <sd-icon name=\"edit\"></sd-icon>\n              {{ 'core.module.layout.user.update-profile' | translate }}\n            </button>\n          }\n          @if (settingAction()) {\n            <button\n              type=\"button\"\n              data-user-action=\"setting\"\n              class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n              (click)=\"runSetting()\">\n              <sd-icon name=\"settings\"></sd-icon>\n              {{ 'core.module.layout.user.setting' | translate }}\n            </button>\n          }\n          @if (notificationAction()) {\n            <button\n              type=\"button\"\n              data-user-action=\"notification\"\n              class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n              (click)=\"runNotification()\">\n              <sd-icon name=\"notifications\"></sd-icon>\n              <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | translate }}</span>\n              @if (_notificationBadge) {\n                <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n              }\n            </button>\n          }\n          @if (changePasswordAction()) {\n            <button\n              type=\"button\"\n              data-user-action=\"change-password\"\n              class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n              (click)=\"runChangePassword()\">\n              <sd-icon name=\"lock\"></sd-icon>\n              {{ 'core.module.layout.user.change-password' | translate }}\n            </button>\n          }\n        </div>\n      }\n    </div>\n  } @else {\n    <button\n      #trigger\n      type=\"button\"\n      data-user-trigger\n      class=\"sd-layout-user-menu__trigger d-flex align-items-center text-left\"\n      [class.sd-layout-user-menu__trigger--compact]=\"compact()\"\n      [class.w-full]=\"!compact()\"\n      [class.gap-8]=\"!compact()\"\n      [class.w-56]=\"compact()\"\n      [class.gap-0]=\"compact()\"\n      aria-haspopup=\"menu\"\n      [attr.aria-label]=\"compact() ? displayName() : null\"\n      [attr.aria-expanded]=\"isOpen()\"\n      (click)=\"toggle()\">\n      <sd-avatar [src]=\"avatar()\" [size]=\"compact() ? 32 : 40\"></sd-avatar>\n      @if (!compact()) {\n        <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n          <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n          @if (userInfo().email) {\n            <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n          }\n        </span>\n        <sd-icon [name]=\"isOpen() ? 'expand_less' : 'expand_more'\"></sd-icon>\n      }\n    </button>\n\n    @if (isOpen()) {\n      <div\n        #menu\n        data-user-menu\n        class=\"sd-layout-user-menu__popup d-flex flex-column gap-4 p-8 bg-white border border-black200 rounded-8 mat-elevation-z4\"\n        role=\"menu\"\n        tabindex=\"-1\"\n        (keydown)=\"onMenuKeydown($event)\">\n        <div data-user-identity class=\"sd-layout-user-menu__identity d-flex align-items-center gap-8 px-8 py-4\">\n          <sd-avatar [src]=\"avatar()\" [size]=\"40\"></sd-avatar>\n          <span class=\"d-flex flex-column flex-1 overflow-hidden\">\n            <span class=\"T14M text-ellipsis\">{{ displayName() }}</span>\n            @if (userInfo().email) {\n              <span class=\"T12R text-black400 text-ellipsis\">{{ userInfo().email }}</span>\n            }\n            @if (_role) {\n              <span\n                data-user-role\n                class=\"sd-layout-user-menu__role d-flex align-items-center gap-4 T12R text-ellipsis\"\n                [style.color]=\"_role.color\">\n                @if (_role.icon) {\n                  <sd-icon [name]=\"_role.icon\"></sd-icon>\n                }\n                {{ _role.text }}\n              </span>\n            }\n          </span>\n        </div>\n        @if (updateProfileAction()) {\n          <button\n            type=\"button\"\n            role=\"menuitem\"\n            data-user-action=\"update-profile\"\n            class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n            (click)=\"runUpdateProfile()\">\n            <sd-icon name=\"edit\"></sd-icon>\n            {{ 'core.module.layout.user.update-profile' | translate }}\n          </button>\n        }\n        @if (settingAction()) {\n          <button\n            type=\"button\"\n            role=\"menuitem\"\n            data-user-action=\"setting\"\n            class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n            (click)=\"runSetting()\">\n            <sd-icon name=\"settings\"></sd-icon>\n            {{ 'core.module.layout.user.setting' | translate }}\n          </button>\n        }\n        @if (notificationAction()) {\n          <button\n            type=\"button\"\n            role=\"menuitem\"\n            data-user-action=\"notification\"\n            class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n            (click)=\"runNotification()\">\n            <sd-icon name=\"notifications\"></sd-icon>\n            <span class=\"flex-1\">{{ 'core.module.layout.user.notification' | translate }}</span>\n            @if (_notificationBadge) {\n              <span data-notification-badge class=\"sd-layout-user-menu__badge\">{{ _notificationBadge }}</span>\n            }\n          </button>\n        }\n        @if (changePasswordAction()) {\n          <button\n            type=\"button\"\n            role=\"menuitem\"\n            data-user-action=\"change-password\"\n            class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left\"\n            (click)=\"runChangePassword()\">\n            <sd-icon name=\"lock\"></sd-icon>\n            {{ 'core.module.layout.user.change-password' | translate }}\n          </button>\n        }\n        @if (signoutAction()) {\n          <button\n            type=\"button\"\n            role=\"menuitem\"\n            data-user-action=\"signout\"\n            class=\"sd-layout-user-menu__action d-flex align-items-center gap-8 px-8 py-8 T14R text-left text-error\"\n            (click)=\"runSignout()\">\n            <sd-icon name=\"logout\"></sd-icon>\n            {{ 'core.module.layout.user.logout' | translate }}\n          </button>\n        }\n      </div>\n    }\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n  selector: 'lib-layout-user',\n  templateUrl: './user.component.html',\n  styleUrl: './user.component.scss',\n  imports: [SdIcon, SdLayoutUserMenuComponent, TranslatePipe],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n  isMobileOrTablet = input<boolean>(false);\n  isMenuLock = input<boolean>(false);\n  isShowSidebar = input<boolean>(false);\n  userInfo = input.required<SdLayoutUserInfo>();\n\n  menuClosed = output<void>();\n  menuOpened = output<void>();\n  toggleMenuLock = output<Event>();\n\n  onMenuOpened(): void {\n    this.menuOpened.emit();\n  }\n\n  onMenuClosed(): void {\n    this.menuClosed.emit();\n  }\n\n  onToggleMenuLock(event: Event): void {\n    this.toggleMenuLock.emit(event);\n  }\n}\n","<div class=\"c-layout-user-wrapper\">\n  <sd-layout-user-menu\n    class=\"c-layout-user-avatar\"\n    [userInfo]=\"userInfo()\"\n    [compact]=\"true\"\n    (opened)=\"onMenuOpened()\"\n    (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n  @if (!isMobileOrTablet()) {\n    <button\n      type=\"button\"\n      class=\"c-layout-icon-toggle\"\n      [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | translate\"\n      (click)=\"onToggleMenuLock($event)\">\n      <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n    </button>\n  }\n</div>\n","import { NestedTreeControl } from '@angular/cdk/tree';\nimport { CommonModule, DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { MatTreeModule, MatTreeNestedDataSource } from '@angular/material/tree';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdInput, SdSuffixDefDirective } from '@sdcorejs/angular/forms';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { HighlightSearchPipe, MenuFocusPipe } from '../../../../pipes';\nimport { SdLayoutChildrenMenu, SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sidebar',\n  standalone: true,\n  imports: [\n    SdIcon,\n    SdInput,\n    FormsModule,\n    CommonModule,\n    RouterModule,\n    MatTreeModule,\n    SdSafeHtmlPipe,\n    MatInputModule,\n    MenuFocusPipe,\n    MatTooltipModule,\n    HighlightSearchPipe,\n    SdSuffixDefDirective,\n    LayoutUserComponent,\n    TranslatePipe,\n  ],\n  templateUrl: './sidebar.component.html',\n  styleUrl: './sidebar.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarComponent {\n  // ==========================================\n  // INJECT SERVICES (Thay thế Constructor rườm rà)\n  // ==========================================\n  #router = inject(Router);\n  #layoutStorageService = inject(SdLayoutStorageService);\n  #navigationState = inject(SdLayoutNavigationStateService);\n  #menuFocusPipe = inject(MenuFocusPipe);\n  #window = inject(DOCUMENT).defaultView;\n  #destroyRef = inject(DestroyRef); // Dùng để unsubscribe RxJS tự động\n\n  // ==========================================\n  // SIGNAL INPUTS & OUTPUTS\n  // ==========================================\n  isShowSidebar = input.required<boolean>();\n  menus = input.required<SdLayoutMenu[]>();\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV1>();\n  isMobile = input(false);\n  expandSideBar = output<void>();\n  popupUserMenuClosed = output<void>();\n  popupUserMenuOpened = output<void>();\n  showSideBar = output<boolean | null>();\n\n  // ==========================================\n  // STATE SIGNALS\n  // ==========================================\n  isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n  currentPath = signal<string>(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n  searchText = signal<string>('');\n  titleMenuGroup = signal<string | undefined>('');\n  idMenuGroupActive = signal<string | undefined>('');\n  menusByGroup = signal<SdLayoutMenu[]>([]);\n  #hoveredMenuNodeKey = signal<string | null>(null);\n  #pinIconHoverTimerId = signal<ReturnType<typeof setTimeout> | null>(null);\n  pinnedMenuGroup = computed<SdLayoutChildrenMenu>(() => ({\n    id: 'pinned-menu-group',\n    title: 'Đã ghim',\n    children: this.#navigationState.pinnedMenus(),\n  }));\n\n  // ==========================================\n  // COMPUTED STATE\n  // ==========================================\n  totalMenuInMenusByGroup = computed(() => this.#getTotalMenus(this.menusByGroup()));\n  logoUrl = computed(() => this.sidebar().logoUrl?.trim() || undefined);\n  pinnedNodeKeys = computed(() => new Set(this.pinnedMenuGroup().children?.map(m => this.#getMenuNodeKey(m)) ?? []));\n  isPinnedMenuGroupActive = computed(() => this.idMenuGroupActive() === this.pinnedMenuGroup().id);\n\n  // ==========================================\n  // DATA STRUCTURES\n  // ==========================================\n  #pinIconHoverTimerDelay = 300;\n  #isFirstBindingMenu = signal<boolean>(true);\n  dataSource = new MatTreeNestedDataSource<SdLayoutMenu>();\n  treeControl = new NestedTreeControl<SdLayoutMenu>(node => ('children' in node && node.children?.length ? node.children : []));\n\n  constructor() {\n    this.#setupEffects();\n    this.#setupSubscriptions();\n  }\n\n  #setupEffects(): void {\n    effect(() => {\n      const currentMenus = this.menus();\n      untracked(() => {\n        this.#navigationState.hydrate(currentMenus);\n        const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n        const pinnedGroup = this.pinnedMenuGroup();\n        const isPinEnabled = this.sidebar()?.pin?.enabled;\n        // Xử lý khi lần đầu vào web (nếu chưa có active group)\n        if (!lastActiveMenuGroupId || (lastActiveMenuGroupId === pinnedGroup?.id && !isPinEnabled)) {\n          // Ưu tiên pinnedGroup nếu đủ điều kiện, còn không lấy menu đầu tiền dev khai báo\n          const targetId = isPinEnabled && pinnedGroup?.children?.length ? pinnedGroup?.id : currentMenus?.[0]?.id;\n          this.#layoutStorageService.lastActiveMenuGroupId.set(targetId ?? '');\n        }\n\n        this.#bindingMenuGroupByCurrentPath(currentMenus);\n        this.#isFirstBindingMenu.set(false);\n      });\n    });\n  }\n\n  #setupSubscriptions(): void {\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (event instanceof NavigationEnd) {\n        const currentPath = event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '';\n        if (this.currentPath() !== currentPath) {\n          this.currentPath.set(currentPath);\n          this.#bindingMenuGroupByCurrentPath(this.menus());\n        }\n      }\n    });\n  }\n\n  // ==========================================\n  // EVENT HANDLERS\n  // ==========================================\n  hasChild = (_: number, node: SdLayoutMenu): boolean => 'children' in node && !!node.children?.length;\n\n  onToggleMenuNode = (menu: SdLayoutMenu): void => {\n    this.treeControl.toggle(menu);\n  };\n\n  isPinnedNode = (node: SdLayoutMenu): boolean => this.pinnedNodeKeys().has(this.#getMenuNodeKey(node));\n  isHoveredNode = (node: SdLayoutMenu): boolean => this.#hoveredMenuNodeKey() === this.#getMenuNodeKey(node);\n\n  expandPinnedGroup = (): void => {\n    const group = this.pinnedMenuGroup();\n    this.idMenuGroupActive.set(group.id);\n    this.#layoutStorageService.lastActiveMenuGroupId.set(group.id || '');\n    this.titleMenuGroup.set(group.title);\n    this.#setMenusByGroup(group.children ?? []);\n    this.searchText.set('');\n    this.expandSideBar.emit();\n  };\n\n  onTogglePin = (event: MouseEvent, node: SdLayoutMenu): void => {\n    event.stopPropagation();\n    this.#navigationState.togglePinned(node);\n  };\n\n  #onExpandAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n    menus?.forEach(menu => {\n      this.treeControl.expand(menu);\n      if ('children' in menu && menu.children?.length) {\n        this.#onExpandAllMenuNodes(menu.children);\n      }\n    });\n  };\n\n  #onCollapseAllMenuNodes = (menus: SdLayoutMenu[]): void => {\n    menus?.forEach(menu => {\n      this.treeControl.collapse(menu);\n      if ('children' in menu && menu.children?.length) {\n        this.#onCollapseAllMenuNodes(menu.children);\n      }\n    });\n  };\n\n  toggleMenuLock(event: Event): void {\n    event.stopPropagation();\n    this.isMenuLock.update(v => !v);\n    this.#layoutStorageService.menuLockStatus?.set(this.isMenuLock());\n    this.showSideBar.emit(this.isMenuLock());\n  }\n\n  openHomePage = (): void => {\n    this.#router.navigateByUrl('/layout/home');\n    this.searchText.set('');\n    this.#layoutStorageService.lastActiveMenuGroupId.set('');\n  };\n\n  onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n  onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n\n  navigate = (args: { path: string; queryParams: Params }): void => {\n    const { path, queryParams } = args;\n    if (path.includes('http')) {\n      this.#window?.open(path, '_blank', 'noopener');\n      return;\n    }\n    this.#router.navigate([path.split('?')[0]], {\n      queryParams,\n      state: { switchTab: true },\n    });\n\n    if (this.isMobile()) {\n      this.#closeMenu();\n    }\n  };\n\n  onFilterSearchText = (event: string): void => {\n    this.searchText.set(event);\n    this.#filterMenuBySearchText(this.menusByGroup());\n  };\n\n  onClearSearchText = (): void => {\n    this.searchText.set('');\n    this.#filterMenuBySearchText(this.menusByGroup());\n  };\n\n  expandMenuGroup = (menuGroupNode: SdLayoutMenu): void => {\n    this.titleMenuGroup.set(menuGroupNode?.tooltipTitle || menuGroupNode?.title);\n\n    // Case 1: Menu không có children\n    if (!('children' in menuGroupNode && menuGroupNode.children?.length)) {\n      if ('path' in menuGroupNode) {\n        this.navigate({ path: menuGroupNode.path, queryParams: menuGroupNode?.queryParams ?? {} });\n        return;\n      }\n    }\n\n    // Case 2: Menu có children\n    if ('children' in menuGroupNode && menuGroupNode.children?.length) {\n      this.#setMenusByGroup(menuGroupNode.children);\n      this.searchText.set('');\n      this.onFilterSearchText('');\n      this.expandSideBar.emit();\n    }\n\n    this.idMenuGroupActive.set(menuGroupNode?.id);\n    this.#layoutStorageService.lastActiveMenuGroupId.set(menuGroupNode?.id || '');\n    if (!this.currentPath()) {\n      this.currentPath.set(this.#window?.location.pathname ?? this.#router.url.split(/[?#]/, 1)[0] ?? '');\n    }\n  };\n\n  // ==========================================\n  // CỤM HOVER MENU GROUP & NODE\n  // ==========================================\n  onMouseOverMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n    if (this.idMenuGroupActive() !== menuNode?.id) {\n      const menuGroup = event.currentTarget as HTMLElement;\n      const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n      const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n      if (menuGroupIcon) {\n        menuGroupIcon.style.transition = 'all 0.15s';\n        menuGroupIcon.style.backgroundColor =\n          brandLightColorOpacity || 'color-mix(in srgb, var(--sd-primary-light, #d7e3ff) 60%, transparent)';\n        if (!(menuGroupIcon instanceof HTMLImageElement)) {\n          menuGroupIcon.style.color = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n        }\n      }\n    }\n  };\n\n  onMouseLeaveMenuGroupNode = (event: MouseEvent, menuNode: SdLayoutMenu): void => {\n    if (this.idMenuGroupActive() !== menuNode?.id) {\n      const menuGroup = event.currentTarget as HTMLElement;\n      const menuGroupIcon = menuGroup.querySelector('.c-menu-group-icon') as HTMLElement;\n\n      if (menuGroupIcon) {\n        menuGroupIcon.style.transition = 'all 0.15s';\n        menuGroupIcon.style.backgroundColor = 'transparent';\n        if (menuGroupIcon instanceof HTMLImageElement) {\n          menuGroupIcon.style.opacity = '0.55';\n        } else {\n          menuGroupIcon.style.color = 'var(--sd-text-secondary, #44474f)';\n        }\n      }\n    }\n  };\n\n  onMouseOverMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n    const menuNode = event.currentTarget as HTMLElement;\n    const brandColor = this.sidebar()?.brandColor || 'var(--sd-primary, #005cbb)';\n\n    // Nếu có bật config pin menu\n    if (this.sidebar()?.pin?.enabled) {\n      const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n      if (iconPin) {\n        if (this.#pinIconHoverTimerId()) {\n          clearTimeout(this.#pinIconHoverTimerId()!);\n          this.#pinIconHoverTimerId.set(null);\n        }\n\n        this.#pinIconHoverTimerId.set(\n          setTimeout(() => {\n            this.#hoveredMenuNodeKey.set(this.#getMenuNodeKey(menuItem));\n            iconPin.style.color = brandColor;\n            iconPin.style.transition = 'all 0.15s';\n            iconPin.style.opacity = '1';\n            this.#pinIconHoverTimerId.set(null);\n          }, this.#pinIconHoverTimerDelay)\n        );\n      }\n    }\n\n    if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n      const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n      const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n      const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n      const brandLightColorOpacity = this.#convertColor(this.sidebar()?.brandLightColor, 0.6);\n\n      if (menuNode) {\n        menuNode.style.transition = 'all 0.15s';\n        menuNode.style.backgroundColor = brandLightColorOpacity || 'rgba(248, 249, 250, 0.6)';\n\n        if (iconMenu) {\n          iconMenu.style.transition = 'all 0.15s';\n          iconMenu.style.color = brandColor;\n        }\n        if (content) {\n          content.style.transition = 'all 0.15s';\n          content.style.color = brandColor;\n        }\n        if (iconExpand) {\n          iconExpand.style.transition = 'all 0.15s';\n          iconExpand.style.color = brandColor;\n        }\n      }\n    }\n  };\n\n  onMouseLeaveMenuNode = (event: MouseEvent, menuItem: SdLayoutMenu): void => {\n    const menuNode = event.currentTarget as HTMLElement;\n\n    // Nếu có bật config pin menu\n    if (this.sidebar()?.pin?.enabled) {\n      const iconPin = menuNode.querySelector('.c-menu-node-description-icon-pin') as HTMLElement;\n      if (iconPin) {\n        if (this.#pinIconHoverTimerId()) {\n          clearTimeout(this.#pinIconHoverTimerId()!);\n          this.#pinIconHoverTimerId.set(null);\n        }\n        this.#hoveredMenuNodeKey.set(null);\n\n        iconPin.style.transition = 'all 0.15s';\n        if (!this.isPinnedNode(menuItem)) {\n          iconPin.style.color = '#8C8C8C';\n          iconPin.style.opacity = '0';\n        }\n      }\n    }\n\n    if (!this.#menuFocusPipe.transform(this.currentPath(), menuItem)) {\n      const iconMenu = menuNode.querySelector('.c-menu-node-icon') as HTMLElement;\n      const content = menuNode.querySelector('.c-menu-node-description-content') as HTMLElement;\n      const iconExpand = menuNode.querySelector('.c-menu-node-description-icon-expand') as HTMLElement;\n\n      if (menuNode) {\n        menuNode.style.transition = 'all 0.15s';\n        menuNode.style.backgroundColor = 'transparent';\n\n        if (iconMenu) {\n          iconMenu.style.transition = 'all 0.15s';\n          iconMenu.style.color = '#8C8C8C';\n        }\n        if (content) {\n          content.style.transition = 'all 0.15s';\n          content.style.color = '#1F1F1F';\n        }\n        if (iconExpand) {\n          iconExpand.style.transition = 'all 0.15s';\n          iconExpand.style.color = '#8C8C8C';\n        }\n      }\n    }\n  };\n\n  // ==========================================\n  // PRIVATE LOGIC\n  // ==========================================\n  #setMenusByGroup = (menus: SdLayoutMenu[]): void => {\n    this.menusByGroup.set(menus);\n    this.dataSource.data = menus;\n  };\n\n  #getMenuNodeKey = (node: SdLayoutMenu): string => {\n    if (node?.id) {\n      return node.id;\n    }\n    if ('path' in node && node.path) {\n      return node.path;\n    }\n\n    return node.title || '';\n  };\n\n  #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n    for (const menu of menus) {\n      if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n        return [menuGroup ?? menu];\n      }\n      if ('children' in menu && menu.children?.length) {\n        const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n        if (result?.length) {\n          return result;\n        }\n      }\n    }\n    return [];\n  };\n\n  #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n    // Chỉ bindingGroup mới khi người dùng không searchText\n    if (!this.#getValidSearchText()) {\n      const pinnedChildren = this.pinnedMenuGroup()?.children ?? [];\n\n      // Ưu tiên: Current path khớp với item trong pinMenuGroup thì lần đầu vào trang sẽ hiện pinnedMenuGroup\n      const isPinnedPathMatchValid =\n        this.sidebar()?.pin?.enabled &&\n        pinnedChildren?.length &&\n        this.#getMenuGroupByCurrentPath(pinnedChildren)?.length &&\n        this.#isFirstBindingMenu() &&\n        this.idMenuGroupActive() !== this.pinnedMenuGroup()?.id;\n\n      if (isPinnedPathMatchValid) {\n        const pinned = this.pinnedMenuGroup();\n        this.idMenuGroupActive.set(pinned.id);\n        this.#layoutStorageService.lastActiveMenuGroupId.set(pinned.id ?? '');\n        this.titleMenuGroup.set(pinned.title);\n        this.#setMenusByGroup(pinnedChildren);\n        this.#expandParentNodesByCurrentPath(pinnedChildren);\n        return;\n      }\n\n      let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n      // Nếu không tìm được path nào khớp với menu\n      if (!menuGroupByPath?.length) {\n        const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n        // Nếu có pinned group thì hiện mậc định là pinnedMenuGroup\n        if (this.sidebar()?.pin?.enabled && lastActiveId === this.pinnedMenuGroup()?.id && pinnedChildren?.length) {\n          const pinned = this.pinnedMenuGroup();\n          this.idMenuGroupActive.set(pinned.id);\n          this.titleMenuGroup.set(pinned.title);\n          this.#setMenusByGroup(pinnedChildren);\n          this.#expandParentNodesByCurrentPath(pinnedChildren);\n          return;\n        }\n        // Nếu không có pinnedMenuGroup thì menuGroup lấy từ thao tác cuối cùng của người dùng\n        menuGroupByPath = this.menus()?.filter(menu => menu?.id === lastActiveId) || [];\n      }\n\n      // Kiểm tra lại menuGroupPath đã thực sự tìm được chưa?\n      if (menuGroupByPath?.length) {\n        // Nếu user đang ở pinedGroup và curentPath có chứa trong pinnedMenuGroup thì return luôn, không chuyển sang menuGroup mới\n        if (\n          this.sidebar()?.pin?.enabled &&\n          this.idMenuGroupActive() === this.pinnedMenuGroup()?.id &&\n          this.#getMenuGroupByCurrentPath(pinnedChildren)?.length\n        ) {\n          return;\n        } else {\n          const matchedGroup = menuGroupByPath[0];\n          this.idMenuGroupActive.set(matchedGroup?.id);\n          this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n          this.titleMenuGroup.set(matchedGroup?.tooltipTitle || matchedGroup?.title);\n\n          if ('children' in matchedGroup && matchedGroup.children?.length) {\n            this.menusByGroup.set(matchedGroup.children);\n            this.#expandParentNodesByCurrentPath(this.menusByGroup());\n          } else {\n            this.menusByGroup.set([]);\n          }\n        }\n      } else {\n        this.idMenuGroupActive.set('');\n        this.titleMenuGroup.set('');\n        this.menusByGroup.set([]);\n      }\n\n      this.dataSource.data = this.menusByGroup();\n    }\n  };\n\n  #expandParentNodesByCurrentPath(menus: SdLayoutMenu[]): boolean {\n    let shouldPropagate = false;\n    for (const menu of menus) {\n      if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n        shouldPropagate = true;\n      }\n      if ('children' in menu && menu.children?.length) {\n        const childHasMatch = this.#expandParentNodesByCurrentPath(menu.children);\n        if (childHasMatch) {\n          this.treeControl.expand(menu);\n          shouldPropagate = true;\n        }\n      }\n    }\n    return shouldPropagate;\n  }\n\n  #filterMenuBySearchText = (menus: SdLayoutMenu[]): void => {\n    const validSearchText = this.#getValidSearchText();\n    if (!validSearchText) {\n      this.dataSource.data = menus;\n      this.#onCollapseAllMenuNodes(menus);\n      this.#expandParentNodesByCurrentPath(menus);\n    } else {\n      const aliasSearchText = StringUtilities.changeAliasLowerCase(validSearchText);\n      this.dataSource.data = this.#getMenuByAliasSearchText(menus, aliasSearchText);\n      if (this.dataSource.data?.length) {\n        this.#onExpandAllMenuNodes(this.dataSource.data);\n      }\n    }\n  };\n\n  #getMenuByAliasSearchText = (menus: SdLayoutMenu[], aliasSearchText: string): SdLayoutMenu[] => {\n    const result: SdLayoutMenu[] = [];\n    for (const menu of menus) {\n      const aliasTitle = StringUtilities.changeAliasLowerCase(menu.title as string);\n\n      if (aliasTitle.includes(aliasSearchText)) {\n        result.push(menu);\n        continue;\n      }\n\n      let matchedChildren: SdLayoutMenu[] = [];\n      if ('children' in menu && menu.children?.length) {\n        matchedChildren = this.#getMenuByAliasSearchText(menu.children, aliasSearchText);\n      }\n\n      if (matchedChildren?.length) {\n        result.push({ ...menu, children: matchedChildren });\n      }\n    }\n    return result;\n  };\n\n  #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n    if (!path) {\n      return false;\n    }\n\n    if (this.currentPath() === path) {\n      return true;\n    }\n\n    return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n  };\n\n  #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n\n  #closeMenu(): void {\n    this.showSideBar.emit(null);\n  }\n\n  #convertColor = (input: string | undefined, opacity = 1): string => {\n    if (!input) {\n      return '';\n    }\n\n    input = input.trim();\n    const hexRegex = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/;\n    const rgbRegex = /^rgb\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*\\)$/i;\n\n    if (hexRegex.test(input)) {\n      let hex = input.slice(1);\n      if (hex.length === 3) {\n        hex = hex\n          .split('')\n          .map(c => c + c)\n          .join('');\n      }\n      const r = parseInt(hex.substring(0, 2), 16);\n      const g = parseInt(hex.substring(2, 4), 16);\n      const b = parseInt(hex.substring(4, 6), 16);\n      return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n    }\n\n    const rgbMatch = input.match(rgbRegex);\n    if (rgbMatch) {\n      const [_, r, g, b] = rgbMatch;\n      return `rgba(${r}, ${g}, ${b}, ${opacity})`;\n    }\n\n    return input;\n  };\n\n  #getValidSearchText = (): string => {\n    const normalized = this.#normalizeSearchText(this.searchText());\n    return normalized && normalized.length >= 2 ? normalized : '';\n  };\n\n  #normalizeSearchText = (searchText: string) => {\n    let str: string = searchText?.toString() ?? '';\n    /* eslint-disable no-useless-escape */\n    str = str.replace(/!|@|%|\\^|\\*|\\(|\\)|\\+|\\=|\\<|\\>|\\?|\\/|,|\\.|\\:|\\;|\\'|\\\"|\\&|\\#|\\[|\\]|~|\\$|_|`|-|{|}|\\||\\\\/g, '');\n    str = str.replace(/ + /g, ' ');\n    return str.trim();\n  };\n\n  #getTotalMenus = (menus: SdLayoutMenu[]): number => {\n    return menus.reduce((total, menu) => total + this.#countMenuNode(menu), 0);\n  };\n\n  #countMenuNode = (menu: SdLayoutMenu): number => {\n    if (!('children' in menu) || !menu.children?.length) {\n      return 1;\n    }\n\n    let count = 1;\n    for (const child of menu.children) {\n      count += this.#countMenuNode(child);\n    }\n    return count;\n  };\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n  <div class=\"wrapper\" [style.height]=\"isMobile() ? '100dvh' : '100%'\">\n    <div class=\"c-header\">\n      <div class=\"c-logo\">\n        <a href=\"javascript:;\" aria-label=\"Trang chủ\" (click)=\"openHomePage()\">\n          @if (logoUrl(); as _logoUrl) {\n            <img alt=\"\" [src]=\"_logoUrl\" />\n          } @else {\n            <sd-icon name=\"apps\"></sd-icon>\n          }\n        </a>\n      </div>\n      <div class=\"c-title-menu-group\" [class.d-none]=\"!isShowSidebar()\">\n        <span>{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n      </div>\n    </div>\n    <div class=\"c-body\">\n      <div class=\"c-menu\">\n        <div class=\"c-menu-group\">\n          @if (_sidebar?.pin?.enabled && pinnedMenuGroup().children?.length) {\n            <button\n              (mouseenter)=\"onMouseOverMenuGroupNode($event, pinnedMenuGroup())\"\n              (mouseleave)=\"onMouseLeaveMenuGroupNode($event, pinnedMenuGroup())\"\n              (click)=\"expandPinnedGroup()\"\n              [matTooltip]=\"'Đã ghim'\"\n              [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n              [matTooltipPosition]=\"'right'\"\n              style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n              <sd-icon\n                class=\"c-menu-group-icon\"\n                [ngStyle]=\"{\n                  color: isPinnedMenuGroupActive()\n                    ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n                    : 'var(--sd-text-secondary, #44474f)',\n                  backgroundColor: isPinnedMenuGroupActive()\n                    ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n                    : 'transparent',\n                }\"\n                name=\"push_pin\"></sd-icon>\n            </button>\n          }\n          @for (nodeMenuGroup of menus(); track nodeMenuGroup.id) {\n            <button\n              (mouseenter)=\"onMouseOverMenuGroupNode($event, nodeMenuGroup)\"\n              (mouseleave)=\"onMouseLeaveMenuGroupNode($event, nodeMenuGroup)\"\n              (click)=\"expandMenuGroup(nodeMenuGroup)\"\n              [matTooltip]=\"nodeMenuGroup.tooltipTitle || nodeMenuGroup.title\"\n              [matTooltipClass]=\"'c-tooltip-menu-group-7a22ab15-0083-4d4c-9c0c-00a30bc8c140'\"\n              [matTooltipPosition]=\"'right'\"\n              style=\"padding: 0; margin: 0; border: none; background-color: transparent\">\n              @if (nodeMenuGroup.iconUrl) {\n                <span\n                  class=\"c-menu-group-icon\"\n                  [ngStyle]=\"{\n                    backgroundColor:\n                      idMenuGroupActive() === nodeMenuGroup?.id\n                        ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n                        : 'transparent',\n                  }\">\n                  <img width=\"24px\" height=\"24px\" [src]=\"nodeMenuGroup.iconUrl\" [alt]=\"nodeMenuGroup.title\" />\n                </span>\n              } @else {\n                <sd-icon\n                  class=\"c-menu-group-icon\"\n                  [ngStyle]=\"{\n                    color:\n                      idMenuGroupActive() === nodeMenuGroup?.id\n                        ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n                        : 'var(--sd-text-secondary, #44474f)',\n                    backgroundColor:\n                      idMenuGroupActive() === nodeMenuGroup?.id\n                        ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)'\n                        : 'transparent',\n                  }\"\n                  [name]=\"nodeMenuGroup.icon || 'widgets'\"></sd-icon>\n              }\n            </button>\n          }\n        </div>\n        <div class=\"c-menu-tree\" [class.d-none]=\"!isShowSidebar()\" [attr.inert]=\"!isShowSidebar() ? '' : null\">\n          @if (totalMenuInMenusByGroup() > 10) {\n            <div style=\"padding: 0px 4px\" class=\"c-menu-tree-search\">\n              <sd-input\n                size=\"sm\"\n                [placeholder]=\"'core.module.layout.sidebar.search' | translate\"\n                [autoId]=\"'layout-v1-menu-search'\"\n                [model]=\"searchText()\"\n                (sdChange)=\"onFilterSearchText($event)\">\n                <ng-template sdSuffixDef>\n                  @if (searchText()) {\n                    <sd-icon class=\"c-search-prefix-icon cancel\" (click)=\"onClearSearchText()\" name=\"cancel\"></sd-icon>\n                  } @else {\n                    <sd-icon class=\"c-search-prefix-icon search\" name=\"search\"></sd-icon>\n                  }\n                </ng-template>\n              </sd-input>\n            </div>\n          }\n          <div class=\"c-menu-tree-container\">\n            <mat-tree [dataSource]=\"dataSource\" [treeControl]=\"treeControl\" [style.backgroundColor]=\"'transparent'\">\n              <mat-nested-tree-node *matTreeNodeDef=\"let node; when: !hasChild\">\n                <li\n                  class=\"c-menu-node\"\n                  (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n                  (mouseleave)=\"onMouseLeaveMenuNode($event, node)\"\n                  [ngStyle]=\"{\n                    backgroundColor:\n                      (currentPath() | menuFocus: node) ? _sidebar.brandLightColor || 'var(--sd-primary-light, #d7e3ff)' : 'transparent',\n                  }\">\n                  <div aria-hidden=\"true\" class=\"c-menu-node-description\" (click)=\"navigate(node)\" [class.d-none]=\"!isShowSidebar()\">\n                    <div\n                      class=\"c-menu-node-description-content\"\n                      [ngStyle]=\"{\n                        color:\n                          (currentPath() | menuFocus: node)\n                            ? _sidebar.brandColor || 'var(--sd-primary, #005cbb)'\n                            : 'var(--sd-text, #1a1b1f)',\n                      }\"\n                      [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n\n                    @if (_sidebar?.pin?.enabled) {\n                      <sd-icon\n                        class=\"c-menu-node-description-icon-pin\"\n                        [style.opacity]=\"isPinnedNode(node) || isHoveredNode(node) ? '1' : null\"\n                        [style.color]=\"\n                          isPinnedNode(node) || isHoveredNode(node) ? sidebar().brandColor || 'var(--sd-primary, #005cbb)' : null\n                        \"\n                        (click)=\"onTogglePin($event, node)\"\n                        name=\"push_pin\"></sd-icon>\n                    }\n                  </div>\n                </li>\n              </mat-nested-tree-node>\n\n              <mat-nested-tree-node\n                *matTreeNodeDef=\"let node; when: hasChild\"\n                aria-hidden=\"true\"\n                [class]=\"{ expanded: treeControl.isExpanded(node), isfocus: currentPath() | menuFocus: node }\">\n                <li>\n                  <div\n                    class=\"c-menu-node\"\n                    (mouseenter)=\"onMouseOverMenuNode($event, node)\"\n                    (mouseleave)=\"onMouseLeaveMenuNode($event, node)\">\n                    <div class=\"d-flex align-items-center\" style=\"gap: 10px; width: 100%\">\n                      <div [class.d-none]=\"!isShowSidebar()\" class=\"c-menu-node-description\" (click)=\"onToggleMenuNode(node)\">\n                        <div\n                          class=\"c-menu-node-description-content\"\n                          [innerHTML]=\"node.title | highLightSearch: searchText() | sdSafeHtml\"></div>\n                        <sd-icon\n                          class=\"c-menu-node-description-icon-expand\"\n                          [name]=\"treeControl.isExpanded(node) ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n                      </div>\n                    </div>\n                  </div>\n                  <ul class=\"p-0\" [class.d-none]=\"!treeControl.isExpanded(node)\">\n                    <ng-container matTreeNodeOutlet></ng-container>\n                  </ul>\n                </li>\n              </mat-nested-tree-node>\n            </mat-tree>\n          </div>\n        </div>\n      </div>\n    </div>\n\n    <div class=\"c-footer\">\n      <lib-layout-user\n        [userInfo]=\"_userInfo\"\n        [isMobileOrTablet]=\"isMobile()\"\n        (menuOpened)=\"onUserMenuOpened()\"\n        (menuClosed)=\"onUserMenuClosed()\"\n        [isShowSidebar]=\"isShowSidebar()\"\n        (toggleMenuLock)=\"toggleMenuLock($event)\">\n      </lib-layout-user>\n    </div>\n\n    <div class=\"c-vertical\"></div>\n  </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, effect, inject, input, signal, untracked, viewChild } from '@angular/core';\nimport { MatSidenav, MatSidenavModule } from '@angular/material/sidenav';\n\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarComponent } from './components/sidebar/sidebar.component';\n\n@Component({\n  selector: 'sidebar-v1',\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  imports: [MatSidenavModule, CommonModule, SidebarComponent],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV1Component {\n  // ==========================================\n  // INJECT SERVICES\n  // ==========================================\n  #layoutStorageService = inject(SdLayoutStorageService);\n\n  // ==========================================\n  // VIEW CHILD & INPUTS\n  // ==========================================\n  sidenav = viewChild.required<MatSidenav>('sidenav');\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV1>();\n  isMobile = input(false);\n\n  // ==========================================\n  // STATE SIGNALS\n  // ==========================================\n  // Trạng thái khóa menu (luôn mở rộng hay không)\n  isMenuLock = signal<boolean>(this.#layoutStorageService.menuLockStatus?.get() ?? true);\n\n  // Trạng thái hiển thị (mở/đóng) của Sidenav\n  isShowSidebar = signal<boolean>(this.isMobile() ? false : (this.#layoutStorageService.menuLockStatus?.get() ?? true));\n\n  onhover = signal<boolean>(false);\n\n  // ==========================================\n  // PRIVATE TIMERS\n  // ==========================================\n  #timerMouseInMenu: ReturnType<typeof setTimeout> | null = null;\n\n  constructor() {\n    // EFFECT: Tự động đồng bộ isShowSidebar vào storage service mỗi khi nó thay đổi\n    effect(() => {\n      const isShow = this.isShowSidebar();\n      untracked(() => {\n        this.#layoutStorageService.isShowSidebar.set(isShow);\n      });\n    });\n  }\n\n  // ==========================================\n  // EVENT HANDLERS\n  // ==========================================\n\n  #mouseLeave = (): void => {\n    if (this.#timerMouseInMenu) {\n      clearTimeout(this.#timerMouseInMenu);\n    }\n\n    if (this.onhover() && this.isShowSidebar()) {\n      this.isShowSidebar.set(false);\n      this.onhover.set(false);\n    }\n  };\n\n  #handleMouseLeaveTransition = (): void => {\n    if (!this.isShowSidebar()) {\n      const delayTime = 400;\n      if (this.#timerMouseInMenu) {\n        clearTimeout(this.#timerMouseInMenu);\n      }\n      setTimeout(() => {\n        this.#mouseLeave();\n      }, delayTime);\n    } else {\n      this.#mouseLeave();\n    }\n  };\n\n  openSidebar = (): void => {\n    if (!this.isMobile()) {\n      return;\n    }\n\n    if (!this.isShowSidebar()) {\n      this.isShowSidebar.set(true);\n      this.onhover.set(true);\n    }\n  };\n\n  onPopupOfSideBarOpened = (): void => {\n    this.onhover.set(false);\n    this.isShowSidebar.set(true);\n  };\n\n  onPopupOfSideBarClosed = (): void => {\n    const delayTime = 500;\n    if (!this.isMenuLock()) {\n      this.onhover.set(true);\n      setTimeout(() => {\n        this.#mouseLeave();\n      }, delayTime);\n    }\n  };\n\n  onExpandSideBar = (): void => {\n    if (this.isMobile()) {\n      return;\n    }\n    if (!this.isShowSidebar()) {\n      this.isShowSidebar.set(true);\n      this.onhover.set(true);\n    }\n  };\n\n  onMouseleaveSideBar = (): void => {\n    if (this.isMobile()) {\n      return;\n    }\n    this.#mouseLeave();\n  };\n\n  onSidenavOpenedChange = (opened: boolean): void => {\n    if (this.isMobile()) {\n      this.isShowSidebar.set(opened);\n    }\n  };\n\n  onToggle = (data: boolean | null) => {\n    if (data === null) {\n      this.#handleMouseLeaveTransition();\n    } else {\n      this.#mouseLeave();\n      this.isShowSidebar.set(data);\n      this.isMenuLock.set(data);\n\n      // Desktop keeps the Material drawer mounted as a 60px rail; mobile still opens and closes the overlay.\n      if (this.isMobile()) {\n        const sidenavComp = this.sidenav();\n        if (sidenavComp) {\n          if (data) {\n            sidenavComp.open();\n          } else {\n            sidenavComp.close();\n          }\n        }\n      }\n    }\n  };\n}\n","<mat-sidenav-container class=\"c-layout-wrapper\">\n  <mat-sidenav\n    #sidenav\n    [opened]=\"!isMobile() || isShowSidebar()\"\n    (openedChange)=\"onSidenavOpenedChange($event)\"\n    class=\"c-layout-sidebar\"\n    [class.is-expanded]=\"isShowSidebar()\"\n    (click)=\"openSidebar()\"\n    (mouseleave)=\"onMouseleaveSideBar()\"\n    [mode]=\"isMobile() ? 'over' : 'side'\"\n    [fixedInViewport]=\"isMobile()\">\n    <sidebar\n      [menus]=\"menus()\"\n      [userInfo]=\"userInfo()\"\n      [sidebar]=\"sidebar()\"\n      [isMobile]=\"isMobile()\"\n      [isShowSidebar]=\"isShowSidebar()\"\n      (showSideBar)=\"onToggle($event)\"\n      (expandSideBar)=\"onExpandSideBar()\"\n      (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n      (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\">\n    </sidebar>\n  </mat-sidenav>\n\n  <mat-sidenav-content class=\"c-layout-content\" [class.isShowSidebar]=\"isMenuLock()\">\n    <mat-drawer-container class=\"c-mat-drawer-container\">\n      <mat-drawer-content>\n        <ng-content></ng-content>\n      </mat-drawer-content>\n    </mat-drawer-container>\n  </mat-sidenav-content>\n</mat-sidenav-container>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo } from '../../../../configurations';\nimport { SdLayoutUserMenuComponent } from '../../../shared/user-menu/user-menu.component';\n\n@Component({\n  selector: 'lib-layout-user',\n  templateUrl: './user.component.html',\n  styleUrl: './user.component.scss',\n  imports: [SdIcon, SdLayoutUserMenuComponent, TranslatePipe],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class LayoutUserComponent {\n  isMobileOrTablet = input<boolean>(false);\n  isMenuLock = input<boolean>(false);\n  isShowSidebar = input<boolean>(false);\n  userInfo = input.required<SdLayoutUserInfo>();\n\n  menuClosed = output<void>();\n  menuOpened = output<void>();\n  toggleMenuLock = output<Event>();\n\n  onMenuOpened(): void {\n    this.menuOpened.emit();\n  }\n\n  onMenuClosed(): void {\n    this.menuClosed.emit();\n  }\n\n  onToggleMenuLock(event: Event): void {\n    this.toggleMenuLock.emit(event);\n  }\n}\n","@if (isMobileOrTablet()) {\n  <sd-layout-user-menu [userInfo]=\"userInfo()\" presentation=\"mobile\"></sd-layout-user-menu>\n} @else {\n  <div class=\"c-layout-user-wrapper\">\n    <sd-layout-user-menu\n      class=\"c-layout-user-avatar\"\n      [userInfo]=\"userInfo()\"\n      [compact]=\"true\"\n      (opened)=\"onMenuOpened()\"\n      (closed)=\"onMenuClosed()\"></sd-layout-user-menu>\n\n    <button\n      type=\"button\"\n      class=\"c-layout-icon-toggle\"\n      [attr.aria-label]=\"'core.module.layout.sidebar.toggle' | translate\"\n      (click)=\"onToggleMenuLock($event)\">\n      <sd-icon [name]=\"isShowSidebar() ? 'keyboard_arrow_right' : 'keyboard_arrow_left'\"></sd-icon>\n    </button>\n  </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, DestroyRef, effect, inject, input, output, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Params, Router, RouterModule } from '@angular/router';\n\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../../../services';\nimport { LayoutUserComponent } from '../user/user.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sd-sidebar-mobile-overlay',\n  standalone: true,\n  imports: [SdIcon, CommonModule, RouterModule, LayoutUserComponent],\n  templateUrl: './sidebar.component.html',\n  styleUrl: './sidebar.component.scss',\n})\nexport class SidebarMobileOverlayComponent {\n  #router = inject(Router);\n  #destroyRef = inject(DestroyRef);\n  #layoutStorageService = inject(SdLayoutStorageService);\n\n  // ==========================================\n  // INPUTS & OUTPUTS\n  // ==========================================\n  isShowSidebar = input<boolean>(false);\n  menus = input.required<SdLayoutMenu[]>();\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV1>();\n\n  // showSideBar(null) = đóng sidebar (tương thích với onToggle của main component)\n  showSideBar = output<boolean | null>();\n  expandSideBar = output<void>();\n  popupUserMenuOpened = output<void>();\n  popupUserMenuClosed = output<void>();\n  titleMenuGroupChanged = output<string | undefined>();\n\n  // ==========================================\n  // STATE SIGNALS\n  // ==========================================\n  titleMenuGroup = signal<string | undefined>('');\n  currentPath = signal<string>(window.location.pathname);\n\n  // Lưu danh sách ID các menu group đang được mở\n  expandedMobileGroups = signal<Set<string>>(new Set<string>());\n\n  constructor() {\n    // Bind title khi menus thay đổi\n    effect(() => {\n      const currentMenus = this.menus();\n      untracked(() => {\n        const lastActiveMenuGroupId = this.#layoutStorageService.lastActiveMenuGroupId.get();\n        if (!lastActiveMenuGroupId) {\n          this.#layoutStorageService.lastActiveMenuGroupId.set(currentMenus?.[0]?.id ?? '');\n        }\n        this.#bindingMenuGroupByCurrentPath(currentMenus);\n      });\n    });\n\n    // Bind title khi điều hướng\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (event instanceof NavigationEnd) {\n        if (this.currentPath() !== window.location.pathname) {\n          this.currentPath.set(window.location.pathname);\n          this.#bindingMenuGroupByCurrentPath(this.menus());\n        }\n      }\n    });\n  }\n\n  // ==========================================\n  // EVENT HANDLERS\n  // ==========================================\n  toggleMobileGroup(groupId: string | undefined): void {\n    if (!groupId) return;\n    this.expandedMobileGroups.update(groups => {\n      const newGroups = new Set(groups);\n      if (newGroups.has(groupId)) {\n        newGroups.delete(groupId);\n      } else {\n        newGroups.add(groupId);\n      }\n      return newGroups;\n    });\n  }\n\n  isExpanded(groupId: string | undefined): boolean {\n    if (!groupId) return false;\n    return this.expandedMobileGroups().has(groupId);\n  }\n\n  navigate(args: { path?: string; queryParams?: Params }): void {\n    const { path, queryParams } = args;\n    if (!path) return;\n\n    if (path.includes('http')) {\n      window.open(path);\n      return;\n    }\n\n    this.#router.navigate([path.split('?')[0]], {\n      queryParams: queryParams ?? {},\n      state: { switchTab: true },\n    });\n\n    // Sau khi điều hướng trên mobile, tự động đóng sidebar\n    this.onClose();\n  }\n\n  onClose(): void {\n    this.showSideBar.emit(null);\n  }\n\n  // Kiểm tra menu có children (là SdLayoutChildrenMenu)\n  hasChildren(menu: SdLayoutMenu): boolean {\n    return 'children' in menu && !!menu.children?.length;\n  }\n\n  // Lấy danh sách children an toàn (type-safe)\n  getChildren(menu: SdLayoutMenu): SdLayoutMenu[] {\n    return 'children' in menu ? (menu.children ?? []) : [];\n  }\n\n  // Lấy path an toàn từ leaf menu (SdLayoutRootMenu)\n  getPath(menu: SdLayoutMenu): string | undefined {\n    return 'path' in menu ? menu.path : undefined;\n  }\n\n  // Lấy queryParams an toàn từ leaf menu\n  getQueryParams(menu: SdLayoutMenu): Params {\n    return ('queryParams' in menu ? menu.queryParams : undefined) ?? {};\n  }\n\n  onUserMenuOpened = (): void => this.popupUserMenuOpened.emit();\n  onUserMenuClosed = (): void => this.popupUserMenuClosed.emit();\n\n  // ==========================================\n  // PRIVATE LOGIC\n  // ==========================================\n  #bindingMenuGroupByCurrentPath = (menus: SdLayoutMenu[]): void => {\n    let menuGroupByPath = this.#getMenuGroupByCurrentPath(menus);\n\n    if (!menuGroupByPath?.length) {\n      const lastActiveId = this.#layoutStorageService.lastActiveMenuGroupId.get() || '';\n      menuGroupByPath = menus?.filter(menu => menu?.id === lastActiveId) || [];\n    }\n\n    if (menuGroupByPath?.length) {\n      const matchedGroup = menuGroupByPath[0];\n      this.#layoutStorageService.lastActiveMenuGroupId.set(matchedGroup?.id || '');\n      const title = matchedGroup?.tooltipTitle || matchedGroup?.title;\n      this.titleMenuGroup.set(title);\n      this.titleMenuGroupChanged.emit(title);\n    } else {\n      this.titleMenuGroup.set('');\n      this.titleMenuGroupChanged.emit('');\n    }\n  };\n\n  #getMenuGroupByCurrentPath = (menus: SdLayoutMenu[], menuGroup?: SdLayoutMenu): SdLayoutMenu[] => {\n    for (const menu of menus) {\n      if ('path' in menu && this.#isMenuPathMatchByCurrentPath(menu.path)) {\n        return [menuGroup ?? menu];\n      }\n      if ('children' in menu && menu.children?.length) {\n        const result = this.#getMenuGroupByCurrentPath(menu.children, menuGroup ?? menu);\n        if (result?.length) return result;\n      }\n    }\n    return [];\n  };\n\n  #isMenuPathMatchByCurrentPath = (path: string): boolean => {\n    if (!path) return false;\n    if (this.currentPath() === path) return true;\n    return this.#normalizePath(this.currentPath()).startsWith(this.#normalizePath(path));\n  };\n\n  #normalizePath = (p: string): string => (p.endsWith('/') ? p : p + '/');\n}\n","@let _userInfo = userInfo();\n@let _sidebar = sidebar();\n\n@if (_userInfo && _sidebar) {\n  <div\n    class=\"m-backdrop\"\n    [class.m-backdrop--visible]=\"isShowSidebar()\"\n    role=\"button\"\n    tabindex=\"0\"\n    (click)=\"onClose()\"\n    (keydown.escape)=\"onClose()\">\n  </div>\n\n  <div class=\"m-wrapper\" [class.m-wrapper--open]=\"isShowSidebar()\">\n    <div class=\"m-header\">\n      <div class=\"m-title-group\">\n        @if (_sidebar.logoUrl) {\n          <img class=\"m-logo\" alt=\"logo\" [src]=\"_sidebar.logoUrl\" />\n        }\n        <span class=\"m-title\">{{ titleMenuGroup() || _sidebar.defaultTitle || 'Back Office' }}</span>\n      </div>\n      <button class=\"m-close-btn\" (click)=\"onClose()\">\n        <sd-icon name=\"close\"></sd-icon>\n      </button>\n    </div>\n\n    <div class=\"m-user-section\">\n      <lib-layout-user\n        [userInfo]=\"_userInfo\"\n        [isMobileOrTablet]=\"true\"\n        (menuOpened)=\"onUserMenuOpened()\"\n        (menuClosed)=\"onUserMenuClosed()\">\n      </lib-layout-user>\n    </div>\n\n    <div class=\"m-menu-list\">\n      @for (group of menus(); track group.id) {\n        <div class=\"m-menu-card\">\n          <button class=\"m-card-header\" (click)=\"toggleMobileGroup(group.id)\">\n            <div class=\"m-card-header-left\">\n              @if (group.iconUrl) {\n                <img class=\"m-group-icon\" [src]=\"group.iconUrl\" [alt]=\"group.title\" />\n              } @else {\n                <sd-icon class=\"m-group-icon\" [name]=\"group.icon || 'widgets'\"></sd-icon>\n              }\n              <span class=\"m-group-title\">{{ group.title }}</span>\n            </div>\n            <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(group.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n          </button>\n\n          @if (expandedMobileGroups().has(group.id ?? '') && hasChildren(group)) {\n            <div class=\"m-card-body\">\n              @for (child of getChildren(group); track child.id) {\n                @if (hasChildren(child)) {\n                  <div class=\"m-sub-group\">\n                    <button class=\"m-sub-group-header\" (click)=\"toggleMobileGroup(child.id)\">\n                      <div class=\"m-item-left\">\n                        @if (child.iconUrl) {\n                          <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n                        } @else {\n                          <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'folder'\"></sd-icon>\n                        }\n                        <span class=\"m-item-title\">{{ child.title }}</span>\n                      </div>\n                      <sd-icon class=\"m-expand-icon\" [name]=\"expandedMobileGroups().has(child.id ?? '') ? 'keyboard_arrow_up' : 'keyboard_arrow_down'\"></sd-icon>\n                    </button>\n                    @if (expandedMobileGroups().has(child.id ?? '')) {\n                      @for (subChild of getChildren(child); track subChild.id) {\n                        <button class=\"m-menu-item m-menu-item--indented\"\n                          (click)=\"navigate({ path: getPath(subChild), queryParams: getQueryParams(subChild) })\">\n                          <div class=\"m-item-left\">\n                            @if (subChild.iconUrl) {\n                              <img class=\"m-item-icon-img\" [src]=\"subChild.iconUrl\" alt=\"icon\" />\n                            } @else {\n                              <sd-icon class=\"m-item-icon\" [name]=\"subChild.icon || 'insert_drive_file'\"></sd-icon>\n                            }\n                            <span class=\"m-item-title\">{{ subChild.title }}</span>\n                          </div>\n                          <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n                        </button>\n                      }\n                    }\n                  </div>\n                } @else {\n                  <button class=\"m-menu-item\" (click)=\"navigate({ path: getPath(child), queryParams: getQueryParams(child) })\">\n                    <div class=\"m-item-left\">\n                      @if (child.iconUrl) {\n                        <img class=\"m-item-icon-img\" [src]=\"child.iconUrl\" alt=\"icon\" />\n                      } @else {\n                        <sd-icon class=\"m-item-icon\" [name]=\"child.icon || 'insert_drive_file'\"></sd-icon>\n                      }\n                      <span class=\"m-item-title\">{{ child.title }}</span>\n                    </div>\n                    <sd-icon class=\"m-nav-icon\" name=\"chevron_right\"></sd-icon>\n                  </button>\n                }\n              }\n            </div>\n          }\n        </div>\n      }\n    </div>\n  </div>\n}\n","import { CommonModule } from '@angular/common';\nimport { Component, effect, inject, input, signal, untracked } from '@angular/core';\n// NOTE: Import nội bộ trong module layout\nimport { SdLayoutUserInfo, SidebarConfigurationV1 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutStorageService } from '../../services';\nimport { SidebarMobileOverlayComponent } from './components/sidebar/sidebar.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sidebar-mobile-v1',\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  imports: [SdIcon, CommonModule, SidebarMobileOverlayComponent],\n  standalone: true,\n})\nexport class SidebarMobileV1Component {\n  #layoutStorageService = inject(SdLayoutStorageService);\n\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV1>();\n\n  // Sidebar luôn bắt đầu đóng trên mobile\n  isShowSidebar = signal<boolean>(false);\n  titleMenuGroup = signal<string | undefined>('');\n\n  constructor() {\n    effect(() => {\n      const isShow = this.isShowSidebar();\n      untracked(() => {\n        this.#layoutStorageService.isShowSidebar.set(isShow);\n      });\n    });\n  }\n\n  openSidebar = (): void => {\n    this.isShowSidebar.set(true);\n  };\n\n  onToggle = (_data: boolean | null): void => {\n    this.isShowSidebar.set(false);\n  };\n\n  onPopupOfSideBarOpened = (): void => {};\n  onPopupOfSideBarClosed = (): void => {};\n  onExpandSideBar = (): void => {};\n  onMouseleaveSideBar = (): void => {};\n  onTitleMenuGroupChanged = (title: string | undefined): void => {\n    this.titleMenuGroup.set(title);\n  };\n}\n","<div class=\"c-mobile-layout\">\n  <div class=\"c-mobile-topbar\">\n    <div class=\"c-topbar-brand\">\n      @if (sidebar().logoUrl) {\n        <img class=\"c-topbar-logo\" [src]=\"sidebar().logoUrl\" alt=\"logo\" />\n      }\n      <span class=\"c-topbar-title\">{{ titleMenuGroup() || sidebar().defaultTitle || 'Back Office' }}</span>\n    </div>\n    <button class=\"c-hamburger-btn\" (click)=\"openSidebar()\">\n      <sd-icon name=\"menu\"></sd-icon>\n    </button>\n  </div>\n\n  <div class=\"c-mobile-content\">\n    <ng-content></ng-content>\n  </div>\n\n  <sd-sidebar-mobile-overlay\n    [menus]=\"menus()\"\n    [userInfo]=\"userInfo()\"\n    [sidebar]=\"sidebar()\"\n    [isShowSidebar]=\"isShowSidebar()\"\n    (showSideBar)=\"onToggle($event)\"\n    (expandSideBar)=\"onExpandSideBar()\"\n    (popupUserMenuOpened)=\"onPopupOfSideBarOpened()\"\n    (popupUserMenuClosed)=\"onPopupOfSideBarClosed()\"\n    (titleMenuGroupChanged)=\"onTitleMenuGroupChanged($event)\">\n  </sd-sidebar-mobile-overlay>\n</div>\n","import { ChangeDetectionStrategy, Component, DestroyRef, computed, inject, input, output, signal } from '@angular/core';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutMenu, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../../services';\n\ninterface SdLayoutMenuTreeNode {\n  menu: SdLayoutMenu;\n  key: string;\n  title: string;\n  depth: number;\n  paddingLeft: number;\n  isGroup: boolean;\n  isActive: boolean;\n  isPinned: boolean;\n  isPinVisible: boolean;\n}\n\n@Component({\n  selector: 'sd-layout-menu-tree',\n  standalone: true,\n  imports: [SdIcon],\n  templateUrl: './menu-tree.component.html',\n  styleUrl: './menu-tree.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutMenuTreeComponent {\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #hoveredPinKey = signal<string | null>(null);\n  #pinHoverTimerId: ReturnType<typeof setTimeout> | undefined;\n\n  menus = input<SdLayoutMenu[]>([]);\n  query = input('');\n  activePath = input('');\n  pinnedKeys = input<string[]>([]);\n  showPin = input(true);\n  pinVisibility = input<'hover' | 'always'>('hover');\n  navigate = output<SdLayoutRootMenu>();\n  togglePinned = output<SdLayoutMenu>();\n\n  nodes = computed<SdLayoutMenuTreeNode[]>(() => {\n    const pinnedKeys = new Set(this.pinnedKeys());\n    const hoveredPinKey = this.#hoveredPinKey();\n    const alwaysShowPin = this.pinVisibility() === 'always';\n    const query = this.query().trim();\n    const menus = query ? searchMenuLeaves(this.menus(), query) : this.menus();\n    const nodes: SdLayoutMenuTreeNode[] = [];\n\n    const append = (items: SdLayoutMenu[], depth: number, ancestors: string[]): void => {\n      for (const menu of items) {\n        const key = getMenuStableKey(menu, ancestors);\n        if (!key) continue;\n        const isGroup = 'children' in menu && !!menu.children?.length;\n        const path = 'path' in menu ? menu.path : '';\n        nodes.push({\n          menu,\n          key,\n          title: menu.title ?? menu.tooltipTitle ?? '',\n          depth,\n          paddingLeft: 12 + depth * 16,\n          isGroup,\n          isActive: !!path && this.#pathMatches(this.activePath(), path),\n          isPinned: pinnedKeys.has(key),\n          isPinVisible: alwaysShowPin || pinnedKeys.has(key) || hoveredPinKey === key,\n        });\n        if (isGroup && 'children' in menu) append(menu.children ?? [], depth + 1, [...ancestors, menu.title ?? key]);\n      }\n    };\n\n    append(menus, 0, []);\n    return nodes;\n  });\n\n  constructor() {\n    this.#destroyRef.onDestroy(() => this.#clearPinHoverTimer());\n  }\n\n  onNavigate(menu: SdLayoutMenu): void {\n    if ('path' in menu) this.navigate.emit(menu);\n  }\n\n  onTogglePinned(event: MouseEvent, menu: SdLayoutMenu): void {\n    event.stopPropagation();\n    this.togglePinned.emit(menu);\n  }\n\n  onPinHoverStart(key: string): void {\n    if (this.pinVisibility() === 'always') return;\n    this.#clearPinHoverTimer();\n    this.#pinHoverTimerId = setTimeout(() => {\n      this.#hoveredPinKey.set(key);\n      this.#pinHoverTimerId = undefined;\n    }, 300);\n  }\n\n  onPinHoverEnd(key: string): void {\n    this.#clearPinHoverTimer();\n    if (this.#hoveredPinKey() === key) this.#hoveredPinKey.set(null);\n  }\n\n  #clearPinHoverTimer(): void {\n    if (this.#pinHoverTimerId === undefined) return;\n    clearTimeout(this.#pinHoverTimerId);\n    this.#pinHoverTimerId = undefined;\n  }\n\n  #pathMatches(currentPath: string, menuPath: string): boolean {\n    const normalize = (path: string): string => (path.endsWith('/') ? path : `${path}/`);\n    return currentPath === menuPath || normalize(currentPath).startsWith(normalize(menuPath));\n  }\n}\n","<nav class=\"d-flex flex-column gap-4\" aria-label=\"Navigation menu\">\n  @for (node of nodes(); track node.key) {\n    @if (node.isGroup) {\n      <div class=\"sd-layout-menu-tree__group d-flex align-items-center gap-8 T12M text-black400\" [style.padding-left.px]=\"node.paddingLeft\">\n        <sd-icon [name]=\"node.menu.icon || 'folder'\"></sd-icon>\n        <span class=\"text-ellipsis\">{{ node.title }}</span>\n      </div>\n    } @else {\n      <div\n        class=\"sd-layout-menu-tree__route d-flex align-items-center gap-4\"\n        (mouseenter)=\"onPinHoverStart(node.key)\"\n        (mouseleave)=\"onPinHoverEnd(node.key)\">\n        <button\n          type=\"button\"\n          class=\"sd-layout-menu-tree__route-button d-flex align-items-center gap-8 flex-1 text-left T14R\"\n          data-menu-route\n          [attr.data-menu-key]=\"node.key\"\n          [attr.aria-current]=\"node.isActive ? 'page' : null\"\n          [class.sd-layout-menu-tree__route-button--active]=\"node.isActive\"\n          [style.padding-left.px]=\"node.paddingLeft\"\n          (click)=\"onNavigate(node.menu)\">\n          @if (node.menu.iconUrl) {\n            <img class=\"sd-layout-menu-tree__icon-image\" [src]=\"node.menu.iconUrl\" alt=\"\" />\n          } @else {\n            <sd-icon [name]=\"node.menu.icon || 'chevron_right'\"></sd-icon>\n          }\n          <span class=\"text-ellipsis\">{{ node.title }}</span>\n        </button>\n        @if (showPin()) {\n          <button\n            type=\"button\"\n            class=\"sd-layout-menu-tree__pin d-flex align-items-center justify-content-center\"\n            [class.sd-layout-menu-tree__pin--visible]=\"node.isPinVisible\"\n            [attr.data-pin-key]=\"node.key\"\n            [attr.aria-label]=\"node.isPinned ? 'Unpin ' + node.title : 'Pin ' + node.title\"\n            [attr.aria-pressed]=\"node.isPinned\"\n            (click)=\"onTogglePinned($event, node.menu)\">\n            <sd-icon name=\"push_pin\"></sd-icon>\n          </button>\n        }\n      </div>\n    }\n  } @empty {\n    <div class=\"d-flex flex-column align-items-center justify-content-center gap-12 p-24 text-black400 T14R\">\n      Không tìm thấy menu phù hợp\n    </div>\n  }\n</nav>\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { SdInput } from '@sdcorejs/angular/forms';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sd-layout-search-field',\n  standalone: true,\n  imports: [SdIcon, SdInput],\n  templateUrl: './search-field.component.html',\n  styleUrl: './search-field.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutSearchFieldComponent {\n  model = input('');\n  placeholder = input.required<string>();\n  autoId = input.required<string>();\n  sdChange = output<string>();\n}\n","<div\n  data-layout-search\n  class=\"sd-layout-search-field sd-layout-search-field--soft-pill d-flex align-items-center gap-8\">\n  <sd-icon class=\"sd-layout-search-field__icon\" name=\"search\"></sd-icon>\n  <sd-input\n    class=\"sd-layout-search-field__control\"\n    size=\"sm\"\n    hideInlineError\n    [placeholder]=\"placeholder()\"\n    [autoId]=\"autoId()\"\n    [model]=\"model()\"\n    (sdChange)=\"sdChange.emit($event)\">\n  </sd-input>\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2, resolveSidebarV2Interaction } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\ninterface SidebarV2RailItem {\n  menu: SdLayoutMenu;\n  key: string;\n  title: string;\n}\n\n@Component({\n  selector: 'sidebar-v2',\n  standalone: true,\n  imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV2Component {\n  readonly #router = inject(Router);\n  readonly #document = inject(DOCUMENT);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #navigationState = inject(SdLayoutNavigationStateService);\n\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV2>();\n  activeGroupKey = signal('');\n  isFlyoutOpen = signal(false);\n  isFlyoutLocked = signal(false);\n  searchText = signal('');\n  activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n\n  interaction = computed(() => resolveSidebarV2Interaction(this.sidebar()));\n  railItems = computed<SidebarV2RailItem[]>(() =>\n    this.menus()\n      .map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n      .filter(item => !!item.key)\n  );\n  activeGroup = computed(() => this.railItems().find(item => item.key === this.activeGroupKey())?.menu);\n  contextMenus = computed<SdLayoutMenu[]>(() => {\n    const activeGroup = this.activeGroup();\n    if (!activeGroup) return [];\n    return 'children' in activeGroup && activeGroup.children?.length ? activeGroup.children : [activeGroup];\n  });\n  pinnedKeys = this.#navigationState.pinnedKeys;\n\n  constructor() {\n    effect(() => {\n      const menus = this.menus();\n      untracked(() => {\n        this.#navigationState.hydrate(menus);\n        const persistedState = this.#navigationState.versionState(2);\n        if (persistedState.activeGroupKey && !this.activeGroupKey()) this.activeGroupKey.set(persistedState.activeGroupKey);\n      });\n    });\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (!(event instanceof NavigationEnd)) return;\n      this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n      this.closeFromNavigation();\n    });\n  }\n\n  selectGroup(menu: SdLayoutMenu): void {\n    const key = getMenuStableKey(menu);\n    if (!key) return;\n\n    if (this.interaction() === 'click') {\n      if (this.activeGroupKey() === key && this.isFlyoutOpen()) {\n        this.#closeFlyout();\n        return;\n      }\n      this.#openGroup(key, false);\n      return;\n    }\n\n    if (this.activeGroupKey() === key && this.isFlyoutLocked()) {\n      this.#closeFlyout();\n      return;\n    }\n    this.#openGroup(key, true);\n  }\n\n  previewGroup(menu: SdLayoutMenu): void {\n    if (this.interaction() !== 'hover-lock' || this.isFlyoutLocked()) return;\n    const key = getMenuStableKey(menu);\n    if (key) this.#openGroup(key, false, false);\n  }\n\n  leaveFlyout(): void {\n    if (this.interaction() === 'hover-lock' && !this.isFlyoutLocked()) this.#closeFlyout(false);\n  }\n\n  closeFromBackdrop(): void {\n    this.#closeFlyout();\n  }\n\n  closeFromEscape(): void {\n    this.#closeFlyout();\n  }\n\n  closeFromNavigation(): void {\n    this.#closeFlyout();\n  }\n\n  onNavigate(menu: SdLayoutMenu): void {\n    if (!('path' in menu)) return;\n    this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n    if (menu.path.includes('http')) {\n      this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n      this.closeFromNavigation();\n      return;\n    }\n    void this.#router.navigate([menu.path.split('?')[0]], {\n      queryParams: menu.queryParams ?? {},\n      state: { switchTab: true },\n    });\n  }\n\n  onTogglePinned(menu: SdLayoutMenu): void {\n    this.#navigationState.togglePinned(menu);\n  }\n\n  #openGroup(key: string, locked: boolean, persist = true): void {\n    this.activeGroupKey.set(key);\n    this.isFlyoutOpen.set(true);\n    this.isFlyoutLocked.set(locked);\n    this.searchText.set('');\n    if (persist) this.#navigationState.patchVersionState(2, { activeGroupKey: key, locked });\n  }\n\n  #closeFlyout(persist = true): void {\n    this.isFlyoutOpen.set(false);\n    this.isFlyoutLocked.set(false);\n    this.searchText.set('');\n    if (persist) this.#navigationState.patchVersionState(2, { locked: false });\n  }\n}\n","<div class=\"sd-sidebar-v2\" (keydown.escape)=\"closeFromEscape()\">\n  <aside class=\"sd-sidebar-v2__rail d-flex flex-column align-items-center gap-8 py-12 bg-white border-right border-black200\">\n    <button type=\"button\" class=\"sd-sidebar-v2__brand d-flex align-items-center justify-content-center\" aria-label=\"Trang chủ\">\n      @if (sidebar().logoUrl) {\n        <img class=\"sd-sidebar-v2__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n      } @else {\n        <sd-icon name=\"apps\"></sd-icon>\n      }\n    </button>\n\n    <nav class=\"d-flex flex-column align-items-center gap-4 flex-1\" aria-label=\"Nhóm menu\">\n      @for (item of railItems(); track item.key) {\n        <button\n          type=\"button\"\n          class=\"sd-sidebar-v2__rail-action d-flex flex-column align-items-center justify-content-center gap-4\"\n          [attr.data-v2-group-key]=\"item.key\"\n          [attr.aria-label]=\"item.title\"\n          [attr.aria-expanded]=\"activeGroupKey() === item.key && isFlyoutOpen()\"\n          [class.sd-sidebar-v2__rail-action--active]=\"activeGroupKey() === item.key\"\n          (click)=\"selectGroup(item.menu)\"\n          (mouseenter)=\"previewGroup(item.menu)\"\n          (focus)=\"previewGroup(item.menu)\">\n          @if (item.menu.iconUrl) {\n            <img class=\"sd-sidebar-v2__rail-icon\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n          } @else {\n            <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n          }\n          <span class=\"sd-sidebar-v2__rail-label text-ellipsis\">{{ item.title }}</span>\n        </button>\n      }\n    </nav>\n\n    <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"true\"></sd-layout-user-menu>\n  </aside>\n\n  @if (isFlyoutOpen()) {\n    <button\n      type=\"button\"\n      class=\"sd-sidebar-v2__backdrop\"\n      aria-label=\"Đóng menu\"\n      (click)=\"closeFromBackdrop()\"\n      (keydown.escape)=\"closeFromEscape()\"></button>\n    <section\n      class=\"sd-sidebar-v2__flyout d-flex flex-column bg-white border-right border-black200 mat-elevation-z4\"\n      [attr.aria-label]=\"activeGroup()?.title || 'Menu'\"\n      (mouseleave)=\"leaveFlyout()\"\n      (keydown.escape)=\"closeFromEscape()\">\n      <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n        <span class=\"T16M text-ellipsis\">{{ activeGroup()?.title || sidebar().defaultTitle || 'Menu' }}</span>\n        @if (isFlyoutLocked()) {\n          <sd-icon name=\"lock\"></sd-icon>\n        }\n      </header>\n      <div class=\"p-12\">\n        <sd-layout-search-field\n          placeholder=\"Tìm trong nhóm\"\n          [autoId]=\"'layout-v2-context-search'\"\n          [model]=\"searchText()\"\n          (sdChange)=\"searchText.set($event)\">\n        </sd-layout-search-field>\n      </div>\n      <div class=\"flex-1 overflow-auto px-8 pb-12\">\n        <sd-layout-menu-tree\n          [menus]=\"contextMenus()\"\n          [query]=\"searchText()\"\n          [activePath]=\"activePath()\"\n          [pinnedKeys]=\"pinnedKeys()\"\n          (navigate)=\"onNavigate($event)\"\n          (togglePinned)=\"onTogglePinned($event)\">\n        </sd-layout-menu-tree>\n      </div>\n    </section>\n  }\n\n  <main class=\"sd-sidebar-v2__content\" data-v2-content data-content-offset=\"rail\">\n    <ng-content></ng-content>\n  </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV2 } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, getMenuStableKey, selectPrimaryMenuGroups } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n  selector: 'sidebar-mobile-v2',\n  standalone: true,\n  imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV2Component {\n  readonly #router = inject(Router);\n  readonly #document = inject(DOCUMENT);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #navigationState = inject(SdLayoutNavigationStateService);\n  #restoreFocusElement: HTMLElement | null = null;\n  #previousBodyOverflow = '';\n\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV2>();\n  primaryMenus = computed(() => selectPrimaryMenuGroups(this.menus(), this.sidebar().primaryMenuIds));\n  overflowMenus = computed(() => {\n    const primaryKeys = new Set(this.primaryMenus().map(menu => getMenuStableKey(menu)));\n    return this.menus().filter(menu => !primaryKeys.has(getMenuStableKey(menu)));\n  });\n  isSheetOpen = signal(false);\n  sheetGroupKey = signal('');\n  sheetTitle = signal('');\n  sheetMenus = signal<SdLayoutMenu[]>([]);\n  searchText = signal('');\n  activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n  pinnedKeys = this.#navigationState.pinnedKeys;\n\n  constructor() {\n    effect(() => {\n      const menus = this.menus();\n      untracked(() => this.#navigationState.hydrate(menus));\n    });\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (!(event instanceof NavigationEnd)) return;\n      this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n      this.closeSheet(false);\n    });\n    this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n  }\n\n  openMore(trigger?: EventTarget | null): void {\n    this.#openSheet('more', 'Thêm', this.overflowMenus(), trigger);\n  }\n\n  activateMenu(menu: SdLayoutMenu, trigger?: EventTarget | null): void {\n    if ('path' in menu) {\n      this.#navigate(menu);\n      return;\n    }\n    this.#openSheet(getMenuStableKey(menu), menu.title || 'Menu', menu.children ?? [], trigger);\n  }\n\n  closeSheet(restoreFocus = true): void {\n    if (!this.isSheetOpen()) return;\n    this.isSheetOpen.set(false);\n    this.searchText.set('');\n    this.#releaseBodyScroll();\n    if (restoreFocus) this.#restoreFocusElement?.focus();\n    this.#restoreFocusElement = null;\n  }\n\n  onSheetKeydown(event: KeyboardEvent): void {\n    if (event.key !== 'Escape') return;\n    event.preventDefault();\n    this.closeSheet();\n  }\n\n  onNavigate(menu: SdLayoutMenu): void {\n    if ('path' in menu) this.#navigate(menu);\n  }\n\n  onTogglePinned(menu: SdLayoutMenu): void {\n    this.#navigationState.togglePinned(menu);\n  }\n\n  #openSheet(key: string, title: string, menus: SdLayoutMenu[], trigger?: EventTarget | null): void {\n    this.sheetGroupKey.set(key);\n    this.sheetTitle.set(title);\n    this.sheetMenus.set(menus);\n    this.searchText.set('');\n    this.#restoreFocusElement =\n      trigger instanceof HTMLElement ? trigger : this.#document.activeElement instanceof HTMLElement ? this.#document.activeElement : null;\n    if (!this.isSheetOpen()) {\n      this.#previousBodyOverflow = this.#document.body.style.overflow;\n      this.#document.body.style.overflow = 'hidden';\n    }\n    this.isSheetOpen.set(true);\n  }\n\n  #navigate(menu: Extract<SdLayoutMenu, { path: string }>): void {\n    this.#navigationState.recordRecent(menu, { enabled: true, maxItems: 5 });\n    if (menu.path.includes('http')) {\n      this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n      this.closeSheet();\n      return;\n    }\n    void this.#router\n      .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n      .then(navigated => {\n        if (navigated) this.closeSheet();\n      });\n  }\n\n  #releaseBodyScroll(): void {\n    this.#document.body.style.overflow = this.#previousBodyOverflow;\n  }\n}\n","<div class=\"sd-sidebar-mobile-v2 d-flex flex-column\">\n  <main class=\"sd-sidebar-mobile-v2__content flex-1 overflow-auto\">\n    <ng-content></ng-content>\n  </main>\n\n  <nav class=\"sd-sidebar-mobile-v2__bar d-flex align-items-stretch bg-white border-top border-black200\" aria-label=\"Điều hướng chính\">\n    @for (menu of primaryMenus(); track menu.id || menu.title) {\n      <button\n        type=\"button\"\n        class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n        [attr.data-mobile-menu-key]=\"menu.id ? 'id:' + menu.id : null\"\n        [attr.aria-label]=\"menu.tooltipTitle || menu.title || 'Menu'\"\n        [attr.aria-expanded]=\"sheetGroupKey() === (menu.id ? 'id:' + menu.id : '') && isSheetOpen()\"\n        (click)=\"activateMenu(menu, $event.currentTarget)\">\n        @if (menu.iconUrl) {\n          <img class=\"sd-sidebar-mobile-v2__icon\" [src]=\"menu.iconUrl\" alt=\"\" />\n        } @else {\n          <sd-icon [name]=\"menu.icon || 'widgets'\"></sd-icon>\n        }\n        <span class=\"sd-sidebar-mobile-v2__label text-ellipsis\">{{ menu.tooltipTitle || menu.title }}</span>\n      </button>\n    }\n    @if (overflowMenus().length) {\n      <button\n        type=\"button\"\n        class=\"sd-sidebar-mobile-v2__bar-action d-flex flex-column align-items-center justify-content-center gap-4 flex-1\"\n        aria-label=\"Thêm menu\"\n        [attr.aria-expanded]=\"sheetGroupKey() === 'more' && isSheetOpen()\"\n        (click)=\"openMore($event.currentTarget)\">\n        <sd-icon name=\"more_horiz\"></sd-icon>\n        <span class=\"sd-sidebar-mobile-v2__label\">Thêm</span>\n      </button>\n    }\n  </nav>\n\n  @if (isSheetOpen()) {\n    <button type=\"button\" class=\"sd-sidebar-mobile-v2__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeSheet()\"></button>\n    <section\n      data-v2-sheet\n      class=\"sd-sidebar-mobile-v2__sheet d-flex flex-column bg-white rounded-top-16 mat-elevation-z8\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      [attr.aria-label]=\"sheetTitle()\"\n      cdkTrapFocus\n      [cdkTrapFocusAutoCapture]=\"true\"\n      (keydown)=\"onSheetKeydown($event)\">\n      <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n        <span class=\"T16M text-ellipsis\">{{ sheetTitle() }}</span>\n        <button\n          type=\"button\"\n          class=\"sd-sidebar-mobile-v2__close d-flex align-items-center justify-content-center\"\n          aria-label=\"Đóng\"\n          (click)=\"closeSheet()\">\n          <sd-icon name=\"close\"></sd-icon>\n        </button>\n      </header>\n      <div class=\"d-flex flex-column gap-12 p-12 overflow-auto\">\n        <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n        <sd-layout-search-field\n          placeholder=\"Tìm trong menu\"\n          [autoId]=\"'layout-v2-mobile-search'\"\n          [model]=\"searchText()\"\n          (sdChange)=\"searchText.set($event)\">\n        </sd-layout-search-field>\n        <sd-layout-menu-tree\n          [menus]=\"sheetMenus()\"\n          [query]=\"searchText()\"\n          [activePath]=\"activePath()\"\n          [pinnedKeys]=\"pinnedKeys()\"\n          pinVisibility=\"always\"\n          (navigate)=\"onNavigate($event)\"\n          (togglePinned)=\"onTogglePinned($event)\">\n        </sd-layout-menu-tree>\n      </div>\n    </section>\n  }\n</div>\n","import { DOCUMENT } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, getMenuStableKey, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n  selector: 'sidebar-v3',\n  standalone: true,\n  imports: [SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarV3Component {\n  readonly #router = inject(Router);\n  readonly #document = inject(DOCUMENT);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #navigationState = inject(SdLayoutNavigationStateService);\n  #initialized = false;\n\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV3>();\n  isCollapsed = signal(false);\n  searchText = signal('');\n  activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n  searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n  recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n  pinnedKeys = this.#navigationState.pinnedKeys;\n  pinnedMenus = this.#navigationState.pinnedMenus;\n  recentMenus = this.#navigationState.recentMenus;\n  collapsedItems = computed(() =>\n    this.menus().map(menu => ({ menu, key: getMenuStableKey(menu), title: menu.tooltipTitle || menu.title || 'Menu' }))\n  );\n\n  constructor() {\n    effect(() => {\n      const menus = this.menus();\n      const sidebar = this.sidebar();\n      const recentConfiguration = resolveSidebarV3Recent(sidebar);\n      untracked(() => {\n        this.#navigationState.hydrate(menus, recentConfiguration.maxItems);\n        if (this.#initialized) return;\n        const persistedCollapsed = this.#navigationState.versionState(3).collapsed;\n        this.isCollapsed.set(typeof persistedCollapsed === 'boolean' ? persistedCollapsed : (sidebar.defaultCollapsed ?? false));\n        this.#initialized = true;\n      });\n    });\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (event instanceof NavigationEnd) this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n    });\n  }\n\n  toggleCollapsed(): void {\n    this.isCollapsed.update(collapsed => !collapsed);\n    this.#navigationState.patchVersionState(3, { collapsed: this.isCollapsed() });\n  }\n\n  activateCollapsedMenu(menu: SdLayoutMenu): void {\n    if ('path' in menu) this.navigateMenu(menu);\n    else {\n      this.isCollapsed.set(false);\n      this.#navigationState.patchVersionState(3, { collapsed: false });\n    }\n  }\n\n  navigateMenu(menu: SdLayoutMenu): void {\n    if (!('path' in menu)) return;\n    this.#navigationState.recordRecent(menu, this.recentConfiguration());\n    if (menu.path.includes('http')) {\n      this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n      return;\n    }\n    void this.#router.navigate([menu.path.split('?')[0]], {\n      queryParams: menu.queryParams ?? {},\n      state: { switchTab: true },\n    });\n  }\n\n  onTogglePinned(menu: SdLayoutMenu): void {\n    this.#navigationState.togglePinned(menu);\n  }\n}\n","<div class=\"sd-sidebar-v3\" [class.sd-sidebar-v3--collapsed]=\"isCollapsed()\">\n  <aside\n    class=\"sd-sidebar-v3__drawer d-flex flex-column bg-white border-right border-black200\"\n    data-v3-sidebar\n    [attr.data-collapsed]=\"isCollapsed()\">\n    <header\n      data-v3-header\n      class=\"sd-sidebar-v3__header d-flex align-items-center gap-8 p-12 border-bottom border-black200\"\n      [class.sd-sidebar-v3__header--collapsed]=\"isCollapsed()\"\n      [class.justify-content-between]=\"!isCollapsed()\"\n      [class.justify-content-center]=\"isCollapsed()\">\n      @if (!isCollapsed()) {\n        <div data-v3-brand class=\"d-flex align-items-center gap-8 overflow-hidden\">\n          @if (sidebar().logoUrl) {\n            <img class=\"sd-sidebar-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n          } @else {\n            <sd-icon name=\"apps\"></sd-icon>\n          }\n          <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n        </div>\n      }\n      <button\n        type=\"button\"\n        class=\"sd-sidebar-v3__icon-action d-flex align-items-center justify-content-center\"\n        [attr.aria-label]=\"isCollapsed() ? 'Mở rộng sidebar' : 'Thu gọn sidebar'\"\n        [attr.aria-expanded]=\"!isCollapsed()\"\n        (click)=\"toggleCollapsed()\">\n        <sd-icon [name]=\"isCollapsed() ? 'chevron_right' : 'chevron_left'\"></sd-icon>\n      </button>\n    </header>\n\n    @if (isCollapsed()) {\n      <nav class=\"d-flex flex-column align-items-center gap-4 p-8 flex-1\" aria-label=\"Menu thu gọn\">\n        @for (item of collapsedItems(); track item.key) {\n          <button\n            type=\"button\"\n            class=\"sd-sidebar-v3__collapsed-action d-flex align-items-center justify-content-center\"\n            [attr.aria-label]=\"item.title\"\n            (click)=\"activateCollapsedMenu(item.menu)\">\n            @if (item.menu.iconUrl) {\n              <img class=\"sd-sidebar-v3__logo\" [src]=\"item.menu.iconUrl\" alt=\"\" />\n            } @else {\n              <sd-icon [name]=\"item.menu.icon || 'widgets'\"></sd-icon>\n            }\n          </button>\n        }\n      </nav>\n    } @else {\n      <div class=\"p-12\">\n        <sd-layout-search-field\n          placeholder=\"Tìm trong tất cả menu\"\n          [autoId]=\"'layout-v3-global-search'\"\n          [model]=\"searchText()\"\n          (sdChange)=\"searchText.set($event)\">\n        </sd-layout-search-field>\n      </div>\n      <div class=\"sd-sidebar-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto px-8 pb-12\">\n        @if (pinnedMenus().length) {\n          <section data-v3-pinned class=\"d-flex flex-column gap-4\">\n            <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n            <sd-layout-menu-tree\n              [menus]=\"pinnedMenus()\"\n              [activePath]=\"activePath()\"\n              [pinnedKeys]=\"pinnedKeys()\"\n              (navigate)=\"navigateMenu($event)\"\n              (togglePinned)=\"onTogglePinned($event)\">\n            </sd-layout-menu-tree>\n          </section>\n        }\n        @if (recentConfiguration().enabled && recentMenus().length) {\n          <section data-v3-recent class=\"d-flex flex-column gap-4\">\n            <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n            <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n            </sd-layout-menu-tree>\n          </section>\n        }\n        <section class=\"d-flex flex-column gap-4\">\n          <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n          <sd-layout-menu-tree\n            [menus]=\"menus()\"\n            [query]=\"searchText()\"\n            [activePath]=\"activePath()\"\n            [pinnedKeys]=\"pinnedKeys()\"\n            (navigate)=\"navigateMenu($event)\"\n            (togglePinned)=\"onTogglePinned($event)\">\n          </sd-layout-menu-tree>\n        </section>\n      </div>\n    }\n\n    <div class=\"p-8 border-top border-black200\">\n      <sd-layout-user-menu [userInfo]=\"userInfo()\" [compact]=\"isCollapsed()\"></sd-layout-user-menu>\n    </div>\n  </aside>\n\n  <main class=\"sd-sidebar-v3__content\">\n    <ng-content></ng-content>\n  </main>\n</div>\n","import { A11yModule } from '@angular/cdk/a11y';\nimport { DOCUMENT } from '@angular/common';\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  DestroyRef,\n  ElementRef,\n  computed,\n  effect,\n  inject,\n  input,\n  signal,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { NavigationEnd, Router } from '@angular/router';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdLayoutUserInfo, SidebarConfigurationV3, resolveSidebarV3Recent } from '../../configurations';\nimport { SdLayoutMenu, SdLayoutNavigationStateService, SdLayoutRootMenu, searchMenuLeaves } from '../../services';\nimport { SdLayoutMenuTreeComponent } from '../shared/menu-tree/menu-tree.component';\nimport { SdLayoutSearchFieldComponent } from '../shared/search-field/search-field.component';\nimport { SdLayoutUserMenuComponent } from '../shared/user-menu/user-menu.component';\n\n@Component({\n  selector: 'sidebar-mobile-v3',\n  standalone: true,\n  imports: [A11yModule, SdIcon, SdLayoutSearchFieldComponent, SdLayoutMenuTreeComponent, SdLayoutUserMenuComponent],\n  templateUrl: './main.component.html',\n  styleUrl: './main.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SidebarMobileV3Component {\n  readonly #router = inject(Router);\n  readonly #document = inject(DOCUMENT);\n  readonly #destroyRef = inject(DestroyRef);\n  readonly #navigationState = inject(SdLayoutNavigationStateService);\n  private readonly trigger = viewChild<ElementRef<HTMLButtonElement>>('trigger');\n  #restoreFocusElement: HTMLElement | null = null;\n  #previousBodyOverflow = '';\n\n  menus = input<SdLayoutMenu[]>([]);\n  userInfo = input.required<SdLayoutUserInfo>();\n  sidebar = input.required<SidebarConfigurationV3>();\n  isDrawerOpen = signal(false);\n  searchText = signal('');\n  activePath = signal(this.#router.url.split(/[?#]/, 1)[0] ?? '');\n  searchResults = computed<SdLayoutRootMenu[]>(() => searchMenuLeaves(this.menus(), this.searchText()));\n  recentConfiguration = computed(() => resolveSidebarV3Recent(this.sidebar()));\n  pinnedKeys = this.#navigationState.pinnedKeys;\n  pinnedMenus = this.#navigationState.pinnedMenus;\n  recentMenus = this.#navigationState.recentMenus;\n\n  constructor() {\n    effect(() => {\n      const menus = this.menus();\n      const maximum = resolveSidebarV3Recent(this.sidebar()).maxItems;\n      untracked(() => this.#navigationState.hydrate(menus, maximum));\n    });\n    this.#router.events.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(event => {\n      if (!(event instanceof NavigationEnd)) return;\n      this.activePath.set(event.urlAfterRedirects.split(/[?#]/, 1)[0] ?? '');\n      this.closeFromNavigation();\n    });\n    this.#destroyRef.onDestroy(() => this.#releaseBodyScroll());\n  }\n\n  openDrawer(trigger?: EventTarget | null): void {\n    this.#restoreFocusElement =\n      trigger instanceof HTMLElement\n        ? trigger\n        : this.#document.activeElement instanceof HTMLElement\n          ? this.#document.activeElement\n          : (this.trigger()?.nativeElement ?? null);\n    if (!this.isDrawerOpen()) {\n      this.#previousBodyOverflow = this.#document.body.style.overflow;\n      this.#document.body.style.overflow = 'hidden';\n    }\n    this.isDrawerOpen.set(true);\n  }\n\n  closeFromBackdrop(): void {\n    this.#closeDrawer();\n  }\n\n  closeFromEscape(): void {\n    this.#closeDrawer();\n  }\n\n  closeFromNavigation(): void {\n    this.#closeDrawer();\n  }\n\n  onDrawerKeydown(event: KeyboardEvent): void {\n    if (event.key !== 'Escape') return;\n    event.preventDefault();\n    this.closeFromEscape();\n  }\n\n  navigateMenu(menu: SdLayoutMenu): void {\n    if (!('path' in menu)) return;\n    this.#navigationState.recordRecent(menu, this.recentConfiguration());\n    if (menu.path.includes('http')) {\n      this.#document.defaultView?.open(menu.path, '_blank', 'noopener');\n      this.closeFromNavigation();\n      return;\n    }\n    void this.#router\n      .navigate([menu.path.split('?')[0]], { queryParams: menu.queryParams ?? {}, state: { switchTab: true } })\n      .then(navigated => {\n        if (navigated) this.closeFromNavigation();\n      });\n  }\n\n  onTogglePinned(menu: SdLayoutMenu): void {\n    this.#navigationState.togglePinned(menu);\n  }\n\n  #closeDrawer(): void {\n    if (!this.isDrawerOpen()) return;\n    this.isDrawerOpen.set(false);\n    this.searchText.set('');\n    this.#releaseBodyScroll();\n    (this.#restoreFocusElement ?? this.trigger()?.nativeElement)?.focus();\n    this.#restoreFocusElement = null;\n  }\n\n  #releaseBodyScroll(): void {\n    this.#document.body.style.overflow = this.#previousBodyOverflow;\n  }\n}\n","<div class=\"sd-sidebar-mobile-v3 d-flex flex-column\">\n  <header\n    class=\"sd-sidebar-mobile-v3__topbar d-flex align-items-center justify-content-between gap-8 px-16 bg-white border-bottom border-black200\">\n    <div class=\"d-flex align-items-center gap-8 overflow-hidden\">\n      @if (sidebar().logoUrl) {\n        <img class=\"sd-sidebar-mobile-v3__logo\" [src]=\"sidebar().logoUrl\" alt=\"\" />\n      }\n      <span class=\"T16M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n    </div>\n    <button\n      #trigger\n      type=\"button\"\n      data-v3-mobile-trigger\n      class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n      aria-label=\"Mở menu\"\n      [attr.aria-expanded]=\"isDrawerOpen()\"\n      (click)=\"openDrawer($event.currentTarget)\">\n      <sd-icon name=\"menu\"></sd-icon>\n    </button>\n  </header>\n\n  <main class=\"flex-1 overflow-auto\">\n    <ng-content></ng-content>\n  </main>\n\n  @if (isDrawerOpen()) {\n    <button type=\"button\" class=\"sd-sidebar-mobile-v3__backdrop\" aria-label=\"Đóng menu\" (click)=\"closeFromBackdrop()\"></button>\n    <aside\n      class=\"sd-sidebar-mobile-v3__drawer d-flex flex-column bg-white mat-elevation-z8\"\n      role=\"dialog\"\n      aria-modal=\"true\"\n      aria-label=\"Menu chính\"\n      cdkTrapFocus\n      [cdkTrapFocusAutoCapture]=\"true\"\n      (keydown)=\"onDrawerKeydown($event)\">\n      <header class=\"d-flex align-items-center justify-content-between gap-8 px-16 py-12 border-bottom border-black200\">\n        <span class=\"T18M text-ellipsis\">{{ sidebar().defaultTitle || 'Back Office' }}</span>\n        <button\n          type=\"button\"\n          class=\"sd-sidebar-mobile-v3__icon-action d-flex align-items-center justify-content-center\"\n          aria-label=\"Đóng menu\"\n          (click)=\"closeFromBackdrop()\">\n          <sd-icon name=\"close\"></sd-icon>\n        </button>\n      </header>\n      <div class=\"sd-sidebar-mobile-v3__navigation d-flex flex-column gap-16 flex-1 overflow-auto p-12\">\n        <sd-layout-user-menu presentation=\"mobile-inline\" [userInfo]=\"userInfo()\"></sd-layout-user-menu>\n        <div class=\"sd-sidebar-mobile-v3__search bg-white\">\n          <sd-layout-search-field\n            placeholder=\"Tìm trong tất cả menu\"\n            [autoId]=\"'layout-v3-mobile-global-search'\"\n            [model]=\"searchText()\"\n            (sdChange)=\"searchText.set($event)\">\n          </sd-layout-search-field>\n        </div>\n        @if (pinnedMenus().length) {\n          <section data-v3-mobile-pinned class=\"d-flex flex-column gap-4\">\n            <h2 class=\"T12M text-black400 px-12 m-0\">Đã ghim</h2>\n            <sd-layout-menu-tree\n              [menus]=\"pinnedMenus()\"\n              [activePath]=\"activePath()\"\n              [pinnedKeys]=\"pinnedKeys()\"\n              pinVisibility=\"always\"\n              (navigate)=\"navigateMenu($event)\"\n              (togglePinned)=\"onTogglePinned($event)\">\n            </sd-layout-menu-tree>\n          </section>\n        }\n        @if (recentConfiguration().enabled && recentMenus().length) {\n          <section data-v3-mobile-recent class=\"d-flex flex-column gap-4\">\n            <h2 class=\"T12M text-black400 px-12 m-0\">Gần đây</h2>\n            <sd-layout-menu-tree [menus]=\"recentMenus()\" [activePath]=\"activePath()\" [showPin]=\"false\" (navigate)=\"navigateMenu($event)\">\n            </sd-layout-menu-tree>\n          </section>\n        }\n        <section class=\"d-flex flex-column gap-4\">\n          <h2 class=\"T12M text-black400 px-12 m-0\">Tất cả menu</h2>\n          <sd-layout-menu-tree\n            [menus]=\"menus()\"\n            [query]=\"searchText()\"\n            [activePath]=\"activePath()\"\n            [pinnedKeys]=\"pinnedKeys()\"\n            pinVisibility=\"always\"\n            (navigate)=\"navigateMenu($event)\"\n            (togglePinned)=\"onTogglePinned($event)\">\n          </sd-layout-menu-tree>\n        </section>\n      </div>\n    </aside>\n  }\n</div>\n","import { ChangeDetectionStrategy, Component, computed, inject, input } from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\n\n// Import nội bộ trong module layout\nimport { SdLayoutMenu, SdLayoutResponsiveService, SdLayoutService } from '../../services';\nimport { MenuPipe } from '../../pipes';\nimport { SidebarV1Component } from '../sidebar-v1/main.component';\nimport { SidebarMobileV1Component } from '../sidebar-mobile-v1/main.component';\nimport { SidebarV2Component } from '../sidebar-v2/main.component';\nimport { SidebarMobileV2Component } from '../sidebar-mobile-v2/main.component';\nimport { SidebarV3Component } from '../sidebar-v3/main.component';\nimport { SidebarMobileV3Component } from '../sidebar-mobile-v3/main.component';\nimport {\n  SD_LAYOUT_CONFIGURATION,\n  SidebarConfigurationV1,\n  SidebarConfigurationV2,\n  SidebarConfigurationV3,\n  normalizeLayoutMobileBreakpoint,\n} from '../../configurations';\n\n@Component({\n  selector: 'sd-layout',\n  templateUrl: './layout-main.component.html',\n  styleUrl: './layout-main.component.scss',\n  imports: [\n    SidebarV1Component,\n    SidebarMobileV1Component,\n    SidebarV2Component,\n    SidebarMobileV2Component,\n    SidebarV3Component,\n    SidebarMobileV3Component,\n    NgTemplateOutlet,\n  ],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdLayoutComponent {\n  // ==========================================\n  // INJECT SERVICES\n  // ==========================================\n  #menuPipe = inject(MenuPipe);\n  #layoutService = inject(SdLayoutService);\n  #responsiveService = inject(SdLayoutResponsiveService);\n  #layoutConfiguration = inject(SD_LAYOUT_CONFIGURATION, { optional: true });\n\n  // ==========================================\n  // SIGNAL INPUTS\n  // ==========================================\n  menusInput = input<SdLayoutMenu[]>([], { alias: 'menus' });\n  menus = computed(() => this.#menuPipe.transform(this.menusInput() || []));\n\n  // ==========================================\n  // CONSUME SHARED STATE\n  // ==========================================\n  userInfo = this.#layoutService.userInfo;\n  sidebar = this.#layoutService.sidebar;\n  sidebarV1 = computed<SidebarConfigurationV1 | undefined>(() => {\n    const sidebar = this.sidebar();\n    return sidebar?.version === 1 ? sidebar : undefined;\n  });\n  sidebarV2 = computed<SidebarConfigurationV2 | undefined>(() => {\n    const sidebar = this.sidebar();\n    return sidebar?.version === 2 ? sidebar : undefined;\n  });\n  sidebarV3 = computed<SidebarConfigurationV3 | undefined>(() => {\n    const sidebar = this.sidebar();\n    return sidebar?.version === 3 ? sidebar : undefined;\n  });\n  mobileBreakpoint = normalizeLayoutMobileBreakpoint(this.#layoutConfiguration?.mobileBreakpoint);\n  isMobile = computed(() => this.#responsiveService.isMobile(this.mobileBreakpoint));\n}\n","<ng-template #projectedContent>\n  <ng-content></ng-content>\n</ng-template>\n\n@let _userInfo = userInfo();\n@let _sidebarV1 = sidebarV1();\n@let _sidebarV2 = sidebarV2();\n@let _sidebarV3 = sidebarV3();\n\n@if (_userInfo && _sidebarV1) {\n  @if (!isMobile()) {\n    <sidebar-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\" [isMobile]=\"false\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-v1>\n  } @else {\n    <sidebar-mobile-v1 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV1\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-mobile-v1>\n  }\n}\n\n@if (_userInfo && _sidebarV3) {\n  @if (!isMobile()) {\n    <sidebar-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-v3>\n  } @else {\n    <sidebar-mobile-v3 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV3\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-mobile-v3>\n  }\n}\n\n@if (_userInfo && _sidebarV2) {\n  @if (!isMobile()) {\n    <sidebar-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-v2>\n  } @else {\n    <sidebar-mobile-v2 [menus]=\"menus()\" [userInfo]=\"_userInfo\" [sidebar]=\"_sidebarV2\">\n      <ng-container [ngTemplateOutlet]=\"projectedContent\"></ng-container>\n    </sidebar-mobile-v2>\n  }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { SdTabComponent } from '@sdcorejs/angular/components';\nimport { I18N_STORAGE_KEY, I18N_MESSAGES, I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Language } from '@sdcorejs/angular/models';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n// End\n\n@Component({\n  selector: 'app-home-page',\n  imports: [SdIcon, SdPageComponent, TranslatePipe],\n  templateUrl: './home-page.component.html',\n  styleUrl: './home-page.component.scss',\n  standalone: true,\n})\n@SdTabComponent({\n  component: HomePageComponent,\n  // WHY: decorator chạy trước Angular DI, nên không inject được I18nService.\n  // Đọc ngôn ngữ hiện tại trực tiếp từ localStorage + I18N_MESSAGES để có giá trị đã dịch.\n  name: () => {\n    const lang = ((): Language => {\n      try {\n        const stored = localStorage.getItem(I18N_STORAGE_KEY) as Language | null;\n        if (stored) return stored;\n      } catch {\n        /* ignore */\n      }\n      return 'vi';\n    })();\n    return I18N_MESSAGES[lang]?.['core.module.layout.home.tab-name'] ?? I18N_MESSAGES.vi['core.module.layout.home.tab-name'];\n  },\n  icon: 'home',\n  color: 'primary',\n})\nexport class HomePageComponent {\n  // ==========================================\n  // INJECT SERVICES (Modern Angular)\n  // ==========================================\n  readonly #layoutService = inject(SdLayoutService);\n  readonly #i18n = inject(I18nService);\n\n  // Map Language code → BCP 47 locale tag dùng cho Intl date formatting\n  // WHY: must be declared before todayInfo — field init runs top-to-bottom; #getTodayInfo reads #localeMap.\n  readonly #localeMap: Record<Language, string> = {\n    vi: 'vi-VN',\n    en: 'en-US',\n    ja: 'ja-JP',\n    ko: 'ko-KR',\n    zh: 'zh-CN',\n  };\n\n  // ==========================================\n  // SIGNALS (STATE)\n  // ==========================================\n  // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n  readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n  userInfo = this.#layoutService.userInfo;\n\n  // WHY: static data, không cần signal. `storage` + `schema` thay cho `database` + `account_tree`\n  // để đảm bảo render trên mọi version của Material Icons mặc định.\n  readonly features = [\n    { icon: 'storage', key: 'core.module.layout.home.feature.data', area: 'data' },\n    { icon: 'insights', key: 'core.module.layout.home.feature.reports', area: 'report' },\n    { icon: 'group', key: 'core.module.layout.home.feature.users', area: 'users' },\n    { icon: 'schema', key: 'core.module.layout.home.feature.workflow', area: 'flow' },\n    { icon: 'verified_user', key: 'core.module.layout.home.feature.audit', area: 'audit' },\n    { icon: 'hub', key: 'core.module.layout.home.feature.integration', area: 'integ' },\n  ] as const;\n  // ==========================================\n  // PRIVATE METHODS\n  // ==========================================\n\n  #getTimezone() {\n    const now = new Date();\n    const timezoneOffset = now.getTimezoneOffset();\n    const offsetHours = -timezoneOffset / 60;\n    const sign = offsetHours >= 0 ? '+' : '';\n    const simpleGmtString = `GMT${sign}${offsetHours}`;\n    return simpleGmtString;\n  }\n\n  #getTodayInfo(date: Date) {\n    // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n    const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n    // WHY: dùng locale theo ngôn ngữ hiện tại để định dạng số (dd/mm/yyyy vs mm/dd/yyyy ...)\n    const locale = this.#localeMap[this.#i18n.language()] ?? 'vi-VN';\n    const dateStr = date.toLocaleDateString(locale, {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n    });\n    const formatted = this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n    return `${formatted} (${this.#getTimezone()})`;\n  }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n  <div class=\"d-flex flex-column\" headerLeft>\n    <div class=\"font-weight-medium fs-20\">\n      {{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}\n    </div>\n    <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n  </div>\n\n  <div class=\"wrapper\">\n    <div class=\"bento\">\n      <!-- Hero -->\n      <div class=\"card hero-card\">\n        <div class=\"hero-ring ring-3\"></div>\n        <div class=\"hero-ring ring-2\"></div>\n        <div class=\"hero-ring ring-1\"></div>\n        <div class=\"hero-core\">\n          <sd-icon class=\"hero-icon\" name=\"space_dashboard\"></sd-icon>\n        </div>\n        <div class=\"hero-decoration\">\n          <span class=\"dot d1\"></span>\n          <span class=\"dot d2\"></span>\n          <span class=\"dot d3\"></span>\n        </div>\n      </div>\n\n      <!-- Features -->\n      @for (feature of features; track feature.key; let i = $index) {\n        <div\n          class=\"card feature-card\"\n          [class.feature-wide]=\"feature.area === 'audit' || feature.area === 'integ'\"\n          [style.gridArea]=\"feature.area\"\n          [style.animation-delay.ms]=\"(i + 1) * 80\"\n        >\n          <div class=\"feature-accent\"></div>\n          <div class=\"feature-content\">\n            <div class=\"feature-icon-wrap\">\n              <sd-icon class=\"feature-icon\" [name]=\"feature.icon\"></sd-icon>\n            </div>\n            <span class=\"feature-label\">{{ feature.key | translate }}</span>\n          </div>\n        </div>\n      }\n    </div>\n  </div>\n</sd-page>\n","import { inject, Injectable } from '@angular/core';\nimport { CanActivate, Router } from '@angular/router';\n\n// Giả sử bạn có một service để đọc config\nimport { ISdLayoutConfiguration, SD_LAYOUT_CONFIGURATION } from '../../../configurations';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class HomeRedirectGuard implements CanActivate {\n  private readonly router = inject(Router);\n  private readonly layoutConfiguration: ISdLayoutConfiguration = inject(SD_LAYOUT_CONFIGURATION);\n\n  async canActivate() {\n    const homeUrl = this.layoutConfiguration?.homeUrl;\n    if (homeUrl) {\n      // Nếu có config homeUrl, tạo một UrlTree để redirect\n      // Đây là cách redirect chính thống từ trong guard\n      return this.router.createUrlTree([homeUrl]);\n    }\n    // Nếu không có homeUrl, cho phép kích hoạt route\n    return true;\n  }\n}\n","import { NgModule } from '@angular/core';\nimport { RouterModule, Routes } from '@angular/router';\nimport { HomePageComponent } from './components/home-page/home-page.component';\nimport { HomeRedirectGuard } from './guards/home-redirect.guard';\n\nconst routes: Routes = [\n  {\n    path: '',\n    canActivate: [HomeRedirectGuard],\n    component: HomePageComponent,\n  },\n];\n\n@NgModule({\n  imports: [RouterModule.forChild(routes)],\n  exports: [RouterModule],\n})\nexport class HomeRoutingModule {}\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { HomeRoutingModule } from './home.routing';\n\n@NgModule({\n  declarations: [],\n  imports: [CommonModule, HomeRoutingModule],\n})\nexport class HomeModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\n// End\n\n@Component({\n  templateUrl: './root.component.html',\n  styleUrl: './root.component.scss',\n  imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n  // ==========================================\n  // INJECT SERVICES (Modern Angular)\n  // ==========================================\n  readonly #route = inject(ActivatedRoute);\n  readonly #layoutService = inject(SdLayoutService);\n  readonly #i18n = inject(I18nService);\n\n  // ==========================================\n  // SIGNALS (STATE)\n  // ==========================================\n  // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n  readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n  readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n  userInfo = this.#layoutService.userInfo;\n  // ==========================================\n  // PRIVATE METHODS\n  // ==========================================\n  #getTodayInfo(date: Date): string {\n    // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n    const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n    const dateStr = date.toLocaleDateString('vi-VN', {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n    });\n    return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n  }\n\n  // ==========================================\n  // PUBLIC METHODS\n  // ==========================================\n  reload() {\n    window.location.href = '';\n  }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n  <div class=\"d-flex flex-column\" headerLeft>\n    <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n    <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n  </div>\n\n  <div class=\"h-full d-flex flex-column align-items-center\">\n    <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n      <img alt=\"not-found\" class=\"sd-image-not-found\" />\n      <span class=\"T16M mt-24\">{{ 'core.module.layout.not-found.title' | translate }}</span>\n      <span class=\"T16R text-secondary mt-4\">\n        {{ 'core.module.layout.not-found.message' | translate }}\n      </span>\n      <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.not-found.back' | translate\" prefixIcon=\"arrow_back\"> </sd-button>\n    </div>\n  </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { CommonModule } from '@angular/common';\nimport { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './not-found.routing';\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(Routes)],\n  exports: [],\n})\nexport class NotFoundModule {}\n","import { Component, inject, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { SdButton } from '@sdcorejs/angular/components';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\n\n// NOTE: Import nội bộ trong module layout thì dùng path tương đối\nimport { SdPageComponent } from '../../../../components';\nimport { SdLayoutService } from '../../../../services';\n// End\n\n@Component({\n  templateUrl: './root.component.html',\n  styleUrl: './root.component.scss',\n  imports: [SdButton, SdPageComponent, TranslatePipe],\n})\nexport class RootComponent {\n  // ==========================================\n  // INJECT SERVICES (Modern Angular)\n  // ==========================================\n  readonly #route = inject(ActivatedRoute);\n  readonly #layoutService = inject(SdLayoutService);\n  readonly #i18n = inject(I18nService);\n\n  // ==========================================\n  // SIGNALS (STATE)\n  // ==========================================\n  // Lấy snapshot một lần lúc khởi tạo và đưa vào signal\n  readonly url = signal<string>(this.#route.snapshot.queryParams?.['url'] || '');\n  readonly todayInfo = signal<string>(this.#getTodayInfo(new Date()));\n  userInfo = this.#layoutService.userInfo;\n  // ==========================================\n  // PRIVATE METHODS\n  // ==========================================\n  #getTodayInfo(date: Date): string {\n    // WHY: weekday names i18n hóa qua key core.module.layout.weekday.<0..6>\n    const weekday = this.#i18n.t(`core.module.layout.weekday.${date.getDay()}`);\n    const dateStr = date.toLocaleDateString('vi-VN', {\n      day: '2-digit',\n      month: '2-digit',\n      year: 'numeric',\n    });\n    return this.#i18n.t('core.module.layout.today-info.format', { weekday, date: dateStr });\n  }\n\n  // ==========================================\n  // PUBLIC METHODS\n  // ==========================================\n  reload() {\n    window.location.href = '';\n  }\n}\n","@let _userInfo = userInfo();\n<sd-page>\n  <div class=\"d-flex flex-column\" headerLeft>\n    <div class=\"font-weight-medium fs-20\">{{ 'core.module.layout.greeting.hello' | translate: { name: _userInfo?.fullName ?? _userInfo?.email ?? _userInfo?.username ?? '' } }}</div>\n    <span class=\"T12R text-secondary\">{{ todayInfo() }}</span>\n  </div>\n  <div class=\"h-full d-flex flex-column align-items-center\">\n    <div class=\"h-full d-flex flex-column align-items-center justify-content-center text-center wrapper\">\n      <img alt=\"forbidden\" class=\"sd-image-forbidden\" />\n      <span class=\"T16M mt-24\">{{ 'core.module.layout.forbidden.title' | translate }}</span>\n      <span class=\"T14R text-secondary mt-4\"\n        >{{ 'core.module.layout.forbidden.message' | translate }}</span\n      >\n      <sd-button class=\"mt-16\" type=\"fill\" color=\"primary\" (click)=\"reload()\" [title]=\"'core.module.layout.forbidden.back-home' | translate\"> </sd-button>\n    </div>\n  </div>\n</sd-page>\n","import { Route } from '@angular/router';\nimport { RootComponent } from './pages/root/root.component';\n\nexport const Routes: Route[] = [{ path: '', component: RootComponent }];\n","import { NgModule } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './forbidden.routing';\n\n@NgModule({\n  imports: [CommonModule, RouterModule.forChild(Routes)],\n  exports: [],\n})\nexport class ForbiddenModule {}\n","import { Route } from '@angular/router';\n\nexport const Routes: Route[] = [\n  {\n    path: '',\n    pathMatch: 'full',\n    redirectTo: 'not-found',\n  },\n  {\n    path: 'home',\n    loadChildren: () => import('./modules/home').then(m => m.HomeModule),\n  },\n  {\n    path: 'not-found',\n    loadChildren: () => import('./modules/not-found').then(m => m.NotFoundModule),\n  },\n  {\n    path: 'forbidden',\n    loadChildren: () => import('./modules/forbidden').then(m => m.ForbiddenModule),\n  },\n];\n","import { NgModule } from '@angular/core';\nimport { RouterModule } from '@angular/router';\nimport { Routes } from './layout.routing';\n@NgModule({\n  declarations: [],\n  imports: [RouterModule.forChild(Routes)],\n  providers: [],\n})\nexport class SdLayoutModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["LayoutUserComponent","i1","RootComponent","Routes"],"mappings":"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"}