{"version":3,"file":"forty-cdk-progress.mjs","sources":["../../../projects/forty-cdk/progress/src/progress-context.ts","../../../projects/forty-cdk/progress/src/progress-defaults.ts","../../../projects/forty-cdk/progress/src/progress.ts","../../../projects/forty-cdk/progress/src/progress-indicator.ts","../../../projects/forty-cdk/progress/src/forty-cdk-progress.ts"],"sourcesContent":["import { inject, InjectionToken, type Signal } from '@angular/core';\n\nimport { orphanContextError } from 'forty-cdk/core';\n\n/** State of a progress bar reflected on `data-state`. */\nexport type ForProgressState = 'indeterminate' | 'loading' | 'complete';\n\n/** Shape exposed to descendant pieces (the indicator). */\nexport interface ForProgressContext {\n  /** Raw value as written by the consumer, or `null` when indeterminate. */\n  readonly value: Signal<number | null>;\n  /** Value clamped to `[0, max]`, or `null` when indeterminate. Use this for any visual / ARIA reflection. */\n  readonly clampedValue: Signal<number | null>;\n  /** Current max as written by the consumer. */\n  readonly max: Signal<number>;\n  /**\n   * `max` clamped to a strictly positive value, used for every ARIA / visual\n   * reflection. Descendant pieces mirror this instead of the raw {@link max}\n   * so root and indicator never diverge for a non-positive `max`.\n   */\n  readonly effectiveMax: Signal<number>;\n  /** `null` when indeterminate; otherwise `0..100`. */\n  readonly percentage: Signal<number | null>;\n  /**\n   * {@link percentage} rounded to two decimals for the `data-percentage`\n   * reflection, or `null` when indeterminate. Owned by the root so the\n   * indicator mirrors it instead of re-implementing the rounding.\n   */\n  readonly percentageAttr: Signal<number | null>;\n  /** Logical state, mirrored on `data-state`. */\n  readonly state: Signal<ForProgressState>;\n}\n\nexport const FOR_PROGRESS_CONTEXT = new InjectionToken<ForProgressContext>('FOR_PROGRESS_CONTEXT');\n\n/**\n * Injects the nearest {@link ForProgressContext}, throwing a descriptive\n * error when used outside a `[forProgress]` element.\n *\n * @param piece Name of the calling directive, used in the error message.\n */\nexport function injectProgressContext(piece: string): ForProgressContext {\n  const ctx = inject(FOR_PROGRESS_CONTEXT, { optional: true });\n  if (!ctx) {\n    throw orphanContextError({\n      code: 'FORCDK-PROGRESS-001',\n      piece,\n      root: '[forProgress]',\n      token: 'FOR_PROGRESS_CONTEXT',\n    });\n  }\n  return ctx;\n}\n","import { type Provider } from '@angular/core';\n\nimport { createDefaults } from 'forty-cdk/core';\n\n/**\n * Defaults inherited by descendant progress bars in the surrounding injector\n * scope. Configure with `provideForProgressDefaults` either at the\n * application root or in any component's `providers` array; partial\n * overrides merge with the parent scope.\n */\nexport interface ForProgressDefaults {\n  /**\n   * Whether to announce completion (or the label) once via `aria-live` on\n   * the loading→complete transition. Opt-in — useful on flows where the\n   * user explicitly waits for completion (uploads, submissions).\n   */\n  announceCompletion: boolean;\n  /**\n   * String announced via `aria-live` on the loading→complete transition when\n   * no `aria-valuetext` is available. A screen reader verbalizes it, so\n   * override it per scope to localize the announcement; defaults to the\n   * English `'Complete'`.\n   */\n  completeAnnouncement: string;\n}\n\n/**\n * Library fallback for progress defaults, read at the root injector when no\n * consumer has called `provideForProgressDefaults`. Exported for the shared defaults\n * contract spec; not re-exported from the primitive's public entry.\n */\nexport const FOR_PROGRESS_FALLBACK_DEFAULTS: ForProgressDefaults = {\n  announceCompletion: false,\n  completeAnnouncement: 'Complete',\n};\n\nconst { token, provideDefaults } = createDefaults<ForProgressDefaults>(\n  'FOR_PROGRESS_DEFAULTS',\n  FOR_PROGRESS_FALLBACK_DEFAULTS,\n);\n\n/** Token holding the resolved progress defaults for the current scope. */\nexport const FOR_PROGRESS_DEFAULTS = token;\n\n/**\n * Configures forty-cdk progress defaults for this injector scope. Partial\n * overrides inherit unspecified keys from the parent scope (or library\n * defaults at the root).\n */\nexport function provideForProgressDefaults(\n  defaults: Partial<ForProgressDefaults> = {},\n): Provider[] {\n  return provideDefaults(defaults);\n}\n","import { booleanAttribute, computed, Directive, effect, inject, input } from '@angular/core';\n\nimport { LiveAnnouncer, clamp, hostAriaLabel } from 'forty-cdk/core';\nimport {\n  FOR_PROGRESS_CONTEXT,\n  type ForProgressContext,\n  type ForProgressState,\n} from './progress-context';\nimport { FOR_PROGRESS_DEFAULTS } from './progress-defaults';\n\n/**\n * Headless progress bar. Implements the\n * [WAI-ARIA progressbar role](https://www.w3.org/TR/wai-aria-1.2/#progressbar)\n * for tasks whose completion is communicated visually.\n *\n * `value === null` puts the bar in **indeterminate** mode (no `aria-valuenow`).\n * Use it for \"loading…\" states whose duration cannot be predicted. Otherwise\n * pass a number in `[0, max]`; values outside the range are clamped before\n * being reflected.\n *\n * The directive only handles state and ARIA. The visual fill is up to the\n * consumer — see `ForProgressIndicator`.\n *\n * @example\n * ```html\n * <div forProgress [value]=\"uploaded()\" [max]=\"total()\">\n *   <div forProgressIndicator></div>\n * </div>\n *\n * <div forProgress [value]=\"null\">  <!-- indeterminate -->\n *   <div forProgressIndicator></div>\n * </div>\n * ```\n */\n@Directive({\n  selector: '[forProgress]',\n  exportAs: 'forProgress',\n  host: {\n    role: 'progressbar',\n    '[attr.aria-valuemin]': '0',\n    '[attr.aria-valuemax]': 'effectiveMax()',\n    '[attr.aria-valuenow]': 'clampedValue() ?? null',\n    '[attr.aria-valuetext]': 'ariaValueText()',\n    '[attr.aria-label]': 'resolvedAriaLabel()',\n    '[attr.data-state]': 'state()',\n    '[attr.data-value]': 'clampedValue() ?? null',\n    '[attr.data-min]': '0',\n    '[attr.data-max]': 'effectiveMax()',\n    '[attr.data-percentage]': 'percentageAttr()',\n  },\n  providers: [{ provide: FOR_PROGRESS_CONTEXT, useExisting: ForProgress }],\n})\nexport class ForProgress implements ForProgressContext {\n  readonly #defaults = inject(FOR_PROGRESS_DEFAULTS);\n\n  /**\n   * Current progress in `[0, max]`, or `null` for the indeterminate state.\n   * One-way `[value]` input: a progress bar is display-only and reports no\n   * interactive value, so it exposes no two-way binding. Values outside the\n   * range are clamped for ARIA; the input retains the raw value.\n   */\n  readonly value = input<number | null>(null);\n\n  /** Maximum value. Defaults to `100` (so a raw value reads as a percentage). */\n  readonly max = input<number>(100);\n\n  /**\n   * `max` clamped to a strictly positive value. `progressbar` requires\n   * `aria-valuemax` to exceed `aria-valuemin` (which is fixed at `0` here), so a\n   * non-positive `max` would reflect invalid ARIA. Mirrors the way `ForMeter`\n   * keeps `max >= min`; here the floor is `1` so the reflected range is always\n   * valid and the percentage math has a non-zero denominator.\n   */\n  readonly effectiveMax = computed<number>(() => Math.max(this.max(), 1));\n\n  /**\n   * Optional override for `aria-valuetext`. Useful for non-percentage\n   * progress (e.g. `\"Step 3 of 5\"`, `\"42 MB of 200 MB\"`). Receives the\n   * clamped value and the effective max (the configured max sanitized to\n   * `>= 1`).\n   */\n  readonly getValueLabel = input<((value: number, max: number) => string) | null>(null);\n\n  /**\n   * Accessible name for the progressbar. Defaults to `null`, emitting no\n   * `aria-label`; prefer a visible label referenced via `aria-labelledby` when\n   * one exists.\n   */\n  readonly ariaLabel = input<string | null>(null);\n\n  protected readonly resolvedAriaLabel = hostAriaLabel(() => this.ariaLabel() || null);\n\n  /**\n   * When true, transitions to `value === max` are announced once via the\n   * live announcer using the current `aria-valuetext` (or the scope's\n   * `completeAnnouncement` string when none). Repeated transitions to the\n   * same complete state do not re-fire. Both the enablement and the announced\n   * string default to `provideForProgressDefaults` for the surrounding scope.\n   */\n  readonly announceCompletion = input(this.#defaults.announceCompletion, {\n    transform: booleanAttribute,\n  });\n\n  readonly clampedValue = computed<number | null>(() => {\n    const v = this.value();\n    if (v === null) {\n      return null;\n    }\n    return clamp(v, 0, this.effectiveMax());\n  });\n\n  readonly percentage = computed<number | null>(() => {\n    const v = this.clampedValue();\n    if (v === null) {\n      return null;\n    }\n    return (v / this.effectiveMax()) * 100;\n  });\n\n  readonly state = computed<ForProgressState>(() => {\n    const v = this.clampedValue();\n    if (v === null) return 'indeterminate';\n    return v === this.effectiveMax() ? 'complete' : 'loading';\n  });\n\n  readonly ariaValueText = computed<string | null>(() => {\n    const v = this.clampedValue();\n    if (v === null) {\n      return null;\n    }\n    const label = this.getValueLabel();\n    if (label) {\n      return label(v, this.effectiveMax());\n    }\n    return null;\n  });\n\n  readonly percentageAttr = computed<number | null>(() => {\n    const p = this.percentage();\n    return p === null ? null : Math.round(p * 100) / 100;\n  });\n\n  readonly #announcer = inject(LiveAnnouncer);\n\n  constructor() {\n    let lastState: ForProgressState | null = null;\n    effect(() => {\n      const next = this.state();\n      const prev = lastState;\n      lastState = next;\n      if (prev === null || prev === next) {\n        return;\n      }\n      if (next === 'complete' && this.announceCompletion()) {\n        this.#announcer.announce(\n          this.ariaValueText() ?? this.#defaults.completeAnnouncement,\n          'polite',\n        );\n      }\n    });\n  }\n}\n","import { Directive } from '@angular/core';\n\nimport { injectProgressContext } from './progress-context';\n\n/**\n * Visual fill paired with `[forProgress]`. Reflects `data-state` and\n * `data-percentage` so the consumer can drive width / transform from CSS.\n *\n * The directive does NOT set any visual style itself. Typical usage:\n *\n * ```css\n * [forProgressIndicator] {\n *   width: 100%;\n *   transform: translateX(calc(-100% + var(--for-progress-percentage, 0%)));\n * }\n * [forProgressIndicator][data-state=\"indeterminate\"] {\n *   animation: stripes 1s infinite linear;\n * }\n * ```\n *\n * with the `--for-progress-percentage` custom property fed from `data-percentage`.\n */\n@Directive({\n  selector: '[forProgressIndicator]',\n  exportAs: 'forProgressIndicator',\n  host: {\n    '[attr.data-state]': 'context.state()',\n    '[attr.data-value]': 'context.clampedValue() ?? null',\n    '[attr.data-min]': '0',\n    '[attr.data-max]': 'context.effectiveMax()',\n    '[attr.data-percentage]': 'context.percentageAttr()',\n    '[style.--for-progress-percentage]': 'percentageStyle()',\n  },\n})\nexport class ForProgressIndicator {\n  protected readonly context = injectProgressContext('ForProgressIndicator');\n\n  protected percentageStyle(): string | null {\n    const p = this.context.percentageAttr();\n    return p === null ? null : `${p}%`;\n  }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}