@clr/angular 18.0.0-beta.1 → 18.0.0-beta.10

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.
Files changed (132) hide show
  1. package/fesm2022/clr-angular-accordion.mjs +1 -1
  2. package/fesm2022/clr-angular-accordion.mjs.map +1 -1
  3. package/fesm2022/clr-angular-button.mjs +6 -6
  4. package/fesm2022/clr-angular-button.mjs.map +1 -1
  5. package/fesm2022/clr-angular-data-datagrid.mjs +27 -35
  6. package/fesm2022/clr-angular-data-datagrid.mjs.map +1 -1
  7. package/fesm2022/clr-angular-data-tree-view.mjs +3 -3
  8. package/fesm2022/clr-angular-data-tree-view.mjs.map +1 -1
  9. package/fesm2022/clr-angular-data.mjs +11 -9116
  10. package/fesm2022/clr-angular-data.mjs.map +1 -1
  11. package/fesm2022/clr-angular-emphasis-alert.mjs +2 -2
  12. package/fesm2022/clr-angular-emphasis-alert.mjs.map +1 -1
  13. package/fesm2022/clr-angular-emphasis.mjs +12 -778
  14. package/fesm2022/clr-angular-emphasis.mjs.map +1 -1
  15. package/fesm2022/clr-angular-forms-checkbox.mjs +13 -44
  16. package/fesm2022/clr-angular-forms-checkbox.mjs.map +1 -1
  17. package/fesm2022/clr-angular-forms-combobox.mjs +420 -90
  18. package/fesm2022/clr-angular-forms-combobox.mjs.map +1 -1
  19. package/fesm2022/clr-angular-forms-common.mjs +62 -57
  20. package/fesm2022/clr-angular-forms-common.mjs.map +1 -1
  21. package/fesm2022/clr-angular-forms-datalist.mjs +2 -14
  22. package/fesm2022/clr-angular-forms-datalist.mjs.map +1 -1
  23. package/fesm2022/clr-angular-forms-datepicker.mjs +20 -28
  24. package/fesm2022/clr-angular-forms-datepicker.mjs.map +1 -1
  25. package/fesm2022/clr-angular-forms-file-input.mjs +78 -62
  26. package/fesm2022/clr-angular-forms-file-input.mjs.map +1 -1
  27. package/fesm2022/clr-angular-forms-input.mjs +4 -18
  28. package/fesm2022/clr-angular-forms-input.mjs.map +1 -1
  29. package/fesm2022/clr-angular-forms-number-input.mjs +2 -14
  30. package/fesm2022/clr-angular-forms-number-input.mjs.map +1 -1
  31. package/fesm2022/clr-angular-forms-password.mjs +2 -14
  32. package/fesm2022/clr-angular-forms-password.mjs.map +1 -1
  33. package/fesm2022/clr-angular-forms-radio.mjs +13 -44
  34. package/fesm2022/clr-angular-forms-radio.mjs.map +1 -1
  35. package/fesm2022/clr-angular-forms-range.mjs +3 -16
  36. package/fesm2022/clr-angular-forms-range.mjs.map +1 -1
  37. package/fesm2022/clr-angular-forms-select.mjs +3 -16
  38. package/fesm2022/clr-angular-forms-select.mjs.map +1 -1
  39. package/fesm2022/clr-angular-forms-textarea.mjs +4 -17
  40. package/fesm2022/clr-angular-forms-textarea.mjs.map +1 -1
  41. package/fesm2022/clr-angular-forms.mjs +68 -8560
  42. package/fesm2022/clr-angular-forms.mjs.map +1 -1
  43. package/fesm2022/clr-angular-icon.mjs +10 -0
  44. package/fesm2022/clr-angular-icon.mjs.map +1 -1
  45. package/fesm2022/clr-angular-layout-nav.mjs +27 -25
  46. package/fesm2022/clr-angular-layout-nav.mjs.map +1 -1
  47. package/fesm2022/clr-angular-layout-tabs.mjs +1 -1
  48. package/fesm2022/clr-angular-layout-tabs.mjs.map +1 -1
  49. package/fesm2022/clr-angular-layout.mjs +15 -2057
  50. package/fesm2022/clr-angular-layout.mjs.map +1 -1
  51. package/fesm2022/clr-angular-modal.mjs +4 -5
  52. package/fesm2022/clr-angular-modal.mjs.map +1 -1
  53. package/fesm2022/clr-angular-popover-common.mjs +151 -85
  54. package/fesm2022/clr-angular-popover-common.mjs.map +1 -1
  55. package/fesm2022/clr-angular-popover-dropdown.mjs +7 -4
  56. package/fesm2022/clr-angular-popover-dropdown.mjs.map +1 -1
  57. package/fesm2022/clr-angular-popover-signpost.mjs +30 -15
  58. package/fesm2022/clr-angular-popover-signpost.mjs.map +1 -1
  59. package/fesm2022/clr-angular-popover-tooltip.mjs +7 -7
  60. package/fesm2022/clr-angular-popover-tooltip.mjs.map +1 -1
  61. package/fesm2022/clr-angular-popover.mjs +12 -2242
  62. package/fesm2022/clr-angular-popover.mjs.map +1 -1
  63. package/fesm2022/clr-angular-stepper.mjs +5 -5
  64. package/fesm2022/clr-angular-stepper.mjs.map +1 -1
  65. package/fesm2022/clr-angular-utils.mjs +20 -485
  66. package/fesm2022/clr-angular-utils.mjs.map +1 -1
  67. package/fesm2022/clr-angular-wizard.mjs +434 -223
  68. package/fesm2022/clr-angular-wizard.mjs.map +1 -1
  69. package/fesm2022/clr-angular.mjs +94 -38740
  70. package/fesm2022/clr-angular.mjs.map +1 -1
  71. package/package.json +10 -5
  72. package/popover/common/README.md +14 -12
  73. package/schematics/collection.json +14 -0
  74. package/schematics/ng-update/index.d.ts +2 -0
  75. package/schematics/ng-update/index.js +69 -0
  76. package/schematics/ng-update/index.js.map +1 -0
  77. package/schematics/ng-update/migrations/css-migration.d.ts +6 -0
  78. package/schematics/ng-update/migrations/css-migration.js +177 -0
  79. package/schematics/ng-update/migrations/css-migration.js.map +1 -0
  80. package/schematics/ng-update/migrations/import-migration.d.ts +4 -0
  81. package/schematics/ng-update/migrations/import-migration.js +187 -0
  82. package/schematics/ng-update/migrations/import-migration.js.map +1 -0
  83. package/schematics/ng-update/migrations/template-migration.d.ts +6 -0
  84. package/schematics/ng-update/migrations/template-migration.js +261 -0
  85. package/schematics/ng-update/migrations/template-migration.js.map +1 -0
  86. package/schematics/ng-update/replacements/css-replacements.d.ts +17 -0
  87. package/schematics/ng-update/replacements/css-replacements.js +74 -0
  88. package/schematics/ng-update/replacements/css-replacements.js.map +1 -0
  89. package/schematics/ng-update/replacements/import-replacements.d.ts +13 -0
  90. package/schematics/ng-update/replacements/import-replacements.js +108 -0
  91. package/schematics/ng-update/replacements/import-replacements.js.map +1 -0
  92. package/schematics/ng-update/replacements/symbol-replacements.d.ts +12 -0
  93. package/schematics/ng-update/replacements/symbol-replacements.js +67 -0
  94. package/schematics/ng-update/replacements/symbol-replacements.js.map +1 -0
  95. package/schematics/ng-update/replacements/template-replacements.d.ts +19 -0
  96. package/schematics/ng-update/replacements/template-replacements.js +57 -0
  97. package/schematics/ng-update/replacements/template-replacements.js.map +1 -0
  98. package/schematics/ng-update/tests/test-helpers.d.ts +6 -0
  99. package/schematics/ng-update/tests/test-helpers.js +34 -0
  100. package/schematics/ng-update/tests/test-helpers.js.map +1 -0
  101. package/schematics/ng-update/utils/file-visitor.d.ts +8 -0
  102. package/schematics/ng-update/utils/file-visitor.js +44 -0
  103. package/schematics/ng-update/utils/file-visitor.js.map +1 -0
  104. package/schematics/ng-update/utils/regexp-utils.d.ts +16 -0
  105. package/schematics/ng-update/utils/regexp-utils.js +34 -0
  106. package/schematics/ng-update/utils/regexp-utils.js.map +1 -0
  107. package/schematics/vitest.config.d.ts +2 -0
  108. package/schematics/vitest.config.js +17 -0
  109. package/schematics/vitest.config.js.map +1 -0
  110. package/types/clr-angular-accordion.d.ts +1 -1
  111. package/types/clr-angular-button.d.ts +1 -1
  112. package/types/clr-angular-data-datagrid.d.ts +23 -33
  113. package/types/clr-angular-data-tree-view.d.ts +10 -1
  114. package/types/clr-angular-data.d.ts +4 -2136
  115. package/types/clr-angular-emphasis.d.ts +4 -220
  116. package/types/clr-angular-forms-combobox.d.ts +64 -11
  117. package/types/clr-angular-forms-common.d.ts +9 -9
  118. package/types/clr-angular-forms-datepicker.d.ts +8 -1
  119. package/types/clr-angular-forms-file-input.d.ts +6 -3
  120. package/types/clr-angular-forms.d.ts +26 -2062
  121. package/types/clr-angular-layout-nav.d.ts +6 -2
  122. package/types/clr-angular-layout-tabs.d.ts +1 -1
  123. package/types/clr-angular-layout.d.ts +6 -463
  124. package/types/clr-angular-popover-common.d.ts +38 -13
  125. package/types/clr-angular-popover-dropdown.d.ts +2 -1
  126. package/types/clr-angular-popover-signpost.d.ts +15 -7
  127. package/types/clr-angular-popover-tooltip.d.ts +1 -1
  128. package/types/clr-angular-popover.d.ts +7 -559
  129. package/types/clr-angular-stepper.d.ts +1 -1
  130. package/types/clr-angular-utils.d.ts +13 -175
  131. package/types/clr-angular-wizard.d.ts +92 -35
  132. package/types/clr-angular.d.ts +22 -10238
