ng-hub-ui-stepper 22.9.0 → 22.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -3,12 +3,12 @@
3
3
  [Español](./README.es.md) | **English**
4
4
 
5
5
  [![npm version](https://img.shields.io/npm/v/ng-hub-ui-stepper.svg)](https://www.npmjs.com/package/ng-hub-ui-stepper)
6
- [![license](https://img.shields.io/npm/l/ng-hub-ui-stepper.svg)](https://github.com/carlos-morcillo/ng-hub-ui-stepper/blob/main/LICENSE)
6
+ [![license](https://img.shields.io/npm/l/ng-hub-ui-stepper.svg)](https://github.com/hub-env/ng-hub-ui-stepper/blob/main/LICENSE)
7
7
 
8
8
  A flexible, customizable, and accessible stepper component for Angular 21+. Perfect for multi-step forms, wizards, and guided user experiences with a focus on developer experience and modern standards.
9
9
 
10
10
  > [!IMPORTANT]
11
- > Version `22.9.0` targets **Angular 21** and uses the **Signals** architecture shared across `ng-hub-ui`.
11
+ > Version `22.10.1` targets **Angular 22** and uses the **Signals** architecture shared across `ng-hub-ui`.
12
12
 
13
13
  ## Documentation and Live Examples
14
14
 
@@ -17,6 +17,7 @@ This package is part of [Hub UI](https://hubui.dev/en/), a collection of Angular
17
17
  - Docs: https://hubui.dev/en/stepper/overview/
18
18
  - Live examples: https://hubui.dev/en/stepper/examples/
19
19
  - Hub UI: https://hubui.dev/en/
20
+ - Hub UI on GitHub (issues, roadmap and contributing): https://github.com/hub-env/hub-ui
20
21
 
21
22
  ## 🧩 Library Family `ng-hub-ui`
22
23
 
@@ -211,13 +212,14 @@ button disabled while the move is unavailable.
211
212
 
212
213
  ### Step transitions
213
214
 
214
- Transitions are plain CSS and opt-in: add `stepper--animated` to the host, then pick the flavour with
215
- `stepper--anim-slide` (the default when neither is set) or `stepper--anim-fade`. Duration comes from
216
- `--hub-stepper-animation-duration`.
215
+ Transitions are plain CSS and opt-in: add `hub-stepper--animated` to the host, then pick the flavour
216
+ with `hub-stepper--anim-slide` (the default when neither is set) or `hub-stepper--anim-fade`. Duration
217
+ comes from `--hub-stepper-animation-duration`. The unprefixed `stepper--animated`,
218
+ `stepper--anim-slide` and `stepper--anim-fade` are still read, and go in 23.0.0.
217
219
 
218
220
  ```html
219
221
  <hub-stepper
220
- class="stepper--animated stepper--anim-fade"
222
+ class="hub-stepper--animated hub-stepper--anim-fade"
221
223
  [style.--hub-stepper-animation-duration.ms]="240"
222
224
  >
223
225
  <hub-step title="Profile">...</hub-step>
@@ -225,6 +227,39 @@ Transitions are plain CSS and opt-in: add `stepper--animated` to the host, then
225
227
  </hub-stepper>
226
228
  ```
227
229
 
230
+ ### Custom rail triggers
231
+
232
+ `hubStepperNav` replaces the whole rail. When all you want is a different control inside each rail
233
+ item — a numbered circle, an icon, a check on the steps already done — `hubStepTrigger` is one level
234
+ down: the rail keeps its list, its `role="tablist"`, its orientation and its label, and only the
235
+ button inside each item is yours.
236
+
237
+ ```html
238
+ <hub-stepper #wizard>
239
+ <ng-template hubStepTrigger let-title="title" let-index="index" let-isCurrent="isCurrent" let-disabled="disabled">
240
+ <button
241
+ type="button"
242
+ role="tab"
243
+ [attr.aria-selected]="isCurrent"
244
+ [disabled]="disabled"
245
+ (click)="wizard.goTo(index)"
246
+ >
247
+ <span class="badge">{{ index + 1 }}</span> {{ title }}
248
+ </button>
249
+ </ng-template>
250
+
251
+ <hub-step title="Account">...</hub-step>
252
+ <hub-step title="Payment">...</hub-step>
253
+ </hub-stepper>
254
+ ```
255
+
256
+ The context carries the step as `$implicit` and as `step`, plus `title`, `index`, `isCurrent`,
257
+ `isCompleted` and `disabled`. Activating a step stays with you, through a template reference on the
258
+ host — which is why the example names the stepper `#wizard`. Give the trigger `role="tab"` if you
259
+ want the rail's arrow-key navigation to keep finding it.
260
+
261
+ A stepper that declares both templates uses `hubStepperNav` and ignores this one.
262
+
228
263
  ## API Reference
229
264
 
230
265
  ### StepperComponent (`hub-stepper`)
@@ -274,7 +309,7 @@ Public members you can reach through a template reference (`<hub-stepper #steppe
274
309
  | `PreviousButtonDirective` | `button[previousButton]`, `button[backButton]` | `<button>` | Calls `goToPrevious()` and disables the button when there is no enabled previous step. |
275
310
  | `SubmitButtonDirective` | `button[submitButton]` | `<button>` | Calls `complete()` and disables the button while the current step is `disabled`. |
276
311
  | `StepperNavDirective` | `[hubStepperNav]`, `[stepperNav]` | `<ng-template>` | Replaces the built-in rail. Context: `steps`, `currentIndex`. |
277
- | `StepTriggerDirective` | `[hubStepTrigger]`, `[stepTrigger]` | `<ng-template>` | Captures a per-step trigger template. **Exported but not yet rendered** — the stepper draws its own triggers; this is groundwork, and applying it changes nothing today. |
312
+ | `StepTriggerDirective` | `[hubStepTrigger]`, `[stepTrigger]` | `<ng-template>` | Replaces the rail trigger the default rail draws, once per step. Context: `$implicit` / `step`, `title`, `index`, `isCurrent`, `isCompleted`, `disabled`. Ignored when a `hubStepperNav` template is present, since a custom rail draws its own triggers. |
278
313
 
279
314
  ### Host classes
280
315
 
@@ -282,9 +317,16 @@ Set these on `<hub-stepper>` itself; they are read by the stylesheet, not by inp
282
317
 
283
318
  | Class | Effect |
284
319
  |---|---|
285
- | `stepper--animated` | Enables the CSS transition between step panels. Without it, panels swap instantly. |
286
- | `stepper--anim-slide` | Slide transition (also the default when only `stepper--animated` is set). |
287
- | `stepper--anim-fade` | Fade transition instead of the slide. |
320
+ | `hub-stepper--animated` | Enables the CSS transition between step panels. Without it, panels swap instantly. |
321
+ | `hub-stepper--anim-slide` | Slide transition (also the default when only `hub-stepper--animated` is set). |
322
+ | `hub-stepper--anim-fade` | Fade transition instead of the slide. |
323
+
324
+ > **Renamed in 22.10.0.** These were `stepper--animated`, `stepper--anim-slide` and
325
+ > `stepper--anim-fade`, and the component itself wore a bare `stepper` class. `stepper` is a word in
326
+ > the application's namespace, not the library's, so a host application with a `.stepper` rule of its
327
+ > own restyled the component from the outside. The whole block is now `hub-stepper`, in line with
328
+ > every other library of the family. **The old spellings still work and are still written to the
329
+ > DOM**; both go in **23.0.0**. See [`BREAKING_CHANGES.md`](./BREAKING_CHANGES.md).
288
330
 
289
331
  ### Services
290
332
 
@@ -443,7 +485,7 @@ For full theming in a single call, the package ships a `hub-stepper-theme()` Sas
443
485
 
444
486
  ## Contributing
445
487
 
446
- We welcome contributions! Please follow our [Commit Guidelines](https://github.com/carlos-morcillo/ng-hub-ui/blob/main/CONTRIBUTING.md).
488
+ We welcome contributions! Please follow our [Commit Guidelines](https://github.com/hub-env/hub-ui/blob/main/CONTRIBUTING.md).
447
489
 
448
490
  1. Fork the repo.
449
491
  2. Create your feature branch (`git checkout -b feature/amazing-feature`).
@@ -17,7 +17,7 @@ class NextButtonDirective {
17
17
  }, /* @ts-ignore */
18
18
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
19
19
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NextButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
20
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NextButtonDirective, isStandalone: true, selector: "button[nextButton], button[continueButton]", host: { listeners: { "click": "stepper.goToNext()" }, properties: { "disabled": "disabled()" }, classAttribute: "stepper__button stepper__button--next" }, ngImport: i0 });
20
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: NextButtonDirective, isStandalone: true, selector: "button[nextButton], button[continueButton]", host: { listeners: { "click": "stepper.goToNext()" }, properties: { "disabled": "disabled()" }, classAttribute: "hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next" }, ngImport: i0 });
21
21
  }
22
22
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: NextButtonDirective, decorators: [{
23
23
  type: Directive,
@@ -25,7 +25,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
25
25
  selector: 'button[nextButton], button[continueButton]',
26
26
  standalone: true,
27
27
  host: {
28
- class: 'stepper__button stepper__button--next',
28
+ class: 'hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next',
29
29
  '[disabled]': 'disabled()',
30
30
  '(click)': 'stepper.goToNext()'
31
31
  }
@@ -46,7 +46,7 @@ class PreviousButtonDirective {
46
46
  }, /* @ts-ignore */
47
47
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
48
48
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PreviousButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
49
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PreviousButtonDirective, isStandalone: true, selector: "button[previousButton], button[backButton]", host: { listeners: { "click": "stepper.goToPrevious()" }, properties: { "disabled": "disabled()" }, classAttribute: "stepper__button stepper__button--back" }, ngImport: i0 });
49
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: PreviousButtonDirective, isStandalone: true, selector: "button[previousButton], button[backButton]", host: { listeners: { "click": "stepper.goToPrevious()" }, properties: { "disabled": "disabled()" }, classAttribute: "hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back" }, ngImport: i0 });
50
50
  }
51
51
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: PreviousButtonDirective, decorators: [{
52
52
  type: Directive,
@@ -54,7 +54,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
54
54
  selector: 'button[previousButton], button[backButton]',
55
55
  standalone: true,
56
56
  host: {
57
- class: 'stepper__button stepper__button--back',
57
+ class: 'hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back',
58
58
  '[disabled]': 'disabled()',
59
59
  '(click)': 'stepper.goToPrevious()'
60
60
  }
@@ -98,13 +98,54 @@ class StepComponent {
98
98
  return !this.disabled();
99
99
  }
100
100
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
101
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: StepComponent, isStandalone: true, selector: "hub-step, hub-ui-step", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "innerTemplate", first: true, predicate: ["innerTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #innerTemplate>\n\t<div class=\"step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush });
101
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "22.0.8", type: StepComponent, isStandalone: true, selector: "hub-step, hub-ui-step", inputs: { title: { classPropertyName: "title", publicName: "title", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null } }, viewQueries: [{ propertyName: "innerTemplate", first: true, predicate: ["innerTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #innerTemplate>\n\t<div class=\"hub-step__content step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n", styles: [""], changeDetection: i0.ChangeDetectionStrategy.OnPush });
102
102
  }
103
103
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepComponent, decorators: [{
104
104
  type: Component,
105
- args: [{ selector: 'hub-step, hub-ui-step', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #innerTemplate>\n\t<div class=\"step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n" }]
105
+ args: [{ selector: 'hub-step, hub-ui-step', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-template #innerTemplate>\n\t<div class=\"hub-step__content step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n" }]
106
106
  }], propDecorators: { title: [{ type: i0.Input, args: [{ isSignal: true, alias: "title", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], innerTemplate: [{ type: i0.ViewChild, args: ['innerTemplate', { isSignal: true }] }] } });
107
107
 
108
+ /**
109
+ * Marks an `ng-template` as the trigger the default rail renders for each step, in place of the
110
+ * built-in pill button.
111
+ *
112
+ * It is the counterpart of `hubStepperNav`, one level down: that one replaces the whole rail,
113
+ * this one keeps the rail — its list, its `role="tablist"`, its orientation and its label — and
114
+ * only swaps the control inside each item. A stepper that declares both uses the nav template and
115
+ * ignores this one, because a custom rail draws its own triggers.
116
+ *
117
+ * The template context carries the step as `$implicit` and as `step`, plus `title`, `index`,
118
+ * `isCurrent`, `isCompleted` and `disabled`. Activating a step stays with the consumer, through a
119
+ * template reference on the host:
120
+ *
121
+ * @example
122
+ * ```html
123
+ * <hub-stepper #wizard>
124
+ * <ng-template hubStepTrigger let-title="title" let-index="index" let-isCurrent="isCurrent" let-disabled="disabled">
125
+ * <button type="button" role="tab" [attr.aria-selected]="isCurrent" [disabled]="disabled" (click)="wizard.goTo(index)">
126
+ * {{ index + 1 }}. {{ title }}
127
+ * </button>
128
+ * </ng-template>
129
+ * <hub-step title="Account">…</hub-step>
130
+ * </hub-stepper>
131
+ * ```
132
+ */
133
+ class StepTriggerDirective {
134
+ template;
135
+ /** Captured template reference projected into the parent stepper. */
136
+ constructor(template) {
137
+ this.template = template;
138
+ }
139
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepTriggerDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
140
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: StepTriggerDirective, isStandalone: true, selector: "[hubStepTrigger], [stepTrigger]", ngImport: i0 });
141
+ }
142
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepTriggerDirective, decorators: [{
143
+ type: Directive,
144
+ args: [{
145
+ selector: '[hubStepTrigger], [stepTrigger]'
146
+ }]
147
+ }], ctorParameters: () => [{ type: i0.TemplateRef }] });
148
+
108
149
  /**
109
150
  * Marks an `ng-template` as a custom navigation template for `hub-stepper`.
110
151
  */
@@ -134,7 +175,7 @@ class SubmitButtonDirective {
134
175
  disabled = computed(() => this.stepper.currentStep?.disabled() ?? false, /* @ts-ignore */
135
176
  ...(ngDevMode ? [{ debugName: "disabled" }] : /* istanbul ignore next */ []));
136
177
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitButtonDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
137
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SubmitButtonDirective, isStandalone: true, selector: "button[submitButton]", host: { listeners: { "click": "stepper.complete()" }, properties: { "disabled": "disabled()" }, classAttribute: "stepper__button stepper__button--submit" }, ngImport: i0 });
178
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: SubmitButtonDirective, isStandalone: true, selector: "button[submitButton]", host: { listeners: { "click": "stepper.complete()" }, properties: { "disabled": "disabled()" }, classAttribute: "hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit" }, ngImport: i0 });
138
179
  }
139
180
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SubmitButtonDirective, decorators: [{
140
181
  type: Directive,
@@ -142,7 +183,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
142
183
  selector: 'button[submitButton]',
143
184
  standalone: true,
144
185
  host: {
145
- class: 'stepper__button stepper__button--submit',
186
+ class: 'hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit',
146
187
  '[disabled]': 'disabled()',
147
188
  '(click)': 'stepper.complete()'
148
189
  }
@@ -274,15 +315,30 @@ class StepperComponent {
274
315
  ...(ngDevMode ? [{ debugName: "assignStepIndexes" }] : /* istanbul ignore next */ []));
275
316
  /** Optional content-projected template for custom navigation. */
276
317
  stepperNavTpt = contentChild(StepperNavDirective, { ...(ngDevMode ? { debugName: "stepperNavTpt" } : /* istanbul ignore next */ {}), read: TemplateRef });
277
- /** Optional custom projected previous button. */
278
- previousButton = contentChild(PreviousButtonDirective, /* @ts-ignore */
279
- ...(ngDevMode ? [{ debugName: "previousButton" }] : /* istanbul ignore next */ []));
280
- /** Optional custom projected next button. */
281
- nextButton = contentChild(NextButtonDirective, /* @ts-ignore */
282
- ...(ngDevMode ? [{ debugName: "nextButton" }] : /* istanbul ignore next */ []));
283
- /** Optional custom projected submit button. */
284
- submitButton = contentChild(SubmitButtonDirective, /* @ts-ignore */
285
- ...(ngDevMode ? [{ debugName: "submitButton" }] : /* istanbul ignore next */ []));
318
+ /**
319
+ * Optional content-projected template rendered in place of the built-in rail trigger, once
320
+ * per step. Only the default rail uses it: a `hubStepperNav` template draws its own triggers.
321
+ *
322
+ * The context carries the step itself as `$implicit`, plus `title`, `index`, `isCurrent`,
323
+ * `isCompleted` and `disabled`. Activation stays with the consumer, which is what a template
324
+ * reference on the host is for: `<hub-stepper #wizard>` … `(click)="wizard.goTo(index)"`.
325
+ */
326
+ stepTriggerTpt = contentChild(StepTriggerDirective, { ...(ngDevMode ? { debugName: "stepTriggerTpt" } : /* istanbul ignore next */ {}), read: TemplateRef });
327
+ /**
328
+ * Optional custom projected previous button.
329
+ *
330
+ * `descendants: false` on the three control queries is not a detail. Content projection with
331
+ * a `select` only ever matches a direct child of the host, so a `button previousButton`
332
+ * nested deeper — inside a `hub-step`, inside a form — can never reach the controls row. With
333
+ * the default `descendants: true` the query found it anyway, the component concluded a custom
334
+ * control had been supplied, and rendered no button at all: the stepper lost its own control
335
+ * to a button it could not display.
336
+ */
337
+ previousButton = contentChild(PreviousButtonDirective, { ...(ngDevMode ? { debugName: "previousButton" } : /* istanbul ignore next */ {}), descendants: false });
338
+ /** Optional custom projected next button. See `previousButton` for why the query is shallow. */
339
+ nextButton = contentChild(NextButtonDirective, { ...(ngDevMode ? { debugName: "nextButton" } : /* istanbul ignore next */ {}), descendants: false });
340
+ /** Optional custom projected submit button. See `previousButton` for why the query is shallow. */
341
+ submitButton = contentChild(SubmitButtonDirective, { ...(ngDevMode ? { debugName: "submitButton" } : /* istanbul ignore next */ {}), descendants: false });
286
342
  /**
287
343
  * Optional visual and layout configuration for the stepper container.
288
344
  */
@@ -441,16 +497,25 @@ class StepperComponent {
441
497
  this.focusedIndex.set(index);
442
498
  this.#cdr.detectChanges();
443
499
  const host = this.#hostRef.nativeElement;
444
- const triggers = host.querySelectorAll('.stepper__nav-trigger');
500
+ // Scoped to the rail so a nested stepper inside a step panel cannot contribute tabs, and
501
+ // widened to `[role="tab"]` so a `hubStepTrigger` template that carries the role but not
502
+ // the class still receives focus. A comma selector yields each element once.
503
+ const rail = host.querySelector('.hub-stepper__nav') ?? host;
504
+ const triggers = rail.querySelectorAll('.hub-stepper__nav-trigger, .stepper__nav-trigger, [role="tab"]');
445
505
  triggers[index]?.focus();
446
506
  }
447
507
  /** Returns the active step component instance or `null` when unavailable. */
448
508
  get currentStep() {
449
509
  return this.steps()?.[this.currentIndex()] ?? null;
450
510
  }
451
- /** Returns whether host classes enable animated transitions. */
511
+ /**
512
+ * Returns whether host classes enable animated transitions. Both spellings count while the
513
+ * unprefixed one is supported: `hub-stepper--animated` from 22.10.0, `stepper--animated`
514
+ * until 23.0.0 removes it.
515
+ */
452
516
  hasAnimationClass() {
453
- return this.#hostRef.nativeElement.classList.contains('stepper--animated');
517
+ const classes = this.#hostRef.nativeElement.classList;
518
+ return classes.contains('hub-stepper--animated') || classes.contains('stepper--animated');
454
519
  }
455
520
  /** Returns whether transition direction is forward. */
456
521
  isForwardAnimation() {
@@ -579,39 +644,27 @@ class StepperComponent {
579
644
  this.#cdr.detectChanges();
580
645
  }
581
646
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepperComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
582
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: StepperComponent, isStandalone: true, selector: "hub-stepper, hub-ui-stepper", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, backLabel: { classPropertyName: "backLabel", publicName: "backLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLabel: { classPropertyName: "continueLabel", publicName: "continueLabel", isSignal: true, isRequired: false, transformFunction: null }, submitLabel: { classPropertyName: "submitLabel", publicName: "submitLabel", isSignal: true, isRequired: false, transformFunction: null }, truncateTitles: { classPropertyName: "truncateTitles", publicName: "truncateTitles", isSignal: true, isRequired: false, transformFunction: null }, railLabel: { classPropertyName: "railLabel", publicName: "railLabel", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { completed: "completed", previousStep: "previousStep", nextStep: "nextStep" }, host: { properties: { "class.stepper--layout-vertical": "layout() === StepperLayout.Vertical", "class.stepper--layout-sidebar": "layout() === StepperLayout.Sidebar", "class.stepper--rtl": "isRtl()", "class.stepper--truncate-titles": "truncateTitles()", "attr.data-variant": "variant() ?? null", "style.--hub-stepper-accent": "customAccent()" }, classAttribute: "stepper" }, providers: [{ provide: HUB_TRANSLATION_PREFIX, useValue: 'HUBUI.STEPPER' }], queries: [{ propertyName: "steps", predicate: StepComponent, isSignal: true }, { propertyName: "stepperNavTpt", first: true, predicate: StepperNavDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "previousButton", first: true, predicate: PreviousButtonDirective, descendants: true, isSignal: true }, { propertyName: "nextButton", first: true, predicate: NextButtonDirective, descendants: true, isSignal: true }, { propertyName: "submitButton", first: true, predicate: SubmitButtonDirective, descendants: true, isSignal: true }], ngImport: i0, template: "<!--begin::Nav-->\n<nav class=\"stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"stepper__content\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul class=\"stepper__nav-list\" role=\"tablist\" [attr.aria-orientation]=\"railOrientation()\" [attr.aria-label]=\"railLabel()\">\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\">Step {{ index + 1 }}</span>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: ["@charset \"UTF-8\";:host{--hub-stepper-accent: var(--hub-sys-color-primary, #0d6efd);--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-stepper-primary-color: var(--hub-stepper-accent);--hub-stepper-background-color: var(--hub-sys-surface-elevated, #f8f9fa);--hub-stepper-text-color: var(--hub-sys-text-primary, #212529);--hub-stepper-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-surface-color: var(--hub-sys-surface-page, #ffffff);--hub-stepper-nav-bg: var(--hub-sys-surface-page, transparent);--hub-stepper-nav-padding-x: 0;--hub-stepper-nav-padding-y: 0;--hub-stepper-nav-border-width: 0;--hub-stepper-nav-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-stepper-nav-link-hover-color: var(--hub-sys-link-hover-color, #0a58ca);--hub-stepper-nav-link-hover-bg: var(--hub-sys-state-hover-bg, rgba(0, 0, 0, .075));--hub-stepper-nav-link-active-color: var(--hub-stepper-accent-on, #ffffff);--hub-stepper-nav-link-active-bg: var(--hub-stepper-accent);--hub-stepper-nav-link-active-border-color: var(--hub-stepper-accent);--hub-stepper-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-stepper-gap: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-padding-y: var(--hub-ref-space-2, .5rem);--hub-stepper-nav-trigger-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-trigger-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-nav-trigger-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-indicator-size: calc(var(--hub-ref-space-3, 1rem) * 2);--hub-stepper-controls-justify: flex-end;--hub-stepper-controls-gap: var(--hub-ref-space-2, .5rem);--hub-stepper-control-padding-y: .375rem;--hub-stepper-control-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-control-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-control-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-disabled-opacity: var(--hub-sys-opacity-50, .5);--hub-stepper-sidebar-min-width: 160px;--hub-stepper-sidebar-ideal-width: 20vw;--hub-stepper-sidebar-max-width: 240px;--hub-stepper-sidebar-width: clamp( var(--hub-stepper-sidebar-min-width), var(--hub-stepper-sidebar-ideal-width), var(--hub-stepper-sidebar-max-width) );--hub-stepper-content-padding-x: 0;--hub-stepper-content-padding-y: 0;--hub-stepper-content-border-width: 0;--hub-stepper-animation-duration: var(--hub-sys-transition-duration-base, .26s);--hub-stepper-animation-easing: var(--hub-sys-transition-timing-function-base, ease);--hub-stepper-animation-distance: var(--hub-ref-space-4, 1.5rem);display:grid;grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto;gap:var(--hub-stepper-gap);width:100%}:host.stepper--layout-vertical{grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto}:host.stepper--layout-sidebar{grid-template-columns:var(--hub-stepper-sidebar-width) minmax(0,1fr);grid-template-areas:\"nav content\" \"nav controls\";grid-template-rows:1fr auto;align-items:stretch}.stepper__nav{grid-area:nav;background-color:var(--hub-stepper-nav-bg);border:var(--hub-stepper-nav-border-width) solid var(--hub-stepper-nav-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-nav-padding-y, 0) var(--hub-stepper-nav-padding-x, 0);overflow-x:auto}.stepper__nav-list{list-style:none;display:flex;gap:var(--hub-stepper-nav-gap);padding:0;margin:0;min-width:max-content}.stepper__nav-item{flex:0 0 auto}.stepper__nav-trigger{display:inline-flex;align-items:center;gap:var(--hub-stepper-nav-trigger-gap);border:1px solid transparent;border-radius:var(--hub-sys-radius-pill, 50rem);background-color:transparent;padding:var(--hub-stepper-nav-trigger-padding-y) var(--hub-stepper-nav-trigger-padding-x);cursor:pointer;color:var(--hub-stepper-nav-link-color);font-size:var(--hub-stepper-nav-trigger-font-size);line-height:var(--hub-stepper-nav-trigger-line-height)}.stepper__nav-trigger:hover:not(:disabled){color:var(--hub-stepper-nav-link-hover-color);background-color:var(--hub-stepper-nav-link-hover-bg)}.stepper__nav-trigger--current{border-color:var(--hub-stepper-nav-link-active-border-color);background-color:var(--hub-stepper-nav-link-active-bg);color:var(--hub-stepper-nav-link-active-color)}.stepper__nav-trigger--completed{color:var(--hub-stepper-nav-link-color)}.stepper__nav-trigger:disabled{color:var(--hub-stepper-nav-link-disabled-color);cursor:not-allowed}.stepper__content{grid-area:content;border:var(--hub-stepper-content-border-width) solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);background-color:var(--hub-stepper-surface-color);padding:var(--hub-stepper-content-padding-y, 0) var(--hub-stepper-content-padding-x, 0);min-width:0;position:relative;overflow:hidden}.stepper__content-panel{will-change:transform,opacity}.stepper__controls{grid-area:controls;display:flex;gap:var(--hub-stepper-controls-gap);align-items:center;justify-content:var(--hub-stepper-controls-justify)}.stepper__controls :is(button[previousButton],button[nextButton],button[submitButton],.stepper__button){border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}.stepper__button--back{background-color:var(--hub-stepper-background-color);color:var(--hub-stepper-text-color)}.stepper__button--next,.stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}.stepper__controls button[nextButton],.stepper__controls button[submitButton]{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.stepper__controls button[previousButton]{background-color:var(--hub-stepper-background-color)}.stepper__controls :is(button[previousButton],button[nextButton],button[submitButton]):disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host.stepper--layout-sidebar .stepper__nav{height:100%;overflow-y:auto;overflow-x:hidden}:host.stepper--layout-sidebar .stepper__nav-list{flex-direction:column;align-items:stretch}:host.stepper--layout-sidebar .stepper__nav-item{width:100%}:host.stepper--layout-sidebar .stepper__nav-trigger{width:100%;justify-content:flex-start}:host.stepper--rtl{direction:rtl}:host.stepper--rtl .stepper__nav-list{flex-direction:row}:host.stepper--rtl.stepper--layout-sidebar .stepper__nav-list{flex-direction:column}:host.stepper--rtl.stepper--layout-sidebar .stepper__nav-trigger{justify-content:flex-end;text-align:right}.stepper__button-icon{display:inline-flex;align-items:center;line-height:1}.stepper__content--animated.stepper__content--animating .stepper__content-panel{animation-duration:var(--hub-stepper-animation-duration);animation-timing-function:var(--hub-stepper-animation-easing);animation-fill-mode:both}:host.stepper--animated.stepper--anim-fade .stepper__content--animating .stepper__content-panel{animation-name:stepper-fade-in}:host.stepper--animated:not(.stepper--anim-fade) .stepper__content--animating.stepper__content--forward .stepper__content-panel,:host.stepper--animated.stepper--anim-slide .stepper__content--animating.stepper__content--forward .stepper__content-panel{animation-name:stepper-slide-in-forward}:host.stepper--animated:not(.stepper--anim-fade) .stepper__content--animating.stepper__content--backward .stepper__content-panel,:host.stepper--animated.stepper--anim-slide .stepper__content--animating.stepper__content--backward .stepper__content-panel{animation-name:stepper-slide-in-backward}@keyframes stepper-fade-in{0%{opacity:0}to{opacity:1}}@keyframes stepper-slide-in-forward{0%{opacity:0;transform:translate(var(--hub-stepper-animation-distance))}to{opacity:1;transform:translate(0)}}@keyframes stepper-slide-in-backward{0%{opacity:0;transform:translate(calc(-1 * var(--hub-stepper-animation-distance)))}to{opacity:1;transform:translate(0)}}:host ::ng-deep button.stepper__button{border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}:host ::ng-deep button.stepper__button--back{background-color:var(--hub-stepper-background-color)}:host ::ng-deep button.stepper__button--next,:host ::ng-deep button.stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}:host ::ng-deep button.stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host([data-variant]){--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h)}:host([data-variant=primary]){--hub-stepper-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]){--hub-stepper-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]){--hub-stepper-accent: var(--hub-sys-color-success)}:host([data-variant=danger]){--hub-stepper-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]){--hub-stepper-accent: var(--hub-sys-color-warning)}:host([data-variant=info]){--hub-stepper-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]){--hub-stepper-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]){--hub-stepper-accent: var(--hub-sys-color-light)}:host([data-variant=dark]){--hub-stepper-accent: var(--hub-sys-color-dark)}:host(.stepper--truncate-titles) .stepper__nav-title{display:inline-block;max-inline-size:var(--hub-stepper-nav-title-max-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: HubOverflowTooltipDirective, selector: "[hubOverflowTooltip]", inputs: ["hubOverflowTooltip", "placement", "hubOverflowTooltipMeasure"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: UcfirstPipe, name: "ucfirst" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
647
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: StepperComponent, isStandalone: true, selector: "hub-stepper, hub-ui-stepper", inputs: { variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null }, backLabel: { classPropertyName: "backLabel", publicName: "backLabel", isSignal: true, isRequired: false, transformFunction: null }, continueLabel: { classPropertyName: "continueLabel", publicName: "continueLabel", isSignal: true, isRequired: false, transformFunction: null }, submitLabel: { classPropertyName: "submitLabel", publicName: "submitLabel", isSignal: true, isRequired: false, transformFunction: null }, truncateTitles: { classPropertyName: "truncateTitles", publicName: "truncateTitles", isSignal: true, isRequired: false, transformFunction: null }, railLabel: { classPropertyName: "railLabel", publicName: "railLabel", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { completed: "completed", previousStep: "previousStep", nextStep: "nextStep" }, host: { properties: { "class.hub-stepper--layout-vertical": "layout() === StepperLayout.Vertical", "class.stepper--layout-vertical": "layout() === StepperLayout.Vertical", "class.hub-stepper--layout-sidebar": "layout() === StepperLayout.Sidebar", "class.stepper--layout-sidebar": "layout() === StepperLayout.Sidebar", "class.hub-stepper--rtl": "isRtl()", "class.stepper--rtl": "isRtl()", "class.hub-stepper--truncate-titles": "truncateTitles()", "class.stepper--truncate-titles": "truncateTitles()", "attr.data-variant": "variant() ?? null", "style.--hub-stepper-accent": "customAccent()" }, classAttribute: "hub-stepper stepper" }, providers: [{ provide: HUB_TRANSLATION_PREFIX, useValue: 'HUBUI.STEPPER' }], queries: [{ propertyName: "steps", predicate: StepComponent, isSignal: true }, { propertyName: "stepperNavTpt", first: true, predicate: StepperNavDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "stepTriggerTpt", first: true, predicate: StepTriggerDirective, descendants: true, read: TemplateRef, isSignal: true }, { propertyName: "previousButton", first: true, predicate: PreviousButtonDirective, isSignal: true }, { propertyName: "nextButton", first: true, predicate: NextButtonDirective, isSignal: true }, { propertyName: "submitButton", first: true, predicate: SubmitButtonDirective, isSignal: true }], ngImport: i0, template: "<!--begin::Nav-->\n<nav class=\"hub-stepper__nav stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"hub-stepper__content stepper__content\"\n\t[class.hub-stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.hub-stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.hub-stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.hub-stepper__content--backward]=\"isBackwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"hub-stepper__content-panel stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"hub-stepper__controls stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul\n\t\tclass=\"hub-stepper__nav-list stepper__nav-list\"\n\t\trole=\"tablist\"\n\t\t[attr.aria-orientation]=\"railOrientation()\"\n\t\t[attr.aria-label]=\"railLabel()\"\n\t>\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"hub-stepper__nav-item stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"stepTriggerTpt() || defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t$implicit: step,\n\t\t\t\t\t\tstep: step,\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex,\n\t\t\t\t\t\tdisabled: !canNavigateTo(i)\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"hub-stepper__nav-trigger stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.hub-stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.hub-stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\"\n\t\t\t\t>Step {{ index + 1 }}</span\n\t\t\t>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: ["@charset \"UTF-8\";:host{--hub-stepper-accent: var(--hub-sys-color-primary, #0d6efd);--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-stepper-primary-color: var(--hub-stepper-accent);--hub-stepper-background-color: var(--hub-sys-surface-elevated, #f8f9fa);--hub-stepper-text-color: var(--hub-sys-text-primary, #212529);--hub-stepper-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-surface-color: var(--hub-sys-surface-page, #ffffff);--hub-stepper-nav-bg: var(--hub-sys-surface-page, transparent);--hub-stepper-nav-padding-x: 0;--hub-stepper-nav-padding-y: 0;--hub-stepper-nav-border-width: 0;--hub-stepper-nav-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-stepper-nav-link-hover-color: var(--hub-sys-link-hover-color, #0a58ca);--hub-stepper-nav-link-hover-bg: var(--hub-sys-state-hover-bg, rgba(0, 0, 0, .075));--hub-stepper-nav-link-active-color: var(--hub-stepper-accent-on, #ffffff);--hub-stepper-nav-link-active-bg: var(--hub-stepper-accent);--hub-stepper-nav-link-active-border-color: var(--hub-stepper-accent);--hub-stepper-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-stepper-gap: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-padding-y: var(--hub-ref-space-2, .5rem);--hub-stepper-nav-trigger-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-trigger-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-nav-trigger-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-indicator-size: calc(var(--hub-ref-space-3, 1rem) * 2);--hub-stepper-controls-justify: flex-end;--hub-stepper-controls-gap: var(--hub-ref-space-2, .5rem);--hub-stepper-control-padding-y: .375rem;--hub-stepper-control-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-control-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-control-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-disabled-opacity: var(--hub-sys-opacity-50, .5);--hub-stepper-sidebar-min-width: 160px;--hub-stepper-sidebar-ideal-width: 20vw;--hub-stepper-sidebar-max-width: 240px;--hub-stepper-sidebar-width: clamp( var(--hub-stepper-sidebar-min-width), var(--hub-stepper-sidebar-ideal-width), var(--hub-stepper-sidebar-max-width) );--hub-stepper-content-padding-x: 0;--hub-stepper-content-padding-y: 0;--hub-stepper-content-border-width: 0;--hub-stepper-animation-duration: var(--hub-sys-transition-duration-base, .26s);--hub-stepper-animation-easing: var(--hub-sys-transition-timing-function-base, ease);--hub-stepper-animation-distance: var(--hub-ref-space-4, 1.5rem);display:grid;grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto;gap:var(--hub-stepper-gap);width:100%}:host.hub-stepper--layout-vertical{grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto}:host.hub-stepper--layout-sidebar{grid-template-columns:var(--hub-stepper-sidebar-width) minmax(0,1fr);grid-template-areas:\"nav content\" \"nav controls\";grid-template-rows:1fr auto;align-items:stretch}.hub-stepper__nav{grid-area:nav;background-color:var(--hub-stepper-nav-bg);border:var(--hub-stepper-nav-border-width) solid var(--hub-stepper-nav-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-nav-padding-y, 0) var(--hub-stepper-nav-padding-x, 0);overflow-x:auto}.hub-stepper__nav-list{list-style:none;display:flex;gap:var(--hub-stepper-nav-gap);padding:0;margin:0;min-width:max-content}.hub-stepper__nav-item{flex:0 0 auto}.hub-stepper__nav-trigger{display:inline-flex;align-items:center;gap:var(--hub-stepper-nav-trigger-gap);border:1px solid transparent;border-radius:var(--hub-sys-radius-pill, 50rem);background-color:transparent;padding:var(--hub-stepper-nav-trigger-padding-y) var(--hub-stepper-nav-trigger-padding-x);cursor:pointer;color:var(--hub-stepper-nav-link-color);font-size:var(--hub-stepper-nav-trigger-font-size);line-height:var(--hub-stepper-nav-trigger-line-height)}.hub-stepper__nav-trigger:hover:not(:disabled){color:var(--hub-stepper-nav-link-hover-color);background-color:var(--hub-stepper-nav-link-hover-bg)}.hub-stepper__nav-trigger--current{border-color:var(--hub-stepper-nav-link-active-border-color);background-color:var(--hub-stepper-nav-link-active-bg);color:var(--hub-stepper-nav-link-active-color)}.hub-stepper__nav-trigger--completed{color:var(--hub-stepper-nav-link-color)}.hub-stepper__nav-trigger:disabled{color:var(--hub-stepper-nav-link-disabled-color);cursor:not-allowed}.hub-stepper__content{grid-area:content;border:var(--hub-stepper-content-border-width) solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);background-color:var(--hub-stepper-surface-color);padding:var(--hub-stepper-content-padding-y, 0) var(--hub-stepper-content-padding-x, 0);min-width:0;position:relative;overflow:hidden}.hub-stepper__content-panel{will-change:transform,opacity}.hub-stepper__controls{grid-area:controls;display:flex;gap:var(--hub-stepper-controls-gap);align-items:center;justify-content:var(--hub-stepper-controls-justify)}.hub-stepper__controls :is(button[previousButton],button[nextButton],button[submitButton],.hub-stepper__button){border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}.hub-stepper__button--back{background-color:var(--hub-stepper-background-color);color:var(--hub-stepper-text-color)}.hub-stepper__button--next,.hub-stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.hub-stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}.hub-stepper__controls button[nextButton],.hub-stepper__controls button[submitButton]{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.hub-stepper__controls button[previousButton]{background-color:var(--hub-stepper-background-color)}.hub-stepper__controls :is(button[previousButton],button[nextButton],button[submitButton]):disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host.hub-stepper--layout-sidebar .hub-stepper__nav{height:100%;overflow-y:auto;overflow-x:hidden}:host.hub-stepper--layout-sidebar .hub-stepper__nav-list{flex-direction:column;align-items:stretch}:host.hub-stepper--layout-sidebar .hub-stepper__nav-item{width:100%}:host.hub-stepper--layout-sidebar .hub-stepper__nav-trigger{width:100%;justify-content:flex-start}:host.hub-stepper--rtl{direction:rtl}:host.hub-stepper--rtl .hub-stepper__nav-list{flex-direction:row}:host.hub-stepper--rtl.hub-stepper--layout-sidebar .hub-stepper__nav-list{flex-direction:column}:host.hub-stepper--rtl.hub-stepper--layout-sidebar .hub-stepper__nav-trigger{justify-content:flex-end;text-align:right}.hub-stepper__button-icon{display:inline-flex;align-items:center;line-height:1}.hub-stepper__content--animated.hub-stepper__content--animating .hub-stepper__content-panel{animation-duration:var(--hub-stepper-animation-duration);animation-timing-function:var(--hub-stepper-animation-easing);animation-fill-mode:both}:host.hub-stepper--animated.hub-stepper--anim-fade .hub-stepper__content--animating .hub-stepper__content-panel{animation-name:hub-stepper-fade-in}:host.hub-stepper--animated:not(.hub-stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel,:host.hub-stepper--animated.hub-stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-forward}:host.hub-stepper--animated:not(.hub-stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel,:host.hub-stepper--animated.hub-stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-backward}:host.stepper--animated.stepper--anim-fade .hub-stepper__content--animating .hub-stepper__content-panel{animation-name:hub-stepper-fade-in}:host.stepper--animated:not(.stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel,:host.stepper--animated.stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-forward}:host.stepper--animated:not(.stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel,:host.stepper--animated.stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-backward}@keyframes hub-stepper-fade-in{0%{opacity:0}to{opacity:1}}@keyframes hub-stepper-slide-in-forward{0%{opacity:0;transform:translate(var(--hub-stepper-animation-distance))}to{opacity:1;transform:translate(0)}}@keyframes hub-stepper-slide-in-backward{0%{opacity:0;transform:translate(calc(-1 * var(--hub-stepper-animation-distance)))}to{opacity:1;transform:translate(0)}}:host ::ng-deep button.hub-stepper__button{border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}:host ::ng-deep button.hub-stepper__button--back{background-color:var(--hub-stepper-background-color)}:host ::ng-deep button.hub-stepper__button--next,:host ::ng-deep button.hub-stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}:host ::ng-deep button.hub-stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host([data-variant]){--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h)}:host([data-variant=primary]){--hub-stepper-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]){--hub-stepper-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]){--hub-stepper-accent: var(--hub-sys-color-success)}:host([data-variant=danger]){--hub-stepper-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]){--hub-stepper-accent: var(--hub-sys-color-warning)}:host([data-variant=info]){--hub-stepper-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]){--hub-stepper-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]){--hub-stepper-accent: var(--hub-sys-color-light)}:host([data-variant=dark]){--hub-stepper-accent: var(--hub-sys-color-dark)}:host(.hub-stepper--truncate-titles) .hub-stepper__nav-title{display:inline-block;max-inline-size:var(--hub-stepper-nav-title-max-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: HubOverflowTooltipDirective, selector: "[hubOverflowTooltip]", inputs: ["hubOverflowTooltip", "placement", "hubOverflowTooltipMeasure"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }, { kind: "pipe", type: UcfirstPipe, name: "ucfirst" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
583
648
  }
584
649
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepperComponent, decorators: [{
585
650
  type: Component,
586
651
  args: [{ selector: 'hub-stepper, hub-ui-stepper', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TranslatePipe, UcfirstPipe, HubOverflowTooltipDirective], providers: [{ provide: HUB_TRANSLATION_PREFIX, useValue: 'HUBUI.STEPPER' }], host: {
587
- class: 'stepper',
652
+ // `hub-stepper` is the block from 22.10.0 on. The bare `stepper` beside it is the name it
653
+ // replaces — a word in the application's namespace, not the library's — kept working until
654
+ // it is removed in 23.0.0. Same story for every modifier below.
655
+ class: 'hub-stepper stepper',
656
+ '[class.hub-stepper--layout-vertical]': 'layout() === StepperLayout.Vertical',
588
657
  '[class.stepper--layout-vertical]': 'layout() === StepperLayout.Vertical',
658
+ '[class.hub-stepper--layout-sidebar]': 'layout() === StepperLayout.Sidebar',
589
659
  '[class.stepper--layout-sidebar]': 'layout() === StepperLayout.Sidebar',
660
+ '[class.hub-stepper--rtl]': 'isRtl()',
590
661
  '[class.stepper--rtl]': 'isRtl()',
662
+ '[class.hub-stepper--truncate-titles]': 'truncateTitles()',
591
663
  '[class.stepper--truncate-titles]': 'truncateTitles()',
592
664
  '[attr.data-variant]': 'variant() ?? null',
593
665
  '[style.--hub-stepper-accent]': 'customAccent()'
594
- }, template: "<!--begin::Nav-->\n<nav class=\"stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"stepper__content\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul class=\"stepper__nav-list\" role=\"tablist\" [attr.aria-orientation]=\"railOrientation()\" [attr.aria-label]=\"railLabel()\">\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\">Step {{ index + 1 }}</span>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: ["@charset \"UTF-8\";:host{--hub-stepper-accent: var(--hub-sys-color-primary, #0d6efd);--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-stepper-primary-color: var(--hub-stepper-accent);--hub-stepper-background-color: var(--hub-sys-surface-elevated, #f8f9fa);--hub-stepper-text-color: var(--hub-sys-text-primary, #212529);--hub-stepper-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-surface-color: var(--hub-sys-surface-page, #ffffff);--hub-stepper-nav-bg: var(--hub-sys-surface-page, transparent);--hub-stepper-nav-padding-x: 0;--hub-stepper-nav-padding-y: 0;--hub-stepper-nav-border-width: 0;--hub-stepper-nav-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-stepper-nav-link-hover-color: var(--hub-sys-link-hover-color, #0a58ca);--hub-stepper-nav-link-hover-bg: var(--hub-sys-state-hover-bg, rgba(0, 0, 0, .075));--hub-stepper-nav-link-active-color: var(--hub-stepper-accent-on, #ffffff);--hub-stepper-nav-link-active-bg: var(--hub-stepper-accent);--hub-stepper-nav-link-active-border-color: var(--hub-stepper-accent);--hub-stepper-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-stepper-gap: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-padding-y: var(--hub-ref-space-2, .5rem);--hub-stepper-nav-trigger-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-trigger-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-nav-trigger-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-indicator-size: calc(var(--hub-ref-space-3, 1rem) * 2);--hub-stepper-controls-justify: flex-end;--hub-stepper-controls-gap: var(--hub-ref-space-2, .5rem);--hub-stepper-control-padding-y: .375rem;--hub-stepper-control-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-control-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-control-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-disabled-opacity: var(--hub-sys-opacity-50, .5);--hub-stepper-sidebar-min-width: 160px;--hub-stepper-sidebar-ideal-width: 20vw;--hub-stepper-sidebar-max-width: 240px;--hub-stepper-sidebar-width: clamp( var(--hub-stepper-sidebar-min-width), var(--hub-stepper-sidebar-ideal-width), var(--hub-stepper-sidebar-max-width) );--hub-stepper-content-padding-x: 0;--hub-stepper-content-padding-y: 0;--hub-stepper-content-border-width: 0;--hub-stepper-animation-duration: var(--hub-sys-transition-duration-base, .26s);--hub-stepper-animation-easing: var(--hub-sys-transition-timing-function-base, ease);--hub-stepper-animation-distance: var(--hub-ref-space-4, 1.5rem);display:grid;grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto;gap:var(--hub-stepper-gap);width:100%}:host.stepper--layout-vertical{grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto}:host.stepper--layout-sidebar{grid-template-columns:var(--hub-stepper-sidebar-width) minmax(0,1fr);grid-template-areas:\"nav content\" \"nav controls\";grid-template-rows:1fr auto;align-items:stretch}.stepper__nav{grid-area:nav;background-color:var(--hub-stepper-nav-bg);border:var(--hub-stepper-nav-border-width) solid var(--hub-stepper-nav-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-nav-padding-y, 0) var(--hub-stepper-nav-padding-x, 0);overflow-x:auto}.stepper__nav-list{list-style:none;display:flex;gap:var(--hub-stepper-nav-gap);padding:0;margin:0;min-width:max-content}.stepper__nav-item{flex:0 0 auto}.stepper__nav-trigger{display:inline-flex;align-items:center;gap:var(--hub-stepper-nav-trigger-gap);border:1px solid transparent;border-radius:var(--hub-sys-radius-pill, 50rem);background-color:transparent;padding:var(--hub-stepper-nav-trigger-padding-y) var(--hub-stepper-nav-trigger-padding-x);cursor:pointer;color:var(--hub-stepper-nav-link-color);font-size:var(--hub-stepper-nav-trigger-font-size);line-height:var(--hub-stepper-nav-trigger-line-height)}.stepper__nav-trigger:hover:not(:disabled){color:var(--hub-stepper-nav-link-hover-color);background-color:var(--hub-stepper-nav-link-hover-bg)}.stepper__nav-trigger--current{border-color:var(--hub-stepper-nav-link-active-border-color);background-color:var(--hub-stepper-nav-link-active-bg);color:var(--hub-stepper-nav-link-active-color)}.stepper__nav-trigger--completed{color:var(--hub-stepper-nav-link-color)}.stepper__nav-trigger:disabled{color:var(--hub-stepper-nav-link-disabled-color);cursor:not-allowed}.stepper__content{grid-area:content;border:var(--hub-stepper-content-border-width) solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);background-color:var(--hub-stepper-surface-color);padding:var(--hub-stepper-content-padding-y, 0) var(--hub-stepper-content-padding-x, 0);min-width:0;position:relative;overflow:hidden}.stepper__content-panel{will-change:transform,opacity}.stepper__controls{grid-area:controls;display:flex;gap:var(--hub-stepper-controls-gap);align-items:center;justify-content:var(--hub-stepper-controls-justify)}.stepper__controls :is(button[previousButton],button[nextButton],button[submitButton],.stepper__button){border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}.stepper__button--back{background-color:var(--hub-stepper-background-color);color:var(--hub-stepper-text-color)}.stepper__button--next,.stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}.stepper__controls button[nextButton],.stepper__controls button[submitButton]{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.stepper__controls button[previousButton]{background-color:var(--hub-stepper-background-color)}.stepper__controls :is(button[previousButton],button[nextButton],button[submitButton]):disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host.stepper--layout-sidebar .stepper__nav{height:100%;overflow-y:auto;overflow-x:hidden}:host.stepper--layout-sidebar .stepper__nav-list{flex-direction:column;align-items:stretch}:host.stepper--layout-sidebar .stepper__nav-item{width:100%}:host.stepper--layout-sidebar .stepper__nav-trigger{width:100%;justify-content:flex-start}:host.stepper--rtl{direction:rtl}:host.stepper--rtl .stepper__nav-list{flex-direction:row}:host.stepper--rtl.stepper--layout-sidebar .stepper__nav-list{flex-direction:column}:host.stepper--rtl.stepper--layout-sidebar .stepper__nav-trigger{justify-content:flex-end;text-align:right}.stepper__button-icon{display:inline-flex;align-items:center;line-height:1}.stepper__content--animated.stepper__content--animating .stepper__content-panel{animation-duration:var(--hub-stepper-animation-duration);animation-timing-function:var(--hub-stepper-animation-easing);animation-fill-mode:both}:host.stepper--animated.stepper--anim-fade .stepper__content--animating .stepper__content-panel{animation-name:stepper-fade-in}:host.stepper--animated:not(.stepper--anim-fade) .stepper__content--animating.stepper__content--forward .stepper__content-panel,:host.stepper--animated.stepper--anim-slide .stepper__content--animating.stepper__content--forward .stepper__content-panel{animation-name:stepper-slide-in-forward}:host.stepper--animated:not(.stepper--anim-fade) .stepper__content--animating.stepper__content--backward .stepper__content-panel,:host.stepper--animated.stepper--anim-slide .stepper__content--animating.stepper__content--backward .stepper__content-panel{animation-name:stepper-slide-in-backward}@keyframes stepper-fade-in{0%{opacity:0}to{opacity:1}}@keyframes stepper-slide-in-forward{0%{opacity:0;transform:translate(var(--hub-stepper-animation-distance))}to{opacity:1;transform:translate(0)}}@keyframes stepper-slide-in-backward{0%{opacity:0;transform:translate(calc(-1 * var(--hub-stepper-animation-distance)))}to{opacity:1;transform:translate(0)}}:host ::ng-deep button.stepper__button{border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}:host ::ng-deep button.stepper__button--back{background-color:var(--hub-stepper-background-color)}:host ::ng-deep button.stepper__button--next,:host ::ng-deep button.stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}:host ::ng-deep button.stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host([data-variant]){--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h)}:host([data-variant=primary]){--hub-stepper-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]){--hub-stepper-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]){--hub-stepper-accent: var(--hub-sys-color-success)}:host([data-variant=danger]){--hub-stepper-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]){--hub-stepper-accent: var(--hub-sys-color-warning)}:host([data-variant=info]){--hub-stepper-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]){--hub-stepper-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]){--hub-stepper-accent: var(--hub-sys-color-light)}:host([data-variant=dark]){--hub-stepper-accent: var(--hub-sys-color-dark)}:host(.stepper--truncate-titles) .stepper__nav-title{display:inline-block;max-inline-size:var(--hub-stepper-nav-title-max-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}\n"] }]
595
- }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], backLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "backLabel", required: false }] }], continueLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLabel", required: false }] }], submitLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "submitLabel", required: false }] }], truncateTitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateTitles", required: false }] }], railLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "railLabel", required: false }] }], completed: [{ type: i0.Output, args: ["completed"] }], previousStep: [{ type: i0.Output, args: ["previousStep"] }], nextStep: [{ type: i0.Output, args: ["nextStep"] }], steps: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StepComponent), { isSignal: true }] }], stepperNavTpt: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StepperNavDirective), { ...{ read: TemplateRef }, isSignal: true }] }], previousButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => PreviousButtonDirective), { isSignal: true }] }], nextButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NextButtonDirective), { isSignal: true }] }], submitButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SubmitButtonDirective), { isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
596
-
597
- /**
598
- * Marks an `ng-template` as a custom trigger template for an individual step.
599
- */
600
- class StepTriggerDirective {
601
- template;
602
- /** Captured template reference projected into the parent stepper. */
603
- constructor(template) {
604
- this.template = template;
605
- }
606
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepTriggerDirective, deps: [{ token: i0.TemplateRef }], target: i0.ɵɵFactoryTarget.Directive });
607
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "22.0.8", type: StepTriggerDirective, isStandalone: true, selector: "[hubStepTrigger], [stepTrigger]", ngImport: i0 });
608
- }
609
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: StepTriggerDirective, decorators: [{
610
- type: Directive,
611
- args: [{
612
- selector: '[hubStepTrigger], [stepTrigger]'
613
- }]
614
- }], ctorParameters: () => [{ type: i0.TemplateRef }] });
666
+ }, template: "<!--begin::Nav-->\n<nav class=\"hub-stepper__nav stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"hub-stepper__content stepper__content\"\n\t[class.hub-stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.hub-stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.hub-stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.hub-stepper__content--backward]=\"isBackwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"hub-stepper__content-panel stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"hub-stepper__controls stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul\n\t\tclass=\"hub-stepper__nav-list stepper__nav-list\"\n\t\trole=\"tablist\"\n\t\t[attr.aria-orientation]=\"railOrientation()\"\n\t\t[attr.aria-label]=\"railLabel()\"\n\t>\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"hub-stepper__nav-item stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"stepTriggerTpt() || defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t$implicit: step,\n\t\t\t\t\t\tstep: step,\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex,\n\t\t\t\t\t\tdisabled: !canNavigateTo(i)\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"hub-stepper__nav-trigger stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.hub-stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.hub-stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\"\n\t\t\t\t>Step {{ index + 1 }}</span\n\t\t\t>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n", styles: ["@charset \"UTF-8\";:host{--hub-stepper-accent: var(--hub-sys-color-primary, #0d6efd);--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h);--hub-stepper-primary-color: var(--hub-stepper-accent);--hub-stepper-background-color: var(--hub-sys-surface-elevated, #f8f9fa);--hub-stepper-text-color: var(--hub-sys-text-primary, #212529);--hub-stepper-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-surface-color: var(--hub-sys-surface-page, #ffffff);--hub-stepper-nav-bg: var(--hub-sys-surface-page, transparent);--hub-stepper-nav-padding-x: 0;--hub-stepper-nav-padding-y: 0;--hub-stepper-nav-border-width: 0;--hub-stepper-nav-border-color: var(--hub-sys-border-color-default, #dee2e6);--hub-stepper-nav-link-color: var(--hub-sys-text-primary, #212529);--hub-stepper-nav-link-hover-color: var(--hub-sys-link-hover-color, #0a58ca);--hub-stepper-nav-link-hover-bg: var(--hub-sys-state-hover-bg, rgba(0, 0, 0, .075));--hub-stepper-nav-link-active-color: var(--hub-stepper-accent-on, #ffffff);--hub-stepper-nav-link-active-bg: var(--hub-stepper-accent);--hub-stepper-nav-link-active-border-color: var(--hub-stepper-accent);--hub-stepper-nav-link-disabled-color: var(--hub-sys-text-muted, #6c757d);--hub-stepper-gap: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-gap: var(--hub-ref-space-1, .25rem);--hub-stepper-nav-trigger-padding-y: var(--hub-ref-space-2, .5rem);--hub-stepper-nav-trigger-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-nav-trigger-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-nav-trigger-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-indicator-size: calc(var(--hub-ref-space-3, 1rem) * 2);--hub-stepper-controls-justify: flex-end;--hub-stepper-controls-gap: var(--hub-ref-space-2, .5rem);--hub-stepper-control-padding-y: .375rem;--hub-stepper-control-padding-x: var(--hub-ref-space-3, 1rem);--hub-stepper-control-font-size: var(--hub-ref-font-size-sm, .875rem);--hub-stepper-control-line-height: var(--hub-ref-line-height-sm, 1.25);--hub-stepper-disabled-opacity: var(--hub-sys-opacity-50, .5);--hub-stepper-sidebar-min-width: 160px;--hub-stepper-sidebar-ideal-width: 20vw;--hub-stepper-sidebar-max-width: 240px;--hub-stepper-sidebar-width: clamp( var(--hub-stepper-sidebar-min-width), var(--hub-stepper-sidebar-ideal-width), var(--hub-stepper-sidebar-max-width) );--hub-stepper-content-padding-x: 0;--hub-stepper-content-padding-y: 0;--hub-stepper-content-border-width: 0;--hub-stepper-animation-duration: var(--hub-sys-transition-duration-base, .26s);--hub-stepper-animation-easing: var(--hub-sys-transition-timing-function-base, ease);--hub-stepper-animation-distance: var(--hub-ref-space-4, 1.5rem);display:grid;grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto;gap:var(--hub-stepper-gap);width:100%}:host.hub-stepper--layout-vertical{grid-template-columns:1fr;grid-template-areas:\"nav\" \"content\" \"controls\";grid-template-rows:auto 1fr auto}:host.hub-stepper--layout-sidebar{grid-template-columns:var(--hub-stepper-sidebar-width) minmax(0,1fr);grid-template-areas:\"nav content\" \"nav controls\";grid-template-rows:1fr auto;align-items:stretch}.hub-stepper__nav{grid-area:nav;background-color:var(--hub-stepper-nav-bg);border:var(--hub-stepper-nav-border-width) solid var(--hub-stepper-nav-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-nav-padding-y, 0) var(--hub-stepper-nav-padding-x, 0);overflow-x:auto}.hub-stepper__nav-list{list-style:none;display:flex;gap:var(--hub-stepper-nav-gap);padding:0;margin:0;min-width:max-content}.hub-stepper__nav-item{flex:0 0 auto}.hub-stepper__nav-trigger{display:inline-flex;align-items:center;gap:var(--hub-stepper-nav-trigger-gap);border:1px solid transparent;border-radius:var(--hub-sys-radius-pill, 50rem);background-color:transparent;padding:var(--hub-stepper-nav-trigger-padding-y) var(--hub-stepper-nav-trigger-padding-x);cursor:pointer;color:var(--hub-stepper-nav-link-color);font-size:var(--hub-stepper-nav-trigger-font-size);line-height:var(--hub-stepper-nav-trigger-line-height)}.hub-stepper__nav-trigger:hover:not(:disabled){color:var(--hub-stepper-nav-link-hover-color);background-color:var(--hub-stepper-nav-link-hover-bg)}.hub-stepper__nav-trigger--current{border-color:var(--hub-stepper-nav-link-active-border-color);background-color:var(--hub-stepper-nav-link-active-bg);color:var(--hub-stepper-nav-link-active-color)}.hub-stepper__nav-trigger--completed{color:var(--hub-stepper-nav-link-color)}.hub-stepper__nav-trigger:disabled{color:var(--hub-stepper-nav-link-disabled-color);cursor:not-allowed}.hub-stepper__content{grid-area:content;border:var(--hub-stepper-content-border-width) solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);background-color:var(--hub-stepper-surface-color);padding:var(--hub-stepper-content-padding-y, 0) var(--hub-stepper-content-padding-x, 0);min-width:0;position:relative;overflow:hidden}.hub-stepper__content-panel{will-change:transform,opacity}.hub-stepper__controls{grid-area:controls;display:flex;gap:var(--hub-stepper-controls-gap);align-items:center;justify-content:var(--hub-stepper-controls-justify)}.hub-stepper__controls :is(button[previousButton],button[nextButton],button[submitButton],.hub-stepper__button){border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}.hub-stepper__button--back{background-color:var(--hub-stepper-background-color);color:var(--hub-stepper-text-color)}.hub-stepper__button--next,.hub-stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.hub-stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}.hub-stepper__controls button[nextButton],.hub-stepper__controls button[submitButton]{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}.hub-stepper__controls button[previousButton]{background-color:var(--hub-stepper-background-color)}.hub-stepper__controls :is(button[previousButton],button[nextButton],button[submitButton]):disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host.hub-stepper--layout-sidebar .hub-stepper__nav{height:100%;overflow-y:auto;overflow-x:hidden}:host.hub-stepper--layout-sidebar .hub-stepper__nav-list{flex-direction:column;align-items:stretch}:host.hub-stepper--layout-sidebar .hub-stepper__nav-item{width:100%}:host.hub-stepper--layout-sidebar .hub-stepper__nav-trigger{width:100%;justify-content:flex-start}:host.hub-stepper--rtl{direction:rtl}:host.hub-stepper--rtl .hub-stepper__nav-list{flex-direction:row}:host.hub-stepper--rtl.hub-stepper--layout-sidebar .hub-stepper__nav-list{flex-direction:column}:host.hub-stepper--rtl.hub-stepper--layout-sidebar .hub-stepper__nav-trigger{justify-content:flex-end;text-align:right}.hub-stepper__button-icon{display:inline-flex;align-items:center;line-height:1}.hub-stepper__content--animated.hub-stepper__content--animating .hub-stepper__content-panel{animation-duration:var(--hub-stepper-animation-duration);animation-timing-function:var(--hub-stepper-animation-easing);animation-fill-mode:both}:host.hub-stepper--animated.hub-stepper--anim-fade .hub-stepper__content--animating .hub-stepper__content-panel{animation-name:hub-stepper-fade-in}:host.hub-stepper--animated:not(.hub-stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel,:host.hub-stepper--animated.hub-stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-forward}:host.hub-stepper--animated:not(.hub-stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel,:host.hub-stepper--animated.hub-stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-backward}:host.stepper--animated.stepper--anim-fade .hub-stepper__content--animating .hub-stepper__content-panel{animation-name:hub-stepper-fade-in}:host.stepper--animated:not(.stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel,:host.stepper--animated.stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--forward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-forward}:host.stepper--animated:not(.stepper--anim-fade) .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel,:host.stepper--animated.stepper--anim-slide .hub-stepper__content--animating.hub-stepper__content--backward .hub-stepper__content-panel{animation-name:hub-stepper-slide-in-backward}@keyframes hub-stepper-fade-in{0%{opacity:0}to{opacity:1}}@keyframes hub-stepper-slide-in-forward{0%{opacity:0;transform:translate(var(--hub-stepper-animation-distance))}to{opacity:1;transform:translate(0)}}@keyframes hub-stepper-slide-in-backward{0%{opacity:0;transform:translate(calc(-1 * var(--hub-stepper-animation-distance)))}to{opacity:1;transform:translate(0)}}:host ::ng-deep button.hub-stepper__button{border:1px solid var(--hub-stepper-border-color);border-radius:var(--hub-ref-radius-md, .375rem);padding:var(--hub-stepper-control-padding-y) var(--hub-stepper-control-padding-x);font-size:var(--hub-stepper-control-font-size);line-height:var(--hub-stepper-control-line-height);cursor:pointer;background-color:var(--hub-stepper-surface-color);color:var(--hub-stepper-text-color)}:host ::ng-deep button.hub-stepper__button--back{background-color:var(--hub-stepper-background-color)}:host ::ng-deep button.hub-stepper__button--next,:host ::ng-deep button.hub-stepper__button--submit{background-color:var(--hub-stepper-primary-color);border-color:var(--hub-stepper-primary-color);color:var(--hub-stepper-accent-on, #ffffff)}:host ::ng-deep button.hub-stepper__button:disabled{opacity:var(--hub-stepper-disabled-opacity);cursor:not-allowed}:host([data-variant]){--hub-stepper-accent-emphasis: color-mix(in oklch, var(--hub-stepper-accent) 80%, var(--hub-sys-color-ink, #212529));--hub-stepper-accent-subtle: color-mix(in oklch, var(--hub-stepper-accent) 12%, var(--hub-sys-surface-page, #fff));--hub-stepper-accent-on: oklch(from var(--hub-stepper-accent) clamp(0, (.62 - l) * 1000, 1) 0 h)}:host([data-variant=primary]){--hub-stepper-accent: var(--hub-sys-color-primary)}:host([data-variant=secondary]){--hub-stepper-accent: var(--hub-sys-color-secondary)}:host([data-variant=success]){--hub-stepper-accent: var(--hub-sys-color-success)}:host([data-variant=danger]){--hub-stepper-accent: var(--hub-sys-color-danger)}:host([data-variant=warning]){--hub-stepper-accent: var(--hub-sys-color-warning)}:host([data-variant=info]){--hub-stepper-accent: var(--hub-sys-color-info)}:host([data-variant=neutral]){--hub-stepper-accent: var(--hub-sys-color-neutral)}:host([data-variant=light]){--hub-stepper-accent: var(--hub-sys-color-light)}:host([data-variant=dark]){--hub-stepper-accent: var(--hub-sys-color-dark)}:host(.hub-stepper--truncate-titles) .hub-stepper__nav-title{display:inline-block;max-inline-size:var(--hub-stepper-nav-title-max-width, 12rem);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:bottom}\n"] }]
667
+ }], propDecorators: { variant: [{ type: i0.Input, args: [{ isSignal: true, alias: "variant", required: false }] }], backLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "backLabel", required: false }] }], continueLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "continueLabel", required: false }] }], submitLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "submitLabel", required: false }] }], truncateTitles: [{ type: i0.Input, args: [{ isSignal: true, alias: "truncateTitles", required: false }] }], railLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "railLabel", required: false }] }], completed: [{ type: i0.Output, args: ["completed"] }], previousStep: [{ type: i0.Output, args: ["previousStep"] }], nextStep: [{ type: i0.Output, args: ["nextStep"] }], steps: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => StepComponent), { isSignal: true }] }], stepperNavTpt: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StepperNavDirective), { ...{ read: TemplateRef }, isSignal: true }] }], stepTriggerTpt: [{ type: i0.ContentChild, args: [i0.forwardRef(() => StepTriggerDirective), { ...{ read: TemplateRef }, isSignal: true }] }], previousButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => PreviousButtonDirective), { ...{ descendants: false }, isSignal: true }] }], nextButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NextButtonDirective), { ...{ descendants: false }, isSignal: true }] }], submitButton: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SubmitButtonDirective), { ...{ descendants: false }, isSignal: true }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }] } });
615
668
 
