{"version":3,"file":"talenra-ngx-base-content-layout.mjs","sources":["../../../projects/ngx-base/content-layout/src/content-layout/content-layout.service.ts","../../../projects/ngx-base/content-layout/src/content-layout/content-layout.component.ts","../../../projects/ngx-base/content-layout/src/content-layout/content-layout.component.html","../../../projects/ngx-base/content-layout/src/sticky-bar/sticky-bar.component.ts","../../../projects/ngx-base/content-layout/src/sticky-bar/sticky-bar.component.html","../../../projects/ngx-base/content-layout/talenra-ngx-base-content-layout.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\n\n/**\n * Service to manage the state of the Content Layout component.\n *\n * The service grants access to Content Layout's Scroll Container which allows consumers to interact with the native\n * scroll element. We might extend the service in the future to provide additional functionality if we have appropriate\n * use cases.\n *\n * Currently the service is intended for internal use only and thus not mentioned in the API docs.\n *\n * @internal\n */\n@Injectable()\nexport class ContentLayoutService {\n  /** Internal: Scroll Container reference. Is set by Content Layout. Read-only access is provided to consumers. */\n  private readonly _scrollContainer = signal<ScrollContainerComponent | null>(null);\n\n  /**\n   * Scroll Container reference. Allows access to the native scroll element.\n   *\n   * ```typescript\n   * const service: ContentLayoutService = inject(ContentLayoutService);\n   * console.log(`scrollTop: ${service.scrollContainer()?.scrollElement.scrollTop}`);\n   * ```\n   */\n  public readonly scrollContainer = this._scrollContainer.asReadonly();\n\n  /**\n   * Set Scroll Container reference. Hidden from API docs as this is handled by ContentLayoutComponent exclusively.\n   *\n   * @internal\n   */\n  public setScrollContainer(scrollContainer: ScrollContainerComponent): void {\n    this._scrollContainer.set(scrollContainer);\n  }\n\n  /** Internal: Determines whether Content Layout content has vertical scroll offset */\n  private readonly _hasScroll = signal<boolean>(false);\n\n  /** Determines whether Content Layout content has vertical scroll offset */\n  public readonly hasScroll = this._hasScroll.asReadonly();\n\n  /**\n   * Set hasScroll property's value. Hidden from API docs as this is handled by ContentLayoutComponent exclusively.\n   *\n   * @internal\n   */\n  public setHasScroll(value: boolean): void {\n    this._hasScroll.set(value);\n  }\n}\n","import {\n  AfterViewInit,\n  Component,\n  ElementRef,\n  Input,\n  OnChanges,\n  OnDestroy,\n  Renderer2,\n  RendererFactory2,\n  ViewChild,\n  booleanAttribute,\n  inject,\n  output,\n  viewChild,\n} from '@angular/core';\nimport { asapScheduler } from 'rxjs';\nimport { ScrollContainerComponent } from '@talenra/ngx-base/scroll-container';\nimport { deprecationWarning } from '@talenra/ngx-base/dev-kit';\nimport { ContentLayoutService } from './content-layout.service';\n\n/**\n * Helper function used in component's metadata. Returns the service provided by a parent component, or a new instance\n * if it is not provided.\n *\n * @internal\n */\nconst contentLayoutServiceFactory = () => {\n  const service: ContentLayoutService | null = inject(ContentLayoutService, { optional: true, skipSelf: true });\n  return service || new ContentLayoutService();\n};\n\n/**\n * Controls the vertical layout of your content. Is typically combined with a workspace-layout\n * that controls the horizontal layout.\n *\n * - Adds scrolling if the content exceeds the container height.\n * - Supports a header section with an optional \"overscroll\" effect\n * - Supports an optional sticky bar (e.g. a toolbar)\n * - Supports an optional sticky footer (e.g. buttons)\n *\n * @see {@link WorkspaceLayoutSimpleComponent} and {@link WorkspaceLayoutSidepanelComponent}\n * for examples on how to use content-layout in combination with a workspace-layout.\n *\n * ```html\n * <!-- A minimal example using StickyBar component -->\n * <talenra-content-layout>\n *   <div header>My header</div>\n *   <!-- StickyBar component handles styling and acts as a wrapper for your content. -->\n *   <talenra-sticky-bar sticky-bar>My toolbar</talenra-sticky-bar>\n *   <div>My content</div>\n *   <div sticky-footer>My footer bar</div>\n * </talenra-content-layout>\n * ```\n *\n * ```html\n * <!-- A minimal example using custom sticky bar -->\n * <talenra-content-layout>\n *   <div header>My header</div>\n *   <!-- Custom sticky bar -->\n *   <aside sticky-bar>My toolbar</aside>\n *   <div>My content</div>\n *   <div sticky-footer>My footer bar</div>\n * </talenra-content-layout>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { ContentLayoutModule } from '@talenra/ngx-base/content-layout';\n * ```\n *\n * <example-url>../../#/content-control/content-layout</example-url>\n */\n@Component({\n  selector: 'talenra-content-layout',\n  templateUrl: './content-layout.component.html',\n  styleUrls: ['./content-layout.component.scss'],\n  host: {\n    '[class]': 'hostClass',\n  },\n  imports: [ScrollContainerComponent],\n  providers: [{ provide: ContentLayoutService, useFactory: contentLayoutServiceFactory }],\n})\nexport class ContentLayoutComponent implements AfterViewInit, OnDestroy, OnChanges {\n  /**\n   * Determines whether the layout uses a header element. The header element is injected using content projection: Place\n   * it the component's content and mark it with the `header` attribute.\n   *\n   * ```html\n   * <!-- As `useHeader` defaults `true`, you could safely omit the input in this case. -->\n   * <talenra-content-layout useHeader>\n   *   <div header>My header</div>\n   * </talenra-content-layout>\n   */\n  @Input({ transform: booleanAttribute }) public useHeader = true;\n\n  /**\n   * Determines whether the layout uses a sticky bar element. The sticky bar element is injected using content\n   * projection: Place it the component's content and mark it with the `sticky-bar` attribute.\n   *\n   * The following class names are added/removed to the sticky bar element depending of ContentLayout's state:\n   * - `no-header`: ContentLayout does not use a header (useHeader = false)\n   * - `header-reduced`: Header is reduced (overscrolled by content)\n   * - `content-scrolled`: Content has scroll-offset\n   *\n   * @example\n   * <!-- As `useStickyBar` defaults `true`, you could safely omit the input in this case. -->\n   * <talenra-content-layout useStickyBar>\n   *   <div sticky-bar>My sticky bar</div>\n   * </talenra-content-layout>\n   */\n  @Input({ transform: booleanAttribute }) public useStickyBar = true;\n\n  /**\n   * Determines whether the layout uses a sticky footer element. The sticky footer element is\n   * injected using content projection: Place it the component's content and mark\n   * it with the `sticky-footer` attribute.\n   *\n   * @example\n   * <!-- As `useStickyFooter` defaults `true`, you could safely omit the input in this case. -->\n   * <talenra-content-layout useStickyFooter>\n   *   <div sticky-footer>My sticky footer</div>\n   * </talenra-content-layout>\n   */\n  @Input({ transform: booleanAttribute }) public useStickyFooter = true;\n\n  /**\n   * Determines whether the content is allowed to take the full height and to cover the\n   * header when scrolled.\n   *\n   * @example\n   * <talenra-content-layout overscrollHeader>\n   *   <div header>My header</div>\n   *   <div>My scrollable Content</div>\n   * </talenra-content-layout>\n   */\n  @Input({ transform: booleanAttribute }) public overscrollHeader = true;\n\n  /**\n   * Determines whether the header is currently in reduced mode (overscrolled by content).\n   *\n   * @internal\n   */\n  public headerReduced = false;\n\n  /**\n   * Threshold for triggering overscroll behaviour.\n   *\n   * @see {ScrollContainerBehaviour}\n   *\n   * @internal\n   */\n  public scrollYThreshold = 1;\n\n  private observers: ResizeObserver[] = [];\n\n  /**\n   * Stored heights for relevant elements\n   */\n  private heights = { content: 0, header: 0, host: 0, stickyBar: 0, stickyFooter: 0 };\n\n  /**\n   * Determines whether to use transitions for UI updates. Is initially disabled to prevent flickering.\n   */\n  private useTransition = false;\n\n  /**\n   * Emits the height of the header whenever it is updated. This is useful for cases where the layout depends on the\n   * header height and cannot be handled using CSS.\n   *\n   * @deprecated\n   */\n  public headerHeightChange = output<number>();\n\n  /**\n   * Class names applied to the host element.\n   */\n  private hostClass = '';\n\n  @ViewChild('header') private headerRef?: ElementRef;\n  @ViewChild('content') private contentRef?: ElementRef;\n  @ViewChild('stickyBar') private stickyBarRef?: ElementRef;\n  @ViewChild('stickyFooter') private stickyFooterRef?: ElementRef;\n\n  private renderer: Renderer2;\n\n  /** Scroll Container reference */\n  private scrollContainer = viewChild.required(ScrollContainerComponent);\n\n  /** Content Layout Service reference. */\n  private service: ContentLayoutService = inject(ContentLayoutService);\n\n  private hostRef = inject(ElementRef);\n\n  /** @internal */\n  constructor() {\n    const renderFactory = inject(RendererFactory2);\n    this.renderer = renderFactory.createRenderer(null, null);\n    setTimeout(() => {\n      // Shaky workaround to throw a warning if deprecated `headerHeightChange` has subscribers. Better ideas welcome!\n      if (this.headerHeightChange['listeners']?.length >= 1)\n        deprecationWarning({\n          submodule: 'content-layout',\n          className: this.constructor.name,\n          member: 'Event `headerHeightChange`',\n          instructions:\n            'Please get in touch with us if you think we should keep support for `headerHeightChange` event.',\n        });\n    }, 100);\n  }\n\n  /** @internal */\n  ngAfterViewInit(): void {\n    const elements = [\n      { name: 'header', ref: this.headerRef },\n      { name: 'content', ref: this.contentRef },\n      { name: 'host', ref: this.hostRef },\n      { name: 'stickyBar', ref: this.stickyBarRef },\n      { name: 'stickyFooter', ref: this.stickyFooterRef },\n    ];\n    for (const element of elements) {\n      const observer: ResizeObserver = new ResizeObserver((entries) => {\n        const childElement: Element | null = entries[0].target.firstElementChild;\n        let verticalMargin = childElement ? parseInt(getComputedStyle(childElement)['marginBottom']) || 0 : 0;\n        verticalMargin += childElement ? parseInt(getComputedStyle(childElement)['marginTop']) || 0 : 0;\n        this.updateHeight(element.name, entries[0].contentRect.height + verticalMargin);\n      });\n      element.ref && observer.observe(element.ref.nativeElement);\n      this.observers.push(observer);\n    }\n    // Set the service's scrollContainer reference to the current instance\n    this.service.setScrollContainer(this.scrollContainer());\n  }\n\n  /** @internal */\n  ngOnDestroy(): void {\n    for (const observer of this.observers) {\n      observer.disconnect();\n    }\n  }\n\n  /** @internal */\n  ngOnChanges(): void {\n    this.onScrollOffsetY(this.service.hasScroll());\n  }\n\n  /**\n   * Updates the stored element heights whenever they change. Enables UI transitions after the very first trigger.\n   */\n  private updateHeight(property: string, value: number): void {\n    this.heights = { ...this.heights, [property]: value };\n    // Emit height for header\n    property === 'header' && this.headerHeightChange.emit(value);\n    // Activate transition when headerHeight is received for the first time.\n    // Activation is slightly delayed to prevent transition when initially setting headerHeight.\n    !this.useTransition &&\n      asapScheduler.schedule(() => {\n        this.useTransition = true;\n      });\n  }\n\n  /**\n   * Triggered whenever input properties are updated or the content scroll-offset changes. Will update the layout\n   * parameters.\n   */\n  protected onScrollOffsetY(hasScroll: boolean): void {\n    this.service.setHasScroll(hasScroll);\n    const overscrollThreshold: number =\n      this.heights.host +\n      this.scrollYThreshold -\n      (this.useHeader && !this.overscrollHeader ? this.heights.header : 0) -\n      (this.useStickyBar ? this.heights.stickyBar : 0) -\n      (this.useStickyFooter ? this.heights.stickyFooter : 0);\n    this.headerReduced =\n      this.overscrollHeader && this.useHeader && this.heights.content > overscrollThreshold && this.service.hasScroll();\n    this.hostClass = [\n      this.useHeader ? 'use-header' : 'no-header',\n      this.useStickyBar ? 'use-stickybar' : 'no-stickybar',\n      this.headerReduced ? 'header-reduced' : '',\n      this.service.hasScroll() ? 'content-scrolled' : '',\n      this.useTransition ? 'use-transition' : '',\n    ]\n      .filter((item) => item)\n      .join(' ');\n    this.updateContentElements();\n  }\n\n  /**\n   * Add/remove class-names to/from sticky bar. Simplifies styling of sticky bar elements for consuming apps.\n   */\n  private updateContentElements(): void {\n    // Gard: Exit if the element does not exist or does not take class-names\n    if (!this.stickyBarRef?.nativeElement.firstChild?.classList) return;\n    // List of class-names along with a boolean value that determines whether to add or remove the class-name\n    const classNames: { className: string; value: boolean }[] = [\n      { className: 'no-header', value: !this.useHeader },\n      { className: 'header-reduced', value: this.headerReduced },\n      { className: 'content-scrolled', value: this.service.hasScroll() },\n    ];\n    // Finally add/remove class-names\n    classNames.forEach((item) => {\n      item.value\n        ? this.renderer.addClass(this.stickyBarRef?.nativeElement.firstChild, item.className)\n        : this.renderer.removeClass(this.stickyBarRef?.nativeElement.firstChild, item.className);\n    });\n  }\n\n  /**\n   * Workaround for transitions: As we cannot use CSS transitions with `height: auto`, we set the height (or the\n   * max-height) explicitly.\n   *\n   * TODO: Check if we can use CSS grid-template-rows: 0/1fr instead (s. AppSidenavComponent for example)\n   *\n   * @internal\n   */\n  public headerStyle() {\n    return !this.useTransition\n      ? {}\n      : {\n          maxHeight: `${this.headerReduced || !this.useHeader ? 0 : this.heights.header}px`,\n        };\n  }\n}\n","<div class=\"header\" [style]=\"headerStyle()\">\n  <div #header>\n    <ng-content select=\"[header]\" />\n  </div>\n</div>\n<div class=\"sticky\">\n  @if (useStickyBar) {\n    <div #stickyBar>\n      <ng-content select=\"[sticky-bar]\" />\n    </div>\n  }\n</div>\n<div class=\"content\">\n  <talenra-scroll-container\n    class=\"scroll-container\"\n    useOffset\n    [scrollYThreshold]=\"scrollYThreshold\"\n    (updatedScrollYOffset)=\"onScrollOffsetY($event)\">\n    <div #content>\n      <ng-content />\n    </div>\n  </talenra-scroll-container>\n</div>\n<div class=\"sticky\">\n  @if (useStickyFooter) {\n    <div #stickyFooter>\n      <ng-content select=\"[sticky-footer]\" />\n    </div>\n  }\n</div>\n","import { Component } from '@angular/core';\n\n/**\n * StickyBar is used with ContentLayout's sticky bar. It wraps the content of the sticky bar and takes care of styling.\n *\n * ```html\n * <talenra-content-layout [...]>\n *   <talenra-workspace-header [...] header></talenra-workspace-header>\n *   <talenra-sticky-bar sticky-bar><!-- Sticky bar content --></talenra-sticky-bar>\n *   <article>Main content</article>\n *   <div sticky-footer><!-- Sticky footer content --></div>\n * </talenra-content-layout>\n * ```\n *\n * ### Import\n *\n * ```typescript\n * import { StickyBarComponent } from '@talenra/ngx-base/content-layout';\n * ```\n *\n * <example-url>../../#/content-control/content-layout</example-url>\n */\n@Component({\n  selector: 'talenra-sticky-bar',\n  templateUrl: './sticky-bar.component.html',\n  styleUrls: ['./sticky-bar.component.scss'],\n})\nexport class StickyBarComponent {}\n","<ng-content />\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}