@@ -1,17 +1,55 @@
1
- import * as i4 from '@angular/common';
1
+ import * as i6 from '@angular/common';
2
2
  import { isPlatformBrowser, CommonModule } from '@angular/common';
3
3
  import * as i0 from '@angular/core';
4
- import { Injectable, EventEmitter, Output, Input, Component, Directive, ContentChild, PLATFORM_ID, ViewChild, ContentChildren, Inject, NgModule } from '@angular/core';
5
- import * as i8 from '@clr/angular/modal';
6
- import { ClrModal, ClrModalModule } from '@clr/angular/modal';
4
+ import { Injectable, EventEmitter, Output, Input, Component, Directive, ContentChild, ViewChildren, PLATFORM_ID, ViewChild, ContentChildren, Inject, NgModule } from '@angular/core';
7
5
  import * as i3 from '@clr/angular/utils';
8
6
  import { uniqueIdFactory } from '@clr/angular/utils';
9
7
  import { filter } from 'rxjs/operators';
10
- import { Subject, startWith, tap } from 'rxjs';
8
+ import { Subject, startWith, debounceTime, tap } from 'rxjs';
11
9
  import * as i5 from '@clr/angular/icon';
12
10
  import { ClarityIcons, errorStandardIcon, successStandardIcon, ClrIcon } from '@clr/angular/icon';
11
+ import * as i8 from '@clr/angular/modal';
12
+ import { ClrModalModule } from '@clr/angular/modal';
13
13
  import { ClrAlertModule } from '@clr/angular/emphasis/alert';
14
14
 
15
+ /*
16
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
17
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
18
+ * This software is released under MIT license.
19
+ * The full license information can be found in LICENSE in the root directory of this project.
20
+ */
21
+ var ClrWizardFooterAlign;
22
+ (function (ClrWizardFooterAlign) {
23
+ ClrWizardFooterAlign["START"] = "start";
24
+ ClrWizardFooterAlign["END"] = "end";
25
+ })(ClrWizardFooterAlign || (ClrWizardFooterAlign = {}));
26
+ const CLR_WIZARD_FOOTER_ALIGN_VALUES = new Set(Object.values(ClrWizardFooterAlign));
27
+ function footerAlignAttribute(value) {
28
+ if (CLR_WIZARD_FOOTER_ALIGN_VALUES.has(value)) {
29
+ return value;
30
+ }
31
+ throw new Error(`Invalid ClrWizardFooterAlign: "${value}". Expected one of: ${[...CLR_WIZARD_FOOTER_ALIGN_VALUES].join(', ')}`);
32
+ }
33
+
34
+ /*
35
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
36
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
37
+ * This software is released under MIT license.
38
+ * The full license information can be found in LICENSE in the root directory of this project.
39
+ */
40
+ var ClrWizardStepnavLayout;
41
+ (function (ClrWizardStepnavLayout) {
42
+ ClrWizardStepnavLayout["VERTICAL"] = "vertical";
43
+ ClrWizardStepnavLayout["HORIZONTAL"] = "horizontal";
44
+ })(ClrWizardStepnavLayout || (ClrWizardStepnavLayout = {}));
45
+ const CLR_WIZARD_STEPNAV_LAYOUT_VALUES = new Set(Object.values(ClrWizardStepnavLayout));
46
+ function stepnavLayoutAttribute(value) {
47
+ if (CLR_WIZARD_STEPNAV_LAYOUT_VALUES.has(value)) {
48
+ return value;
49
+ }
50
+ throw new Error(`Invalid ClrWizardStepnavLayout: "${value}". Expected one of: ${[...CLR_WIZARD_STEPNAV_LAYOUT_VALUES].join(', ')}`);
51
+ }
52
+
15
53
  /*
16
54
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
17
55
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -522,6 +560,10 @@ class WizardNavigationService {
522
560
  * @memberof WizardNavigationService
523
561
  */
524
562
  this.wizardDisableStepnav = false;
563
+ /**
564
+ * The layout of the wizard stepnav, either 'vertical' or 'horizontal'.
565
+ */
566
+ this.stepnavLayout = ClrWizardStepnavLayout.VERTICAL;
525
567
  /**
526
568
  *
527
569
  * @memberof WizardNavigationService
@@ -589,9 +631,7 @@ class WizardNavigationService {
589
631
  *
590
632
  * @memberof WizardNavigationService
591
633
  */
