From 21119d4bddc57bddbaee5659e2a29c28cde86eaf Mon Sep 17 00:00:00 2001 From: Kristiyan Kostadinov Date: Sun, 29 Mar 2026 11:33:44 +0200 Subject: [PATCH] fix(cdk/stepper): linear updates not reflected in the DOM In #31208 I converted a bunch of the shared stepper state to signals in order to resolve "changed after checked errors". I didn't do it for `linear` which ends up being used in a `computed` and results in the DOM sometimes being out of sync. These changes update `linear` to use signals under the hood. Fixes #32964. --- goldens/cdk/stepper/index.api.md | 3 ++- src/cdk/stepper/stepper.ts | 9 ++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/goldens/cdk/stepper/index.api.md b/goldens/cdk/stepper/index.api.md index a26d32c85c00..e2c4a2e16794 100644 --- a/goldens/cdk/stepper/index.api.md +++ b/goldens/cdk/stepper/index.api.md @@ -106,7 +106,8 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { _getFocusIndex(): number | null; _getStepContentId(i: number): string; _getStepLabelId(i: number): string; - linear: boolean; + get linear(): boolean; + set linear(value: boolean); next(): void; // (undocumented) static ngAcceptInputType_linear: unknown; diff --git a/src/cdk/stepper/stepper.ts b/src/cdk/stepper/stepper.ts index 259a897c1dba..bf52d9521030 100644 --- a/src/cdk/stepper/stepper.ts +++ b/src/cdk/stepper/stepper.ts @@ -341,7 +341,14 @@ export class CdkStepper implements AfterContentInit, AfterViewInit, OnDestroy { private _sortedHeaders = new QueryList(); /** Whether the validity of previous steps should be checked or not. */ - @Input({transform: booleanAttribute}) linear: boolean = false; + @Input({transform: booleanAttribute}) + get linear(): boolean { + return this._linear(); + } + set linear(value: boolean) { + this._linear.set(value); + } + private _linear = signal(false); /** The index of the selected step. */ @Input({transform: numberAttribute})