{"version":3,"file":"su-labs-font-size.mjs","sources":["../../../../projects/su-labs/font-size/src/lib/font-size.service.ts","../../../../projects/su-labs/font-size/src/public-api.ts","../../../../projects/su-labs/font-size/src/su-labs-font-size.ts"],"sourcesContent":["import { Injectable, signal, computed } from '@angular/core';\nimport { FontSizeConfig } from './font-size-config.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FontSizeService {\n  /**\n   * Default font size in pixels.\n   * Can be overridden via {@link configure}.\n   */\n  defaultSize = signal(14);\n\n  /**\n   * Minimum allowed font size in pixels.\n   * Can be overridden via {@link configure}.\n   */\n  minSize = signal(10);\n\n  /**\n   * Maximum allowed font size in pixels.\n   * Can be overridden via {@link configure}.\n   */\n  maxSize = signal(22);\n\n  /**\n   * Default step value (in pixels) for increase/decrease operations.\n   * Can be overridden via {@link configure} or per call in {@link increase} / {@link decrease}.\n   */\n  step = signal(2);\n\n  /**\n   * Key used for persisting the font size in localStorage.\n   * Defaults to `\"app:font-size\"`.\n   */\n  private storageKey = 'su:font-size';\n\n  /**\n   * CSS custom property name where the font size is applied.\n   * Defaults to `\"--base-font-size\"`.\n   */\n  private cssVarName = '--base-font-size';\n\n  /**\n   * Current font size state (reactive).\n   */\n  fontSize = signal<number>(this.readFromStorage());\n\n  /**\n   * True if current font size equals the default size.\n   */\n  isDefault = computed(() => this.fontSize() === this.defaultSize());\n\n  /**\n   * True if current font size equals the maximum size.\n   */\n  isMax = computed(() => this.fontSize() === this.maxSize());\n\n  /**\n   * True if current font size equals the minimum size.\n   */\n  isMin = computed(() => this.fontSize() === this.minSize());\n\n  /**\n   * Updates the configuration for font size handling.\n   * Any omitted values will fall back to their defaults.\n   *\n   * @param cfg Partial configuration object (min, max, default, step, storage key, CSS variable name).\n   */\n  configure(cfg: Partial<FontSizeConfig> = {}): void {\n    if (cfg.minSize !== undefined) this.minSize.set(cfg.minSize);\n    if (cfg.maxSize !== undefined) this.maxSize.set(cfg.maxSize);\n    if (cfg.defaultSize !== undefined) this.defaultSize.set(cfg.defaultSize);\n    if (cfg.step !== undefined) this.step.set(cfg.step);\n    if (cfg.storageKey) this.storageKey = cfg.storageKey;\n    if (cfg.cssVarName) this.cssVarName = cfg.cssVarName;\n\n    // Ensure logical invariants\n    if (this.minSize() > this.maxSize()) this.maxSize.set(this.minSize());\n    if (this.defaultSize() < this.minSize())\n      this.defaultSize.set(this.minSize());\n    if (this.defaultSize() > this.maxSize())\n      this.defaultSize.set(this.maxSize());\n    if (this.step() <= 0 || !Number.isFinite(this.step())) this.step.set(1);\n\n    // Clamp current size after configuration changes\n    this.fontSize.update((s) => this.clamp(s));\n  }\n\n  /**\n   * Initializes the font size service.\n   * Loads the persisted value (if available), clamps it,\n   * applies it to the DOM, and updates internal state.\n   * Should typically be called once at application startup.\n   */\n  init(): void {\n    const size = this.readFromStorage();\n    this.fontSize.set(this.clamp(size));\n    this.applyCssVar(this.fontSize());\n  }\n\n  /**\n   * Sets the font size to a specific value (clamped within min/max).\n   *\n   * @param size Desired font size in pixels.\n   */\n  setFontSize(size: number): void {\n    const clamped = this.clamp(size);\n    this.fontSize.set(clamped);\n    this.applyCssVar(clamped);\n    this.writeToStorage(clamped);\n  }\n\n  /**\n   * Increases the font size.\n   *\n   * @param step Optional custom step (pixels). Falls back to configured {@link step} if omitted.\n   */\n  increase(step?: number): void {\n    this.setFontSize(this.fontSize() + (step ?? this.step()));\n  }\n\n  /**\n   * Decreases the font size.\n   *\n   * @param step Optional custom step (pixels). Falls back to configured {@link step} if omitted.\n   */\n  decrease(step?: number): void {\n    this.setFontSize(this.fontSize() - (step ?? this.step()));\n  }\n\n  /**\n   * Resets the font size to the configured {@link defaultSize}.\n   * Also removes the persisted value from localStorage.\n   */\n  reset(): void {\n    const d = this.defaultSize();\n    this.fontSize.set(d);\n    this.applyCssVar(d);\n    localStorage.removeItem(this.storageKey);\n  }\n\n  /**\n   * Clamps a given value between the configured {@link minSize} and {@link maxSize}.\n   *\n   * @param size Value to clamp.\n   * @returns Clamped value within the allowed range.\n   */\n  private clamp(size: number): number {\n    return Math.min(Math.max(size, this.minSize()), this.maxSize());\n  }\n\n  /**\n   * Reads the font size from localStorage.\n   * Falls back to {@link defaultSize} if no value is stored or value is invalid.\n   *\n   * @returns Stored font size or default.\n   */\n  private readFromStorage(): number {\n    const stored = localStorage.getItem(this.storageKey);\n    const parsed = stored ? Number(stored) : this.defaultSize();\n    return Number.isFinite(parsed) ? parsed : this.defaultSize();\n  }\n\n  /**\n   * Persists the current font size in localStorage.\n   *\n   * @param size Font size value to persist.\n   */\n  private writeToStorage(size: number): void {\n    localStorage.setItem(this.storageKey, String(size));\n  }\n\n  /**\n   * Applies the current font size to the DOM\n   * using the configured CSS custom property name.\n   *\n   * @param size Font size value in pixels.\n   */\n  private applyCssVar(size: number): void {\n    document.documentElement.style.setProperty(this.cssVarName, `${size}px`);\n  }\n}\n","/*\n * Public API Surface of font-size\n */\n\nexport * from './lib/font-size.service';\nexport * from './lib/font-size-config.interface';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}