592
- get currentPageChanged() {
593
- // TODO: MAKE SURE EXTERNAL OUTPUTS SAY 'CHANGE' NOT 'CHANGED'
594
- // A BREAKING CHANGE SO AWAITING MINOR RELEASE
634
+ get currentPageChange() {
595
635
  return this._currentChanged.asObservable();
596
636
  }
597
637
  /**
@@ -1033,6 +1073,191 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1033
1073
  type: Injectable
1034
1074
  }], ctorParameters: () => [{ type: WizardNavigationService }] });
1035
1075
 
1076
+ /*
1077
+ * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
1078
+ * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
1079
+ * This software is released under MIT license.
1080
+ * The full license information can be found in LICENSE in the root directory of this project.
1081
+ */
1082
+ const DEFAULT_BUTTON_TYPES = {
1083
+ cancel: 'cancel',
1084
+ previous: 'previous',
1085
+ next: 'next',
1086
+ finish: 'finish',
1087
+ danger: 'danger',
1088
+ };
1089
+ const CUSTOM_BUTTON_TYPES = {
1090
+ cancel: 'custom-cancel',
1091
+ previous: 'custom-previous',
1092
+ next: 'custom-next',
1093
+ finish: 'custom-finish',
1094
+ danger: 'custom-danger',
1095
+ };
1096
+ class ClrWizardButton {
1097
+ constructor(navService, buttonService) {
1098
+ this.navService = navService;
1099
+ this.buttonService = buttonService;
1100
+ this.type = '';
1101
+ this.disabled = false;
1102
+ this.hidden = false;
1103
+ // EventEmitter which is emitted when a button is clicked.
1104
+ this.wasClicked = new EventEmitter(false);
1105
+ }
1106
+ get isCancel() {
1107
+ return this.checkDefaultAndCustomType(this.type, 'cancel');
1108
+ }
1109
+ get isNext() {
1110
+ return this.checkDefaultAndCustomType(this.type, 'next');
1111
+ }
1112
+ get isPrevious() {
1113
+ return this.checkDefaultAndCustomType(this.type, 'previous');
1114
+ }
1115
+ get isFinish() {
1116
+ return this.checkDefaultAndCustomType(this.type, 'finish');
1117
+ }
1118
+ get isDanger() {
1119
+ return this.checkDefaultAndCustomType(this.type, 'danger');
1120
+ }
1121
+ get isPrimaryAction() {
1122
+ return this.isNext || this.isDanger || this.isFinish;
1123
+ }
1124
+ get _disabledAttribute() {
1125
+ if (this.isDisabled) {
1126
+ return '';
1127
+ }
1128
+ return null;
1129
+ }
1130
+ get isDisabled() {
1131
+ // dealing with negatives here. cognitively easier to think of it like this...
1132
+ const disabled = true;
1133
+ const nav = this.navService;
1134
+ const page = this.navService.currentPage;
1135
+ // Ensure we don't change the response until buttons are ready to avoid chocolate
1136
+ if (!this.buttonService.buttonsReady) {
1137
+ return !disabled;
1138
+ }
1139
+ if (this.disabled || nav.wizardStopNavigation || !page) {
1140
+ return true;
1141
+ }
1142
+ if (this.isCancel) {
1143
+ return !disabled;
1144
+ }
1145
+ if (this.isPrevious && (nav.currentPageIsFirst || page.previousStepDisabled)) {
1146
+ return disabled;
1147
+ }
1148
+ if (this.isDanger && !page.readyToComplete) {
1149
+ return disabled;
1150
+ }
1151
+ if (this.isNext && (nav.currentPageIsLast || !page.readyToComplete)) {
1152
+ return disabled;
1153
+ }
1154
+ if (this.isFinish && (!nav.currentPageIsLast || !page.readyToComplete)) {
1155
+ return disabled;
1156
+ }
1157
+ return !disabled;
1158
+ }
1159
+ get isHidden() {
1160
+ // dealing with negatives here. cognitively easier to think of it like this...
1161
+ const hidden = true;
1162
+ const nav = this.navService;
1163
+ // Ensure we don't change the response until buttons are ready to avoid chocolate
1164
+ if (!this.buttonService.buttonsReady) {
1165
+ return !hidden;
1166
+ }
1167
+ if (this.hidden) {
1168
+ return true;
1169
+ }
1170
+ if (this.isCancel) {
1171
+ return !hidden;
1172
+ }
1173
+ if (this.isPrevious && nav.currentPageIsFirst) {
1174
+ return hidden;
1175
+ }
1176
+ if (this.isNext && nav.currentPageIsLast) {
1177
+ return hidden;
1178
+ }
1179
+ if (this.isFinish && !nav.currentPageIsLast) {
1180
+ return hidden;
1181
+ }
1182
+ return !hidden;
1183
+ }
1184
+ click() {
1185
+ if (this.isDisabled) {
1186
+ return;
1187
+ }
1188
+ this.wasClicked.emit(this.type);
1189
+ this.buttonService.buttonClicked(this.type);
1190
+ }
1191
+ checkDefaultAndCustomType(valueToCheck = '', typeToLookUp) {
1192
+ if (DEFAULT_BUTTON_TYPES[typeToLookUp] === valueToCheck) {
1193
+ return true;
1194
+ }
1195
+ if (CUSTOM_BUTTON_TYPES[typeToLookUp] === valueToCheck) {
1196
+ return true;
1197
+ }
1198
+ return false;
1199
+ }
1200
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardButton, deps: [{ token: WizardNavigationService }, { token: ButtonHubService }], target: i0.ɵɵFactoryTarget.Component }); }
1201
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrWizardButton, isStandalone: false, selector: "clr-wizard-button", inputs: { type: "type", disabled: ["clrWizardButtonDisabled", "disabled"], hidden: ["clrWizardButtonHidden", "hidden"] }, outputs: { wasClicked: "clrWizardButtonClicked" }, host: { properties: { "attr.aria-hidden": "isHidden" }, classAttribute: "clr-wizard-btn-wrapper" }, ngImport: i0, template: `
1202
+ <button
1203
+ type="button"
1204
+ class="btn clr-wizard-btn"
1205
+ [class.btn-link]="isCancel"
1206
+ [class.clr-wizard-btn--tertiary]="isCancel"
1207
+ [class.btn-outline]="isPrevious"
1208
+ [class.clr-wizard-btn--secondary]="isPrevious"
1209
+ [class.btn-primary]="isPrimaryAction"
1210
+ [class.clr-wizard-btn--primary]="isPrimaryAction"
1211
+ [class.btn-success]="isFinish"
1212
+ [class.btn-danger]="isDanger"
1213
+ [class.disabled]="isDisabled"
1214
+ [attr.disabled]="_disabledAttribute"
1215
+ (click)="click()"
1216
+ >
1217
+ <ng-content></ng-content>
1218
+ </button>
1219
+ `, isInline: true }); }
1220
+ }
1221
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardButton, decorators: [{
1222
+ type: Component,
1223
+ args: [{
1224
+ selector: 'clr-wizard-button',
1225
+ template: `
1226
+ <button
1227
+ type="button"
1228
+ class="btn clr-wizard-btn"
1229
+ [class.btn-link]="isCancel"
1230
+ [class.clr-wizard-btn--tertiary]="isCancel"
1231
+ [class.btn-outline]="isPrevious"
1232
+ [class.clr-wizard-btn--secondary]="isPrevious"
1233
+ [class.btn-primary]="isPrimaryAction"
1234
+ [class.clr-wizard-btn--primary]="isPrimaryAction"
1235
+ [class.btn-success]="isFinish"
1236
+ [class.btn-danger]="isDanger"
1237
+ [class.disabled]="isDisabled"
1238
+ [attr.disabled]="_disabledAttribute"
1239
+ (click)="click()"
1240
+ >
1241
+ <ng-content></ng-content>
1242
+ </button>
1243
+ `,
1244
+ host: { class: 'clr-wizard-btn-wrapper', '[attr.aria-hidden]': 'isHidden' },
1245
+ standalone: false,
1246
+ }]
1247
+ }], ctorParameters: () => [{ type: WizardNavigationService }, { type: ButtonHubService }], propDecorators: { type: [{
1248
+ type: Input,
1249
+ args: ['type']
1250
+ }], disabled: [{
1251
+ type: Input,
1252
+ args: ['clrWizardButtonDisabled']
1253
+ }], hidden: [{
1254
+ type: Input,
1255
+ args: ['clrWizardButtonHidden']
1256
+ }], wasClicked: [{
1257
+ type: Output,
1258
+ args: ['clrWizardButtonClicked']
1259
+ }] } });
1260
+
1036
1261
  /*
1037
1262
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
1038
1263
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -1659,7 +1884,7 @@ class ClrWizardPage {
1659
1884
  *
1660
1885
  */
1661
1886
  get title() {
1662
- return this.pageTitle.pageTitleTemplateRef;
1887
+ return this.pageTitle?.pageTitleTemplateRef;
1663
1888
  }
