UNPKG

@fsegurai/ngx-sidenav

Version:

Angular component for creating a resizeable sidenav with drag and drop functionality.

1 lines 66.4 kB
{"version":3,"file":"fsegurai-ngx-sidenav.mjs","sources":["../../../lib/src/components/link-item/link-item.ts","../../../lib/src/components/link-item/link-item.html","../../../lib/src/directives/content-area/content-area.directive.ts","../../../lib/src/types/stack.ts","../../../lib/src/services/sidenav/sidenav.service.ts","../../../lib/src/components/sidenav-menu/sidenav-menu.ts","../../../lib/src/components/sidenav-menu/sidenav-menu.html","../../../lib/src/components/sidenav/sidenav.ts","../../../lib/src/components/sidenav/sidenav.html","../../../lib/public_api.ts","../../../lib/fsegurai-ngx-sidenav.ts"],"sourcesContent":["import { Component, input, InputSignal, ViewEncapsulation } from '@angular/core';\nimport { RouterLink, RouterLinkActive } from '@angular/router';\n\n@Component({\n  selector: 'ngx-sidenav-link-item',\n  imports: [\n    RouterLink,\n    RouterLinkActive,\n  ],\n  templateUrl: './link-item.html',\n  styleUrl: './link-item.scss',\n  encapsulation: ViewEncapsulation.None,\n})\nexport class LinkItem {\n  // ? === Public inputs signals ===\n  routerLink: InputSignal<string | string[] | null> = input<string | string[] | null>(null);\n  routerLinkActiveOptions: InputSignal<{ exact: boolean }> = input<{ exact: boolean }>({ exact: true });\n  isTitle: InputSignal<boolean> = input<boolean>(false);\n  isParent: InputSignal<boolean> = input<boolean>(false);\n  isDisabled: InputSignal<boolean> = input<boolean>(false);\n}\n","<a class=\"link-item\"\n   [class.is-parent]=\"isParent()\"\n   [class.is-title]=\"isTitle()\"\n   [routerLink]=\"routerLink()\"\n   routerLinkActive=\"active\"\n   [routerLinkActiveOptions]=\"routerLinkActiveOptions()\">\n\n  <span class=\"link-content-container\">\n    <ng-content></ng-content>\n  </span>\n</a>","import { Directive, inject, ViewContainerRef } from '@angular/core';\n\n@Directive({\n  selector: '[ngxSidenavContentArea]',\n})\nexport class ContentAreaDirective {\n  public _viewContainerRef = inject(ViewContainerRef);\n}\n","import { ComponentStackItem, MenuStackItem } from '../interfaces/stack-item';\n\n/**\n * Represents an item in the side navigation stack.\n *\n * A `SidenavStackItem` can either be a `MenuStackItem` or a `ComponentStackItem`.\n * It is used to define the structure and hierarchy of items in the side navigation panel.\n */\nexport type SidenavStackItem = MenuStackItem | ComponentStackItem;\n\n/**\n * Determines if the given item is a MenuStackItem.\n *\n * @param {SidenavStackItem} item - The item to check.\n * @return {boolean} True if the item is a MenuStackItem, otherwise false.\n */\nexport function isMenuStackItem(item: SidenavStackItem): item is MenuStackItem {\n  return item.type === 'menu';\n}\n\n/**\n * Determines if the given stack item is a ComponentStackItem.\n *\n * @param {SidenavStackItem} item - The stack item to evaluate.\n * @return {boolean} - Returns true if the item is of type ComponentStackItem, otherwise false.\n */\nexport function isComponentStackItem(item: SidenavStackItem): item is ComponentStackItem {\n  return item.type === 'component';\n}\n","import { Type as Component, computed, Injectable, Signal, signal, WritableSignal } from '@angular/core';\nimport { ContentAreaDirective } from '../../directives/content-area/content-area.directive';\nimport { ComponentStackItem, MenuStackItem, SerializableStackItem } from '../../interfaces/stack-item';\nimport { StackMenuItem } from '../../interfaces/stack-menu-item';\nimport { isComponentStackItem, isMenuStackItem, SidenavStackItem } from '../../types/stack';\n\n// LocalStorage keys\nconst STORAGE_KEY_WIDTH = 'ngx-sidenav-width';\nconst STORAGE_KEY_EXPANDED = 'ngx-sidenav-expanded';\nconst STORAGE_KEY_STACK = 'ngx-sidenav-stack';\nconst STORAGE_KEY_CLEAR_ON_RELOAD = 'ngx-sidenav-clear-on-reload';\n\n@Injectable({\n  providedIn: 'root',\n})\nexport class SidenavService {\n  // ? Public constants\n  readonly COLLAPSE_WIDTH = 30; // Minimum width for collapse\n  readonly INITIAL_WIDTH = 300; // Default initial width of the sidenav\n\n  // ! === Private constants ===\n  readonly #DEBOUNCE_DELAY = 300; // Debounce delay for localStorage writes\n  readonly #TRANSITION_DURATION = 400; // Default transition duration in milliseconds\n\n  // ! === Private reactive signals ===\n  #minWidth: WritableSignal<number> = signal(250); // Minimum width of the sidenav\n  #maxWidth: WritableSignal<number> = signal(600); // Maximum width of the sidenav\n  #isExpanded: WritableSignal<boolean> = signal(true);\n  #sidenavWidth: WritableSignal<number> = signal(this.INITIAL_WIDTH);\n  #stack: WritableSignal<SidenavStackItem[]> = signal([]);\n\n  // ? === Public readonly signals ===\n  minWidth: Signal<number> = this.#minWidth.asReadonly();\n  maxWidth: Signal<number> = this.#maxWidth.asReadonly();\n  isExpanded: Signal<boolean> = this.#isExpanded.asReadonly();\n  sidenavWidth: Signal<number> = this.#sidenavWidth.asReadonly();\n  readonly currentMenu = computed(() => {\n    const current: SidenavStackItem | undefined = this.#stack().at(-1); // Get the last item in the stack\n    // Return early if there's no item or if it's not a valid MenuStackItem\n    return current && isMenuStackItem(current) ? current : undefined;\n  });\n  readonly canGoBack = computed(() => this.#stack().length > 1);\n\n  // ? === Public non-reactive state flags ===\n  isSlidingInFromRight = false;\n  isSlidingInFromLeft = false;\n\n  // ! === Private internals ===\n  #shouldPersistStack = true;\n  #stackItemCounter = 0;\n  #contentArea?: ContentAreaDirective;\n\n  constructor() {\n    // Clear-once flag logic\n    const shouldClear = localStorage.getItem(STORAGE_KEY_CLEAR_ON_RELOAD) === 'true';\n    if (shouldClear) {\n      localStorage.removeItem(STORAGE_KEY_STACK);\n      localStorage.removeItem(STORAGE_KEY_CLEAR_ON_RELOAD); // Reset flag\n      this.#shouldPersistStack = false; // 👈 prevent saving again\n    }\n\n    // Restore basic config\n    const storedWidth = Number(localStorage.getItem(STORAGE_KEY_WIDTH));\n    if (!isNaN(storedWidth)) this.#sidenavWidth.set(storedWidth);\n    this.#isExpanded.set(localStorage.getItem(STORAGE_KEY_EXPANDED) === 'true');\n\n    // Save stack when the user exits\n    window.addEventListener('beforeunload', () => {\n      if (this.#shouldPersistStack) this.#saveStack();\n    });\n  }\n\n  /**\n   * Marks the application or specific data to be cleared on the next reload\n   * by setting a flag in the local storage.\n   *\n   * @return {void} This method does not return a value.\n   */\n  clearOnNextReload(): void {\n    localStorage.setItem(STORAGE_KEY_CLEAR_ON_RELOAD, 'true');\n  }\n\n  /**\n   * Configures the parameters for the sidenav, including minimum width, maximum width,\n   * and initial width. Updates the sidenav properties and optionally stores the\n   * initial width in local storage.\n   *\n   * @param {Object} config - Configuration object for the sidenav.\n   * @param {number} [config.minWidth] - Specifies the minimum width of the sidenav.\n   * @param {number} [config.maxWidth] - Specifies the maximum width of the sidenav.\n   * @param {number} [config.initialWidth] - Specifies the initial width of the sidenav.\n   * @return {void}\n   */\n  setConfig({ minWidth, maxWidth, initialWidth }: {\n    minWidth?: number;\n    maxWidth?: number;\n    initialWidth?: number\n  }): void {\n    if (minWidth) this.#minWidth.set(minWidth);\n    if (maxWidth) this.#maxWidth.set(maxWidth);\n    if (initialWidth) {\n      this.#sidenavWidth.set(initialWidth);\n      localStorage.setItem(STORAGE_KEY_WIDTH, String(initialWidth));\n    } else if (!this.#sidenavWidth()) {\n      this.#sidenavWidth.set(this.INITIAL_WIDTH);\n      localStorage.setItem(STORAGE_KEY_WIDTH, String(this.#sidenavWidth()));\n    }\n  }\n\n  /**\n   * Adjusts the width of the sidenav, constraining it within the defined minimum and maximum bounds.\n   * The adjusted width is stored both in a state variable and in local storage.\n   *\n   * @param {number} width - The desired width of the sidenav to be set.\n   * @return {void} This method does not return a value.\n   */\n  setSidenavWidth(width: number): void {\n    const clampedWidth = Math.min(Math.max(width, this.#minWidth()), this.#maxWidth());\n    this.#sidenavWidth.set(clampedWidth);\n    this.#debouncedSave(STORAGE_KEY_WIDTH, clampedWidth);\n  }\n\n  /**\n   * Toggles the state of the sidenav between expanded and collapsed.\n   * Updates the local storage to reflect the new state.\n   *\n   * @return {void} Does not return a value.\n   */\n  toggleSidenav(): void {\n    this.#isExpanded.update(v => {\n      this.#debouncedSave(STORAGE_KEY_EXPANDED, !v);\n      return !v;\n    });\n  }\n\n  /**\n   * Sets the dynamic content area by assigning the provided host to an internal property.\n   *\n   * @param {ContentAreaDirective} host The ContentAreaDirective instance to be set as the dynamic content area.\n   * @return {void} No return value.\n   */\n  setDynamicContentArea(host: ContentAreaDirective): void {\n    this.#contentArea = host;\n  }\n\n  /**\n   * Pushes a new stack item onto the sidenav stack. The item can be either a menu stack item\n   * or a component stack item. Based on the type of the item, the method processes and adds it\n   * to the stack accordingly. Additionally, certain UI elements and animations are updated or triggered.\n   *\n   * @param {SidenavStackItem} item - The stack item to be added. This can either represent a menu\n   *                                  (with title, badge, items) or a component (with data and behavior).\n   * @return {Promise<void>} - A promise that resolves once the push operation and associated\n   *                           animations have been completed.\n   */\n  push(item: SidenavStackItem): Promise<void> {\n    const stackItem: SidenavStackItem = item.type === 'menu'\n      ? this.#createMenuStackItem(item.items, item.title, item.badge, item.badgeColor)\n      : this.#createComponentStackItem(item.component, item.componentData);\n\n    this.#stack.update(stack => [...stack, stackItem]);\n\n    if (isMenuStackItem(stackItem)) {\n      this.#clearContent();\n    } else {\n      this.#setContent(stackItem.component);\n    }\n\n    if (this.#shouldPersistStack) this.#saveStack();\n    return this.#animateInFromTheRight();\n  }\n\n  /**\n   * Removes the top item from the navigation stack and updates the display.\n   * If the stack contains only one or no items, it resolves immediately without making changes.\n   * Adjusts the content displayed based on the type of the new top item in the stack.\n   * Persists the stack state if configured to do so.\n   * Executes an animation to visually represent the stack update.\n   *\n   * @return {Promise<void>} A promise that resolves when the operation is complete.\n   */\n  pop(): Promise<void> {\n    if (this.#stack().length <= 1) return Promise.resolve();\n\n    this.#stack.update(stack => stack.slice(0, -1));\n\n    const previous: SidenavStackItem | undefined = this.#stack().at(-1);\n    if (!previous) return Promise.resolve();\n\n    if (isMenuStackItem(previous)) {\n      this.#clearContent();\n    } else if (isComponentStackItem(previous)) {\n      this.#setContent(previous.component);\n    }\n\n    if (this.#shouldPersistStack) this.#saveStack();\n    return this.#animateInFromTheLeft();\n  }\n\n  /**\n   * Restores the stack from local storage if available; otherwise, initializes the stack from the provided root items.\n   *\n   * @param {StackMenuItem[]} rootItems - An array of StackMenuItem objects representing the root stack menu items.\n   * @return {void} Does not return any value.\n   */\n  restoreStackHybrid(rootItems: StackMenuItem[]): void {\n    const raw = localStorage.getItem(STORAGE_KEY_STACK);\n    if (raw) this.restoreStackFromStorage();\n\n    if (!this.#stack().length) this.restoreStackFromMenuRoot(rootItems);\n  }\n\n  /**\n   * Restores the stack state from the browser's localStorage. The method retrieves a serialized stack,\n   * validates its type, and deserializes appropriate items, reconstructing the stack content.\n   * Invalid or unparsable data will result in an empty stack being restored.\n   *\n   * @return {void} Does not return any value.\n   */\n  restoreStackFromStorage(): void {\n    const raw = localStorage.getItem(STORAGE_KEY_STACK);\n    if (!raw) return;\n\n    try {\n      const parsed = JSON.parse(raw) as SerializableStackItem[];\n      // Validate type safety\n      if (!Array.isArray(parsed)) {\n        console.error('Invalid stack format in localStorage:', parsed);\n        return;\n      }\n\n      this.#clearContent();\n      this.#stack.set(parsed\n        .filter(item => item.type === 'menu')\n        .map(item => this.#deserializeMenuItem(item)),\n      );\n\n    } catch (error: unknown) {\n      const errorMessage = error instanceof Error ? error.message : 'Unknown error';\n      console.warn('Failed to restore stack from localStorage:', errorMessage);\n      this.#stack.set([]);\n    }\n  }\n\n  /**\n   * Restores the menu stack to reflect the current application route based on the given menu root items.\n   * It clears the existing menu stack, rebuilds it starting from the root items, and persists the updated stack.\n   *\n   * @param {StackMenuItem[]} rootItems - An array of StackMenuItem objects representing the root menu structure.\n   * @return {void} This method does not return a value.\n   */\n  restoreStackFromMenuRoot(rootItems: StackMenuItem[]): void {\n    const currentRoute = location.pathname;\n\n    // Always reset the stack\n    this.#clearContent();\n    this.#stack.set([]);\n\n    // Always start with the root\n    this.#stack.update(stack => [...stack, this.#createMenuStackItem(rootItems)]);\n\n    const path = this.#findPathToRoute(rootItems, currentRoute);\n\n    if (!path.length) {\n      this.#saveStack();\n      return;\n    }\n\n    let currentChildren = rootItems;\n\n    for (const item of path) {\n      const match = currentChildren.find(i => i.route === item.route || i.label === item.label);\n\n      if (!match) continue;\n\n      if (match.children?.length) {\n        this.#stack.update(stack => [\n          ...stack,\n          this.#createMenuStackItem(\n            match.children!,\n            match.label,\n            match.badge,\n            match.badgeColor,\n          ),\n        ]);\n\n        currentChildren = match.children;\n      }\n    }\n\n    this.#saveStack(); // Persist\n  }\n\n  /**\n   * Sets the content of the content area by creating and attaching the provided component.\n   * It ensures the content area is not null and the component is a valid constructor function\n   * before attempting to create it.\n   *\n   * @param {Component<unknown>} component - The component to be created and attached to the content area.\n   * @return {void} Does not return a value.\n   */\n  #setContent(component: Component<unknown>): void {\n    if (!this.#contentArea) return;\n\n    this.#contentArea._viewContainerRef.clear();\n\n    // Type guard to ensure a component is a valid constructor function\n    if (!component || typeof component !== 'function') {\n      console.warn('Attempted to create a component with an invalid type:', component);\n      return;\n    }\n\n    this.#contentArea._viewContainerRef.createComponent(component);\n  }\n\n  /**\n   * Clears the content of the private content area by removing all child views from the view container reference.\n   *\n   * @return {void} This method does not return any value.\n   */\n  #clearContent(): void {\n    this.#contentArea?._viewContainerRef.clear();\n  }\n\n  /**\n   * Animates the element by sliding it in from the left.\n   * Sets the `isSlidingInFromLeft` flag to true during the animation.\n   * Waits for the duration specified by `sidenavTransitionDuration` before resetting the flag.\n   *\n   * @return {Promise<void>} A promise that resolves after the animation is complete.\n   */\n  async #animateInFromTheLeft(): Promise<void> {\n    this.isSlidingInFromLeft = true;\n    await this.#sleep(this.#TRANSITION_DURATION);\n    this.isSlidingInFromLeft = false;\n  }\n\n  /**\n   * Handles the animation by sliding in an element from the right side.\n   * Temporarily sets the sliding state to true, waits for the defined transition duration,\n   * and then resets the sliding state to false.\n   *\n   * @return {Promise<void>} A promise that resolves when the animation is complete.\n   */\n  async #animateInFromTheRight(): Promise<void> {\n    this.isSlidingInFromRight = true;\n    await this.#sleep(this.#TRANSITION_DURATION);\n    this.isSlidingInFromRight = false;\n  }\n\n  /**\n   * Pauses the execution for the specified duration.\n   *\n   * @param {number} ms - The duration to sleep in milliseconds.\n   * @return {Promise<void>} A Promise that resolves after the specified duration.\n   */\n  #sleep(ms: number): Promise<void> {\n    return new Promise((resolve) => setTimeout(resolve, ms));\n  }\n\n  /**\n   * Finds the path to a specific route within a nested structure of menu items.\n   *\n   * @param {StackMenuItem[]} items - The array of menu items to search through.\n   * @param {string} route - The route to find within the menu items.\n   * @param {StackMenuItem[]} path - The current path being constructed (default is an empty array).\n   * @return {StackMenuItem[]} - An array representing the path to the specified route. If the route is not found, it returns an empty array.\n   */\n  #findPathToRoute(items: StackMenuItem[], route: string, path: StackMenuItem[] = []): StackMenuItem[] {\n    for (const item of items) {\n      const newPath = [...path, item];\n\n      if (item.route === route) {\n        return newPath;\n      }\n\n      if (item.children?.length) {\n        const found = this.#findPathToRoute(item.children, route, newPath);\n        if (found.length) return found;\n      }\n    }\n\n    return [];\n  }\n\n  /**\n   * Creates and returns a menu stack item object with specified properties.\n   * Performance optimized with counter-based IDs instead of UUIDs.\n   */\n  #createMenuStackItem(\n    items: StackMenuItem[],\n    title?: string,\n    badge?: string | number,\n    badgeColor?: string,\n  ): MenuStackItem {\n    return {\n      type: 'menu',\n      items,\n      title,\n      badge,\n      badgeColor,\n      id: `menu-${ ++this.#stackItemCounter }`, // Much faster than crypto.randomUUID()\n      timestamp: Date.now(),\n    };\n  }\n\n  /**\n   * Creates a new component stack item with the specified component and optional data.\n   * Performance optimized with counter-based IDs.\n   */\n  #createComponentStackItem(component: Component<unknown>, data?: Record<string, unknown>): ComponentStackItem {\n    return {\n      type: 'component',\n      component,\n      componentData: data,\n      id: `component-${ ++this.#stackItemCounter }`, // Much faster than crypto.randomUUID()\n      timestamp: Date.now(),\n    };\n  }\n\n  /**\n   * Deserializes a SerializableStackItem object and converts it into a MenuStackItem.\n   * Uses fallback ID generation for better performance.\n   */\n  #deserializeMenuItem(item: SerializableStackItem): MenuStackItem {\n    return {\n      type: 'menu',\n      items: item.items,\n      title: item.title,\n      badge: item.badge,\n      badgeColor: item.badgeColor,\n      id: item.id || `menu-${ ++this.#stackItemCounter }`, // Use counter instead of crypto.randomUUID()\n      timestamp: item.timestamp || Date.now(),\n    };\n  }\n\n  /**\n   * Persists the current stack of menu items into localStorage if the stack persistence is enabled.\n   * Filters the stack to include only menu stack items, serializes the necessary properties, and stores the result.\n   *\n   * @return {void} This method does not return any value.\n   */\n  #saveStack(): void {\n    if (!this.#shouldPersistStack) return;\n\n    const serialized: SerializableStackItem[] = this.#stack()\n      .filter(isMenuStackItem)\n      .map(item => ({\n        type: 'menu' as const,\n        title: item.title,\n        badge: item.badge,\n        badgeColor: item.badgeColor,\n        items: item.items,\n        id: item.id,\n        timestamp: item.timestamp,\n      }));\n\n    localStorage.setItem(STORAGE_KEY_STACK, JSON.stringify(serialized));\n  }\n\n  /**\n   * A Map object that stores timeout identifiers returned by the `setTimeout` function.\n   * The keys in the Map are string identifiers, representing unique names or categories for each timeout.\n   * The values are the actual timeout identifiers, as returned by the `setTimeout` function.\n   * This allows for efficient tracking and management of multiple timeouts,\n   * such as clearing or updating them when necessary.\n   */\n  #timeouts = new Map<string, ReturnType<typeof setTimeout>>();\n\n  /**\n   * Saves a key-value pair to localStorage with a debounced mechanism to prevent rapid consecutive writes.\n   *\n   * @param {string} key - The key under which the value will be stored in localStorage.\n   * @param {unknown} value - The value to be stored, which will be converted to a string.\n   * @return {void} This method does not return a value.\n   */\n  #debouncedSave(key: string, value: unknown): void {\n    const existingTimeout = this.#timeouts.get(key);\n    if (existingTimeout !== undefined) {\n      clearTimeout(existingTimeout);\n    }\n\n    this.#timeouts.set(\n      key,\n      setTimeout(() => {\n        const stringValue = typeof value === 'string' ? value : String(value);\n        localStorage.setItem(key, stringValue);\n        this.#timeouts.delete(key);\n      }, this.#DEBOUNCE_DELAY),\n    );\n  }\n}","import { NgOptimizedImage } from '@angular/common';\nimport { Component, inject, input, ViewEncapsulation } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { RouterLink } from '@angular/router';\nimport { StackMenuItem } from '../../interfaces/stack-menu-item';\nimport { SidenavService } from '../../services/sidenav/sidenav.service';\nimport { SidenavStackItem } from '../../types/stack';\nimport { LinkItem } from '../link-item/link-item';\n\n@Component({\n  selector: 'ngx-sidenav-menu',\n  imports: [RouterLink, LinkItem, MatIconModule, NgOptimizedImage],\n  templateUrl: './sidenav-menu.html',\n  styleUrls: ['./sidenav-menu.scss'],\n  encapsulation: ViewEncapsulation.None,\n})\nexport class SidenavMenu {\n  // ! === Private Services ===\n  private readonly _sidenav = inject(SidenavService);\n\n  // ? === Public inputs signals ===\n  items = input<StackMenuItem[]>([]);\n  parentLabel = input<string | undefined>(undefined);\n  parentBadge = input<string | number | undefined>(undefined);\n  parentBadgeColor = input<string | undefined>(undefined);\n\n  // * === Protected computed signals ===\n  protected readonly canGoBack = this._sidenav.canGoBack;\n  protected readonly currentMenu = this._sidenav.currentMenu;\n\n  protected onBack(): void {\n    this._sidenav.pop();\n  }\n\n  protected onMenuItemClick(item: StackMenuItem): void {\n    if (item.children?.length) {\n\n      const stackItem = {\n        type: 'menu',\n        items: item.children,\n        title: item.label,\n        badge: item.badge,\n        badgeColor: item.badgeColor,\n      } as SidenavStackItem;\n\n      // this._sidenav.push(item.children, item.label, item.badge, item.badgeColor);\n      this._sidenav.push(stackItem);\n    }\n  }\n}\n\n","@let goBack = canGoBack();\n@let menuItems = items().length ? items() : (currentMenu()?.items || []);\n\n<ul class=\"sidenav-menu\">\n  @if (goBack) {\n    <li>\n      <ngx-sidenav-link-item (click)=\"onBack()\" [isParent]=\"true\">\n        <div class=\"sidenav-menu-back-btn\">\n          <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n            arrow_back\n          </mat-icon>\n          <span class=\"sidenav-menu-label\">{{ parentLabel() }}</span>\n          @if (parentBadge() && parentBadgeColor()) {\n            <span [class]=\"`sidenav-menu-badge ${parentBadgeColor()}`\">{{ parentBadge() }}</span>\n          }\n        </div>\n      </ngx-sidenav-link-item>\n    </li>\n  }\n\n  @for (item of menuItems; track item) {\n    <li>\n      @if (item.route && !(item.children?.length) && (!item.isParent && !item.isTitle)) {\n        <ngx-sidenav-link-item\n            [routerLink]=\"item.route\"\n            [routerLinkActiveOptions]=\"{ exact: true }\">\n          <div class=\"sidenav-menu-label-container\">\n            @if (item.icon) {\n              @switch (item.iconType) {\n                @case ('svg') {\n                  <img\n                      class=\"sidenav-menu-icon\"\n                      [ngSrc]=\"item.icon\"\n                      alt=\"{{ item.label }} Path\"\n                      width=\"24\"\n                      height=\"24\"\n                      priority>\n                }\n                @case ('material') {\n                  <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n                    {{ item.icon }}\n                  </mat-icon>\n                }\n              }\n            }\n            <span class=\"sidenav-menu-label\">{{ item.label }}</span>\n            @if (item.badge) {\n              <span [class]=\"`sidenav-menu-badge ${item.badgeColor}`\">{{ item.badge }}</span>\n            }\n          </div>\n        </ngx-sidenav-link-item>\n      } @else if (item.children?.length) {\n        <ngx-sidenav-link-item (click)=\"onMenuItemClick(item)\">\n          <div class=\"sidenav-menu-label-container\">\n            @if (item.icon) {\n              @switch (item.iconType) {\n                @case ('svg') {\n                  <img\n                      class=\"sidenav-menu-icon\"\n                      [ngSrc]=\"item.icon\"\n                      alt=\"{{ item.label }} Path\"\n                      width=\"24\"\n                      height=\"24\"\n                      priority>\n                }\n                @case ('material') {\n                  <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n                    {{ item.icon }}\n                  </mat-icon>\n                }\n              }\n            }\n            <span class=\"sidenav-menu-label\">{{ item.label }}</span>\n            <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n              chevron_right\n            </mat-icon>\n            @if (item.badge) {\n              <span [class]=\"`sidenav-menu-badge ${item.badgeColor}`\">{{ item.badge }}</span>\n            }\n          </div>\n        </ngx-sidenav-link-item>\n      } @else {\n        <ngx-sidenav-link-item (click)=\"onBack()\" [isTitle]=\"true\">\n          <div class=\"sidenav-menu-title-container\">\n            @if (item.icon) {\n              @switch (item.iconType) {\n                @case ('svg') {\n                  <img\n                      class=\"sidenav-menu-icon\"\n                      [ngSrc]=\"item.icon\"\n                      alt=\"{{ item.label }} Path\"\n                      width=\"24\"\n                      height=\"24\"\n                      priority>\n                }\n                @case ('material') {\n                  <mat-icon role=\"img\" class=\"material-symbols-outlined\">\n                    {{ item.icon }}\n                  </mat-icon>\n                }\n              }\n            }\n            <span class=\"sidenav-menu-title\">{{ item.label }}</span>\n          </div>\n        </ngx-sidenav-link-item>\n      }\n    </li>\n  }\n</ul>\n","import { Component, HostBinding, HostListener, inject, input, OnInit, output, viewChild } from '@angular/core';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { ContentAreaDirective } from '../../directives/content-area/content-area.directive';\nimport { SidenavService } from '../../services/sidenav/sidenav.service';\nimport { SidenavMenu } from '../sidenav-menu/sidenav-menu';\n\n@Component({\n  selector: 'ngx-sidenav',\n  imports: [ContentAreaDirective, SidenavMenu, MatIconModule, MatTooltipModule],\n  templateUrl: './sidenav.html',\n  styleUrl: './sidenav.scss',\n})\nexport class Sidenav implements OnInit {\n  // ! === Private Services ===\n  private readonly _sidenav = inject(SidenavService);\n\n  // ? === Public inputs signals ===\n  readonly collapseWidth = input<number>(this._sidenav.COLLAPSE_WIDTH); // Minimum width for collapse\n  readonly minWidth = input<number>(this._sidenav.minWidth()); // Minimum width for sidenav\n  readonly maxWidth = input<number>(this._sidenav.maxWidth()); // Maximum width for sidenav\n  readonly initialWidth = input<number>(this._sidenav.INITIAL_WIDTH); // Initial width for sidenav\n  readonly clearCacheOnReload = input<boolean>(false); // Clear cache on reload\n  readonly position = input<'left' | 'right'>('left');\n  readonly direction = input<'ltr' | 'rtl'>('ltr'); // RTL support\n  readonly backdrop = input<boolean>(false); // Backdrop support\n  readonly canCollapse = input<boolean>(true); // Allow collapsing\n  readonly canResize = input<boolean>(true); // Allow resizing\n  readonly menuIconCollapse = input<string>('menu_open'); // Icon for collapsed menu\n  readonly menuIconExpand = input<string>('menu'); // Icon for expanded menu\n\n  // ? === Public output signals ===\n  readonly opened = output<void>();\n  readonly closed = output<void>();\n  readonly resized = output<number>();\n\n  // ! === Private view children ===\n  readonly sidenavContentArea = viewChild(ContentAreaDirective);\n\n  // * === Protected computed signals ===\n  protected readonly currentMenu = this._sidenav.currentMenu;\n  protected resizingEvent = {\n    isResizing: false,\n    startingCursorX: 0,\n    startingWidth: 0,\n  };\n\n  // ! === Private reactive signals ===\n  readonly #expanded = this._sidenav.isExpanded;\n  readonly #width = this._sidenav.sidenavWidth;\n\n  ngOnInit() {\n    const sidenavContentArea = this.sidenavContentArea();\n    if (!sidenavContentArea) throw new Error('Sidenav content area is not defined');\n\n    this._sidenav.setDynamicContentArea(sidenavContentArea);\n    this._sidenav.setConfig({\n      minWidth: this.minWidth(),\n      maxWidth: this.maxWidth(),\n      initialWidth: this.initialWidth(),\n    });\n\n    const rootItems = this.currentMenu()?.items ?? [];\n    this._sidenav.restoreStackHybrid(rootItems); // 👈 key line\n\n    this.#updateSidenavVariables(); // Set initial CSS variables for better reactivity\n\n    this.#clearSidenavCache();\n  }\n\n  /**\n   * Getter method to determine if resizing is in progress.\n   *\n   * @return {boolean} Returns true if a resizing event is currently active, false otherwise.\n   */\n  @HostBinding('class.resizing')\n  get isResizing(): boolean {\n    return this.resizingEvent.isResizing;\n  }\n\n  /**\n   * Determines if the element is in an expanded state by invoking the `expanded` method.\n   *\n   * @return {boolean} Returns true if the element is expanded, otherwise false.\n   */\n  @HostBinding('class.is-expanded')\n  get isExpanded(): boolean {\n    return this.#expanded();\n  }\n\n  /**\n   * Retrieves the dynamic width of the host element based on the sidenav service\n   * and the component's expanded or collapsed state.\n   *\n   * @return {string} The calculated width of the host element as a string, e.g., \"250 px\" or a CSS variable value.\n   */\n  @HostBinding('style.width')\n  get hostWidth(): string {\n    // Always use the width from the service for reactivity\n    const width = this.#width();\n    return this.isExpanded\n      ? `${ width }px`\n      : 'var(--sidenav-collapsed-width, 56px)';\n  }\n\n  /**\n   * Determines if the sidenav is positioned to the right.\n   *\n   * @return {boolean} Returns true if the sidenav's position is 'right', false otherwise.\n   */\n  @HostBinding('class.sidenav-right')\n  get isRight(): boolean {\n    return this.position() === 'right';\n  }\n\n  /**\n   * Updates the width of the sidenav during a resize operation based on mouse movement.\n   *\n   * @param {MouseEvent} event The mouse event containing the current position of the cursor.\n   * @return {void}\n   */\n  @HostListener('window:mousemove', ['$event'])\n  updateSidenavWidth(event: MouseEvent): void {\n    if (!this.resizingEvent.isResizing) return;\n    const cursorDeltaX = event.clientX - this.resizingEvent.startingCursorX;\n    const newWidth = this.resizingEvent.startingWidth + cursorDeltaX;\n    this.#calculateSidenavWidth(newWidth);\n  }\n\n  /**\n   * Stops the resizing action and resets the cursor style when the mouse button is released.\n   *\n   * @return {void} Does not return a value.\n   */\n  @HostListener('window:mouseup')\n  stopResizing(): void {\n    if (this.resizingEvent.isResizing) {\n      this.resizingEvent.isResizing = false;\n      document.body.style.cursor = '';\n    }\n  }\n\n  /**\n   * Handles the keydown events for specific elements and performs actions such as resizing a sidebar or toggling navigation.\n   *\n   * @param {KeyboardEvent} event The keyboard event triggered by the user.\n   * @return {void} Does not return a value.\n   */\n  @HostListener('keydown', ['$event'])\n  handleKeydown(event: KeyboardEvent): void {\n    if (event.target && (event.target as HTMLElement).classList.contains('resize-handle')) {\n      if (event.key === 'ArrowLeft' || event.key === 'ArrowRight') {\n        const delta = event.key === 'ArrowLeft' ? -10 : 10;\n        const newWidth = this.#width() + delta;\n        this.#calculateSidenavWidth(newWidth);\n        event.preventDefault();\n      }\n    }\n    if (event.key === 'Escape' && this.#expanded()) {\n      this.toggleNav();\n      event.preventDefault();\n    }\n  }\n\n  /**\n   * Checks the sliding orientation of the side navigation.\n   *\n   * @param {'left' | 'right'} sideNav - Specifies the side navigation position (left or right).\n   * @return {boolean} Returns true if the sliding orientation matches the specified side navigation position, otherwise false.\n   */\n  protected checkSlideOrientation(sideNav: 'left' | 'right'): boolean {\n    if (this.position() === 'right') {\n      return sideNav === 'right' ? this._sidenav.isSlidingInFromRight : this._sidenav.isSlidingInFromLeft;\n    }\n    return sideNav === 'left' ? this._sidenav.isSlidingInFromLeft : this._sidenav.isSlidingInFromRight;\n  }\n\n  /**\n   * Toggles the state of the navigation menu by opening it if it is closed or closing it if it is open.\n   * Emits an event to indicate whether the navigation menu has been opened or closed.\n   *\n   * @return {void} This method does not return a value.\n   */\n  protected toggleNav(): void {\n    this._sidenav.toggleSidenav();\n    if (this.#expanded()) {\n      this.closed.emit();\n    } else {\n      this.opened.emit();\n    }\n  }\n\n  /**\n   * Initializes the resizing process for the sidenav component when it is in an expanded state.\n   *\n   * @param {MouseEvent | TouchEvent} event - The event triggered to start resizing, can be a mouse or touch event.\n   * @return {void} This method does not return a value.\n   */\n  protected startResizing(event: MouseEvent | TouchEvent): void {\n    if (!this.isExpanded) return; // Only allow resizing when expanded\n\n    event.preventDefault();\n    event.stopPropagation();\n\n    const clientX = this.#getClientX(event);\n\n    this.resizingEvent = {\n      isResizing: true,\n      startingCursorX: clientX,\n      startingWidth: this.#width(),\n    };\n    document.body.style.cursor = 'ew-resize';\n  }\n\n  /**\n   * Updates the CSS variables related to the side navigation layout.\n   * Sets the values for collapsed width, minimum width, and maximum width\n   * dynamically using the corresponding methods for calculation.\n   *\n   * @return {void} Does not return a value.\n   */\n  #updateSidenavVariables(): void {\n    document.documentElement.style.setProperty('--sidenav-collapsed-width', `${ this.collapseWidth() }px`);\n    document.documentElement.style.setProperty('--sidenav-min-width', `${ this.minWidth() }px`);\n    document.documentElement.style.setProperty('--sidenav-max-width', `${ this.maxWidth() }px`);\n  }\n\n  /**\n   * Adjusts the sidenav width to the specified value while respecting the minimum and maximum width constraints.\n   *\n   * @param {number} newWidth The new desired width for the sidenav.\n   * @return {void} This method does not return a value.\n   */\n  #calculateSidenavWidth(newWidth: number): void {\n    const minWidth = this.minWidth() ?? parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sidenav-min-width'), 10);\n    const maxWidth = this.maxWidth() ?? parseInt(getComputedStyle(document.documentElement).getPropertyValue('--sidenav-max-width'), 10);\n\n    if (minWidth) newWidth = Math.max(minWidth, newWidth);\n    if (maxWidth) newWidth = Math.min(maxWidth, newWidth);\n\n    this._sidenav.setSidenavWidth(newWidth);\n    this.resized.emit(newWidth);\n  }\n\n  /**\n   * Clears the sidenav cache if the conditions are met.\n   * Specifically, it checks whether the cache should be cleared on reload\n   * and triggers a clear operation for the sidenav on the next reload.\n   *\n   * @return {void} No return value.\n   */\n  #clearSidenavCache(): void {\n    if (this.clearCacheOnReload()) this._sidenav.clearOnNextReload();\n  }\n\n  /**\n   * Retrieves the clientX coordinate from a MouseEvent or the first touchpoint in a TouchEvent.\n   *\n   * @param {MouseEvent | TouchEvent} event - The input event from which the clientX coordinate is extracted. Can be a MouseEvent or a TouchEvent.\n   * @return {number} The clientX coordinate of the event. If the event is a MouseEvent, returns its clientX value. If the event is a TouchEvent with at least one touchpoint, it returns the clientX value of the first touch. Returns 0 if no valid clientX value is found.\n   */\n  #getClientX(event: MouseEvent | TouchEvent): number {\n    if (event instanceof MouseEvent) {\n      return event.clientX;\n    } else if (event instanceof TouchEvent && event.touches.length > 0) {\n      return event.touches[0].clientX;\n    }\n    return 0;\n  }\n}\n","@let menu = currentMenu();\n@let resizing = resizingEvent;\n\n<!-- Enhanced Toggle Button - moved outside container to always be visible -->\n@if (menu && canCollapse()) {\n  <button\n      class=\"sidenav-toggle-btn\"\n      [class.expanded]=\"isExpanded\"\n      [class.rotated]=\"position() === 'right'\"\n      type=\"button\"\n      (click)=\"toggleNav()\"\n      [attr.aria-label]=\"'Menu Toggle Button'\"\n      tabindex=\"0\">\n    <mat-icon role=\"button\" class=\"material-symbols-outlined\">\n      {{ isExpanded ? menuIconCollapse() : menuIconExpand() }}\n    </mat-icon>\n  </button>\n}\n\n<div class=\"sidenav-container\"\n     [class.is-expanded]=\"isExpanded\"\n     [class.slide-in-from-left]=\"checkSlideOrientation('left')\"\n     [class.slide-in-from-right]=\"checkSlideOrientation('right')\"\n     [attr.dir]=\"direction()\"\n     role=\"navigation\"\n     [attr.aria-label]=\"'Side navigation'\"\n     [attr.aria-expanded]=\"isExpanded\"\n     [attr.aria-orientation]=\"position() === 'left' ? 'vertical' : 'horizontal'\"\n     [attr.aria-modal]=\"backdrop() ? isExpanded : null\"\n     [attr.tabindex]=\"isExpanded ? 0 : -1\">\n\n  <div class=\"sidenav-content\">\n    <!-- Section to load components menu -->\n    <ng-template ngxSidenavContentArea></ng-template>\n\n    <!-- Section to load items menu -->\n    @if (menu) {\n      <ngx-sidenav-menu\n          [items]=\"menu.items\"\n          [parentLabel]=\"menu.title\"\n          [parentBadge]=\"menu.badge\"\n          [parentBadgeColor]=\"menu.badgeColor\"/>\n    }\n  </div>\n</div>\n\n<!-- Optional Backdrop for modal mode -->\n@if (backdrop() && isExpanded) {\n  <div class=\"sidenav-backdrop\"\n       tabindex=\"-1\"\n       aria-hidden=\"true\"\n       (click)=\"toggleNav()\">\n  </div>\n}\n\n<!-- Enhanced Resize Handle with better icon -->\n@if (canResize()) {\n  <div class=\"resize-handle\"\n       tabindex=\"0\"\n       [class.resizing]=\"resizing.isResizing\"\n       (mousedown)=\"startResizing($event)\"\n       (touchstart)=\"startResizing($event)\"\n       [attr.aria-label]=\"'Resize navigation panel'\"\n       role=\"separator\">\n\n    <!-- Always visible resize indicator -->\n    <div class=\"resize-indicator\"></div>\n\n    @if (isExpanded) {\n      <!-- Enhanced resize icon with better styling -->\n      <div class=\"resize-icon\" matTooltip=\"Resize navigation panel\" matTooltipPosition=\"above\"\n           [matTooltipPosition]=\"position() === 'left' ? 'right' : 'left'\">\n        <svg viewBox=\"0 0 24 24\" fill=\"currentColor\">\n          <!-- Vertical grip dots pattern for better resize indication -->\n          <circle cx=\"8\" cy=\"5\" r=\"1\"/>\n          <circle cx=\"8\" cy=\"9\" r=\"1\"/>\n          <circle cx=\"8\" cy=\"13\" r=\"1\"/>\n          <circle cx=\"8\" cy=\"17\" r=\"1\"/>\n          <circle cx=\"8\" cy=\"21\" r=\"1\"/>\n\n          <circle cx=\"12\" cy=\"3\" r=\"1\"/>\n          <circle cx=\"12\" cy=\"7\" r=\"1\"/>\n          <circle cx=\"12\" cy=\"11\" r=\"1\"/>\n          <circle cx=\"12\" cy=\"15\" r=\"1\"/>\n          <circle cx=\"12\" cy=\"19\" r=\"1\"/>\n          <circle cx=\"12\" cy=\"23\" r=\"1\"/>\n\n          <circle cx=\"16\" cy=\"5\" r=\"1\"/>\n          <circle cx=\"16\" cy=\"9\" r=\"1\"/>\n          <circle cx=\"16\" cy=\"13\" r=\"1\"/>\n          <circle cx=\"16\" cy=\"17\" r=\"1\"/>\n          <circle cx=\"16\" cy=\"21\" r=\"1\"/>\n        </svg>\n      </div>\n    }\n  </div>\n}\n","/*\n * Public API Surface of code-editor\n */\n\nexport * from './src/index';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}