{"version":3,"file":"ngwr-statistic.mjs","sources":["../../../projects/lib/statistic/statistic.ts","../../../projects/lib/statistic/statistic.html","../../../projects/lib/statistic/statistic-countdown.ts","../../../projects/lib/statistic/statistic-countdown.html","../../../projects/lib/statistic/ngwr-statistic.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 { coerceBooleanProperty, coerceNumberProperty } from '@angular/cdk/coercion';\nimport {\n  Component,\n  LOCALE_ID,\n  ViewEncapsulation,\n  computed,\n  effect,\n  inject,\n  input,\n  signal,\n  untracked,\n} from '@angular/core';\n\nimport { WrCountUp } from 'ngwr/counter';\nimport { WrPlatform } from 'ngwr/platform';\nimport { numAttr } from 'ngwr/utils';\n\n/**\n * KPI card — label + big number + optional prefix/suffix + delta. Pair\n * with a layout grid for dashboards.\n *\n * When `value` is numeric the number counts up (eased) from its previous\n * value to the new one on every change — see `animate`. String values and\n * `prefers-reduced-motion` render instantly.\n *\n * @example\n * ```html\n * <wr-statistic label=\"Active users\" [value]=\"12345\" suffix=\"users\" />\n * <wr-statistic label=\"Revenue\" [value]=\"9512\" prefix=\"$\" [delta]=\"12.4\" />\n * <wr-statistic label=\"Churn\" [value]=\"1.8\" suffix=\"%\" [precision]=\"1\" />\n * ```\n *\n * @see https://ngwr.dev/components/statistic\n */\n@Component({\n  selector: 'wr-statistic',\n  templateUrl: './statistic.html',\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'wr-statistic' },\n  imports: [WrCountUp],\n})\nexport class WrStatistic {\n  private readonly platform = inject(WrPlatform);\n  private readonly locale = inject(LOCALE_ID);\n\n  readonly label = input<string>('');\n\n  /** The number (or string) to display in the main slot. */\n  readonly value = input<number | string | null>(null);\n\n  /** Prefix glyph / symbol (e.g. `'$'`). */\n  readonly prefix = input<string>('');\n\n  /** Suffix glyph / unit (e.g. `'%'`, `'kg'`). */\n  readonly suffix = input<string>('');\n\n  /** Fixed number of decimals applied to numeric values. @default 0 */\n  readonly precision = input(0, { transform: (v: unknown): number => Math.max(0, coerceNumberProperty(v, 0)) });\n\n  /**\n   * Count up to a new numeric `value` instead of swapping instantly. Always\n   * off for string values or under `prefers-reduced-motion`. @default true\n   */\n  readonly animate = input(true, { transform: coerceBooleanProperty });\n\n  /** Count-up duration (ms). @default 700 */\n  readonly duration = input(700, { transform: numAttr(700) });\n\n  /**\n   * The current value coerced to a finite number, or `null` when `value` is\n   * a non-numeric string / empty / nullish (rendered as-is).\n   */\n  protected readonly numericValue = computed<number | null>(() => {\n    const raw = this.value();\n    if (raw === null || raw === '') return null;\n    const n = typeof raw === 'number' ? raw : coerceNumberProperty(raw, Number.NaN);\n    return Number.isFinite(n) ? n : null;\n  });\n\n  /** Whether the value should count up (browser, numeric, opted-in, motion allowed). */\n  protected readonly animated = computed<boolean>(\n    () =>\n      this.platform.isBrowser && this.animate() && !this.platform.prefersReducedMotion() && this.numericValue() !== null\n  );\n\n  /** Animation start — the previously-rendered numeric value (0 on first paint). */\n  protected readonly animateFrom = signal(0);\n\n  /** Bookkeeping: the last numeric value seen, fed back as the next `from`. */\n  private readonly lastNumeric = signal(0);\n\n  constructor() {\n    // Whenever the numeric value changes, snapshot the prior value as the\n    // count-up start, then remember the new one for the next transition.\n    effect(() => {\n      const next = this.numericValue();\n      if (next === null) return;\n      untracked(() => {\n        this.animateFrom.set(this.lastNumeric());\n        this.lastNumeric.set(next);\n      });\n    });\n  }\n\n  /**\n   * Static (non-animated) display string. Numeric values honour `precision`\n   * and locale grouping so they match the count-up output; everything else\n   * renders verbatim with an em-dash fallback.\n   */\n  protected readonly displayValue = computed<string>(() => {\n    const n = this.numericValue();\n    if (n !== null) {\n      return new Intl.NumberFormat(this.locale, {\n        minimumFractionDigits: this.precision(),\n        maximumFractionDigits: this.precision(),\n      }).format(n);\n    }\n    return String(this.value() ?? '—');\n  });\n\n  /**\n   * Optional delta vs previous period — shown as `+x.x%` (or `-x.x%`).\n   * Use `deltaSuffix` to change the trailing unit.\n   */\n  readonly delta = input<number | null>(null, {\n    transform: (v: unknown): number | null => {\n      if (v === null || v === undefined || v === '') return null;\n      const n = coerceNumberProperty(v, Number.NaN);\n      return Number.isFinite(n) ? n : null;\n    },\n  });\n\n  /** Unit appended to the delta value. @default '%' */\n  readonly deltaSuffix = input<string>('%');\n\n  protected readonly hasDelta = computed(() => this.delta() !== null);\n\n  protected readonly deltaDirection = computed<'up' | 'down' | 'flat'>(() => {\n    const d = this.delta();\n    if (d === null || d === 0) return 'flat';\n    return d > 0 ? 'up' : 'down';\n  });\n\n  protected readonly deltaText = computed(() => {\n    const d = this.delta();\n    if (d === null) return '';\n    const sign = d > 0 ? '+' : '';\n    return `${sign}${d}${this.deltaSuffix()}`;\n  });\n}\n","@if (label()) {\n  <div class=\"wr-statistic__label\">{{ label() }}</div>\n}\n<div class=\"wr-statistic__value\">\n  @if (prefix()) {\n    <span class=\"wr-statistic__prefix\">{{ prefix() }}</span>\n  }\n  @if (animated()) {\n    <wr-count-up\n      class=\"wr-statistic__number\"\n      [from]=\"animateFrom()\"\n      [to]=\"numericValue() ?? 0\"\n      [decimals]=\"precision()\"\n      [duration]=\"duration()\"\n    />\n  } @else {\n    <span class=\"wr-statistic__number\">{{ displayValue() }}</span>\n  }\n  @if (suffix()) {\n    <span class=\"wr-statistic__suffix\">{{ suffix() }}</span>\n  }\n</div>\n@if (hasDelta()) {\n  <div [class]=\"`wr-statistic__delta wr-statistic__delta--${deltaDirection()}`\">\n    @if (deltaDirection() === 'up') {\n      <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n        <path d=\"M5 1 L9 8 L1 8 Z\" fill=\"currentColor\" />\n      </svg>\n    } @else if (deltaDirection() === 'down') {\n      <svg width=\"10\" height=\"10\" viewBox=\"0 0 10 10\" aria-hidden=\"true\">\n        <path d=\"M5 9 L9 2 L1 2 Z\" fill=\"currentColor\" />\n      </svg>\n    }\n    <span>{{ deltaText() }}</span>\n  </div>\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 { isPlatformBrowser } from '@angular/common';\nimport {\n  Component,\n  DestroyRef,\n  PLATFORM_ID,\n  ViewEncapsulation,\n  afterNextRender,\n  computed,\n  effect,\n  inject,\n  input,\n  output,\n  signal,\n} from '@angular/core';\n\n// Helpers\n\nfunction toMs(value: Date | string | number): number {\n  if (value instanceof Date) return value.getTime();\n  if (typeof value === 'number') return value;\n  return new Date(value).getTime();\n}\n\nfunction pad(n: number, width: number): string {\n  return String(n).padStart(width, '0');\n}\n\nfunction formatRemaining(ms: number, fmt: string): string {\n  const days = Math.floor(ms / 86_400_000);\n  const hours = Math.floor((ms % 86_400_000) / 3_600_000);\n  const minutes = Math.floor((ms % 3_600_000) / 60_000);\n  const seconds = Math.floor((ms % 60_000) / 1000);\n  const millis = ms % 1000;\n  // Single-pass tokenizer so we never re-scan output for tokens. The\n  // previous sequential `.replace()` chain leaked: e.g. `D days HH:mm:ss`\n  // → `1 day42 11:59:42` because the `/s/g` step at the end re-matched\n  // the literal `s` inside `days`. Longest-token-first ordering inside\n  // the alternation handles `DD`>`D`, `HH`>`H`, `mm`>`m`, `SSS`>`ss`>`s`.\n  return fmt.replace(/(?<![A-Za-z])(?:SSS|DD|HH|mm|ss|D|H|m|s)(?![A-Za-z])/g, token => {\n    switch (token) {\n      case 'DD':\n        return pad(days, 2);\n      case 'D':\n        return String(days);\n      case 'HH':\n        return pad(hours, 2);\n      case 'H':\n        return String(hours);\n      case 'mm':\n        return pad(minutes, 2);\n      case 'm':\n        return String(minutes);\n      case 'ss':\n        return pad(seconds, 2);\n      case 's':\n        return String(seconds);\n      case 'SSS':\n        return pad(millis, 3);\n      default:\n        return token;\n    }\n  });\n}\n\n/**\n * Live-counting variant of `<wr-statistic>` that targets a future date\n * and ticks down to zero. The format string uses Day/Hour/Minute/Second\n * tokens (`D`, `H`, `m`, `s`, double for zero-padded, plus `SSS` for\n * milliseconds).\n *\n * @example\n * ```html\n * <wr-statistic-countdown\n *   label=\"Launch in\"\n *   [target]=\"launchDate\"\n *   format=\"D days HH:mm:ss\"\n *   (countdownEnd)=\"onLive()\"\n * />\n * ```\n *\n * @see https://ngwr.dev/components/statistic\n */\n@Component({\n  selector: 'wr-statistic-countdown',\n  templateUrl: './statistic-countdown.html',\n  encapsulation: ViewEncapsulation.None,\n  host: { class: 'wr-statistic' },\n})\nexport class WrStatisticCountdown {\n  /** Target date / timestamp the countdown is running down to. */\n  readonly target = input.required<Date | string | number>();\n\n  /** Label rendered above the value. */\n  readonly label = input<string>('');\n\n  /**\n   * Format string. Tokens: `D`/`DD` (days), `H`/`HH` (hours),\n   * `m`/`mm` (minutes), `s`/`ss` (seconds), `SSS` (milliseconds).\n   * Double-letter forms zero-pad to width 2. @default 'HH:mm:ss'\n   */\n  readonly format = input<string>('HH:mm:ss');\n\n  /** Optional text shown once the countdown reaches zero. */\n  readonly endText = input<string | null>(null);\n\n  /**\n   * Tick interval in ms. Drop to ~16 for `SSS` (millisecond display).\n   * @default 1000\n   */\n  readonly tickMs = input(1000);\n\n  /** Fires once when the countdown crosses zero. */\n  readonly countdownEnd = output<void>();\n\n  private readonly destroyRef = inject(DestroyRef);\n  private readonly isBrowser = isPlatformBrowser(inject(PLATFORM_ID));\n\n  private readonly targetMs = computed(() => toMs(this.target()));\n\n  /** Remaining milliseconds (live signal). */\n  protected readonly remaining = signal(0);\n  protected readonly finished = signal(false);\n\n  protected readonly display = computed(() => {\n    if (this.finished() && this.endText() != null) return this.endText()!;\n    return formatRemaining(this.remaining(), this.format());\n  });\n\n  constructor() {\n    // Seed once synchronously so SSR / first paint shows a sane value.\n    effect(() => {\n      const ms = Math.max(0, this.targetMs() - Date.now());\n      this.remaining.set(ms);\n      this.finished.set(ms === 0);\n    });\n\n    if (!this.isBrowser) return;\n\n    afterNextRender(() => {\n      const handle = setInterval(() => this.tick(), this.tickMs());\n      this.destroyRef.onDestroy(() => clearInterval(handle));\n    });\n  }\n\n  private tick(): void {\n    const ms = Math.max(0, this.targetMs() - Date.now());\n    this.remaining.set(ms);\n    if (ms === 0 && !this.finished()) {\n      this.finished.set(true);\n      this.countdownEnd.emit();\n    }\n  }\n}\n","@if (label()) {\n  <div class=\"wr-statistic__label\">{{ label() }}</div>\n}\n<div class=\"wr-statistic__value\">\n  <span class=\"wr-statistic__number\">{{ display() }}</span>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}