1664
1889
  /**
1665
1890
  *
@@ -1670,7 +1895,7 @@ class ClrWizardPage {
1670
1895
  if (this.pageNavTitle) {
1671
1896
  return this.pageNavTitle.pageNavTitleTemplateRef;
1672
1897
  }
1673
- return this.pageTitle.pageTitleTemplateRef;
1898
+ return this.pageTitle?.pageTitleTemplateRef;
1674
1899
  }
1675
1900
  /**
1676
1901
  *
@@ -1753,7 +1978,7 @@ class ClrWizardPage {
1753
1978
  this.navService.currentPage = this;
1754
1979
  }
1755
1980
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardPage, deps: [{ token: WizardNavigationService }, { token: PageCollectionService }, { token: ButtonHubService }], target: i0.ɵɵFactoryTarget.Component }); }
1756
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrWizardPage, isStandalone: false, selector: "clr-wizard-page", inputs: { _id: ["id", "_id"], preventDefault: ["clrWizardPagePreventDefault", "preventDefault"], nextStepDisabled: ["clrWizardPageNextDisabled", "nextStepDisabled"], previousStepDisabled: ["clrWizardPagePreviousDisabled", "previousStepDisabled"], hasError: ["clrWizardPageHasError", "hasError"], stopCancel: ["clrWizardPagePreventDefaultCancel", "stopCancel"], stopNext: ["clrWizardPagePreventDefaultNext", "stopNext"] }, outputs: { nextStepDisabledChange: "clrWizardPageNextDisabledChange", previousStepDisabledChange: "clrWizardPagePreviousDisabledChange", stopCancelChange: "clrWizardPagePreventDefaultCancelChange", onCommit: "clrWizardPageOnCommit", onLoad: "clrWizardPageOnLoad", pageOnCancel: "clrWizardPageOnCancel", finishButtonClicked: "clrWizardPageFinish", previousButtonClicked: "clrWizardPagePrevious", nextButtonClicked: "clrWizardPageNext", dangerButtonClicked: "clrWizardPageDanger", primaryButtonClicked: "clrWizardPagePrimary", customButtonClicked: "clrWizardPageCustomButton" }, host: { properties: { "id": "id", "attr.aria-hidden": "!current", "attr.aria-labelledby": "stepItemId", "class.active": "current", "class.clr-wizard-page": "true" } }, queries: [{ propertyName: "pageTitle", first: true, predicate: ClrWizardPageTitle, descendants: true, static: true }, { propertyName: "pageNavTitle", first: true, predicate: ClrWizardPageNavTitle, descendants: true, static: true }, { propertyName: "_buttons", first: true, predicate: ClrWizardPageButtons, descendants: true, static: true }, { propertyName: "_headerActions", first: true, predicate: ClrWizardPageHeaderActions, descendants: true, static: true }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true }); }
1981
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrWizardPage, isStandalone: false, selector: "clr-wizard-page", inputs: { _id: ["id", "_id"], preventDefault: ["clrWizardPagePreventDefault", "preventDefault"], nextStepDisabled: ["clrWizardPageNextDisabled", "nextStepDisabled"], previousStepDisabled: ["clrWizardPagePreviousDisabled", "previousStepDisabled"], hasError: ["clrWizardPageHasError", "hasError"], stopCancel: ["clrWizardPagePreventDefaultCancel", "stopCancel"], stopNext: ["clrWizardPagePreventDefaultNext", "stopNext"] }, outputs: { nextStepDisabledChange: "clrWizardPageNextDisabledChange", previousStepDisabledChange: "clrWizardPagePreviousDisabledChange", stopCancelChange: "clrWizardPagePreventDefaultCancelChange", onCommit: "clrWizardPageOnCommit", onLoad: "clrWizardPageOnLoad", pageOnCancel: "clrWizardPageOnCancel", finishButtonClicked: "clrWizardPageFinish", previousButtonClicked: "clrWizardPagePrevious", nextButtonClicked: "clrWizardPageNext", dangerButtonClicked: "clrWizardPageDanger", primaryButtonClicked: "clrWizardPagePrimary", customButtonClicked: "clrWizardPageCustomButton" }, host: { properties: { "id": "id", "attr.aria-hidden": "!current", "attr.aria-labelledby": "stepItemId", "class.active": "current", "class.clr-wizard-page": "true" } }, queries: [{ propertyName: "pageTitle", first: true, predicate: ClrWizardPageTitle, static: true }, { propertyName: "pageNavTitle", first: true, predicate: ClrWizardPageNavTitle, static: true }, { propertyName: "_buttons", first: true, predicate: ClrWizardPageButtons, static: true }, { propertyName: "_headerActions", first: true, predicate: ClrWizardPageHeaderActions, descendants: true, static: true }], ngImport: i0, template: '<ng-content></ng-content>', isInline: true }); }
1757
1982
  }
1758
1983
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardPage, decorators: [{
1759
1984
  type: Component,
@@ -1813,13 +2038,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
1813
2038
  args: ['clrWizardPageCustomButton']
1814
2039
  }], pageTitle: [{
1815
2040
  type: ContentChild,
1816
- args: [ClrWizardPageTitle, { static: true }]
2041
+ args: [ClrWizardPageTitle, { static: true, descendants: false }]
1817
2042
  }], pageNavTitle: [{
1818
2043
  type: ContentChild,
1819
- args: [ClrWizardPageNavTitle, { static: true }]
2044
+ args: [ClrWizardPageNavTitle, { static: true, descendants: false }]
1820
2045
  }], _buttons: [{
1821
2046
  type: ContentChild,
1822
- args: [ClrWizardPageButtons, { static: true }]
2047
+ args: [ClrWizardPageButtons, { static: true, descendants: false }]
1823
2048
  }], _headerActions: [{
1824
2049
  type: ContentChild,
1825
2050
  args: [ClrWizardPageHeaderActions, { static: true }]
@@ -1923,7 +2148,7 @@ class ClrWizardStepnavItem {
1923
2148
  return allIds.join(' ');
1924
2149
  }
1925
2150
  get icon() {
1926
- if (this.isCurrent) {
2151
+ if (this.isCurrent && this.navService.stepnavLayout !== ClrWizardStepnavLayout.HORIZONTAL) {
1927
2152
  return {
1928
2153
  shape: 'dot-circle',
1929
2154
  label: this.commonStrings.keys.wizardStepCurrent || this.commonStrings.keys.timelineStepCurrent,
@@ -1960,6 +2185,9 @@ class ClrWizardStepnavItem {
1960
2185
  this.skipNextScroll = true;
1961
2186
  this.navService.goTo(this.page);
1962
2187
  }
2188
+ scrollIntoView() {
2189
+ this.elementRef.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest', inline: 'nearest' });
2190
+ }
1963
2191
  pageGuard() {
1964
2192
  if (!this.page) {
1965
2193
  throw new Error('Wizard stepnav item is not associated with a wizard page.');
@@ -1969,7 +2197,7 @@ class ClrWizardStepnavItem {
1969
2197
  // Don't use "smooth" scrolling when the wizard is first opened to avoid a delay in scrolling the current step into view.
1970
2198
  // The current step when the wizard is opened might not be the first step. For example, the wizard can be closed and re-opened.
1971
2199
  let scrollBehavior = 'auto';
1972
- return this.navService.currentPageChanged.pipe(startWith(this.navService.currentPage), tap(currentPage => {
2200
+ return this.navService.currentPageChange.pipe(startWith(this.navService.currentPage), debounceTime(1), tap(currentPage => {
1973
2201
  if (!this.skipNextScroll && currentPage === this.page) {
1974
2202
  this.elementRef.nativeElement.scrollIntoView({ behavior: scrollBehavior, block: 'center', inline: 'center' });
1975
2203
  }
@@ -1978,7 +2206,7 @@ class ClrWizardStepnavItem {
1978
2206
  }));
1979
2207
  }
1980
2208
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardStepnavItem, deps: [{ token: WizardNavigationService }, { token: PageCollectionService }, { token: i3.ClrCommonStringsService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
1981
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizardStepnavItem, isStandalone: false, selector: "[clr-wizard-stepnav-item]", inputs: { page: "page" }, host: { properties: { "id": "id", "attr.aria-current": "stepAriaCurrent", "attr.aria-controls": "page.id", "class.clr-nav-link": "true", "class.nav-item": "true", "class.active": "isCurrent", "class.disabled": "isDisabled", "class.no-click": "!canNavigate", "class.complete": "isComplete", "class.error": "hasError" } }, ngImport: i0, template: `
2209
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizardStepnavItem, isStandalone: false, selector: "[clr-wizard-stepnav-item]", inputs: { page: "page" }, host: { listeners: { "focusin": "scrollIntoView()" }, properties: { "id": "id", "attr.aria-current": "stepAriaCurrent", "attr.aria-controls": "page.id", "class.clr-nav-link": "true", "class.nav-item": "true", "class.active": "isCurrent", "class.disabled": "isDisabled", "class.no-click": "!canNavigate", "class.complete": "isComplete", "class.error": "hasError" } }, ngImport: i0, template: `
1982
2210
  <button
1983
2211
  type="button"
1984
2212
  class="btn btn-link clr-wizard-stepnav-link"
@@ -2006,7 +2234,7 @@ class ClrWizardStepnavItem {
2006
2234
  <ng-template [ngTemplateOutlet]="page.navTitle"></ng-template>
2007
2235
  </span>
2008
2236
  </button>
2009
- `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
2237
+ `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }] }); }
2010
2238
  }
2011
2239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardStepnavItem, decorators: [{
2012
2240
  type: Component,
@@ -2052,6 +2280,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2052
2280
  '[class.no-click]': '!canNavigate',
2053
2281
  '[class.complete]': 'isComplete',
2054
2282
  '[class.error]': 'hasError',
2283
+ '(focusin)': 'scrollIntoView()',
2055
2284
  },
2056
2285
  standalone: false,
2057
2286
  }]
@@ -2067,12 +2296,94 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2067
2296
  * The full license information can be found in LICENSE in the root directory of this project.
2068
2297
  */
2069
2298
  class ClrWizardStepnav {
2070
- constructor(pageService) {
2299
+ constructor(pageService, navService, elementRef) {
2071
2300
  this.pageService = pageService;
2301
+ this.navService = navService;
2302
+ this.elementRef = elementRef;
2303
+ this.showScrollLeftButton = false;
2304
+ this.showScrollRightButton = false;
2305
+ this.firstItemVisible = true;
2306
+ this.lastItemVisible = true;
2307
+ }
2308
+ get stepnavLayout() {
2309
+ return this.navService.stepnavLayout;
2310
+ }
2311
+ ngAfterViewInit() {
2312
+ if (this.stepnavLayout === ClrWizardStepnavLayout.HORIZONTAL) {
2313
+ this.setupIntersectionObserver();
2314
+ this.stepnavItems.notifyOnChanges();
2315
+ this.subscription = this.stepnavItems.changes.pipe(startWith(undefined)).subscribe(() => {
2316
+ this.observeEdgeItems();
2317
+ });
2318
+ }
2319
+ }
2320
+ ngOnDestroy() {
2321
+ this.subscription?.unsubscribe();
2322
+ this.intersectionObserver?.disconnect();
2323
+ }
2324
+ scrollLeft() {
2325
+ this.scroll('left');
2326
+ }
2327
+ scrollRight() {
2328
+ this.scroll('right');
2329
+ }
2330
+ setupIntersectionObserver() {
2331
+ const scrollContainer = this.elementRef.nativeElement.querySelector('.clr-wizard-stepnav-list');
2332
+ this.intersectionObserver = new IntersectionObserver(entries => {
2333
+ for (const entry of entries) {
2334
+ const target = entry.target;
2335
+ const isFirst = target === this.stepnavItems.first?.elementRef.nativeElement;
2336
+ const isLast = target === this.stepnavItems.last?.elementRef.nativeElement;
2337
+ if (isFirst) {
2338
+ this.firstItemVisible = entry.isIntersecting;
2339
+ }
2340
+ if (isLast) {
2341
+ this.lastItemVisible = entry.isIntersecting;
2342
+ }
2343
+ }
2344
+ this.showScrollLeftButton = !this.firstItemVisible;
2345
+ this.showScrollRightButton = !this.lastItemVisible;
2346
+ }, { root: scrollContainer, threshold: 0.99 });
2347
+ }
2348
+ observeEdgeItems() {
2349
+ this.intersectionObserver.disconnect();
2350
+ this.firstItemVisible = true;
2351
+ this.lastItemVisible = true;
2352
+ const first = this.stepnavItems.first;
2353
+ const last = this.stepnavItems.last;
2354
+ if (first) {
2355
+ this.intersectionObserver.observe(first.elementRef.nativeElement);
2356
+ }
2357
+ if (last && last !== first) {
2358
+ this.intersectionObserver.observe(last.elementRef.nativeElement);
2359
+ }
2360
+ }
2361
+ scroll(direction) {
2362
+ const scrollContainer = this.elementRef.nativeElement.querySelector('.clr-wizard-stepnav-list');
2363
+ const scrollAmount = scrollContainer.clientWidth * 0.5;
2364
+ scrollContainer.scrollBy({ left: direction === 'left' ? -scrollAmount : scrollAmount, behavior: 'smooth' });
2365
+ }
2366
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardStepnav, deps: [{ token: PageCollectionService }, { token: WizardNavigationService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
2367
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizardStepnav, isStandalone: false, selector: "clr-wizard-stepnav", inputs: { label: "label" }, host: { classAttribute: "clr-wizard-stepnav" }, viewQueries: [{ propertyName: "stepnavItems", predicate: ClrWizardStepnavItem, descendants: true }], ngImport: i0, template: `
2368
+ @if (showScrollLeftButton && stepnavLayout === 'horizontal') {
2369
+ <button
2370
+ type="button"
2371
+ class="btn btn-sm btn-icon clr-wizard-stepnav-scroll-button-left"
2372
+ (click)="scrollLeft()"
2373
+ tabindex="-1"
2374
+ >
2375
+ <cds-icon shape="angle" direction="left"></cds-icon>
2376
+ </button>
2072
2377
  }
2073
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardStepnav, deps: [{ token: PageCollectionService }], target: i0.ɵɵFactoryTarget.Component }); }
2074
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizardStepnav, isStandalone: false, selector: "clr-wizard-stepnav", inputs: { label: "label" }, host: { classAttribute: "clr-wizard-stepnav" }, ngImport: i0, template: `
2075
- <nav [attr.aria-label]="label">
2378
+
2379
+ <nav
2380
+ class="clr-wizard-stepnav-nav"
2381
+ [ngClass]="{
2382
+ 'clr-wizard-stepnav-nav--with-one-scroll-button': showScrollLeftButton || showScrollRightButton,
2383
+ 'clr-wizard-stepnav-nav--with-two-scroll-buttons': showScrollLeftButton && showScrollRightButton,
2384
+ }"
2385
+ [attr.aria-label]="label"
2386
+ >
2076
2387
  <ol class="clr-wizard-stepnav-list">
2077
2388
  @for (page of pageService.pages; track page; let i = $index) {
2078
2389
  <li clr-wizard-stepnav-item [page]="page" class="clr-wizard-stepnav-item">
@@ -2081,14 +2392,43 @@ class ClrWizardStepnav {
2081
2392
  }
2082
2393
  </ol>
2083
2394
  </nav>
2084
- `, isInline: true, dependencies: [{ kind: "component", type: ClrWizardStepnavItem, selector: "[clr-wizard-stepnav-item]", inputs: ["page"] }] }); }
2395
+
2396
+ @if (showScrollRightButton && stepnavLayout === 'horizontal') {
2397
+ <button
2398
+ type="button"
2399
+ class="btn btn-sm btn-icon clr-wizard-stepnav-scroll-button-right"
2400
+ (click)="scrollRight()"
2401
+ tabindex="-1"
2402
+ >
2403
+ <cds-icon shape="angle" direction="right"></cds-icon>
2404
+ </button>
2405
+ }
2406
+ `, isInline: true, dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: i5.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: ClrWizardStepnavItem, selector: "[clr-wizard-stepnav-item]", inputs: ["page"] }] }); }
2085
2407
  }
