{"version":3,"file":"ngwr-media.mjs","sources":["../../../projects/lib/media/wr-breakpoints.ts","../../../projects/lib/media/wr-media.ts","../../../projects/lib/media/provide-wr-media.ts","../../../projects/lib/media/ngwr-media.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 { InjectionToken } from '@angular/core';\n\nimport type { WrBreakpointMap } from './interfaces';\n\n/** Defaults mirror `projects/lib/styles/_breakpoints.scss`. */\nexport const DEFAULT_WR_BREAKPOINTS: WrBreakpointMap = Object.freeze({\n  xs: 0,\n  sm: 576,\n  md: 768,\n  lg: 992,\n  xl: 1200,\n  xxl: 1400,\n});\n\n/** DI token for the breakpoint map — override via {@link provideWrMedia}. */\nexport const WR_BREAKPOINTS = new InjectionToken<WrBreakpointMap>('WR_BREAKPOINTS', {\n  factory: () => DEFAULT_WR_BREAKPOINTS,\n});\n\nexport type { WrBreakpoint, WrBreakpointMap } from './interfaces';\n","/**\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 { isPlatformBrowser } from '@angular/common';\nimport { DestroyRef, Service, PLATFORM_ID, type Signal, computed, inject, signal } from '@angular/core';\n\nimport { WR_BREAKPOINTS, type WrBreakpoint } from './wr-breakpoints';\n\n/**\n * Reactive viewport queries backed by signals.\n *\n * Each query subscribes lazily — `matches(...)` caches its signal so\n * repeated calls with the same query share a single `matchMedia` listener.\n * SSR-safe: on the server every signal stays `false`.\n *\n * @example\n * ```ts\n * private readonly media = inject(WrMedia);\n * protected readonly isMd = this.media.matches('md');\n * protected readonly isWide = this.media.matches('(min-width: 1200px)');\n * ```\n *\n * @see https://ngwr.dev/services/media\n */\n@Service()\nexport class WrMedia {\n  private readonly breakpoints = inject(WR_BREAKPOINTS);\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n  /** Cache of query → signal so we share `matchMedia` listeners. */\n  private readonly cache = new Map<string, Signal<boolean>>();\n\n  /** Active breakpoint key — `xs` / `sm` / `md` / `lg` / `xl` / `xxl`. */\n  readonly current = computed<WrBreakpoint>(() => {\n    // Walk from largest to smallest, return the first one that matches.\n    const ordered: readonly WrBreakpoint[] = ['xxl', 'xl', 'lg', 'md', 'sm', 'xs'];\n    for (const key of ordered) {\n      if (this.matches(key)()) return key;\n    }\n    return 'xs';\n  });\n\n  /**\n   * Returns a signal that tracks the given query.\n   *\n   * - Named breakpoint (`'md'`) → `(min-width: <px>)`.\n   * - Raw query (`'(prefers-color-scheme: dark)'`) → passed through unchanged.\n   */\n  matches(query: WrBreakpoint | (string & {})): Signal<boolean> {\n    const resolved = this.resolveQuery(query);\n    const cached = this.cache.get(resolved);\n    if (cached) return cached;\n    const sig = this.createSignal(resolved);\n    this.cache.set(resolved, sig);\n    return sig;\n  }\n\n  private resolveQuery(query: WrBreakpoint | (string & {})): string {\n    if (query in this.breakpoints) {\n      const px = this.breakpoints[query as WrBreakpoint];\n      return px === 0 ? '(min-width: 0px)' : `(min-width: ${px}px)`;\n    }\n    return query;\n  }\n\n  private createSignal(query: string): Signal<boolean> {\n    if (!this.isBrowser) return signal(false).asReadonly();\n    const mql = window.matchMedia(query);\n    const sig = signal(mql.matches);\n    const handler = (event: MediaQueryListEvent): void => sig.set(event.matches);\n    mql.addEventListener('change', handler);\n    this.destroyRef.onDestroy(() => mql.removeEventListener('change', handler));\n    return sig.asReadonly();\n  }\n}\n","/**\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 { type EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\n\nimport { DEFAULT_WR_BREAKPOINTS, WR_BREAKPOINTS, type WrBreakpointMap } from './wr-breakpoints';\n\n/**\n * Override the breakpoint map used by {@link WrMedia}. Partial maps\n * are merged with {@link DEFAULT_WR_BREAKPOINTS}, so you only need to list\n * the breakpoints you want to change.\n *\n * @example\n * ```ts\n * bootstrapApplication(AppComponent, {\n *   providers: [provideWrMedia({ md: 720, lg: 1024 })],\n * });\n * ```\n */\nexport function provideWrMedia(breakpoints: Partial<WrBreakpointMap> = {}): EnvironmentProviders {\n  const merged: WrBreakpointMap = { ...DEFAULT_WR_BREAKPOINTS, ...breakpoints };\n  return makeEnvironmentProviders([{ provide: WR_BREAKPOINTS, useValue: merged }]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}