616
669
  /** Aragonese dictionary for default stepper action labels. */
617
670
  const locale$9 = {
@@ -1 +1 @@
1
- {"version":3,"file":"ng-hub-ui-stepper.mjs","sources":["../../../projects/stepper/src/lib/next-button.directive.ts","../../../projects/stepper/src/lib/previous-button.directive.ts","../../../projects/stepper/src/lib/step/step.component.ts","../../../projects/stepper/src/lib/step/step.component.html","../../../projects/stepper/src/lib/stepper-nav.directive.ts","../../../projects/stepper/src/lib/submit-button.directive.ts","../../../projects/stepper/src/lib/stepper/stepper-options.ts","../../../projects/stepper/src/lib/stepper/stepper.component.ts","../../../projects/stepper/src/lib/stepper/stepper.component.html","../../../projects/stepper/src/lib/step-trigger.directive.ts","../../../projects/stepper/src/lib/assets/i18n/an.ts","../../../projects/stepper/src/lib/assets/i18n/ar.ts","../../../projects/stepper/src/lib/assets/i18n/ast.ts","../../../projects/stepper/src/lib/assets/i18n/ca.ts","../../../projects/stepper/src/lib/assets/i18n/de.ts","../../../projects/stepper/src/lib/assets/i18n/en.ts","../../../projects/stepper/src/lib/assets/i18n/es.ts","../../../projects/stepper/src/lib/assets/i18n/eu.ts","../../../projects/stepper/src/lib/assets/i18n/gl.ts","../../../projects/stepper/src/lib/assets/i18n/zh.ts","../../../projects/stepper/src/lib/stepper.providers.ts","../../../projects/stepper/src/lib/stepper.module.ts","../../../projects/stepper/src/lib/services/stepper-theme-service.ts","../../../projects/stepper/src/public-api.ts","../../../projects/stepper/src/ng-hub-ui-stepper.ts"],"sourcesContent":["import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper \"next\" action.\n * It also keeps the button disabled state synchronized with the next step availability.\n */\n@Directive({\n\tselector: 'button[nextButton], button[continueButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'stepper__button stepper__button--next',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.goToNext()'\n\t}\n})\nexport class NextButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether the control can trigger forward navigation. */\n\treadonly disabled = computed(() => {\n\t\tconst nextIndex = this.stepper.currentIndex() + 1;\n\t\tconst nextStep = this.stepper.steps()?.[nextIndex];\n\t\treturn !nextStep || nextStep.disabled();\n\t});\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper \"previous\" action.\n * It also keeps the button disabled state synchronized with backward navigation availability.\n */\n@Directive({\n\tselector: 'button[previousButton], button[backButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'stepper__button stepper__button--back',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.goToPrevious()'\n\t}\n})\nexport class PreviousButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether the control can trigger backward navigation. */\n\treadonly disabled = computed(() => {\n\t\tconst prevIndex = this.stepper.currentIndex() - 1;\n\t\tconst prevStep = this.stepper.steps()?.[prevIndex];\n\t\treturn !prevStep || prevStep.disabled();\n\t});\n}\n","import { ChangeDetectionStrategy, Component, inject, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { StepperComponent } from '../stepper/stepper.component';\n\n/** Default animation duration (ms) used by optional step transitions. */\nconst ANIMATION_DURATION = 256;\n\n/**\n * Defines a single step inside `hub-stepper`.\n * The component exposes metadata (title, disabled state, index) and a projected template as step content.\n */\n@Component({\n\tselector: 'hub-step, hub-ui-step',\n\ttemplateUrl: './step.component.html',\n\tstyleUrls: ['./step.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StepComponent {\n\t/** Parent stepper instance injected from the host context. */\n\tstepper = inject(StepperComponent);\n\n\t/**\n\t * Zero-based position of this step within the parent stepper.\n\t * Assigned automatically by `StepperComponent` — do not set this manually.\n\t */\n\treadonly index = signal<number>(0);\n\n\t/** Optional display title rendered in the step navigation. */\n\treadonly title = input<string>();\n\n\t/** Whether the step is disabled and cannot be navigated to. */\n\treadonly disabled = input(false);\n\n\t/** Template reference used by the parent stepper to render step content. */\n\treadonly innerTemplate = viewChild.required<TemplateRef<any>>('innerTemplate');\n\n\t/** Returns the animation state key consumed by content transitions. */\n\tget animationState() {\n\t\treturn '*';\n\t}\n\n\t/**\n\t * Returns whether the step can be navigated to.\n\t *\n\t * @returns `true` when the step is enabled.\n\t */\n\tisAccessible(): boolean {\n\t\treturn !this.disabled();\n\t}\n}\n","<ng-template #innerTemplate>\n\t<div class=\"step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n","import { TemplateRef, Directive } from '@angular/core';\n\n/**\n * Marks an `ng-template` as a custom navigation template for `hub-stepper`.\n */\n@Directive({\n\tselector: '[hubStepperNav], [stepperNav]'\n})\nexport class StepperNavDirective {\n\t/** Captured template reference projected into the parent stepper. */\n\tconstructor(public template: TemplateRef<any>) {}\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper completion action.\n * It disables the host button when the current step is disabled.\n */\n@Directive({\n\tselector: 'button[submitButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'stepper__button stepper__button--submit',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.complete()'\n\t}\n})\nexport class SubmitButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether completion is currently allowed. */\n\treadonly disabled = computed(() => this.stepper.currentStep?.disabled() ?? false);\n}\n","/**\n * Direction of the step transition animation.\n */\nexport enum StepperAnimationDirection {\n\tForward = 'forward',\n\tBackward = 'backward'\n}\n\n/**\n * Available layout modes for the stepper container.\n */\nexport enum StepperLayout {\n\tVertical = 'vertical',\n\tSidebar = 'sidebar'\n}\n\n/**\n * Optional configuration object for the stepper component.\n */\nexport interface StepperOptions {\n\t/**\n\t * Controls how nav, content and footer are arranged inside the stepper grid.\n\t */\n\tlayout?: StepperLayout;\n\n\t/**\n\t * Enables right-to-left rendering for nav, content and controls.\n\t */\n\trtl?: boolean;\n}\n","import {\n\tAfterContentInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tOnDestroy,\n\teffect,\n\tinject,\n\tsignal,\n\tTemplateRef,\n\tinput,\n\toutput,\n\tcontentChild,\n\tcontentChildren\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n\tHUB_TRANSLATION_PREFIX,\n\tHubOverflowTooltipDirective,\n\tresolveHubAccent,\n\tTranslatePipe,\n\tUcfirstPipe\n} from 'ng-hub-ui-utils';\nimport { NextButtonDirective } from '../next-button.directive';\nimport { PreviousButtonDirective } from '../previous-button.directive';\nimport { StepComponent } from '../step/step.component';\nimport { StepperNavDirective } from '../stepper-nav.directive';\nimport { SubmitButtonDirective } from '../submit-button.directive';\nimport { StepperAnimationDirection, StepperLayout, StepperOptions } from './stepper-options';\n\n/**\n * Renders and controls a multi-step workflow.\n * It coordinates navigation, state transitions and projected templates for steps and controls.\n */\n/** Variants with exact design-system token coverage via the SCSS `@each` loop. */\nconst STEPPER_BUILT_IN_VARIANTS = new Set<string>([\n\t'primary',\n\t'secondary',\n\t'success',\n\t'danger',\n\t'warning',\n\t'info',\n\t'neutral',\n\t'light',\n\t'dark'\n]);\n\n/** Monotonic counter used to build unique, stable per-instance ARIA ids. */\nlet nextStepperInstanceId = 0;\n\n@Component({\n\tselector: 'hub-stepper, hub-ui-stepper',\n\ttemplateUrl: './stepper.component.html',\n\tstyleUrls: ['./stepper.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgTemplateOutlet, TranslatePipe, UcfirstPipe, HubOverflowTooltipDirective],\n\tproviders: [{ provide: HUB_TRANSLATION_PREFIX, useValue: 'HUBUI.STEPPER' }],\n\thost: {\n\t\tclass: 'stepper',\n\t\t'[class.stepper--layout-vertical]': 'layout() === StepperLayout.Vertical',\n\t\t'[class.stepper--layout-sidebar]': 'layout() === StepperLayout.Sidebar',\n\t\t'[class.stepper--rtl]': 'isRtl()',\n\t\t'[class.stepper--truncate-titles]': 'truncateTitles()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-stepper-accent]': 'customAccent()'\n\t}\n})\nexport class StepperComponent implements AfterContentInit, OnDestroy {\n\t#cdr = inject(ChangeDetectorRef);\n\t#hostRef = inject(ElementRef<HTMLElement>);\n\t#animationFrameId: number | null = null;\n\n\t/** Unique per-instance token used to build stable ARIA ids for tabs and panels. */\n\treadonly #instanceId = nextStepperInstanceId++;\n\n\t/** Exposes layout enum values to the template. */\n\treadonly StepperLayout = StepperLayout;\n\n\t/** Stores the index of the currently active step. */\n\treadonly currentIndex = signal(0);\n\n\t/** Stores whether content transition animation is currently running. */\n\treadonly contentAnimating = signal(false);\n\n\t/** Stores transition direction used by the CSS animation classes. */\n\treadonly animationDirection = signal<StepperAnimationDirection>(StepperAnimationDirection.Forward);\n\n\t/**\n\t * Index of the rail tab holding the roving tabindex while the user moves\n\t * focus with the keyboard without activating a step, or `null` when the\n\t * tab stop follows the active step.\n\t */\n\tprotected readonly focusedIndex = signal<number | null>(null);\n\n\t/**\n\t * Semantic accent of the stepper: `'primary'` · `'secondary'` · `'success'` ·\n\t * `'danger'` · `'warning'` · `'info'` · `'neutral'` · `'light'` · `'dark'`, or\n\t * any custom string (read as `--hub-sys-color-<variant>`).\n\t * Re-bases `--hub-stepper-accent`, which drives the active step pill and the\n\t * next / submit controls. Defaults to primary.\n\t */\n\treadonly variant = input<string>();\n\n\t/**\n\t * Inline accent for custom (non-built-in) variants — the built-in nine are\n\t * resolved by the SCSS `@each` loop, so this returns `null` for them.\n\t *\n\t * Any custom value is accepted: a bareword (semantic name / registered accent /\n\t * CSS named colour) resolves to `var(--hub-sys-color-<v>, <v>)` — the design-system\n\t * token with the raw word as fallback — while a literal `#hex` / `rgb()` /\n\t * `oklch()` / `var()` is passed through unchanged.\n\t */\n\tprotected readonly customAccent = computed(() => {\n\t\tconst v = this.variant()?.trim();\n\t\tif (!v) {\n\t\t\treturn null;\n\t\t}\n\t\treturn STEPPER_BUILT_IN_VARIANTS.has(v) ? null : resolveHubAccent(v);\n\t});\n\n\t/** Optional custom label for the back button. */\n\treadonly backLabel = input<string | null>(null);\n\n\t/** Optional custom label for the continue button. */\n\treadonly continueLabel = input<string | null>(null);\n\n\t/** Optional custom label for the submit button. */\n\treadonly submitLabel = input<string | null>(null);\n\n\t/**\n\t * Opt-in truncation of the nav step titles. When `true`, each title is clipped\n\t * to `--hub-stepper-nav-title-max-width` (default `12rem`) with an ellipsis and,\n\t * if it overflows, exposes its full text as a tooltip (the hub-ui tooltip by\n\t * default; swappable with `provideHubTooltip`). Off by default, so the standard\n\t * nav layout is unchanged.\n\t */\n\treadonly truncateTitles = input(false);\n\n\t/**\n\t * Accessible name of the step rail tablist, announced by assistive\n\t * technologies. Defaults to `'Steps'`.\n\t */\n\treadonly railLabel = input('Steps');\n\n\t/** Emits once the user completes the last step. */\n\treadonly completed = output<void>();\n\n\t/** Emits the new index when moving to the previous step. */\n\treadonly previousStep = output<number>();\n\n\t/** Emits the new index when moving to the next step. */\n\treadonly nextStep = output<number>();\n\n\t/** Content-projected step definitions. */\n\treadonly steps = contentChildren(StepComponent);\n\n\t/** Automatically assigns each step its zero-based position when the steps collection changes. */\n\tprotected readonly assignStepIndexes = effect(() => {\n\t\tthis.steps().forEach((step, i) => step.index.set(i));\n\t});\n\n\t/** Optional content-projected template for custom navigation. */\n\treadonly stepperNavTpt = contentChild(StepperNavDirective, { read: TemplateRef });\n\n\t/** Optional custom projected previous button. */\n\treadonly previousButton = contentChild(PreviousButtonDirective);\n\n\t/** Optional custom projected next button. */\n\treadonly nextButton = contentChild(NextButtonDirective);\n\n\t/** Optional custom projected submit button. */\n\treadonly submitButton = contentChild(SubmitButtonDirective);\n\n\t/**\n\t * Optional visual and layout configuration for the stepper container.\n\t */\n\treadonly options = input<StepperOptions>({});\n\n\t/**\n\t * Returns the active layout mode.\n\t *\n\t * @returns The configured layout or the vertical default.\n\t */\n\tlayout(): StepperLayout {\n\t\treturn this.options()?.layout ?? StepperLayout.Vertical;\n\t}\n\n\t/**\n\t * Returns whether right-to-left mode is enabled.\n\t *\n\t * @returns `true` when RTL mode is active.\n\t */\n\tisRtl(): boolean {\n\t\treturn this.options()?.rtl ?? false;\n\t}\n\n\t/**\n\t * Returns the ARIA orientation of the step rail tablist. The rail lays out\n\t * horizontally in the default (vertical) layout and vertically in the\n\t * sidebar layout.\n\t *\n\t * @returns `'vertical'` for the sidebar layout, `'horizontal'` otherwise.\n\t */\n\tprotected railOrientation(): 'horizontal' | 'vertical' {\n\t\treturn this.layout() === StepperLayout.Sidebar ? 'vertical' : 'horizontal';\n\t}\n\n\t/**\n\t * Returns the stable DOM id of the rail tab for the given step index.\n\t *\n\t * @param index Step index.\n\t * @returns Unique, per-instance tab id.\n\t */\n\tprotected tabId(index: number): string {\n\t\treturn `hub-stepper-${this.#instanceId}-tab-${index}`;\n\t}\n\n\t/**\n\t * Returns the stable DOM id of the content panel for the given step index.\n\t *\n\t * @param index Step index.\n\t * @returns Unique, per-instance panel id.\n\t */\n\tprotected panelId(index: number): string {\n\t\treturn `hub-stepper-${this.#instanceId}-panel-${index}`;\n\t}\n\n\t/**\n\t * Roving `tabindex` for the rail tab at `index`: `0` for the focused tab\n\t * (or the active step when no tab holds transient keyboard focus), `-1`\n\t * for the rest — so the rail is a single Tab stop and the arrow keys move\n\t * within it.\n\t *\n\t * @param index Step index of the tab.\n\t * @returns `0` for the current tab stop, `-1` otherwise.\n\t */\n\tprotected tabIndexFor(index: number): number {\n\t\treturn (this.focusedIndex() ?? this.currentIndex()) === index ? 0 : -1;\n\t}\n\n\t/**\n\t * Keyboard navigation for the step rail (WAI-ARIA tabs pattern, manual\n\t * activation): ArrowRight/ArrowDown and ArrowLeft/ArrowUp move focus\n\t * between enabled step tabs (wrapping, skipping disabled steps), Home/End\n\t * jump to the first/last enabled tab, and Enter/Space activates the\n\t * focused step under the same permission model as clicking its trigger\n\t * (`canNavigateTo`). Moving focus never changes the active step.\n\t *\n\t * @param event Keyboard event fired on a rail tab.\n\t * @param index Step index of the tab that received the event.\n\t */\n\tprotected onRailKeydown(event: KeyboardEvent, index: number): void {\n\t\tlet target: number;\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\ttarget = this.#firstEnabledIndex();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\ttarget = this.#lastEnabledIndex();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.canNavigateTo(index)) {\n\t\t\t\t\tthis.goTo(index);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\tif (target < 0) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tthis.#focusTab(target);\n\t}\n\n\t/**\n\t * Returns the next enabled step index from `index` in `direction`,\n\t * wrapping around the rail.\n\t *\n\t * @param index Starting step index.\n\t * @param direction `1` to search forward, `-1` to search backward.\n\t * @returns The nearest enabled index, or `-1` when there are no steps.\n\t */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst steps = this.steps();\n\t\tconst count = steps.length;\n\t\tif (!count) {\n\t\t\treturn -1;\n\t\t}\n\t\tfor (let step = 1; step <= count; step += 1) {\n\t\t\tconst candidate = (((index + direction * step) % count) + count) % count;\n\t\t\tif (!steps[candidate].disabled()) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/**\n\t * Returns the index of the first enabled step.\n\t *\n\t * @returns First enabled index, or `-1` when every step is disabled.\n\t */\n\t#firstEnabledIndex(): number {\n\t\treturn this.steps().findIndex((step) => !step.disabled());\n\t}\n\n\t/**\n\t * Returns the index of the last enabled step.\n\t *\n\t * @returns Last enabled index, or `-1` when every step is disabled.\n\t */\n\t#lastEnabledIndex(): number {\n\t\tconst steps = this.steps();\n\t\tfor (let i = steps.length - 1; i >= 0; i -= 1) {\n\t\t\tif (!steps[i].disabled()) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Moves the roving tabindex and DOM focus to the rail tab at `index`.\n\t *\n\t * @param index Step index of the tab to focus.\n\t */\n\t#focusTab(index: number): void {\n\t\tthis.focusedIndex.set(index);\n\t\tthis.#cdr.detectChanges();\n\t\tconst host: HTMLElement = this.#hostRef.nativeElement;\n\t\tconst triggers = host.querySelectorAll<HTMLElement>('.stepper__nav-trigger');\n\t\ttriggers[index]?.focus();\n\t}\n\n\t/** Returns the active step component instance or `null` when unavailable. */\n\tget currentStep(): StepComponent | null {\n\t\treturn this.steps()?.[this.currentIndex()] ?? null;\n\t}\n\n\t/** Returns whether host classes enable animated transitions. */\n\thasAnimationClass(): boolean {\n\t\treturn this.#hostRef.nativeElement.classList.contains('stepper--animated');\n\t}\n\n\t/** Returns whether transition direction is forward. */\n\tisForwardAnimation(): boolean {\n\t\treturn this.animationDirection() === StepperAnimationDirection.Forward;\n\t}\n\n\t/** Returns whether transition direction is backward. */\n\tisBackwardAnimation(): boolean {\n\t\treturn this.animationDirection() === StepperAnimationDirection.Backward;\n\t}\n\n\t/** Initializes projected step metadata after content projection. */\n\tngAfterContentInit(): void {\n\t\tthis.initializeSteps();\n\t}\n\n\t/** Clears pending animation frame callbacks on component destroy. */\n\tngOnDestroy(): void {\n\t\tthis.clearAnimationFrame();\n\t}\n\n\t/**\n\t * Triggers initial change detection for projected steps.\n\t */\n\tprivate initializeSteps(): void {\n\t\tthis.#cdr.detectChanges();\n\t}\n\n\t/**\n\t * Navigates to the previous step index.\n\t */\n\tgoToPrevious(): void {\n\t\tthis.goTo(this.currentIndex() - 1);\n\t}\n\n\t/**\n\t * Navigates to the next step index.\n\t */\n\tgoToNext(): void {\n\t\tthis.goTo(this.currentIndex() + 1);\n\t}\n\n\t/**\n\t * Navigates to a specific step index when it is valid.\n\t *\n\t * @param index Target step index.\n\t */\n\tgoTo(index: number): void {\n\t\tif (this.isStepIndexInBounds(index)) {\n\t\t\tconst previousIndex = this.currentIndex();\n\t\t\tif (index === previousIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.animationDirection.set(\n\t\t\t\tindex > previousIndex ? StepperAnimationDirection.Forward : StepperAnimationDirection.Backward\n\t\t\t);\n\t\t\tthis.currentIndex.set(index);\n\t\t\tthis.focusedIndex.set(null);\n\t\t\tthis.playContentTransition();\n\t\t\tthis.#cdr.detectChanges();\n\t\t\tif (index > previousIndex) {\n\t\t\t\tthis.nextStep.emit(index);\n\t\t\t} else if (index < previousIndex) {\n\t\t\t\tthis.previousStep.emit(index);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether the target step can be activated.\n\t *\n\t * @param index Target step index.\n\t * @returns `true` when index is in bounds and the step is not disabled.\n\t */\n\tcanNavigateTo(index: number): boolean {\n\t\treturn this.isStepIndexInBounds(index) && this.isValidStepIndex(index);\n\t}\n\n\t/**\n\t * Completes the stepper workflow and emits the completion event.\n\t */\n\tcomplete(): void {\n\t\tthis.completed.emit();\n\t}\n\n\t/**\n\t * Returns whether a step at the provided index is enabled.\n\t *\n\t * @param index Step index to validate.\n\t * @returns `true` when the step exists and is enabled.\n\t */\n\tisValidStepIndex(index: number): boolean {\n\t\treturn !this.steps()?.[index]?.disabled();\n\t}\n\n\t/**\n\t * Returns whether the provided index is within the steps collection bounds.\n\t *\n\t * @param index Step index to validate.\n\t * @returns `true` when the index points to an existing step.\n\t */\n\tisStepIndexInBounds(index: number): boolean {\n\t\treturn index >= 0 && index < this.steps().length;\n\t}\n\n\t/**\n\t * Starts and schedules the content transition animation lifecycle.\n\t */\n\tprivate playContentTransition(): void {\n\t\tthis.clearAnimationFrame();\n\t\tthis.contentAnimating.set(false);\n\t\tif (!this.hasAnimationClass()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#animationFrameId = globalThis.requestAnimationFrame(() => {\n\t\t\tthis.contentAnimating.set(true);\n\t\t\tthis.#cdr.detectChanges();\n\t\t});\n\t}\n\n\t/**\n\t * Clears the pending animation frame used to trigger content transitions.\n\t */\n\tprivate clearAnimationFrame(): void {\n\t\tif (this.#animationFrameId !== null) {\n\t\t\tglobalThis.cancelAnimationFrame(this.#animationFrameId);\n\t\t\tthis.#animationFrameId = null;\n\t\t}\n\t}\n\n\t/**\n\t * Handles animation end events and resets the active transition state.\n\t *\n\t * @param event DOM animation end event.\n\t */\n\tonContentAnimationEnd(event: AnimationEvent): void {\n\t\tif (event.target !== event.currentTarget) {\n\t\t\treturn;\n\t\t}\n\t\tthis.contentAnimating.set(false);\n\t\tthis.#cdr.detectChanges();\n\t}\n}\n","<!--begin::Nav-->\n<nav class=\"stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"stepper__content\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul class=\"stepper__nav-list\" role=\"tablist\" [attr.aria-orientation]=\"railOrientation()\" [attr.aria-label]=\"railLabel()\">\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\">Step {{ index + 1 }}</span>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n","import { TemplateRef, Directive } from '@angular/core';\n\n/**\n * Marks an `ng-template` as a custom trigger template for an individual step.\n */\n@Directive({\n\tselector: '[hubStepTrigger], [stepTrigger]'\n})\nexport class StepTriggerDirective {\n\t/** Captured template reference projected into the parent stepper. */\n\tconstructor(public template: TemplateRef<any>) {}\n}\n","/** Aragonese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'an',\n\tdata: {\n\t\tBACK: 'dezaga',\n\t\tCONTINUE: 'continar',\n\t\tSUBMIT: 'ninviar'\n\t}\n};\n","/** Arabic dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ar',\n\tdata: {\n\t\tBACK: 'رجوع',\n\t\tCONTINUE: 'متابعة',\n\t\tSUBMIT: 'إرسال'\n\t}\n};\n","/** Asturleonese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ast',\n\tdata: {\n\t\tBACK: 'tornar',\n\t\tCONTINUE: 'siguir',\n\t\tSUBMIT: 'unviar'\n\t}\n};\n","/** Catalan dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ca',\n\tdata: {\n\t\tBACK: 'enrere',\n\t\tCONTINUE: 'continua',\n\t\tSUBMIT: 'envia'\n\t}\n};\n","/** German dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'de',\n\tdata: {\n\t\tBACK: 'zuruck',\n\t\tCONTINUE: 'weiter',\n\t\tSUBMIT: 'senden'\n\t}\n};\n","/** English dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'en',\n\tdata: {\n\t\tBACK: 'back',\n\t\tCONTINUE: 'continue',\n\t\tSUBMIT: 'submit'\n\t}\n};\n","/** Castilian dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'es',\n\tdata: {\n\t\tBACK: 'volver',\n\t\tCONTINUE: 'continuar',\n\t\tSUBMIT: 'enviar'\n\t}\n};\n","/** Basque dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'eu',\n\tdata: {\n\t\tBACK: 'atzera',\n\t\tCONTINUE: 'jarraitu',\n\t\tSUBMIT: 'bidali'\n\t}\n};\n","/** Galician dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'gl',\n\tdata: {\n\t\tBACK: 'volver',\n\t\tCONTINUE: 'continuar',\n\t\tSUBMIT: 'enviar'\n\t}\n};\n","/** Chinese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'zh',\n\tdata: {\n\t\tBACK: '返回',\n\t\tCONTINUE: '继续',\n\t\tSUBMIT: '提交'\n\t}\n};\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationService } from 'ng-hub-ui-utils';\nimport { locale as anLocale } from './assets/i18n/an';\nimport { locale as arLocale } from './assets/i18n/ar';\nimport { locale as astLocale } from './assets/i18n/ast';\nimport { locale as caLocale } from './assets/i18n/ca';\nimport { locale as deLocale } from './assets/i18n/de';\nimport { locale as enLocale } from './assets/i18n/en';\nimport { locale as esLocale } from './assets/i18n/es';\nimport { locale as euLocale } from './assets/i18n/eu';\nimport { locale as glLocale } from './assets/i18n/gl';\nimport { locale as zhLocale } from './assets/i18n/zh';\nimport { StepperConfig } from './stepper-config';\n\n/** Default language used when the caller names none. */\nconst DEFAULT_LANGUAGE = 'es';\n\n/** Language the lookup falls back to when a key is missing from the active one. */\nconst DEFAULT_FALLBACK_LANGUAGE = 'en';\n\n/**\n * The three control labels the stepper renders on its own, keyed by language code.\n *\n * Exported so an application can register only the languages it ships, merge them into a\n * dictionary of its own, or translate them further, instead of retyping thirty strings.\n * The keys are flat (`BACK` / `CONTINUE` / `SUBMIT`) because that is what the component\n * resolves after its `HUBUI.STEPPER` namespace misses — nesting them here would silently\n * stop matching.\n *\n * Frozen through: the record is shared by every application on the page, so a consumer that\n * meant to extend it has to spread it rather than write into it.\n */\nexport const STEPPER_DICTIONARIES: Readonly<Record<string, Readonly<Record<string, string>>>> = Object.freeze({\n\t[enLocale.lang]: Object.freeze(enLocale.data),\n\t[esLocale.lang]: Object.freeze(esLocale.data),\n\t[caLocale.lang]: Object.freeze(caLocale.data),\n\t[euLocale.lang]: Object.freeze(euLocale.data),\n\t[glLocale.lang]: Object.freeze(glLocale.data),\n\t[astLocale.lang]: Object.freeze(astLocale.data),\n\t[anLocale.lang]: Object.freeze(anLocale.data),\n\t[deLocale.lang]: Object.freeze(deLocale.data),\n\t[zhLocale.lang]: Object.freeze(zhLocale.data),\n\t[arLocale.lang]: Object.freeze(arLocale.data)\n});\n\n/**\n * Standalone entry point for the stepper: registers the bundled `en` / `es` / `ca` / `eu` /\n * `gl` / `ast` / `an` / `de` / `zh` / `ar` dictionaries and the `HubTranslationService` that\n * the built-in Back / Continue / Submit controls resolve their text through.\n *\n * ```ts\n * import { provideHubStepper } from 'ng-hub-ui-stepper';\n *\n * bootstrapApplication(AppComponent, {\n * \tproviders: [provideHubStepper({ language: 'en' })]\n * });\n * ```\n *\n * It writes `HUB_TRANSLATION_CONFIG`, which is a single application-wide token: an app that\n * also calls `provideHubTranslation()` at the root should register the stepper languages in\n * that call — `STEPPER_DICTIONARIES` is exported for exactly that — or scope this one to the\n * route that owns the wizard, or the later provider wins and the other library loses its\n * dictionaries.\n *\n * @param config Optional language and fallback language override.\n * @returns Environment providers for the stepper library.\n */\nexport function provideHubStepper(config?: StepperConfig): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_TRANSLATION_CONFIG,\n\t\t\tuseValue: {\n\t\t\t\tdictionaries: STEPPER_DICTIONARIES,\n\t\t\t\tlanguage: config?.language ?? DEFAULT_LANGUAGE,\n\t\t\t\tfallbackLanguage: config?.fallbackLanguage ?? DEFAULT_FALLBACK_LANGUAGE\n\t\t\t}\n\t\t},\n\t\tHubTranslationService\n\t]);\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { StepTriggerDirective } from './step-trigger.directive';\nimport { StepComponent } from './step/step.component';\nimport { StepperNavDirective } from './stepper-nav.directive';\nimport { StepperComponent } from './stepper/stepper.component';\nimport { PreviousButtonDirective } from './previous-button.directive';\nimport { NextButtonDirective } from './next-button.directive';\nimport { SubmitButtonDirective } from './submit-button.directive';\nimport { StepperConfig } from './stepper-config';\nimport { provideHubStepper } from './stepper.providers';\n\n/** All stepper building blocks as a convenience array. */\nconst STEPPER_STANDALONE = [\n\tStepperComponent,\n\tStepComponent,\n\tStepTriggerDirective,\n\tStepperNavDirective,\n\tPreviousButtonDirective,\n\tNextButtonDirective,\n\tSubmitButtonDirective\n] as const;\n\n/**\n * Backward-compatibility module that re-exports all stepper standalone building blocks.\n *\n * @deprecated Import the building blocks directly — `StepperComponent`, `StepComponent`,\n * `StepTriggerDirective`, `StepperNavDirective`, `PreviousButtonDirective`,\n * `NextButtonDirective` and `SubmitButtonDirective` are all standalone. Scheduled for\n * removal in **23.0.0**, `forRoot()` included: see its own note for what replaces it.\n */\n@NgModule({\n\timports: [...STEPPER_STANDALONE],\n\texports: [...STEPPER_STANDALONE]\n})\nexport class StepperModule {\n\t/**\n\t * Registers built-in dictionaries and resolves the active translation language.\n\t *\n\t * @deprecated Goes with the module in **23.0.0**. Replace it with\n\t * `provideHubStepper(config)`, which registers the same dictionaries and the same\n\t * `HubTranslationService` without a module. This method now delegates to it, so the swap\n\t * changes nothing at runtime.\n\t *\n\t * @param config Optional language and fallback language override.\n\t * @returns Module providers with translation configuration.\n\t */\n\tstatic forRoot(config?: StepperConfig): ModuleWithProviders<StepperModule> {\n\t\treturn {\n\t\t\tngModule: StepperModule,\n\t\t\tproviders: [provideHubStepper(config)]\n\t\t};\n\t}\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, Renderer2, RendererFactory2, inject } from '@angular/core';\n\n/**\n * Applies runtime CSS variable overrides for the stepper design tokens.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class StepperThemeService {\n\t/** Angular renderer used to update root-level CSS variables safely. */\n\tprivate renderer: Renderer2;\n\n\t/** Injected document token; SSR-safe alternative to the global `document`. */\n\tprivate readonly document = inject(DOCUMENT);\n\n\t/**\n\t * Creates a renderer instance for dynamic style updates.\n\t *\n\t * @param rendererFactory Angular renderer factory.\n\t */\n\tconstructor(rendererFactory: RendererFactory2) {\n\t\tthis.renderer = rendererFactory.createRenderer(null, null);\n\t}\n\n\t/**\n\t * Applies the provided stepper theme map to CSS custom properties.\n\t *\n\t * @param theme Key-value map of stepper token names and CSS values.\n\t */\n\tsetTheme(theme: { [key: string]: string }) {\n\t\tObject.keys(theme).forEach((key) => {\n\t\t\tthis.renderer.setStyle(this.document.documentElement, `--hub-stepper-${key}`, theme[key]);\n\t\t});\n\t}\n}\n","/*\n * Public API Surface of stepper\n */\nexport * from './lib/stepper/stepper.component';\nexport * from './lib/step/step.component';\nexport * from './lib/stepper.module';\nexport * from './lib/stepper.providers';\nexport * from './lib/previous-button.directive';\nexport * from './lib/next-button.directive';\nexport * from './lib/submit-button.directive';\nexport * from './lib/step-trigger.directive';\nexport * from './lib/stepper-nav.directive';\nexport * from './lib/services/stepper-theme-service';\nexport * from './lib/stepper/stepper-options';\nexport * from './lib/stepper-config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["locale","enLocale","esLocale","caLocale","euLocale","glLocale","astLocale","anLocale","deLocale","zhLocale","arLocale"],"mappings":"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"}
1
+ {"version":3,"file":"ng-hub-ui-stepper.mjs","sources":["../../../projects/stepper/src/lib/next-button.directive.ts","../../../projects/stepper/src/lib/previous-button.directive.ts","../../../projects/stepper/src/lib/step/step.component.ts","../../../projects/stepper/src/lib/step/step.component.html","../../../projects/stepper/src/lib/step-trigger.directive.ts","../../../projects/stepper/src/lib/stepper-nav.directive.ts","../../../projects/stepper/src/lib/submit-button.directive.ts","../../../projects/stepper/src/lib/stepper/stepper-options.ts","../../../projects/stepper/src/lib/stepper/stepper.component.ts","../../../projects/stepper/src/lib/stepper/stepper.component.html","../../../projects/stepper/src/lib/assets/i18n/an.ts","../../../projects/stepper/src/lib/assets/i18n/ar.ts","../../../projects/stepper/src/lib/assets/i18n/ast.ts","../../../projects/stepper/src/lib/assets/i18n/ca.ts","../../../projects/stepper/src/lib/assets/i18n/de.ts","../../../projects/stepper/src/lib/assets/i18n/en.ts","../../../projects/stepper/src/lib/assets/i18n/es.ts","../../../projects/stepper/src/lib/assets/i18n/eu.ts","../../../projects/stepper/src/lib/assets/i18n/gl.ts","../../../projects/stepper/src/lib/assets/i18n/zh.ts","../../../projects/stepper/src/lib/stepper.providers.ts","../../../projects/stepper/src/lib/stepper.module.ts","../../../projects/stepper/src/lib/services/stepper-theme-service.ts","../../../projects/stepper/src/public-api.ts","../../../projects/stepper/src/ng-hub-ui-stepper.ts"],"sourcesContent":["import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper \"next\" action.\n * It also keeps the button disabled state synchronized with the next step availability.\n */\n@Directive({\n\tselector: 'button[nextButton], button[continueButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.goToNext()'\n\t}\n})\nexport class NextButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether the control can trigger forward navigation. */\n\treadonly disabled = computed(() => {\n\t\tconst nextIndex = this.stepper.currentIndex() + 1;\n\t\tconst nextStep = this.stepper.steps()?.[nextIndex];\n\t\treturn !nextStep || nextStep.disabled();\n\t});\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper \"previous\" action.\n * It also keeps the button disabled state synchronized with backward navigation availability.\n */\n@Directive({\n\tselector: 'button[previousButton], button[backButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.goToPrevious()'\n\t}\n})\nexport class PreviousButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether the control can trigger backward navigation. */\n\treadonly disabled = computed(() => {\n\t\tconst prevIndex = this.stepper.currentIndex() - 1;\n\t\tconst prevStep = this.stepper.steps()?.[prevIndex];\n\t\treturn !prevStep || prevStep.disabled();\n\t});\n}\n","import { ChangeDetectionStrategy, Component, inject, input, signal, TemplateRef, viewChild } from '@angular/core';\nimport { StepperComponent } from '../stepper/stepper.component';\n\n/** Default animation duration (ms) used by optional step transitions. */\nconst ANIMATION_DURATION = 256;\n\n/**\n * Defines a single step inside `hub-stepper`.\n * The component exposes metadata (title, disabled state, index) and a projected template as step content.\n */\n@Component({\n\tselector: 'hub-step, hub-ui-step',\n\ttemplateUrl: './step.component.html',\n\tstyleUrls: ['./step.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush\n})\nexport class StepComponent {\n\t/** Parent stepper instance injected from the host context. */\n\tstepper = inject(StepperComponent);\n\n\t/**\n\t * Zero-based position of this step within the parent stepper.\n\t * Assigned automatically by `StepperComponent` — do not set this manually.\n\t */\n\treadonly index = signal<number>(0);\n\n\t/** Optional display title rendered in the step navigation. */\n\treadonly title = input<string>();\n\n\t/** Whether the step is disabled and cannot be navigated to. */\n\treadonly disabled = input(false);\n\n\t/** Template reference used by the parent stepper to render step content. */\n\treadonly innerTemplate = viewChild.required<TemplateRef<any>>('innerTemplate');\n\n\t/** Returns the animation state key consumed by content transitions. */\n\tget animationState() {\n\t\treturn '*';\n\t}\n\n\t/**\n\t * Returns whether the step can be navigated to.\n\t *\n\t * @returns `true` when the step is enabled.\n\t */\n\tisAccessible(): boolean {\n\t\treturn !this.disabled();\n\t}\n}\n","<ng-template #innerTemplate>\n\t<div class=\"hub-step__content step__content\" [attr.data-step-index]=\"index()\" [attr.aria-label]=\"title()\">\n\t\t<ng-content></ng-content>\n\t</div>\n</ng-template>\n","import { TemplateRef, Directive } from '@angular/core';\n\n/**\n * Marks an `ng-template` as the trigger the default rail renders for each step, in place of the\n * built-in pill button.\n *\n * It is the counterpart of `hubStepperNav`, one level down: that one replaces the whole rail,\n * this one keeps the rail — its list, its `role=\"tablist\"`, its orientation and its label — and\n * only swaps the control inside each item. A stepper that declares both uses the nav template and\n * ignores this one, because a custom rail draws its own triggers.\n *\n * The template context carries the step as `$implicit` and as `step`, plus `title`, `index`,\n * `isCurrent`, `isCompleted` and `disabled`. Activating a step stays with the consumer, through a\n * template reference on the host:\n *\n * @example\n * ```html\n * <hub-stepper #wizard>\n * \t<ng-template hubStepTrigger let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-disabled=\"disabled\">\n * \t\t<button type=\"button\" role=\"tab\" [attr.aria-selected]=\"isCurrent\" [disabled]=\"disabled\" (click)=\"wizard.goTo(index)\">\n * \t\t\t{{ index + 1 }}. {{ title }}\n * \t\t</button>\n * \t</ng-template>\n * \t<hub-step title=\"Account\">…</hub-step>\n * </hub-stepper>\n * ```\n */\n@Directive({\n\tselector: '[hubStepTrigger], [stepTrigger]'\n})\nexport class StepTriggerDirective {\n\t/** Captured template reference projected into the parent stepper. */\n\tconstructor(public template: TemplateRef<any>) {}\n}\n","import { TemplateRef, Directive } from '@angular/core';\n\n/**\n * Marks an `ng-template` as a custom navigation template for `hub-stepper`.\n */\n@Directive({\n\tselector: '[hubStepperNav], [stepperNav]'\n})\nexport class StepperNavDirective {\n\t/** Captured template reference projected into the parent stepper. */\n\tconstructor(public template: TemplateRef<any>) {}\n}\n","import { computed, Directive, inject } from '@angular/core';\nimport { StepperComponent } from './stepper/stepper.component';\n\n/**\n * Connects a projected button to the stepper completion action.\n * It disables the host button when the current step is disabled.\n */\n@Directive({\n\tselector: 'button[submitButton]',\n\tstandalone: true,\n\thost: {\n\t\tclass: 'hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit',\n\t\t'[disabled]': 'disabled()',\n\t\t'(click)': 'stepper.complete()'\n\t}\n})\nexport class SubmitButtonDirective {\n\treadonly stepper = inject(StepperComponent);\n\n\t/** Reflects whether completion is currently allowed. */\n\treadonly disabled = computed(() => this.stepper.currentStep?.disabled() ?? false);\n}\n","/**\n * Direction of the step transition animation.\n */\nexport enum StepperAnimationDirection {\n\tForward = 'forward',\n\tBackward = 'backward'\n}\n\n/**\n * Available layout modes for the stepper container.\n */\nexport enum StepperLayout {\n\tVertical = 'vertical',\n\tSidebar = 'sidebar'\n}\n\n/**\n * Optional configuration object for the stepper component.\n */\nexport interface StepperOptions {\n\t/**\n\t * Controls how nav, content and footer are arranged inside the stepper grid.\n\t */\n\tlayout?: StepperLayout;\n\n\t/**\n\t * Enables right-to-left rendering for nav, content and controls.\n\t */\n\trtl?: boolean;\n}\n","import {\n\tAfterContentInit,\n\tChangeDetectionStrategy,\n\tChangeDetectorRef,\n\tComponent,\n\tcomputed,\n\tElementRef,\n\tOnDestroy,\n\teffect,\n\tinject,\n\tsignal,\n\tTemplateRef,\n\tinput,\n\toutput,\n\tcontentChild,\n\tcontentChildren\n} from '@angular/core';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n\tHUB_TRANSLATION_PREFIX,\n\tHubOverflowTooltipDirective,\n\tresolveHubAccent,\n\tTranslatePipe,\n\tUcfirstPipe\n} from 'ng-hub-ui-utils';\nimport { NextButtonDirective } from '../next-button.directive';\nimport { PreviousButtonDirective } from '../previous-button.directive';\nimport { StepComponent } from '../step/step.component';\nimport { StepTriggerDirective } from '../step-trigger.directive';\nimport { StepperNavDirective } from '../stepper-nav.directive';\nimport { SubmitButtonDirective } from '../submit-button.directive';\nimport { StepperAnimationDirection, StepperLayout, StepperOptions } from './stepper-options';\n\n/**\n * Renders and controls a multi-step workflow.\n * It coordinates navigation, state transitions and projected templates for steps and controls.\n */\n/** Variants with exact design-system token coverage via the SCSS `@each` loop. */\nconst STEPPER_BUILT_IN_VARIANTS = new Set<string>([\n\t'primary',\n\t'secondary',\n\t'success',\n\t'danger',\n\t'warning',\n\t'info',\n\t'neutral',\n\t'light',\n\t'dark'\n]);\n\n/** Monotonic counter used to build unique, stable per-instance ARIA ids. */\nlet nextStepperInstanceId = 0;\n\n@Component({\n\tselector: 'hub-stepper, hub-ui-stepper',\n\ttemplateUrl: './stepper.component.html',\n\tstyleUrls: ['./stepper.component.scss'],\n\tchangeDetection: ChangeDetectionStrategy.OnPush,\n\timports: [NgTemplateOutlet, TranslatePipe, UcfirstPipe, HubOverflowTooltipDirective],\n\tproviders: [{ provide: HUB_TRANSLATION_PREFIX, useValue: 'HUBUI.STEPPER' }],\n\thost: {\n\t\t// `hub-stepper` is the block from 22.10.0 on. The bare `stepper` beside it is the name it\n\t\t// replaces — a word in the application's namespace, not the library's — kept working until\n\t\t// it is removed in 23.0.0. Same story for every modifier below.\n\t\tclass: 'hub-stepper stepper',\n\t\t'[class.hub-stepper--layout-vertical]': 'layout() === StepperLayout.Vertical',\n\t\t'[class.stepper--layout-vertical]': 'layout() === StepperLayout.Vertical',\n\t\t'[class.hub-stepper--layout-sidebar]': 'layout() === StepperLayout.Sidebar',\n\t\t'[class.stepper--layout-sidebar]': 'layout() === StepperLayout.Sidebar',\n\t\t'[class.hub-stepper--rtl]': 'isRtl()',\n\t\t'[class.stepper--rtl]': 'isRtl()',\n\t\t'[class.hub-stepper--truncate-titles]': 'truncateTitles()',\n\t\t'[class.stepper--truncate-titles]': 'truncateTitles()',\n\t\t'[attr.data-variant]': 'variant() ?? null',\n\t\t'[style.--hub-stepper-accent]': 'customAccent()'\n\t}\n})\nexport class StepperComponent implements AfterContentInit, OnDestroy {\n\t#cdr = inject(ChangeDetectorRef);\n\t#hostRef = inject(ElementRef<HTMLElement>);\n\t#animationFrameId: number | null = null;\n\n\t/** Unique per-instance token used to build stable ARIA ids for tabs and panels. */\n\treadonly #instanceId = nextStepperInstanceId++;\n\n\t/** Exposes layout enum values to the template. */\n\treadonly StepperLayout = StepperLayout;\n\n\t/** Stores the index of the currently active step. */\n\treadonly currentIndex = signal(0);\n\n\t/** Stores whether content transition animation is currently running. */\n\treadonly contentAnimating = signal(false);\n\n\t/** Stores transition direction used by the CSS animation classes. */\n\treadonly animationDirection = signal<StepperAnimationDirection>(StepperAnimationDirection.Forward);\n\n\t/**\n\t * Index of the rail tab holding the roving tabindex while the user moves\n\t * focus with the keyboard without activating a step, or `null` when the\n\t * tab stop follows the active step.\n\t */\n\tprotected readonly focusedIndex = signal<number | null>(null);\n\n\t/**\n\t * Semantic accent of the stepper: `'primary'` · `'secondary'` · `'success'` ·\n\t * `'danger'` · `'warning'` · `'info'` · `'neutral'` · `'light'` · `'dark'`, or\n\t * any custom string (read as `--hub-sys-color-<variant>`).\n\t * Re-bases `--hub-stepper-accent`, which drives the active step pill and the\n\t * next / submit controls. Defaults to primary.\n\t */\n\treadonly variant = input<string>();\n\n\t/**\n\t * Inline accent for custom (non-built-in) variants — the built-in nine are\n\t * resolved by the SCSS `@each` loop, so this returns `null` for them.\n\t *\n\t * Any custom value is accepted: a bareword (semantic name / registered accent /\n\t * CSS named colour) resolves to `var(--hub-sys-color-<v>, <v>)` — the design-system\n\t * token with the raw word as fallback — while a literal `#hex` / `rgb()` /\n\t * `oklch()` / `var()` is passed through unchanged.\n\t */\n\tprotected readonly customAccent = computed(() => {\n\t\tconst v = this.variant()?.trim();\n\t\tif (!v) {\n\t\t\treturn null;\n\t\t}\n\t\treturn STEPPER_BUILT_IN_VARIANTS.has(v) ? null : resolveHubAccent(v);\n\t});\n\n\t/** Optional custom label for the back button. */\n\treadonly backLabel = input<string | null>(null);\n\n\t/** Optional custom label for the continue button. */\n\treadonly continueLabel = input<string | null>(null);\n\n\t/** Optional custom label for the submit button. */\n\treadonly submitLabel = input<string | null>(null);\n\n\t/**\n\t * Opt-in truncation of the nav step titles. When `true`, each title is clipped\n\t * to `--hub-stepper-nav-title-max-width` (default `12rem`) with an ellipsis and,\n\t * if it overflows, exposes its full text as a tooltip (the hub-ui tooltip by\n\t * default; swappable with `provideHubTooltip`). Off by default, so the standard\n\t * nav layout is unchanged.\n\t */\n\treadonly truncateTitles = input(false);\n\n\t/**\n\t * Accessible name of the step rail tablist, announced by assistive\n\t * technologies. Defaults to `'Steps'`.\n\t */\n\treadonly railLabel = input('Steps');\n\n\t/** Emits once the user completes the last step. */\n\treadonly completed = output<void>();\n\n\t/** Emits the new index when moving to the previous step. */\n\treadonly previousStep = output<number>();\n\n\t/** Emits the new index when moving to the next step. */\n\treadonly nextStep = output<number>();\n\n\t/** Content-projected step definitions. */\n\treadonly steps = contentChildren(StepComponent);\n\n\t/** Automatically assigns each step its zero-based position when the steps collection changes. */\n\tprotected readonly assignStepIndexes = effect(() => {\n\t\tthis.steps().forEach((step, i) => step.index.set(i));\n\t});\n\n\t/** Optional content-projected template for custom navigation. */\n\treadonly stepperNavTpt = contentChild(StepperNavDirective, { read: TemplateRef });\n\n\t/**\n\t * Optional content-projected template rendered in place of the built-in rail trigger, once\n\t * per step. Only the default rail uses it: a `hubStepperNav` template draws its own triggers.\n\t *\n\t * The context carries the step itself as `$implicit`, plus `title`, `index`, `isCurrent`,\n\t * `isCompleted` and `disabled`. Activation stays with the consumer, which is what a template\n\t * reference on the host is for: `<hub-stepper #wizard>` … `(click)=\"wizard.goTo(index)\"`.\n\t */\n\treadonly stepTriggerTpt = contentChild(StepTriggerDirective, { read: TemplateRef });\n\n\t/**\n\t * Optional custom projected previous button.\n\t *\n\t * `descendants: false` on the three control queries is not a detail. Content projection with\n\t * a `select` only ever matches a direct child of the host, so a `button previousButton`\n\t * nested deeper — inside a `hub-step`, inside a form — can never reach the controls row. With\n\t * the default `descendants: true` the query found it anyway, the component concluded a custom\n\t * control had been supplied, and rendered no button at all: the stepper lost its own control\n\t * to a button it could not display.\n\t */\n\treadonly previousButton = contentChild(PreviousButtonDirective, { descendants: false });\n\n\t/** Optional custom projected next button. See `previousButton` for why the query is shallow. */\n\treadonly nextButton = contentChild(NextButtonDirective, { descendants: false });\n\n\t/** Optional custom projected submit button. See `previousButton` for why the query is shallow. */\n\treadonly submitButton = contentChild(SubmitButtonDirective, { descendants: false });\n\n\t/**\n\t * Optional visual and layout configuration for the stepper container.\n\t */\n\treadonly options = input<StepperOptions>({});\n\n\t/**\n\t * Returns the active layout mode.\n\t *\n\t * @returns The configured layout or the vertical default.\n\t */\n\tlayout(): StepperLayout {\n\t\treturn this.options()?.layout ?? StepperLayout.Vertical;\n\t}\n\n\t/**\n\t * Returns whether right-to-left mode is enabled.\n\t *\n\t * @returns `true` when RTL mode is active.\n\t */\n\tisRtl(): boolean {\n\t\treturn this.options()?.rtl ?? false;\n\t}\n\n\t/**\n\t * Returns the ARIA orientation of the step rail tablist. The rail lays out\n\t * horizontally in the default (vertical) layout and vertically in the\n\t * sidebar layout.\n\t *\n\t * @returns `'vertical'` for the sidebar layout, `'horizontal'` otherwise.\n\t */\n\tprotected railOrientation(): 'horizontal' | 'vertical' {\n\t\treturn this.layout() === StepperLayout.Sidebar ? 'vertical' : 'horizontal';\n\t}\n\n\t/**\n\t * Returns the stable DOM id of the rail tab for the given step index.\n\t *\n\t * @param index Step index.\n\t * @returns Unique, per-instance tab id.\n\t */\n\tprotected tabId(index: number): string {\n\t\treturn `hub-stepper-${this.#instanceId}-tab-${index}`;\n\t}\n\n\t/**\n\t * Returns the stable DOM id of the content panel for the given step index.\n\t *\n\t * @param index Step index.\n\t * @returns Unique, per-instance panel id.\n\t */\n\tprotected panelId(index: number): string {\n\t\treturn `hub-stepper-${this.#instanceId}-panel-${index}`;\n\t}\n\n\t/**\n\t * Roving `tabindex` for the rail tab at `index`: `0` for the focused tab\n\t * (or the active step when no tab holds transient keyboard focus), `-1`\n\t * for the rest — so the rail is a single Tab stop and the arrow keys move\n\t * within it.\n\t *\n\t * @param index Step index of the tab.\n\t * @returns `0` for the current tab stop, `-1` otherwise.\n\t */\n\tprotected tabIndexFor(index: number): number {\n\t\treturn (this.focusedIndex() ?? this.currentIndex()) === index ? 0 : -1;\n\t}\n\n\t/**\n\t * Keyboard navigation for the step rail (WAI-ARIA tabs pattern, manual\n\t * activation): ArrowRight/ArrowDown and ArrowLeft/ArrowUp move focus\n\t * between enabled step tabs (wrapping, skipping disabled steps), Home/End\n\t * jump to the first/last enabled tab, and Enter/Space activates the\n\t * focused step under the same permission model as clicking its trigger\n\t * (`canNavigateTo`). Moving focus never changes the active step.\n\t *\n\t * @param event Keyboard event fired on a rail tab.\n\t * @param index Step index of the tab that received the event.\n\t */\n\tprotected onRailKeydown(event: KeyboardEvent, index: number): void {\n\t\tlet target: number;\n\t\tswitch (event.key) {\n\t\t\tcase 'ArrowRight':\n\t\t\tcase 'ArrowDown':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, 1);\n\t\t\t\tbreak;\n\t\t\tcase 'ArrowLeft':\n\t\t\tcase 'ArrowUp':\n\t\t\t\ttarget = this.#stepEnabledIndex(index, -1);\n\t\t\t\tbreak;\n\t\t\tcase 'Home':\n\t\t\t\ttarget = this.#firstEnabledIndex();\n\t\t\t\tbreak;\n\t\t\tcase 'End':\n\t\t\t\ttarget = this.#lastEnabledIndex();\n\t\t\t\tbreak;\n\t\t\tcase 'Enter':\n\t\t\tcase ' ':\n\t\t\t\tevent.preventDefault();\n\t\t\t\tif (this.canNavigateTo(index)) {\n\t\t\t\t\tthis.goTo(index);\n\t\t\t\t}\n\t\t\t\treturn;\n\t\t\tdefault:\n\t\t\t\treturn;\n\t\t}\n\t\tif (target < 0) {\n\t\t\treturn;\n\t\t}\n\t\tevent.preventDefault();\n\t\tthis.#focusTab(target);\n\t}\n\n\t/**\n\t * Returns the next enabled step index from `index` in `direction`,\n\t * wrapping around the rail.\n\t *\n\t * @param index Starting step index.\n\t * @param direction `1` to search forward, `-1` to search backward.\n\t * @returns The nearest enabled index, or `-1` when there are no steps.\n\t */\n\t#stepEnabledIndex(index: number, direction: 1 | -1): number {\n\t\tconst steps = this.steps();\n\t\tconst count = steps.length;\n\t\tif (!count) {\n\t\t\treturn -1;\n\t\t}\n\t\tfor (let step = 1; step <= count; step += 1) {\n\t\t\tconst candidate = (((index + direction * step) % count) + count) % count;\n\t\t\tif (!steps[candidate].disabled()) {\n\t\t\t\treturn candidate;\n\t\t\t}\n\t\t}\n\t\treturn index;\n\t}\n\n\t/**\n\t * Returns the index of the first enabled step.\n\t *\n\t * @returns First enabled index, or `-1` when every step is disabled.\n\t */\n\t#firstEnabledIndex(): number {\n\t\treturn this.steps().findIndex((step) => !step.disabled());\n\t}\n\n\t/**\n\t * Returns the index of the last enabled step.\n\t *\n\t * @returns Last enabled index, or `-1` when every step is disabled.\n\t */\n\t#lastEnabledIndex(): number {\n\t\tconst steps = this.steps();\n\t\tfor (let i = steps.length - 1; i >= 0; i -= 1) {\n\t\t\tif (!steps[i].disabled()) {\n\t\t\t\treturn i;\n\t\t\t}\n\t\t}\n\t\treturn -1;\n\t}\n\n\t/**\n\t * Moves the roving tabindex and DOM focus to the rail tab at `index`.\n\t *\n\t * @param index Step index of the tab to focus.\n\t */\n\t#focusTab(index: number): void {\n\t\tthis.focusedIndex.set(index);\n\t\tthis.#cdr.detectChanges();\n\t\tconst host: HTMLElement = this.#hostRef.nativeElement;\n\t\t// Scoped to the rail so a nested stepper inside a step panel cannot contribute tabs, and\n\t\t// widened to `[role=\"tab\"]` so a `hubStepTrigger` template that carries the role but not\n\t\t// the class still receives focus. A comma selector yields each element once.\n\t\tconst rail = host.querySelector('.hub-stepper__nav') ?? host;\n\t\tconst triggers = rail.querySelectorAll<HTMLElement>('.hub-stepper__nav-trigger, .stepper__nav-trigger, [role=\"tab\"]');\n\t\ttriggers[index]?.focus();\n\t}\n\n\t/** Returns the active step component instance or `null` when unavailable. */\n\tget currentStep(): StepComponent | null {\n\t\treturn this.steps()?.[this.currentIndex()] ?? null;\n\t}\n\n\t/**\n\t * Returns whether host classes enable animated transitions. Both spellings count while the\n\t * unprefixed one is supported: `hub-stepper--animated` from 22.10.0, `stepper--animated`\n\t * until 23.0.0 removes it.\n\t */\n\thasAnimationClass(): boolean {\n\t\tconst classes: DOMTokenList = this.#hostRef.nativeElement.classList;\n\t\treturn classes.contains('hub-stepper--animated') || classes.contains('stepper--animated');\n\t}\n\n\t/** Returns whether transition direction is forward. */\n\tisForwardAnimation(): boolean {\n\t\treturn this.animationDirection() === StepperAnimationDirection.Forward;\n\t}\n\n\t/** Returns whether transition direction is backward. */\n\tisBackwardAnimation(): boolean {\n\t\treturn this.animationDirection() === StepperAnimationDirection.Backward;\n\t}\n\n\t/** Initializes projected step metadata after content projection. */\n\tngAfterContentInit(): void {\n\t\tthis.initializeSteps();\n\t}\n\n\t/** Clears pending animation frame callbacks on component destroy. */\n\tngOnDestroy(): void {\n\t\tthis.clearAnimationFrame();\n\t}\n\n\t/**\n\t * Triggers initial change detection for projected steps.\n\t */\n\tprivate initializeSteps(): void {\n\t\tthis.#cdr.detectChanges();\n\t}\n\n\t/**\n\t * Navigates to the previous step index.\n\t */\n\tgoToPrevious(): void {\n\t\tthis.goTo(this.currentIndex() - 1);\n\t}\n\n\t/**\n\t * Navigates to the next step index.\n\t */\n\tgoToNext(): void {\n\t\tthis.goTo(this.currentIndex() + 1);\n\t}\n\n\t/**\n\t * Navigates to a specific step index when it is valid.\n\t *\n\t * @param index Target step index.\n\t */\n\tgoTo(index: number): void {\n\t\tif (this.isStepIndexInBounds(index)) {\n\t\t\tconst previousIndex = this.currentIndex();\n\t\t\tif (index === previousIndex) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.animationDirection.set(\n\t\t\t\tindex > previousIndex ? StepperAnimationDirection.Forward : StepperAnimationDirection.Backward\n\t\t\t);\n\t\t\tthis.currentIndex.set(index);\n\t\t\tthis.focusedIndex.set(null);\n\t\t\tthis.playContentTransition();\n\t\t\tthis.#cdr.detectChanges();\n\t\t\tif (index > previousIndex) {\n\t\t\t\tthis.nextStep.emit(index);\n\t\t\t} else if (index < previousIndex) {\n\t\t\t\tthis.previousStep.emit(index);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Returns whether the target step can be activated.\n\t *\n\t * @param index Target step index.\n\t * @returns `true` when index is in bounds and the step is not disabled.\n\t */\n\tcanNavigateTo(index: number): boolean {\n\t\treturn this.isStepIndexInBounds(index) && this.isValidStepIndex(index);\n\t}\n\n\t/**\n\t * Completes the stepper workflow and emits the completion event.\n\t */\n\tcomplete(): void {\n\t\tthis.completed.emit();\n\t}\n\n\t/**\n\t * Returns whether a step at the provided index is enabled.\n\t *\n\t * @param index Step index to validate.\n\t * @returns `true` when the step exists and is enabled.\n\t */\n\tisValidStepIndex(index: number): boolean {\n\t\treturn !this.steps()?.[index]?.disabled();\n\t}\n\n\t/**\n\t * Returns whether the provided index is within the steps collection bounds.\n\t *\n\t * @param index Step index to validate.\n\t * @returns `true` when the index points to an existing step.\n\t */\n\tisStepIndexInBounds(index: number): boolean {\n\t\treturn index >= 0 && index < this.steps().length;\n\t}\n\n\t/**\n\t * Starts and schedules the content transition animation lifecycle.\n\t */\n\tprivate playContentTransition(): void {\n\t\tthis.clearAnimationFrame();\n\t\tthis.contentAnimating.set(false);\n\t\tif (!this.hasAnimationClass()) {\n\t\t\treturn;\n\t\t}\n\t\tthis.#animationFrameId = globalThis.requestAnimationFrame(() => {\n\t\t\tthis.contentAnimating.set(true);\n\t\t\tthis.#cdr.detectChanges();\n\t\t});\n\t}\n\n\t/**\n\t * Clears the pending animation frame used to trigger content transitions.\n\t */\n\tprivate clearAnimationFrame(): void {\n\t\tif (this.#animationFrameId !== null) {\n\t\t\tglobalThis.cancelAnimationFrame(this.#animationFrameId);\n\t\t\tthis.#animationFrameId = null;\n\t\t}\n\t}\n\n\t/**\n\t * Handles animation end events and resets the active transition state.\n\t *\n\t * @param event DOM animation end event.\n\t */\n\tonContentAnimationEnd(event: AnimationEvent): void {\n\t\tif (event.target !== event.currentTarget) {\n\t\t\treturn;\n\t\t}\n\t\tthis.contentAnimating.set(false);\n\t\tthis.#cdr.detectChanges();\n\t}\n}\n","<!--begin::Nav-->\n<nav class=\"hub-stepper__nav stepper__nav\">\n\t<ng-container\n\t\t[ngTemplateOutlet]=\"stepperNavTpt() || defaultNavTpt\"\n\t\t[ngTemplateOutletContext]=\"{ steps: steps(), currentIndex: currentIndex() }\"\n\t></ng-container>\n</nav>\n<!--end::Nav-->\n\n<!--begin::Content-->\n<div\n\tclass=\"hub-stepper__content stepper__content\"\n\t[class.hub-stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.stepper__content--animated]=\"hasAnimationClass()\"\n\t[class.hub-stepper__content--animating]=\"contentAnimating()\"\n\t[class.stepper__content--animating]=\"contentAnimating()\"\n\t[class.hub-stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.stepper__content--forward]=\"isForwardAnimation()\"\n\t[class.hub-stepper__content--backward]=\"isBackwardAnimation()\"\n\t[class.stepper__content--backward]=\"isBackwardAnimation()\"\n>\n\t<div\n\t\tclass=\"hub-stepper__content-panel stepper__content-panel\"\n\t\trole=\"tabpanel\"\n\t\t[id]=\"panelId(currentIndex())\"\n\t\t[attr.aria-labelledby]=\"tabId(currentIndex())\"\n\t\t(animationend)=\"onContentAnimationEnd($event)\"\n\t>\n\t\t<ng-container [ngTemplateOutlet]=\"currentStep?.innerTemplate()\"></ng-container>\n\t</div>\n</div>\n<!--end::Content-->\n\n<!--begin::Controls-->\n<div class=\"hub-stepper__controls stepper__controls\">\n\t@if (currentIndex() > 0) {\n\t\t<ng-content select=\"button[previousButton]\"></ng-content>\n\t\t@if (!previousButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--back stepper__button stepper__button--back\"\n\t\t\t\t(click)=\"goToPrevious()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() - 1)\"\n\t\t\t>\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t}\n\t\t\t\t{{ backLabel() ?? ('BACK' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() < steps().length - 1) {\n\t\t<ng-content select=\"button[nextButton]\"></ng-content>\n\t\t@if (!nextButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--next stepper__button stepper__button--next\"\n\t\t\t\t(click)=\"goToNext()\"\n\t\t\t\t[disabled]=\"!canNavigateTo(currentIndex() + 1)\"\n\t\t\t>\n\t\t\t\t{{ continueLabel() ?? ('CONTINUE' | translate | ucfirst) }}\n\t\t\t\t@if (isRtl()) {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8592;</span>\n\t\t\t\t} @else {\n\t\t\t\t\t<span class=\"hub-stepper__button-icon stepper__button-icon\" aria-hidden=\"true\">&#8594;</span>\n\t\t\t\t}\n\t\t\t</button>\n\t\t}\n\t}\n\n\t@if (currentIndex() === steps().length - 1) {\n\t\t<ng-content select=\"button[submitButton]\"></ng-content>\n\t\t@if (!submitButton()) {\n\t\t\t<button\n\t\t\t\tclass=\"hub-stepper__button hub-stepper__button--submit stepper__button stepper__button--submit\"\n\t\t\t\t(click)=\"complete()\"\n\t\t\t\t[disabled]=\"!isValidStepIndex(currentIndex())\"\n\t\t\t>\n\t\t\t\t{{ submitLabel() ?? ('SUBMIT' | translate | ucfirst) }}\n\t\t\t</button>\n\t\t}\n\t}\n</div>\n<!--end::Controls-->\n\n<!-- begin:default-nav -->\n<ng-template #defaultNavTpt let-steps=\"steps\" let-currentIndex=\"currentIndex\">\n\t<ul\n\t\tclass=\"hub-stepper__nav-list stepper__nav-list\"\n\t\trole=\"tablist\"\n\t\t[attr.aria-orientation]=\"railOrientation()\"\n\t\t[attr.aria-label]=\"railLabel()\"\n\t>\n\t\t@for (step of steps; track $index; let i = $index) {\n\t\t\t<li class=\"hub-stepper__nav-item stepper__nav-item\" role=\"presentation\">\n\t\t\t\t<ng-container\n\t\t\t\t\t[ngTemplateOutlet]=\"stepTriggerTpt() || defaultNavTriggerTpt\"\n\t\t\t\t\t[ngTemplateOutletContext]=\"{\n\t\t\t\t\t\t$implicit: step,\n\t\t\t\t\t\tstep: step,\n\t\t\t\t\t\ttitle: step.title(),\n\t\t\t\t\t\tindex: i,\n\t\t\t\t\t\tisCurrent: currentIndex === i,\n\t\t\t\t\t\tisCompleted: i < currentIndex,\n\t\t\t\t\t\tdisabled: !canNavigateTo(i)\n\t\t\t\t\t}\"\n\t\t\t\t></ng-container>\n\t\t\t</li>\n\t\t}\n\t</ul>\n</ng-template>\n<!-- end:default-nav -->\n\n<!-- begin:default-nav-trigger -->\n<ng-template #defaultNavTriggerTpt let-title=\"title\" let-index=\"index\" let-isCurrent=\"isCurrent\" let-isCompleted=\"isCompleted\">\n\t<button\n\t\ttype=\"button\"\n\t\tclass=\"hub-stepper__nav-trigger stepper__nav-trigger\"\n\t\trole=\"tab\"\n\t\t[id]=\"tabId(index)\"\n\t\t[class.hub-stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.stepper__nav-trigger--current]=\"isCurrent\"\n\t\t[class.hub-stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[class.stepper__nav-trigger--completed]=\"isCompleted\"\n\t\t[attr.aria-selected]=\"isCurrent\"\n\t\t[attr.aria-current]=\"isCurrent ? 'step' : null\"\n\t\t[attr.aria-controls]=\"panelId(index)\"\n\t\t[attr.aria-disabled]=\"canNavigateTo(index) ? null : true\"\n\t\t[attr.tabindex]=\"tabIndexFor(index)\"\n\t\t[disabled]=\"!canNavigateTo(index)\"\n\t\t(click)=\"goTo(index)\"\n\t\t(keydown)=\"onRailKeydown($event, index)\"\n\t>\n\t\t@if (title) {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"title\">{{ title }}</span>\n\t\t} @else {\n\t\t\t<span class=\"hub-stepper__nav-title stepper__nav-title\" [hubOverflowTooltip]=\"'Step ' + (index + 1)\"\n\t\t\t\t>Step {{ index + 1 }}</span\n\t\t\t>\n\t\t}\n\t</button>\n</ng-template>\n<!-- end:default-nav-trigger -->\n","/** Aragonese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'an',\n\tdata: {\n\t\tBACK: 'dezaga',\n\t\tCONTINUE: 'continar',\n\t\tSUBMIT: 'ninviar'\n\t}\n};\n","/** Arabic dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ar',\n\tdata: {\n\t\tBACK: 'رجوع',\n\t\tCONTINUE: 'متابعة',\n\t\tSUBMIT: 'إرسال'\n\t}\n};\n","/** Asturleonese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ast',\n\tdata: {\n\t\tBACK: 'tornar',\n\t\tCONTINUE: 'siguir',\n\t\tSUBMIT: 'unviar'\n\t}\n};\n","/** Catalan dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'ca',\n\tdata: {\n\t\tBACK: 'enrere',\n\t\tCONTINUE: 'continua',\n\t\tSUBMIT: 'envia'\n\t}\n};\n","/** German dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'de',\n\tdata: {\n\t\tBACK: 'zuruck',\n\t\tCONTINUE: 'weiter',\n\t\tSUBMIT: 'senden'\n\t}\n};\n","/** English dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'en',\n\tdata: {\n\t\tBACK: 'back',\n\t\tCONTINUE: 'continue',\n\t\tSUBMIT: 'submit'\n\t}\n};\n","/** Castilian dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'es',\n\tdata: {\n\t\tBACK: 'volver',\n\t\tCONTINUE: 'continuar',\n\t\tSUBMIT: 'enviar'\n\t}\n};\n","/** Basque dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'eu',\n\tdata: {\n\t\tBACK: 'atzera',\n\t\tCONTINUE: 'jarraitu',\n\t\tSUBMIT: 'bidali'\n\t}\n};\n","/** Galician dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'gl',\n\tdata: {\n\t\tBACK: 'volver',\n\t\tCONTINUE: 'continuar',\n\t\tSUBMIT: 'enviar'\n\t}\n};\n","/** Chinese dictionary for default stepper action labels. */\nexport const locale = {\n\tlang: 'zh',\n\tdata: {\n\t\tBACK: '返回',\n\t\tCONTINUE: '继续',\n\t\tSUBMIT: '提交'\n\t}\n};\n","import { EnvironmentProviders, makeEnvironmentProviders } from '@angular/core';\nimport { HUB_TRANSLATION_CONFIG, HubTranslationService } from 'ng-hub-ui-utils';\nimport { locale as anLocale } from './assets/i18n/an';\nimport { locale as arLocale } from './assets/i18n/ar';\nimport { locale as astLocale } from './assets/i18n/ast';\nimport { locale as caLocale } from './assets/i18n/ca';\nimport { locale as deLocale } from './assets/i18n/de';\nimport { locale as enLocale } from './assets/i18n/en';\nimport { locale as esLocale } from './assets/i18n/es';\nimport { locale as euLocale } from './assets/i18n/eu';\nimport { locale as glLocale } from './assets/i18n/gl';\nimport { locale as zhLocale } from './assets/i18n/zh';\nimport { StepperConfig } from './stepper-config';\n\n/** Default language used when the caller names none. */\nconst DEFAULT_LANGUAGE = 'es';\n\n/** Language the lookup falls back to when a key is missing from the active one. */\nconst DEFAULT_FALLBACK_LANGUAGE = 'en';\n\n/**\n * The three control labels the stepper renders on its own, keyed by language code.\n *\n * Exported so an application can register only the languages it ships, merge them into a\n * dictionary of its own, or translate them further, instead of retyping thirty strings.\n * The keys are flat (`BACK` / `CONTINUE` / `SUBMIT`) because that is what the component\n * resolves after its `HUBUI.STEPPER` namespace misses — nesting them here would silently\n * stop matching.\n *\n * Frozen through: the record is shared by every application on the page, so a consumer that\n * meant to extend it has to spread it rather than write into it.\n */\nexport const STEPPER_DICTIONARIES: Readonly<Record<string, Readonly<Record<string, string>>>> = Object.freeze({\n\t[enLocale.lang]: Object.freeze(enLocale.data),\n\t[esLocale.lang]: Object.freeze(esLocale.data),\n\t[caLocale.lang]: Object.freeze(caLocale.data),\n\t[euLocale.lang]: Object.freeze(euLocale.data),\n\t[glLocale.lang]: Object.freeze(glLocale.data),\n\t[astLocale.lang]: Object.freeze(astLocale.data),\n\t[anLocale.lang]: Object.freeze(anLocale.data),\n\t[deLocale.lang]: Object.freeze(deLocale.data),\n\t[zhLocale.lang]: Object.freeze(zhLocale.data),\n\t[arLocale.lang]: Object.freeze(arLocale.data)\n});\n\n/**\n * Standalone entry point for the stepper: registers the bundled `en` / `es` / `ca` / `eu` /\n * `gl` / `ast` / `an` / `de` / `zh` / `ar` dictionaries and the `HubTranslationService` that\n * the built-in Back / Continue / Submit controls resolve their text through.\n *\n * ```ts\n * import { provideHubStepper } from 'ng-hub-ui-stepper';\n *\n * bootstrapApplication(AppComponent, {\n * \tproviders: [provideHubStepper({ language: 'en' })]\n * });\n * ```\n *\n * It writes `HUB_TRANSLATION_CONFIG`, which is a single application-wide token: an app that\n * also calls `provideHubTranslation()` at the root should register the stepper languages in\n * that call — `STEPPER_DICTIONARIES` is exported for exactly that — or scope this one to the\n * route that owns the wizard, or the later provider wins and the other library loses its\n * dictionaries.\n *\n * @param config Optional language and fallback language override.\n * @returns Environment providers for the stepper library.\n */\nexport function provideHubStepper(config?: StepperConfig): EnvironmentProviders {\n\treturn makeEnvironmentProviders([\n\t\t{\n\t\t\tprovide: HUB_TRANSLATION_CONFIG,\n\t\t\tuseValue: {\n\t\t\t\tdictionaries: STEPPER_DICTIONARIES,\n\t\t\t\tlanguage: config?.language ?? DEFAULT_LANGUAGE,\n\t\t\t\tfallbackLanguage: config?.fallbackLanguage ?? DEFAULT_FALLBACK_LANGUAGE\n\t\t\t}\n\t\t},\n\t\tHubTranslationService\n\t]);\n}\n","import { ModuleWithProviders, NgModule } from '@angular/core';\nimport { StepTriggerDirective } from './step-trigger.directive';\nimport { StepComponent } from './step/step.component';\nimport { StepperNavDirective } from './stepper-nav.directive';\nimport { StepperComponent } from './stepper/stepper.component';\nimport { PreviousButtonDirective } from './previous-button.directive';\nimport { NextButtonDirective } from './next-button.directive';\nimport { SubmitButtonDirective } from './submit-button.directive';\nimport { StepperConfig } from './stepper-config';\nimport { provideHubStepper } from './stepper.providers';\n\n/** All stepper building blocks as a convenience array. */\nconst STEPPER_STANDALONE = [\n\tStepperComponent,\n\tStepComponent,\n\tStepTriggerDirective,\n\tStepperNavDirective,\n\tPreviousButtonDirective,\n\tNextButtonDirective,\n\tSubmitButtonDirective\n] as const;\n\n/**\n * Backward-compatibility module that re-exports all stepper standalone building blocks.\n *\n * @deprecated Import the building blocks directly — `StepperComponent`, `StepComponent`,\n * `StepTriggerDirective`, `StepperNavDirective`, `PreviousButtonDirective`,\n * `NextButtonDirective` and `SubmitButtonDirective` are all standalone. Scheduled for\n * removal in **23.0.0**, `forRoot()` included: see its own note for what replaces it.\n */\n@NgModule({\n\timports: [...STEPPER_STANDALONE],\n\texports: [...STEPPER_STANDALONE]\n})\nexport class StepperModule {\n\t/**\n\t * Registers built-in dictionaries and resolves the active translation language.\n\t *\n\t * @deprecated Goes with the module in **23.0.0**. Replace it with\n\t * `provideHubStepper(config)`, which registers the same dictionaries and the same\n\t * `HubTranslationService` without a module. This method now delegates to it, so the swap\n\t * changes nothing at runtime.\n\t *\n\t * @param config Optional language and fallback language override.\n\t * @returns Module providers with translation configuration.\n\t */\n\tstatic forRoot(config?: StepperConfig): ModuleWithProviders<StepperModule> {\n\t\treturn {\n\t\t\tngModule: StepperModule,\n\t\t\tproviders: [provideHubStepper(config)]\n\t\t};\n\t}\n}\n","import { DOCUMENT } from '@angular/common';\nimport { Injectable, Renderer2, RendererFactory2, inject } from '@angular/core';\n\n/**\n * Applies runtime CSS variable overrides for the stepper design tokens.\n */\n@Injectable({\n\tprovidedIn: 'root'\n})\nexport class StepperThemeService {\n\t/** Angular renderer used to update root-level CSS variables safely. */\n\tprivate renderer: Renderer2;\n\n\t/** Injected document token; SSR-safe alternative to the global `document`. */\n\tprivate readonly document = inject(DOCUMENT);\n\n\t/**\n\t * Creates a renderer instance for dynamic style updates.\n\t *\n\t * @param rendererFactory Angular renderer factory.\n\t */\n\tconstructor(rendererFactory: RendererFactory2) {\n\t\tthis.renderer = rendererFactory.createRenderer(null, null);\n\t}\n\n\t/**\n\t * Applies the provided stepper theme map to CSS custom properties.\n\t *\n\t * @param theme Key-value map of stepper token names and CSS values.\n\t */\n\tsetTheme(theme: { [key: string]: string }) {\n\t\tObject.keys(theme).forEach((key) => {\n\t\t\tthis.renderer.setStyle(this.document.documentElement, `--hub-stepper-${key}`, theme[key]);\n\t\t});\n\t}\n}\n","/*\n * Public API Surface of stepper\n */\nexport * from './lib/stepper/stepper.component';\nexport * from './lib/step/step.component';\nexport * from './lib/stepper.module';\nexport * from './lib/stepper.providers';\nexport * from './lib/previous-button.directive';\nexport * from './lib/next-button.directive';\nexport * from './lib/submit-button.directive';\nexport * from './lib/step-trigger.directive';\nexport * from './lib/stepper-nav.directive';\nexport * from './lib/services/stepper-theme-service';\nexport * from './lib/stepper/stepper-options';\nexport * from './lib/stepper-config';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["locale","enLocale","esLocale","caLocale","euLocale","glLocale","astLocale","anLocale","deLocale","zhLocale","arLocale"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ng-hub-ui-stepper",
3
- "version": "22.9.0",
3
+ "version": "22.10.1",
4
4
  "description": "A flexible and customizable stepper component for Angular applications",
5
5
  "keywords": [
6
6
  "angular",
@@ -21,17 +21,23 @@
21
21
  "license": "MIT",
22
22
  "repository": {
23
23
  "type": "git",
24
- "url": "git+https://github.com/carlos-morcillo/ng-hub-ui-stepper.git"
24
+ "url": "git+https://github.com/hub-env/ng-hub-ui-stepper.git"
25
25
  },
26
26
  "bugs": {
27
- "url": "https://github.com/carlos-morcillo/ng-hub-ui-stepper/issues"
27
+ "url": "https://github.com/hub-env/hub-ui/issues"
28
28
  },
29
29
  "homepage": "https://hubui.dev/en/stepper/overview/",
30
30
  "peerDependencies": {
31
31
  "@angular/common": ">=21.1.2",
32
32
  "@angular/core": ">=21.1.2",
33
+ "ng-hub-ui-ds": ">=22.0.0",
33
34
  "ng-hub-ui-utils": ">=22.8.0"
34
35
  },
36
+ "peerDependenciesMeta": {
37
+ "ng-hub-ui-ds": {
38
+ "optional": true
39
+ }
40
+ },
35
41
  "dependencies": {
36
42
  "tslib": "^2.3.0"
37
43
  },
@@ -160,11 +160,29 @@ declare class StepperComponent implements AfterContentInit, OnDestroy {
160
160
  protected readonly assignStepIndexes: _angular_core.EffectRef;
161
161
  /** Optional content-projected template for custom navigation. */
162
162
  readonly stepperNavTpt: _angular_core.Signal<TemplateRef<any> | undefined>;
163
- /** Optional custom projected previous button. */
163
+ /**
164
+ * Optional content-projected template rendered in place of the built-in rail trigger, once
165
+ * per step. Only the default rail uses it: a `hubStepperNav` template draws its own triggers.
166
+ *
167
+ * The context carries the step itself as `$implicit`, plus `title`, `index`, `isCurrent`,
168
+ * `isCompleted` and `disabled`. Activation stays with the consumer, which is what a template
169
+ * reference on the host is for: `<hub-stepper #wizard>` … `(click)="wizard.goTo(index)"`.
170
+ */
171
+ readonly stepTriggerTpt: _angular_core.Signal<TemplateRef<any> | undefined>;
172
+ /**
173
+ * Optional custom projected previous button.
174
+ *
175
+ * `descendants: false` on the three control queries is not a detail. Content projection with
176
+ * a `select` only ever matches a direct child of the host, so a `button previousButton`
177
+ * nested deeper — inside a `hub-step`, inside a form — can never reach the controls row. With
178
+ * the default `descendants: true` the query found it anyway, the component concluded a custom
179
+ * control had been supplied, and rendered no button at all: the stepper lost its own control
180
+ * to a button it could not display.
181
+ */
164
182
  readonly previousButton: _angular_core.Signal<PreviousButtonDirective | undefined>;
165
- /** Optional custom projected next button. */
183
+ /** Optional custom projected next button. See `previousButton` for why the query is shallow. */
166
184
  readonly nextButton: _angular_core.Signal<NextButtonDirective | undefined>;
167
- /** Optional custom projected submit button. */
185
+ /** Optional custom projected submit button. See `previousButton` for why the query is shallow. */
168
186
  readonly submitButton: _angular_core.Signal<SubmitButtonDirective | undefined>;
169
187
  /**
170
188
  * Optional visual and layout configuration for the stepper container.
@@ -228,7 +246,11 @@ declare class StepperComponent implements AfterContentInit, OnDestroy {
228
246
  protected onRailKeydown(event: KeyboardEvent, index: number): void;
229
247
  /** Returns the active step component instance or `null` when unavailable. */
230
248
  get currentStep(): StepComponent | null;
231
- /** Returns whether host classes enable animated transitions. */
249
+ /**
250
+ * Returns whether host classes enable animated transitions. Both spellings count while the
251
+ * unprefixed one is supported: `hub-stepper--animated` from 22.10.0, `stepper--animated`
252
+ * until 23.0.0 removes it.
253
+ */
232
254
  hasAnimationClass(): boolean;
233
255
  /** Returns whether transition direction is forward. */
234
256
  isForwardAnimation(): boolean;
@@ -296,7 +318,7 @@ declare class StepperComponent implements AfterContentInit, OnDestroy {
296
318
  */
297
319
  onContentAnimationEnd(event: AnimationEvent): void;
298
320
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<StepperComponent, never>;
299
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<StepperComponent, "hub-stepper, hub-ui-stepper", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "continueLabel": { "alias": "continueLabel"; "required": false; "isSignal": true; }; "submitLabel": { "alias": "submitLabel"; "required": false; "isSignal": true; }; "truncateTitles": { "alias": "truncateTitles"; "required": false; "isSignal": true; }; "railLabel": { "alias": "railLabel"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "completed": "completed"; "previousStep": "previousStep"; "nextStep": "nextStep"; }, ["steps", "stepperNavTpt", "previousButton", "nextButton", "submitButton"], ["button[previousButton]", "button[nextButton]", "button[submitButton]"], true, never>;
321
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<StepperComponent, "hub-stepper, hub-ui-stepper", never, { "variant": { "alias": "variant"; "required": false; "isSignal": true; }; "backLabel": { "alias": "backLabel"; "required": false; "isSignal": true; }; "continueLabel": { "alias": "continueLabel"; "required": false; "isSignal": true; }; "submitLabel": { "alias": "submitLabel"; "required": false; "isSignal": true; }; "truncateTitles": { "alias": "truncateTitles"; "required": false; "isSignal": true; }; "railLabel": { "alias": "railLabel"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; }, { "completed": "completed"; "previousStep": "previousStep"; "nextStep": "nextStep"; }, ["steps", "stepperNavTpt", "stepTriggerTpt", "previousButton", "nextButton", "submitButton"], ["button[previousButton]", "button[nextButton]", "button[submitButton]"], true, never>;
300
322
  }
301
323
 
302
324
  /**
@@ -315,7 +337,29 @@ interface StepperConfig {
315
337
  }
316
338
 
317
339
  /**
318
- * Marks an `ng-template` as a custom trigger template for an individual step.
340
+ * Marks an `ng-template` as the trigger the default rail renders for each step, in place of the
341
+ * built-in pill button.
342
+ *
343
+ * It is the counterpart of `hubStepperNav`, one level down: that one replaces the whole rail,
344
+ * this one keeps the rail — its list, its `role="tablist"`, its orientation and its label — and
345
+ * only swaps the control inside each item. A stepper that declares both uses the nav template and
346
+ * ignores this one, because a custom rail draws its own triggers.
347
+ *
348
+ * The template context carries the step as `$implicit` and as `step`, plus `title`, `index`,
349
+ * `isCurrent`, `isCompleted` and `disabled`. Activating a step stays with the consumer, through a
350
+ * template reference on the host:
351
+ *
352
+ * @example
353
+ * ```html
354
+ * <hub-stepper #wizard>
355
+ * <ng-template hubStepTrigger let-title="title" let-index="index" let-isCurrent="isCurrent" let-disabled="disabled">
356
+ * <button type="button" role="tab" [attr.aria-selected]="isCurrent" [disabled]="disabled" (click)="wizard.goTo(index)">
357
+ * {{ index + 1 }}. {{ title }}
358
+ * </button>
359
+ * </ng-template>
360
+ * <hub-step title="Account">…</hub-step>
361
+ * </hub-stepper>
362
+ * ```
319
363
  */
320
364
  declare class StepTriggerDirective {
321
365
  template: TemplateRef<any>;