{"version":3,"file":"sdcorejs-angular-components-stepper.mjs","sources":["../../../projects/sdcorejs-angular/components/stepper/src/step.component.ts","../../../projects/sdcorejs-angular/components/stepper/src/stepper.component.ts","../../../projects/sdcorejs-angular/components/stepper/src/stepper.component.html","../../../projects/sdcorejs-angular/components/stepper/sdcorejs-angular-components-stepper.ts"],"sourcesContent":["import { booleanAttribute, ChangeDetectionStrategy, Component, input, output, TemplateRef, viewChild } from '@angular/core';\nimport { AbstractControl } from '@angular/forms';\n\nexport type SdStepState = 'pending' | 'active' | 'completed' | 'error' | string;\n\n@Component({\n  selector: 'sd-step',\n  standalone: true,\n  // why: identical pattern to <sd-tab> — capture projected content via #body\n  // template ref so <sd-stepper> can render it inside mat-step's matStepContent\n  // (lazy mount + animation-friendly).\n  template: `<ng-template #body><ng-content></ng-content></ng-template>`,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdStep {\n  label = input.required<string>();\n  // Optional Material icon name shown when the step is in 'pending' state\n  // (overrides the default numbered indicator).\n  icon = input<string | null | undefined>(undefined);\n  // Set true to mark the step skippable in linear mode.\n  optional = input(false, { transform: booleanAttribute });\n  // When false, user cannot return to this step after it's been completed.\n  editable = input(true, { transform: booleanAttribute });\n  // Reactive form / control. When the stepper is linear, the user can only\n  // proceed past this step once stepControl.valid is true.\n  stepControl = input<AbstractControl | null | undefined>(undefined);\n  // Override the auto-derived state (eg force 'error' from outside on async validation).\n  state = input<SdStepState | undefined>(undefined);\n  // Error message rendered next to the step header when state is 'error'.\n  errorMessage = input<string | undefined>(undefined);\n\n  // Emitted when this step transitions to selected.\n  selectChange = output<void>();\n\n  // Body template captured from projected <ng-content>.\n  bodyTpl = viewChild.required<TemplateRef<unknown>>('body');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n  booleanAttribute,\n  ChangeDetectionStrategy,\n  Component,\n  contentChildren,\n  effect,\n  HostBinding,\n  input,\n  model,\n  output,\n  untracked,\n  viewChild,\n} from '@angular/core';\nimport { StepperSelectionEvent } from '@angular/cdk/stepper';\nimport { MatStepperModule, MatStepper } from '@angular/material/stepper';\nimport { Color } from '@sdcorejs/utils/models';\nimport { SdStep } from './step.component';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n  selector: 'sd-stepper',\n  standalone: true,\n  imports: [SdIcon, MatStepperModule, NgTemplateOutlet],\n  templateUrl: './stepper.component.html',\n  styleUrl: './stepper.component.scss',\n  changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class SdStepper {\n  steps = contentChildren(SdStep);\n\n  selectedIndex = model<number>(0);\n  // why: enforce sequential gating — only valid steps unlock the next.\n  linear = input(false, { transform: booleanAttribute });\n  orientation = input<'horizontal' | 'vertical'>('horizontal');\n  labelPosition = input<'end' | 'bottom'>('end');\n  headerPosition = input<'top' | 'bottom'>('top');\n  animationDuration = input<string>('500ms');\n  disableRipple = input(false, { transform: booleanAttribute });\n  // Drives the Core color CSS vars on indicators / connector / line.\n  color = input<Color>('primary');\n  autoId = input<string | undefined>(undefined);\n\n  // Emits {previousIndex, selectedIndex, previousStep, selectedStep}.\n  selectionChange = output<StepperSelectionEvent>();\n\n  protected matStepper = viewChild(MatStepper);\n\n  @HostBinding('attr.data-autoId') get autoIdAttr(): string | null {\n    return this.autoId() ?? null;\n  }\n\n  // Core color CSS vars — same mechanism as <sd-tab-group>.\n  @HostBinding('style.--sd-stepper-active-color') get cssActive(): string {\n    return `var(--sd-${this.color()})`;\n  }\n  @HostBinding('style.--sd-stepper-active-bg') get cssActiveBg(): string {\n    return `var(--sd-${this.color()})`;\n  }\n  @HostBinding('style.--sd-stepper-completed-color') get cssCompleted(): string {\n    return `var(--sd-${this.color()})`;\n  }\n  @HostBinding('style.--sd-stepper-line-active-color') get cssLine(): string {\n    return `var(--sd-${this.color()})`;\n  }\n\n  constructor() {\n    // why: clamp selectedIndex when a step is removed past the active one.\n    effect(() => {\n      const len = this.steps().length;\n      const cur = untracked(() => this.selectedIndex());\n      if (len > 0 && cur >= len) {\n        this.selectedIndex.set(Math.max(0, len - 1));\n      }\n    });\n  }\n\n  next(): void {\n    this.matStepper()?.next();\n  }\n\n  previous(): void {\n    this.matStepper()?.previous();\n  }\n\n  reset(): void {\n    this.matStepper()?.reset();\n  }\n\n  goTo(index: number): void {\n    const len = this.steps().length;\n    if (len === 0) {\n      this.selectedIndex.set(0);\n      return;\n    }\n    this.selectedIndex.set(Math.max(0, Math.min(index, len - 1)));\n  }\n\n  protected onSelectionChange(ev: StepperSelectionEvent): void {\n    this.selectionChange.emit(ev);\n    // Forward to each step that just became selected so consumer can react.\n    const step = this.steps()[ev.selectedIndex];\n    step?.selectChange.emit();\n  }\n}\n","<mat-stepper\n  class=\"sd-stepper\"\n  [(selectedIndex)]=\"selectedIndex\"\n  [linear]=\"linear()\"\n  [orientation]=\"orientation()\"\n  [labelPosition]=\"labelPosition()\"\n  [headerPosition]=\"headerPosition()\"\n  [animationDuration]=\"animationDuration()\"\n  [disableRipple]=\"disableRipple()\"\n  (selectionChange)=\"onSelectionChange($event)\">\n  @for (step of steps(); track step; let i = $index) {\n    <mat-step\n      [stepControl]=\"step.stepControl() ?? undefined!\"\n      [optional]=\"step.optional()\"\n      [editable]=\"step.editable()\"\n      [state]=\"step.state() ?? ''\"\n      [errorMessage]=\"step.errorMessage() ?? ''\">\n      <ng-template matStepLabel>\n        <span class=\"sd-step__label\">\n          @if (step.icon(); as ic) {\n            <sd-icon class=\"sd-step__icon\" [name]=\"ic\"></sd-icon>\n          }\n          <span class=\"sd-step__text\">{{ step.label() }}</span>\n        </span>\n      </ng-template>\n\n      <ng-template matStepContent>\n        <ng-container [ngTemplateOutlet]=\"step.bodyTpl()\"></ng-container>\n      </ng-template>\n    </mat-step>\n  }\n</mat-stepper>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}