{"version":3,"file":"ngwr-scroll.mjs","sources":["../../../projects/lib/scroll/wr-scroll.ts","../../../projects/lib/scroll/ngwr-scroll.ts"],"sourcesContent":["/**\n * @license\n *\n * Use of this source code is governed by an MIT-style license that can be\n * found in the LICENSE file at https://github.com/thekhegay/ngwr/blob/main/LICENSE\n */\n\nimport { DOCUMENT } from '@angular/common';\nimport { Service, inject } from '@angular/core';\n\nimport { WrPlatform } from 'ngwr/platform';\n\nimport type { WrScrollOptions, WrScrollTarget } from './interfaces';\n\n/**\n * Smooth-scroll utility. Resolves `id` / selector / element / coords\n * targets; subtracts an `offset` (for sticky headers); respects\n * `prefers-reduced-motion` — automatically falls back to instant\n * scrolling when the user has opted out.\n *\n * SSR-safe — all methods no-op on the server.\n *\n * @example\n * ```ts\n * const scroll = inject(WrScroll);\n * scroll.to('#section-three', { offset: 80 });\n * scroll.toTop({ smooth: false });\n * scroll.intoView(myEl, { offset: 64 });\n * ```\n *\n * @see https://ngwr.dev/services/scroll\n */\n@Service()\nexport class WrScroll {\n  private readonly doc = inject(DOCUMENT);\n  private readonly platform = inject(WrPlatform);\n\n  /** Scroll to an arbitrary target. */\n  to(target: WrScrollTarget, options: WrScrollOptions = {}): void {\n    if (!this.platform.isBrowser) return;\n    const win = this.doc.defaultView;\n    if (!win) return;\n\n    const offset = options.offset ?? 0;\n    const behavior = this.behavior(options.smooth);\n    const container = options.container ?? win;\n\n    if (typeof target === 'object' && 'top' in target) {\n      this.scroll(container, { top: target.top - offset, left: target.left ?? 0, behavior });\n      return;\n    }\n\n    const el = typeof target === 'string' ? this.resolveSelector(target) : target;\n    if (!el) return;\n\n    const rect = el.getBoundingClientRect();\n    if (container === win) {\n      const top = rect.top + win.scrollY - offset;\n      this.scroll(container, { top, left: 0, behavior });\n    } else {\n      const ctx = container as Element;\n      const ctxRect = ctx.getBoundingClientRect();\n      const top = rect.top - ctxRect.top + ctx.scrollTop - offset;\n      this.scroll(container, { top, left: 0, behavior });\n    }\n  }\n\n  /** Convenience for an element — accepts the same options. */\n  intoView(el: Element, options: WrScrollOptions = {}): void {\n    this.to(el, options);\n  }\n\n  /** Scroll the page (or container) to the top. */\n  toTop(options: WrScrollOptions = {}): void {\n    this.to({ top: 0 }, options);\n  }\n\n  // Internals\n\n  private resolveSelector(value: string): Element | null {\n    if (value.startsWith('#')) {\n      return this.doc.getElementById(value.slice(1));\n    }\n    try {\n      return this.doc.querySelector(value);\n    } catch {\n      return null;\n    }\n  }\n\n  private behavior(requested: boolean | undefined): ScrollBehavior {\n    if (requested === false) return 'auto';\n    if (this.platform.prefersReducedMotion()) return 'auto';\n    return 'smooth';\n  }\n\n  private scroll(container: Window | Element, options: ScrollToOptions): void {\n    if (container instanceof Window) container.scrollTo(options);\n    else container.scrollTo(options);\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}