2086
2408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardStepnav, decorators: [{
2087
2409
  type: Component,
2088
2410
  args: [{
2089
2411
  selector: 'clr-wizard-stepnav',
2090
2412
  template: `
2091
- <nav [attr.aria-label]="label">
2413
+ @if (showScrollLeftButton && stepnavLayout === 'horizontal') {
2414
+ <button
2415
+ type="button"
2416
+ class="btn btn-sm btn-icon clr-wizard-stepnav-scroll-button-left"
2417
+ (click)="scrollLeft()"
2418
+ tabindex="-1"
2419
+ >
2420
+ <cds-icon shape="angle" direction="left"></cds-icon>
2421
+ </button>
2422
+ }
2423
+
2424
+ <nav
2425
+ class="clr-wizard-stepnav-nav"
2426
+ [ngClass]="{
2427
+ 'clr-wizard-stepnav-nav--with-one-scroll-button': showScrollLeftButton || showScrollRightButton,
2428
+ 'clr-wizard-stepnav-nav--with-two-scroll-buttons': showScrollLeftButton && showScrollRightButton,
2429
+ }"
2430
+ [attr.aria-label]="label"
2431
+ >
2092
2432
  <ol class="clr-wizard-stepnav-list">
2093
2433
  @for (page of pageService.pages; track page; let i = $index) {
2094
2434
  <li clr-wizard-stepnav-item [page]="page" class="clr-wizard-stepnav-item">
@@ -2097,12 +2437,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2097
2437
  }
2098
2438
  </ol>
2099
2439
  </nav>
2440
+
2441
+ @if (showScrollRightButton && stepnavLayout === 'horizontal') {
2442
+ <button
2443
+ type="button"
2444
+ class="btn btn-sm btn-icon clr-wizard-stepnav-scroll-button-right"
2445
+ (click)="scrollRight()"
2446
+ tabindex="-1"
2447
+ >
2448
+ <cds-icon shape="angle" direction="right"></cds-icon>
2449
+ </button>
2450
+ }
2100
2451
  `,
2101
2452
  host: { class: 'clr-wizard-stepnav' },
2102
2453
  standalone: false,
2103
2454
  }]
2104
- }], ctorParameters: () => [{ type: PageCollectionService }], propDecorators: { label: [{
2455
+ }], ctorParameters: () => [{ type: PageCollectionService }, { type: WizardNavigationService }, { type: i0.ElementRef }], propDecorators: { label: [{
2105
2456
  type: Input
2457
+ }], stepnavItems: [{
2458
+ type: ViewChildren,
2459
+ args: [ClrWizardStepnavItem]
2106
2460
  }] } });
2107
2461
 
2108
2462
  /*
@@ -2124,6 +2478,10 @@ class ClrWizard {
2124
2478
  * Set the aria-label for the stepnav section of the wizard. Set using `[clrWizardStepnavAriaLabel]` input.
2125
2479
  */
2126
2480
  this.stepnavAriaLabel = this.commonStrings.keys.wizardStepnavAriaLabel;
2481
+ /**
2482
+ * Set the wizard stepnav layout to 'vertical' (default) or 'horizontal'. Set using `[clrWizardStepnavLayout]` input.
2483
+ */
2484
+ this.stepnavLayout = ClrWizardStepnavLayout.VERTICAL;
2127
2485
  /**
2128
2486
  * Set the modal size of the wizard. Set using `[clrWizardSize]` input.
2129
2487
  */
@@ -2137,6 +2495,18 @@ class ClrWizard {
2137
2495
  * If you can't use this option, you will likely need to provide custom CSS to set the wizard's height and margins.
2138
2496
  */
2139
2497
  this.inPageFillContentArea = false;
2498
+ /**
2499
+ * Hide the wizard footer entirely. Set using `[clrWizardHideFooter]` input.
2500
+ * Useful when a nested wizard or stepper handles its own navigation.
2501
+ */
2502
+ this.hideFooter = false;
2503
+ /**
2504
+ * Align the footer buttons to 'start' (left) or 'end' (right).
2505
+ * By default, modal wizards align to 'end' and in-page wizards align to 'start'.
2506
+ * Nested wizards inherit the default unless this input is explicitly set.
2507
+ * Set using `[clrWizardFooterAlign]` input.
2508
+ */
2509
+ this._footerAlign = null;
2140
2510
  /**
2141
2511
  * Tells the modal part of the wizard whether it should have a close "X"
2142
2512
  * in the top right corner. Set using `[clrWizardClosable]` input.
@@ -2170,10 +2540,10 @@ class ClrWizard {
2170
2540
  */
2171
2541
  this.onReset = new EventEmitter(false);
2172
2542
  /**
2173
- * Emits when the current page has changed. Listen via `(clrWizardCurrentPageChanged)` event.
2543
+ * Emits when the current page has changed. Listen via `(clrWizardCurrentPageChange)` event.
2174
2544
  * output. Useful for non-blocking validation.
2175
2545
  */
2176
- this.currentPageChanged = new EventEmitter(false);
2546
+ this.currentPageChange = new EventEmitter(false);
2177
2547
  /**
2178
2548
  * Emits when the wizard moves to the next page. Listen via `(clrWizardOnNext)` event.
2179
2549
  * Can be combined with the `[clrWizardPreventDefaultNext]` input to create
@@ -2187,6 +2557,8 @@ class ClrWizard {
2187
2557
  this.onMovePrevious = new EventEmitter(false);
2188
2558
  this._open = false;
2189
2559
  this.wizardId = uniqueIdFactory();
2560
+ this.ClrWizardFooterAlign = ClrWizardFooterAlign;
2561
+ this.ClrWizardStepnavLayout = ClrWizardStepnavLayout;
2190
2562
  this._forceForward = false;
2191
2563
  this._stopNext = false;
2192
2564
  this._stopCancel = false;
@@ -2289,10 +2661,24 @@ class ClrWizard {
2289
2661
  get isInline() {
2290
2662
  return this.elementRef.nativeElement.classList.contains('clr-wizard--inline');
2291
2663
  }
2664
+ get showHeader() {
2665
+ return (!!this.navService.currentPage?.pageTitle ||
2666
+ (this.stepnavLayout === ClrWizardStepnavLayout.VERTICAL && this.headerActionService.displayHeaderActionsWrapper));
2667
+ }
2668
+ get showFooter() {
2669
+ return !this.hideFooter && (this.navService.currentPage?.hasButtons || this.wizardButtons?.length > 0);
2670
+ }
2671
+ get footerAlign() {
2672
+ if (this._footerAlign !== null) {
2673
+ return this._footerAlign;
2674
+ }
2675
+ return this.inPage ? ClrWizardFooterAlign.START : ClrWizardFooterAlign.END;
2676
+ }
2292
2677
  get stopModalAnimations() {
2293
2678
  return this._stopModalAnimations;
2294
2679
  }
2295
2680
  ngAfterContentInit() {
2681
+ this.navService.stepnavLayout = this.stepnavLayout;
2296
2682
  this.pageCollection.pages = this.pages;
2297
2683
  this.headerActionService.wizardHeaderActions = this.headerActions;
2298
2684
  if (this.inPage) {
@@ -2485,12 +2871,12 @@ class ClrWizard {
2485
2871
  return this.navService.wizardFinished.subscribe(() => this.emitWizardFinished());
2486
2872
  }
2487
2873
  listenForPageChanges() {
2488
- return this.navService.currentPageChanged.subscribe(() => {
2874
+ return this.navService.currentPageChange.subscribe(() => {
2489
2875
  // Added to address VPAT-749:
2490
2876
  // When clicking on a wizard tab, focus should move to that
2491
2877
  // tabs content to make the wizard more accessible.
2492
2878
  this.pageTitle?.nativeElement.focus();
2493
- this.currentPageChanged.emit();
2879
+ this.currentPageChange.emit();
2494
2880
  // scroll to top of page in case there is long page content
2495
2881
  this.bodyElementRef?.nativeElement.scrollTo(0, 0);
2496
2882
  });
@@ -2515,7 +2901,7 @@ class ClrWizard {
2515
2901
  this.wizardFinished.emit();
2516
2902
  }
2517
2903
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizard, deps: [{ token: PLATFORM_ID }, { token: i3.ClrCommonStringsService }, { token: WizardNavigationService }, { token: PageCollectionService }, { token: ButtonHubService }, { token: HeaderActionService }, { token: i0.ElementRef }, { token: i0.IterableDiffers }], target: i0.ɵɵFactoryTarget.Component }); }
2518
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizard, isStandalone: false, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], size: ["clrWizardSize", "size"], inPage: ["clrWizardInPage", "inPage"], inPageFillContentArea: ["clrWizardInPageFillContentArea", "inPageFillContentArea"], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChanged: "clrWizardCurrentPageChanged", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.wizard-in-page": "inPage", "class.wizard-in-page--fill-content-area": "inPage && inPageFillContentArea" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage, descendants: true }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n<ng-template #coreWizardContent>\n <div class=\"modal-content-wrapper\">\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle?.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle?.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n </div>\n </div>\n\n @if (headerActionService.displayHeaderActionsWrapper) {\n <div class=\"modal-header-actions-wrapper\">\n @if (headerActionService.showWizardHeaderActions) {\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n } @if (headerActionService.currentPageHasHeaderActions) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage?.headerActions\"></ng-template>\n }\n </div>\n } @if (closable && !inPage) {\n <button type=\"button\" class=\"close\" [attr.aria-label]=\"commonStrings.keys.close\" (click)=\"modalCancel()\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n }\n </div>\n\n <div #body class=\"modal-body-wrapper\">\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div class=\"clr-wizard-footer-buttons-wrapper\">\n @if (navService.currentPage?.hasButtons) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n } @else {\n <ng-content select=\"clr-wizard-button\"></ng-content>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n@if (inPage) {\n<ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n} @else {\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n </ng-template>\n</clr-modal>\n}\n", dependencies: [{ kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i8.ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: i8.ClrModalBody, selector: ".modal-body" }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: ["label"] }] }); }
2904
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.3", type: ClrWizard, isStandalone: false, selector: "clr-wizard", inputs: { stepnavAriaLabel: ["clrWizardStepnavAriaLabel", "stepnavAriaLabel"], stepnavLayout: ["clrWizardStepnavLayout", "stepnavLayout", stepnavLayoutAttribute], size: ["clrWizardSize", "size"], inPage: ["clrWizardInPage", "inPage"], inPageFillContentArea: ["clrWizardInPageFillContentArea", "inPageFillContentArea"], hideFooter: ["clrWizardHideFooter", "hideFooter"], _footerAlign: ["clrWizardFooterAlign", "_footerAlign", footerAlignAttribute], closable: ["clrWizardClosable", "closable"], _stopModalAnimations: ["clrWizardPreventModalAnimation", "_stopModalAnimations"], forceForward: ["clrWizardForceForwardNavigation", "forceForward"], clrWizardOpen: "clrWizardOpen", stopNext: ["clrWizardPreventDefaultNext", "stopNext"], stopCancel: ["clrWizardPreventDefaultCancel", "stopCancel"], stopNavigation: ["clrWizardPreventNavigation", "stopNavigation"], disableStepnav: ["clrWizardDisableStepnav", "disableStepnav"] }, outputs: { _openChanged: "clrWizardOpenChange", onCancel: "clrWizardOnCancel", wizardFinished: "clrWizardOnFinish", onReset: "clrWizardOnReset", currentPageChange: "clrWizardCurrentPageChange", onMoveNext: "clrWizardOnNext", onMovePrevious: "clrWizardOnPrevious" }, host: { properties: { "class.clr-wizard": "true", "class.wizard-md": "size == 'md'", "class.wizard-lg": "size == 'lg'", "class.wizard-xl": "size == 'xl'", "class.wizard-in-page": "inPage", "class.wizard-in-page--fill-content-area": "inPage && inPageFillContentArea", "class.wizard-horizontal": "stepnavLayout === ClrWizardStepnavLayout.HORIZONTAL" } }, providers: [WizardNavigationService, PageCollectionService, ButtonHubService, HeaderActionService], queries: [{ propertyName: "wizardTitle", first: true, predicate: ClrWizardTitle, descendants: true }, { propertyName: "pages", predicate: ClrWizardPage }, { propertyName: "wizardButtons", predicate: ClrWizardButton }, { propertyName: "headerActions", predicate: ClrWizardHeaderAction }], viewQueries: [{ propertyName: "pageTitle", first: true, predicate: ["pageTitle"], descendants: true }, { propertyName: "bodyElementRef", first: true, predicate: ["body"], descendants: true }], ngImport: i0, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n<ng-template #coreWizardContent>\n <div class=\"clr-wizard-content-wrapper\">\n @if (stepnavLayout === ClrWizardStepnavLayout.HORIZONTAL) {\n <div class=\"clr-wizard-title-wrapper\">\n <ng-container [ngTemplateOutlet]=\"wizardTitleTemplate\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"wizardActionsTemplate\"></ng-container>\n </div>\n }\n\n <div class=\"clr-wizard-stepnav-wrapper\" role=\"region\">\n @if (stepnavLayout === ClrWizardStepnavLayout.VERTICAL) {\n <ng-container [ngTemplateOutlet]=\"wizardTitleTemplate\"></ng-container>\n }\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"clr-wizard-main-content\">\n @if (showHeader) {\n <div class=\"clr-wizard-header\">\n @if (navService.currentPage?.pageTitle) {\n <div class=\"clr-wizard-page-title-wrapper\" cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"clr-wizard-page-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle?.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"clr-wizard-page-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n </div>\n </div>\n } @if (stepnavLayout === ClrWizardStepnavLayout.VERTICAL) {\n <ng-container [ngTemplateOutlet]=\"wizardActionsTemplate\"></ng-container>\n }\n </div>\n }\n\n <div #body class=\"clr-wizard-body-wrapper\">\n <div class=\"clr-wizard-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n\n @if (showFooter) {\n <div class=\"clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n class=\"clr-wizard-footer-buttons-wrapper\"\n [ngClass]=\"{'align-start': footerAlign === ClrWizardFooterAlign.START, 'align-end': footerAlign === ClrWizardFooterAlign.END}\"\n >\n @if (navService.currentPage?.hasButtons) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n } @else {\n <ng-content select=\"clr-wizard-button\"></ng-content>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #wizardTitleTemplate>\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle?.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #wizardActionsTemplate>\n @if (headerActionService.displayHeaderActionsWrapper) {\n <div class=\"clr-wizard-header-actions-wrapper\">\n @if (headerActionService.showWizardHeaderActions) {\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n } @if (headerActionService.currentPageHasHeaderActions) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage?.headerActions\"></ng-template>\n }\n </div>\n } @if (closable && !inPage) {\n <button type=\"button\" class=\"close\" [attr.aria-label]=\"commonStrings.keys.close\" (click)=\"modalCancel()\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n }\n</ng-template>\n\n@if (inPage) {\n<ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n} @else {\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n </ng-template>\n</clr-modal>\n}\n", dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.ClrIcon, selector: "clr-icon, cds-icon", inputs: ["shape", "size", "direction", "flip", "solid", "status", "inverse", "badge"] }, { kind: "component", type: i8.ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "component", type: ClrWizardStepnav, selector: "clr-wizard-stepnav", inputs: ["label"] }] }); }
2519
2905
  }
2520
2906
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizard, decorators: [{
2521
2907
  type: Component,
@@ -2526,13 +2912,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2526
2912
  '[class.wizard-xl]': "size == 'xl'",
2527
2913
  '[class.wizard-in-page]': 'inPage',
2528
2914
  '[class.wizard-in-page--fill-content-area]': 'inPage && inPageFillContentArea',
2529
- }, standalone: false, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n<ng-template #coreWizardContent>\n <div class=\"modal-content-wrapper\">\n <div class=\"modal-nav clr-wizard-stepnav-wrapper\" role=\"region\">\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle?.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"modal-content\">\n <div class=\"modal-header--accessible\">\n <div class=\"modal-title-wrapper\" #title cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"modal-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle?.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"modal-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n </div>\n </div>\n\n @if (headerActionService.displayHeaderActionsWrapper) {\n <div class=\"modal-header-actions-wrapper\">\n @if (headerActionService.showWizardHeaderActions) {\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n } @if (headerActionService.currentPageHasHeaderActions) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage?.headerActions\"></ng-template>\n }\n </div>\n } @if (closable && !inPage) {\n <button type=\"button\" class=\"close\" [attr.aria-label]=\"commonStrings.keys.close\" (click)=\"modalCancel()\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n }\n </div>\n\n <div #body class=\"modal-body-wrapper\">\n <div class=\"modal-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n\n <div class=\"modal-footer clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div class=\"clr-wizard-footer-buttons-wrapper\">\n @if (navService.currentPage?.hasButtons) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n } @else {\n <ng-content select=\"clr-wizard-button\"></ng-content>\n }\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n@if (inPage) {\n<ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n} @else {\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n </ng-template>\n</clr-modal>\n}\n" }]
2915
+ '[class.wizard-horizontal]': 'stepnavLayout === ClrWizardStepnavLayout.HORIZONTAL',
2916
+ }, standalone: false, template: "<!--\n ~ Copyright (c) 2016-2026 Broadcom. All Rights Reserved.\n ~ The term \"Broadcom\" refers to Broadcom Inc. and/or its subsidiaries.\n ~ This software is released under MIT license.\n ~ The full license information can be found in LICENSE in the root directory of this project.\n -->\n<ng-template #coreWizardContent>\n <div class=\"clr-wizard-content-wrapper\">\n @if (stepnavLayout === ClrWizardStepnavLayout.HORIZONTAL) {\n <div class=\"clr-wizard-title-wrapper\">\n <ng-container [ngTemplateOutlet]=\"wizardTitleTemplate\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"wizardActionsTemplate\"></ng-container>\n </div>\n }\n\n <div class=\"clr-wizard-stepnav-wrapper\" role=\"region\">\n @if (stepnavLayout === ClrWizardStepnavLayout.VERTICAL) {\n <ng-container [ngTemplateOutlet]=\"wizardTitleTemplate\"></ng-container>\n }\n <clr-wizard-stepnav [label]=\"stepnavAriaLabel\"></clr-wizard-stepnav>\n </div>\n\n <div class=\"clr-wizard-main-content\">\n @if (showHeader) {\n <div class=\"clr-wizard-header\">\n @if (navService.currentPage?.pageTitle) {\n <div class=\"clr-wizard-page-title-wrapper\" cdkFocusInitial tabindex=\"-1\">\n <div\n class=\"clr-wizard-page-title\"\n role=\"heading\"\n [attr.aria-level]=\"navService.currentPage?.pageTitle?.headingLevel || 2\"\n >\n <span tabindex=\"-1\" #pageTitle class=\"clr-wizard-page-title-text\">\n <ng-template [ngTemplateOutlet]=\"navService.currentPageTitle\"></ng-template>\n </span>\n </div>\n </div>\n } @if (stepnavLayout === ClrWizardStepnavLayout.VERTICAL) {\n <ng-container [ngTemplateOutlet]=\"wizardActionsTemplate\"></ng-container>\n }\n </div>\n }\n\n <div #body class=\"clr-wizard-body-wrapper\">\n <div class=\"clr-wizard-body\">\n <main clr-wizard-pages-wrapper class=\"clr-wizard-content\">\n <ng-content></ng-content>\n </main>\n </div>\n </div>\n\n @if (showFooter) {\n <div class=\"clr-wizard-footer\">\n <div class=\"clr-wizard-footer-buttons\">\n <div\n class=\"clr-wizard-footer-buttons-wrapper\"\n [ngClass]=\"{'align-start': footerAlign === ClrWizardFooterAlign.START, 'align-end': footerAlign === ClrWizardFooterAlign.END}\"\n >\n @if (navService.currentPage?.hasButtons) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage.buttons\"></ng-template>\n } @else {\n <ng-content select=\"clr-wizard-button\"></ng-content>\n }\n </div>\n </div>\n </div>\n }\n </div>\n </div>\n</ng-template>\n\n<ng-template #wizardTitleTemplate>\n <div class=\"clr-wizard-title\" [id]=\"wizardId\" role=\"heading\" [attr.aria-level]=\"wizardTitle?.headingLevel || 1\">\n <ng-content select=\"clr-wizard-title\"></ng-content>\n </div>\n</ng-template>\n\n<ng-template #wizardActionsTemplate>\n @if (headerActionService.displayHeaderActionsWrapper) {\n <div class=\"clr-wizard-header-actions-wrapper\">\n @if (headerActionService.showWizardHeaderActions) {\n <ng-content select=\"clr-wizard-header-action\"></ng-content>\n } @if (headerActionService.currentPageHasHeaderActions) {\n <ng-template [ngTemplateOutlet]=\"navService.currentPage?.headerActions\"></ng-template>\n }\n </div>\n } @if (closable && !inPage) {\n <button type=\"button\" class=\"close\" [attr.aria-label]=\"commonStrings.keys.close\" (click)=\"modalCancel()\">\n <cds-icon shape=\"window-close\"></cds-icon>\n </button>\n }\n</ng-template>\n\n@if (inPage) {\n<ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n} @else {\n<clr-modal\n [clrModalOpen]=\"_open\"\n [clrModalSize]=\"size\"\n [clrModalClosable]=\"closable\"\n [clrModalStaticBackdrop]=\"true\"\n [clrModalSkipAnimation]=\"stopModalAnimations\"\n [clrModalOverrideScrollService]=\"isInline\"\n [clrModalPreventClose]=\"true\"\n (clrModalAlternateClose)=\"modalCancel()\"\n [clrModalLabelledById]=\"wizardId\"\n>\n <ng-template #clrInternalModalContentTemplate>\n <ng-container [ngTemplateOutlet]=\"coreWizardContent\"></ng-container>\n </ng-template>\n</clr-modal>\n}\n" }]
2530
2917
  }], ctorParameters: () => [{ type: undefined, decorators: [{
2531
2918
  type: Inject,
2532
2919
  args: [PLATFORM_ID]
2533
2920
  }] }, { type: i3.ClrCommonStringsService }, { type: WizardNavigationService }, { type: PageCollectionService }, { type: ButtonHubService }, { type: HeaderActionService }, { type: i0.ElementRef }, { type: i0.IterableDiffers }], propDecorators: { stepnavAriaLabel: [{
2534
2921
  type: Input,
2535
2922
  args: ['clrWizardStepnavAriaLabel']
2923
+ }], stepnavLayout: [{
2924
+ type: Input,
2925
+ args: [{ alias: 'clrWizardStepnavLayout', transform: stepnavLayoutAttribute }]
2536
2926
  }], size: [{
2537
2927
  type: Input,
2538
2928
  args: ['clrWizardSize']
@@ -2542,6 +2932,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2542
2932
  }], inPageFillContentArea: [{
2543
2933
  type: Input,
2544
2934
  args: ['clrWizardInPageFillContentArea']
2935
+ }], hideFooter: [{
2936
+ type: Input,
2937
+ args: ['clrWizardHideFooter']
2938
+ }], _footerAlign: [{
2939
+ type: Input,
2940
+ args: [{ alias: 'clrWizardFooterAlign', transform: footerAlignAttribute }]
2545
2941
  }], closable: [{
2546
2942
  type: Input,
2547
2943
  args: ['clrWizardClosable']
@@ -2560,9 +2956,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2560
2956
  }], onReset: [{
2561
2957
  type: Output,
2562
2958
  args: ['clrWizardOnReset']
2563
- }], currentPageChanged: [{
2959
+ }], currentPageChange: [{
2564
2960
  type: Output,
2565
- args: ['clrWizardCurrentPageChanged']
2961
+ args: ['clrWizardCurrentPageChange']
2566
2962
  }], onMoveNext: [{
2567
2963
  type: Output,
2568
2964
  args: ['clrWizardOnNext']
@@ -2574,7 +2970,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2574
2970
  args: ['pageTitle']
2575
2971
  }], pages: [{
2576
2972
  type: ContentChildren,
2577
- args: [ClrWizardPage, { descendants: true }]
2973
+ args: [ClrWizardPage]
2974
+ }], wizardButtons: [{
2975
+ type: ContentChildren,
2976
+ args: [ClrWizardButton, { descendants: false }]
2578
2977
  }], headerActions: [{
2579
2978
  type: ContentChildren,
2580
2979
  args: [ClrWizardHeaderAction]
@@ -2584,9 +2983,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2584
2983
  }], bodyElementRef: [{
2585
2984
  type: ViewChild,
2586
2985
  args: ['body']
2587
- }], modal: [{
2588
- type: ViewChild,
2589
- args: [ClrModal]
2590
2986
  }], forceForward: [{
2591
2987
  type: Input,
2592
2988
  args: ['clrWizardForceForwardNavigation']
@@ -2607,191 +3003,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2607
3003
  args: ['clrWizardDisableStepnav']
2608
3004
  }] } });
2609
3005
 
2610
- /*
2611
- * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
2612
- * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
2613
- * This software is released under MIT license.
2614
- * The full license information can be found in LICENSE in the root directory of this project.
2615
- */
2616
- const DEFAULT_BUTTON_TYPES = {
2617
- cancel: 'cancel',
2618
- previous: 'previous',
2619
- next: 'next',
2620
- finish: 'finish',
2621
- danger: 'danger',
2622
- };
2623
- const CUSTOM_BUTTON_TYPES = {
2624
- cancel: 'custom-cancel',
2625
- previous: 'custom-previous',
2626
- next: 'custom-next',
2627
- finish: 'custom-finish',
2628
- danger: 'custom-danger',
2629
- };
2630
- class ClrWizardButton {
2631
- constructor(navService, buttonService) {
2632
- this.navService = navService;
2633
- this.buttonService = buttonService;
2634
- this.type = '';
2635
- this.disabled = false;
2636
- this.hidden = false;
2637
- // EventEmitter which is emitted when a button is clicked.
2638
- this.wasClicked = new EventEmitter(false);
2639
- }
2640
- get isCancel() {
2641
- return this.checkDefaultAndCustomType(this.type, 'cancel');
2642
- }
2643
- get isNext() {
2644
- return this.checkDefaultAndCustomType(this.type, 'next');
2645
- }
2646
- get isPrevious() {
2647
- return this.checkDefaultAndCustomType(this.type, 'previous');
2648
- }
2649
- get isFinish() {
2650
- return this.checkDefaultAndCustomType(this.type, 'finish');
2651
- }
2652
- get isDanger() {
2653
- return this.checkDefaultAndCustomType(this.type, 'danger');
2654
- }
2655
- get isPrimaryAction() {
2656
- return this.isNext || this.isDanger || this.isFinish;
2657
- }
2658
- get _disabledAttribute() {
2659
- if (this.isDisabled) {
2660
- return '';
2661
- }
2662
- return null;
2663
- }
2664
- get isDisabled() {
2665
- // dealing with negatives here. cognitively easier to think of it like this...
2666
- const disabled = true;
2667
- const nav = this.navService;
2668
- const page = this.navService.currentPage;
2669
- // Ensure we don't change the response until buttons are ready to avoid chocolate
2670
- if (!this.buttonService.buttonsReady) {
2671
- return !disabled;
2672
- }
2673
- if (this.disabled || nav.wizardStopNavigation || !page) {
2674
- return true;
2675
- }
2676
- if (this.isCancel) {
2677
- return !disabled;
2678
- }
2679
- if (this.isPrevious && (nav.currentPageIsFirst || page.previousStepDisabled)) {
2680
- return disabled;
2681
- }
2682
- if (this.isDanger && !page.readyToComplete) {
2683
- return disabled;
2684
- }
2685
- if (this.isNext && (nav.currentPageIsLast || !page.readyToComplete)) {
2686
- return disabled;
2687
- }
2688
- if (this.isFinish && (!nav.currentPageIsLast || !page.readyToComplete)) {
2689
- return disabled;
2690
- }
2691
- return !disabled;
2692
- }
2693
- get isHidden() {
2694
- // dealing with negatives here. cognitively easier to think of it like this...
2695
- const hidden = true;
2696
- const nav = this.navService;
2697
- // Ensure we don't change the response until buttons are ready to avoid chocolate
2698
- if (!this.buttonService.buttonsReady) {
2699
- return !hidden;
2700
- }
2701
- if (this.hidden) {
2702
- return true;
2703
- }
2704
- if (this.isCancel) {
2705
- return !hidden;
2706
- }
2707
- if (this.isPrevious && nav.currentPageIsFirst) {
2708
- return hidden;
2709
- }
2710
- if (this.isNext && nav.currentPageIsLast) {
2711
- return hidden;
2712
- }
2713
- if (this.isFinish && !nav.currentPageIsLast) {
2714
- return hidden;
2715
- }
2716
- return !hidden;
2717
- }
2718
- click() {
2719
- if (this.isDisabled) {
2720
- return;
2721
- }
2722
- this.wasClicked.emit(this.type);
2723
- this.buttonService.buttonClicked(this.type);
2724
- }
2725
- checkDefaultAndCustomType(valueToCheck = '', typeToLookUp) {
2726
- if (DEFAULT_BUTTON_TYPES[typeToLookUp] === valueToCheck) {
2727
- return true;
2728
- }
2729
- if (CUSTOM_BUTTON_TYPES[typeToLookUp] === valueToCheck) {
2730
- return true;
2731
- }
2732
- return false;
2733
- }
2734
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardButton, deps: [{ token: WizardNavigationService }, { token: ButtonHubService }], target: i0.ɵɵFactoryTarget.Component }); }
2735
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.1.3", type: ClrWizardButton, isStandalone: false, selector: "clr-wizard-button", inputs: { type: "type", disabled: ["clrWizardButtonDisabled", "disabled"], hidden: ["clrWizardButtonHidden", "hidden"] }, outputs: { wasClicked: "clrWizardButtonClicked" }, host: { properties: { "attr.aria-hidden": "isHidden" }, classAttribute: "clr-wizard-btn-wrapper" }, ngImport: i0, template: `
2736
- <button
2737
- type="button"
2738
- class="btn clr-wizard-btn"
2739
- [class.btn-link]="isCancel"
2740
- [class.clr-wizard-btn--tertiary]="isCancel"
2741
- [class.btn-outline]="isPrevious"
2742
- [class.clr-wizard-btn--secondary]="isPrevious"
2743
- [class.btn-primary]="isPrimaryAction"
2744
- [class.clr-wizard-btn--primary]="isPrimaryAction"
2745
- [class.btn-success]="isFinish"
2746
- [class.btn-danger]="isDanger"
2747
- [class.disabled]="isDisabled"
2748
- [attr.disabled]="_disabledAttribute"
2749
- (click)="click()"
2750
- >
2751
- <ng-content></ng-content>
2752
- </button>
2753
- `, isInline: true }); }
2754
- }
2755
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImport: i0, type: ClrWizardButton, decorators: [{
2756
- type: Component,
2757
- args: [{
2758
- selector: 'clr-wizard-button',
2759
- template: `
2760
- <button
2761
- type="button"
2762
- class="btn clr-wizard-btn"
2763
- [class.btn-link]="isCancel"
2764
- [class.clr-wizard-btn--tertiary]="isCancel"
2765
- [class.btn-outline]="isPrevious"
2766
- [class.clr-wizard-btn--secondary]="isPrevious"
2767
- [class.btn-primary]="isPrimaryAction"
2768
- [class.clr-wizard-btn--primary]="isPrimaryAction"
2769
- [class.btn-success]="isFinish"
2770
- [class.btn-danger]="isDanger"
2771
- [class.disabled]="isDisabled"
2772
- [attr.disabled]="_disabledAttribute"
2773
- (click)="click()"
2774
- >
2775
- <ng-content></ng-content>
2776
- </button>
2777
- `,
2778
- host: { class: 'clr-wizard-btn-wrapper', '[attr.aria-hidden]': 'isHidden' },
2779
- standalone: false,
2780
- }]
2781
- }], ctorParameters: () => [{ type: WizardNavigationService }, { type: ButtonHubService }], propDecorators: { type: [{
2782
- type: Input,
2783
- args: ['type']
2784
- }], disabled: [{
2785
- type: Input,
2786
- args: ['clrWizardButtonDisabled']
2787
- }], hidden: [{
2788
- type: Input,
2789
- args: ['clrWizardButtonHidden']
2790
- }], wasClicked: [{
2791
- type: Output,
2792
- args: ['clrWizardButtonClicked']
2793
- }] } });
2794
-
2795
3006
  /*
2796
3007
  * Copyright (c) 2016-2026 Broadcom. All Rights Reserved.
2797
3008
  * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries.
@@ -2859,5 +3070,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.3", ngImpor
2859
3070
  * Generated bundle index. Do not edit.
2860
3071
  */
2861
3072
 
2862
- export { CLR_WIZARD_DIRECTIVES, CUSTOM_BUTTON_TYPES, ClrWizard, ClrWizardButton, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardTitle, DEFAULT_BUTTON_TYPES };
3073
+ export { CLR_WIZARD_DIRECTIVES, CUSTOM_BUTTON_TYPES, ClrWizard, ClrWizardButton, ClrWizardFooterAlign, ClrWizardHeaderAction, ClrWizardModule, ClrWizardPage, ClrWizardPageButtons, ClrWizardPageHeaderActions, ClrWizardPageNavTitle, ClrWizardPageTitle, ClrWizardStepnav, ClrWizardStepnavItem, ClrWizardStepnavLayout, ClrWizardTitle, DEFAULT_BUTTON_TYPES, footerAlignAttribute, stepnavLayoutAttribute };
2863
3074
  //# sourceMappingURL=clr-angular-wizard.mjs.map