@praxisui/stepper 10.0.0-rc.40 → 10.0.0-rc.42

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
@@ -105,6 +105,8 @@ validateStep = async ({ step, stepIndex, formGroup, formData }) => {
105
105
 
106
106
  Remote dynamic forms still require the effective host to provide the CRUD/resource services expected by `@praxisui/dynamic-form`.
107
107
 
108
+ When a workflow includes rich-content review blocks (`stepBlocksBeforeForm` or `stepBlocksAfterForm`), `PraxisStepper` reactively merges live form values from all steps into the rich-content evaluation context (`values`, root fields, and `forms[stepId | stepIndex]`). Review steps can therefore bind `recordReference`, `keyValueList`, `propertySheet` or `recordSummary` nodes with `quickView` (`ResourceQuickViewBinding`) to foreign-key IDs or `entity-lookup` selections made in earlier steps.
109
+
108
110
  ## Main Inputs And Outputs
109
111
 
110
112
  - `stepperId: string`: required stable id for persisted configuration.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-26T18:09:20.136Z",
3
+ "generatedAt": "2026-11-01T13:59:56.156Z",
4
4
  "packageName": "@praxisui/stepper",
5
- "packageVersion": "10.0.0-rc.40",
5
+ "packageVersion": "10.0.0-rc.42",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -595,6 +595,8 @@ class PraxisStepper {
595
595
  _formComponents = new Map();
596
596
  _formValidity = new Map();
597
597
  _formPending = new Map();
598
+ _stepFormValues = signal({}, ...(ngDevMode ? [{ debugName: "_stepFormValues" }] : /* istanbul ignore next */ []));
599
+ _formValueSubscriptions = new Map();
598
600
  hostElement = inject((ElementRef));
599
601
  renderer = inject(Renderer2);
600
602
  appliedHeaderClasses = [];
@@ -633,8 +635,15 @@ class PraxisStepper {
633
635
  if (i != null)
634
636
  this._selectedIndex.set(i);
635
637
  }
638
+ _enableCustomization = signal(false, ...(ngDevMode ? [{ debugName: "_enableCustomization" }] : /* istanbul ignore next */ []));
636
639
  disableRippleInput = false;
637
- enableCustomization = false;
640
+ set enableCustomization(value) {
641
+ this._enableCustomization.set(!!value);
642
+ this.cdr.markForCheck();
643
+ }
644
+ get enableCustomization() {
645
+ return this._enableCustomization();
646
+ }
638
647
  // Paridade com API do Material
639
648
  labelPosition;
640
649
  color;
@@ -811,6 +820,15 @@ class PraxisStepper {
811
820
  if (component)
812
821
  this._formComponents.set(stepIndex, component);
813
822
  this._formValidity.set(stepIndex, ev.formGroup.valid);
823
+ this.syncStepFormValues(stepIndex, ev.formGroup);
824
+ this._formValueSubscriptions.get(stepIndex)?.unsubscribe();
825
+ if (ev.formGroup?.valueChanges) {
826
+ this._formValueSubscriptions.set(stepIndex, ev.formGroup.valueChanges.subscribe(() => {
827
+ this.syncStepFormValues(stepIndex, ev.formGroup);
828
+ this.cdr.markForCheck();
829
+ }));
830
+ }
831
+ this.cdr.markForCheck();
814
832
  this.stepFormReady.emit({
815
833
  stepIndex,
816
834
  stepId: this.steps()[stepIndex]?.id,
@@ -819,12 +837,37 @@ class PraxisStepper {
819
837
  }
820
838
  onFormValueChange(stepIndex, ev) {
821
839
  this._formValidity.set(stepIndex, ev.isValid);
840
+ const fg = this._formGroups.get(stepIndex);
841
+ if (ev.formData &&
842
+ typeof ev.formData === 'object' &&
843
+ !Array.isArray(ev.formData)) {
844
+ this._stepFormValues.update((prev) => ({
845
+ ...prev,
846
+ [stepIndex]: { ...ev.formData },
847
+ }));
848
+ }
849
+ else if (fg) {
850
+ this.syncStepFormValues(stepIndex, fg);
851
+ }
852
+ this.cdr.markForCheck();
822
853
  this.stepFormValueChange.emit({
823
854
  stepIndex,
824
855
  stepId: this.steps()[stepIndex]?.id,
825
856
  event: ev,
826
857
  });
827
858
  }
859
+ syncStepFormValues(stepIndex, formGroup) {
860
+ const raw = typeof formGroup?.getRawValue === 'function'
861
+ ? formGroup.getRawValue()
862
+ : formGroup?.value;
863
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
864
+ return;
865
+ }
866
+ this._stepFormValues.update((prev) => ({
867
+ ...prev,
868
+ [stepIndex]: { ...raw },
869
+ }));
870
+ }
828
871
  onReactiveDeterminationExecuted(stepIndex, event) {
829
872
  this.stepReactiveDeterminationExecuted.emit({
830
873
  stepIndex,
@@ -895,8 +938,37 @@ class PraxisStepper {
895
938
  return Array.isArray(document?.nodes) && document.nodes.length > 0;
896
939
  }
897
940
  getStepRichContentContext(stepIndex) {
898
- const step = this.steps()[stepIndex];
941
+ const allSteps = this.steps();
942
+ const step = allSteps[stepIndex];
943
+ const trackedValues = this._stepFormValues();
944
+ const formsByStep = {};
945
+ const mergedFormValues = {};
946
+ allSteps.forEach((candidateStep, idx) => {
947
+ const fg = this._formGroups.get(idx);
948
+ const liveRaw = typeof fg?.getRawValue === 'function'
949
+ ? fg.getRawValue()
950
+ : fg?.value;
951
+ const stepValues = (liveRaw && typeof liveRaw === 'object' && !Array.isArray(liveRaw)
952
+ ? liveRaw
953
+ : trackedValues[idx]) ?? undefined;
954
+ if (!stepValues) {
955
+ return;
956
+ }
957
+ const snapshot = { ...stepValues };
958
+ formsByStep[String(idx)] = snapshot;
959
+ if (candidateStep?.id) {
960
+ formsByStep[candidateStep.id] = snapshot;
961
+ }
962
+ Object.assign(mergedFormValues, snapshot);
963
+ });
964
+ const currentStepValues = formsByStep[String(stepIndex)] ??
965
+ (step?.id ? formsByStep[step.id] : undefined) ??
966
+ {};
899
967
  return {
968
+ ...mergedFormValues,
969
+ values: mergedFormValues,
970
+ forms: formsByStep,
971
+ currentStepValues: currentStepValues,
900
972
  step: (step ?? {}),
901
973
  stepIndex,
902
974
  stepper: {
@@ -1394,6 +1466,8 @@ class PraxisStepper {
1394
1466
  });
1395
1467
  }
1396
1468
  ngOnDestroy() {
1469
+ this._formValueSubscriptions.forEach((sub) => sub.unsubscribe());
1470
+ this._formValueSubscriptions.clear();
1397
1471
  this.assistantSessions.removeContextSession(this.buildAiAssistantContextSnapshot().identity);
1398
1472
  this.aiAssistantStateSubscription?.unsubscribe();
1399
1473
  }
@@ -1774,7 +1848,7 @@ class PraxisStepper {
1774
1848
  <mat-icon fontIcon="edit"></mat-icon>
1775
1849
  </button>
1776
1850
  }
1777
- `, isInline: true, styles: [":host{display:block;position:relative}.praxis-stepper{width:100%;background:var(--md-sys-color-surface);border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;padding:12px;box-shadow:var(--mat-elevation-level1)}.praxis-stepper.pdx-stepper-ft-light{background:transparent;border:none;border-radius:0;padding:0;box-shadow:none}:host(.density-compact) ::ng-deep .mat-step-header{min-height:36px}:host(.density-compact) .pdx-step-actions{padding-top:4px;gap:6px}:host(.density-comfortable) ::ng-deep .mat-step-header{min-height:44px}.pdx-step-content{padding:12px 4px 8px;color:var(--md-sys-color-on-surface)}.pdx-step-actions{display:flex;gap:8px;padding-top:8px}::ng-deep .praxis-stepper .mat-step-header{border-radius:999px;margin:4px 0;color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-label{color:var(--md-sys-color-on-surface);opacity:1}::ng-deep .praxis-stepper .mat-step-label.mat-step-label-active{color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-label.mat-step-label-selected{color:var(--md-sys-color-on-surface);font-weight:600}::ng-deep .praxis-stepper .mat-step-optional{color:var(--md-sys-color-on-surface);opacity:1}::ng-deep .praxis-stepper .mat-step-header.cdk-keyboard-focused,::ng-deep .praxis-stepper .mat-step-header.cdk-program-focused{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}::ng-deep .praxis-stepper .mat-step-icon{background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-icon-selected{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}::ng-deep .praxis-stepper .mat-step-icon-state-done{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}::ng-deep .praxis-stepper .mat-step-icon-state-error{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}::ng-deep .praxis-stepper .mat-stepper-horizontal-line{border-top-color:var(--md-sys-color-outline-variant)}::ng-deep .praxis-stepper .mat-stepper-vertical-line:before{border-left-color:var(--md-sys-color-outline-variant)}::ng-deep .pdx-stepper-ft-light .mat-stepper-horizontal{background:transparent;--mat-stepper-header-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-on-surface) 8%, transparent );--mat-stepper-header-focus-state-layer-color: transparent;--mat-stepper-header-hover-state-layer-shape: 14px;--mat-stepper-header-focus-state-layer-shape: 14px}::ng-deep .pdx-stepper-ft-light .mat-step-header{margin:0}::ng-deep .pdx-stepper-ft-light .mat-step-header .mat-step-header-ripple{display:none}::ng-deep .ft-stepper{background:transparent}.ft-stepper-content{padding:0}.ft-stepper-content .form-section{border:none;padding:0;background:transparent}.nav-align-start{justify-content:flex-start}.nav-align-center{justify-content:center}.nav-align-end{justify-content:flex-end}.nav-align-space-between{justify-content:space-between}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.stepper-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.stepper-ai-assistant-trigger{box-shadow:var( --md-sys-elevation-level2, 0 4px 12px rgba(0, 0, 0, .18) )}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatStepperModule }, { kind: "component", type: i2.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i2.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i2.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i2.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisDynamicForm, selector: "praxis-dynamic-form", inputs: ["resourcePath", "resourceId", "initialValue", "emptyState", "editorialContext", "mode", "config", "actions", "schemaSource", "actionId", "operationId", "schemaUrl", "readUrl", "submitUrl", "submitMethod", "submitIdempotencyKey", "submitCorrelationId", "submitResourceVersion", "submitResourceVersionTargetResourceKey", "submitResourceVersionTargetIdField", "responseSchemaUrl", "apiEndpointKey", "apiUrlEntry", "enableCustomization", "showAiAssistant", "formId", "componentInstanceId", "configPersistenceStrategy", "layout", "layoutMode", "formLayout", "generatedLayoutPreset", "layoutPolicy", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "presentation", "presentationPreset", "sectionDefaultAppearance", "sectionDivider", "visibleGlobal", "fieldIconPolicy", "domainRules", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "configPatchChange", "formReady", "valueChange", "payloadPreviewChange", "syncCompleted", "initializationError", "loadingStateChange", "enableCustomizationChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError", "ruleDiagnosticsChange", "reactiveDeterminationExecuted", "reactiveDeterminationPendingChange", "tabChange", "tabSelected"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"], outputs: ["nodeAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1851
+ `, isInline: true, styles: [":host{display:block;position:relative}.praxis-stepper{width:100%;background:var(--md-sys-color-surface);border:1px solid var(--md-sys-color-outline-variant);border-radius:16px;padding:12px;box-shadow:var(--mat-elevation-level1)}.praxis-stepper.pdx-stepper-ft-light{background:transparent;border:none;border-radius:0;padding:0;box-shadow:none}:host(.density-compact) ::ng-deep .mat-step-header{min-height:36px}:host(.density-compact) .pdx-step-actions{padding-top:4px;gap:6px}:host(.density-comfortable) ::ng-deep .mat-step-header{min-height:44px}.pdx-step-content{padding:12px 4px 8px;color:var(--md-sys-color-on-surface)}.pdx-step-actions{display:flex;gap:8px;padding-top:8px}::ng-deep .praxis-stepper .mat-step-header{border-radius:999px;margin:4px 0;color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-label{color:var(--md-sys-color-on-surface);opacity:1}::ng-deep .praxis-stepper .mat-step-label.mat-step-label-active{color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-label.mat-step-label-selected{color:var(--md-sys-color-on-surface);font-weight:600}::ng-deep .praxis-stepper .mat-step-optional{color:var(--md-sys-color-on-surface);opacity:1}::ng-deep .praxis-stepper .mat-step-header.cdk-keyboard-focused,::ng-deep .praxis-stepper .mat-step-header.cdk-program-focused{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}::ng-deep .praxis-stepper .mat-step-icon{background:var(--md-sys-color-surface-container-high);color:var(--md-sys-color-on-surface)}::ng-deep .praxis-stepper .mat-step-icon-selected{background:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}::ng-deep .praxis-stepper .mat-step-icon-state-done{background:var(--md-sys-color-tertiary);color:var(--md-sys-color-on-tertiary)}::ng-deep .praxis-stepper .mat-step-icon-state-error{background:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}::ng-deep .praxis-stepper .mat-stepper-horizontal-line{border-top-color:var(--md-sys-color-outline-variant)}::ng-deep .praxis-stepper .mat-stepper-vertical-line:before{border-left-color:var(--md-sys-color-outline-variant)}::ng-deep .pdx-stepper-ft-light .mat-stepper-horizontal{background:transparent;--mat-stepper-header-hover-state-layer-color: color-mix( in srgb, var(--md-sys-color-on-surface) 8%, transparent );--mat-stepper-header-focus-state-layer-color: transparent;--mat-stepper-header-hover-state-layer-shape: 14px;--mat-stepper-header-focus-state-layer-shape: 14px}::ng-deep .pdx-stepper-ft-light .mat-step-header{margin:0}::ng-deep .pdx-stepper-ft-light .mat-step-header .mat-step-header-ripple{display:none}::ng-deep .ft-stepper{background:transparent}.ft-stepper-content{padding:0}.ft-stepper-content .form-section{border:none;padding:0;background:transparent}.nav-align-start{justify-content:flex-start}.nav-align-center{justify-content:center}.nav-align-end{justify-content:flex-end}.nav-align-space-between{justify-content:space-between}.edit-fab{position:absolute;right:12px;bottom:12px;z-index:2}.stepper-ai-assistant{position:absolute;right:12px;bottom:72px;z-index:3}.stepper-ai-assistant-trigger{box-shadow:var( --md-sys-elevation-level2, 0 4px 12px rgba(0, 0, 0, .18) )}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatStepperModule }, { kind: "component", type: i2.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i2.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i2.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "aria-label", "headerPrefix", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i2.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatMiniFabButton, selector: "button[mat-mini-fab], a[mat-mini-fab], button[matMiniFab], a[matMiniFab]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: i3.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "component", type: PraxisDynamicForm, selector: "praxis-dynamic-form", inputs: ["resourcePath", "resourceId", "initialValue", "emptyState", "editorialContext", "mode", "config", "actions", "schemaSource", "actionId", "operationId", "schemaUrl", "readUrl", "submitUrl", "submitMethod", "submitIdempotencyKey", "submitCorrelationId", "submitResourceVersion", "submitResourceVersionTargetResourceKey", "submitResourceVersionTargetIdField", "responseSchemaUrl", "apiEndpointKey", "apiUrlEntry", "enableCustomization", "showAiAssistant", "formId", "componentInstanceId", "configPersistenceStrategy", "layout", "layoutMode", "formLayout", "generatedLayoutPreset", "layoutPolicy", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "presentation", "presentationPreset", "sectionDefaultAppearance", "sectionDivider", "visibleGlobal", "fieldIconPolicy", "domainRules", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "configPatchChange", "formReady", "valueChange", "payloadPreviewChange", "syncCompleted", "initializationError", "loadingStateChange", "enableCustomizationChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError", "ruleDiagnosticsChange", "reactiveDeterminationExecuted", "reactiveDeterminationPendingChange", "tabChange", "tabSelected"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "ownerWidgetKey", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent", "widgetDiagnostic"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone", "variant", "alignment", "density", "iconContainer"] }, { kind: "component", type: PraxisAiAssistantShellComponent, selector: "praxis-ai-assistant-shell", inputs: ["labels", "mode", "state", "contextItems", "attachments", "messages", "quickReplies", "recommendedIntents", "prompt", "statusText", "errorText", "testIdPrefix", "panelTestId", "submitTestId", "applyTestId", "primaryAction", "secondaryActions", "governanceActions", "busy", "canSubmit", "canApply", "preview", "submitOnEnter", "showAttachAction", "enablePastedAttachments", "enableFileAttachments", "attachmentAccept", "attachmentMultiple", "voiceInputMode", "voiceLanguage", "draggable", "resizable", "minWidth", "minHeight", "margin", "layout"], outputs: ["promptChange", "submitPrompt", "apply", "retryTurn", "cancelTurn", "shellAction", "close", "attach", "attachmentsPasted", "attachmentsSelected", "removeAttachment", "messageAction", "editMessage", "resendMessage", "quickReply", "recommendedIntent", "layoutChange"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"], outputs: ["nodeAction"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1778
1852
  }
1779
1853
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisStepper, decorators: [{
1780
1854
  type: Component,
package/package.json CHANGED
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "name": "@praxisui/stepper",
3
- "version": "10.0.0-rc.40",
3
+ "version": "10.0.0-rc.42",
4
4
  "description": "Stepper workflows for Praxis UI with integrated forms, lists, uploads and page builder support.",
5
5
  "peerDependencies": {
6
6
  "@angular/common": "^21.0.0",
7
7
  "@angular/core": "^21.0.0",
8
8
  "@angular/material": "^21.0.0",
9
9
  "@angular/cdk": "^21.0.0",
10
- "@praxisui/core": "^10.0.0-rc.40",
11
- "@praxisui/dynamic-form": "^10.0.0-rc.40",
12
- "@praxisui/rich-content": "^10.0.0-rc.40",
13
- "@praxisui/settings-panel": "^10.0.0-rc.40",
14
- "@praxisui/list": "^10.0.0-rc.40",
15
- "@praxisui/files-upload": "^10.0.0-rc.40",
16
- "@praxisui/page-builder": "^10.0.0-rc.40",
10
+ "@praxisui/core": "^10.0.0-rc.42",
11
+ "@praxisui/dynamic-form": "^10.0.0-rc.42",
12
+ "@praxisui/rich-content": "^10.0.0-rc.42",
13
+ "@praxisui/settings-panel": "^10.0.0-rc.42",
14
+ "@praxisui/list": "^10.0.0-rc.42",
15
+ "@praxisui/files-upload": "^10.0.0-rc.42",
16
+ "@praxisui/page-builder": "^10.0.0-rc.42",
17
17
  "@angular/forms": "^21.0.0",
18
18
  "@angular/router": "^21.0.0",
19
- "@praxisui/ai": "^10.0.0-rc.40",
19
+ "@praxisui/ai": "^10.0.0-rc.42",
20
20
  "rxjs": "~7.8.0"
21
21
  },
22
22
  "dependencies": {
@@ -119,6 +119,8 @@ declare class PraxisStepper implements OnInit, AfterViewInit, OnDestroy {
119
119
  private _formComponents;
120
120
  private _formValidity;
121
121
  private _formPending;
122
+ private _stepFormValues;
123
+ private _formValueSubscriptions;
122
124
  private readonly hostElement;
123
125
  private readonly renderer;
124
126
  private appliedHeaderClasses;
@@ -139,8 +141,10 @@ declare class PraxisStepper implements OnInit, AfterViewInit, OnDestroy {
139
141
  set config(c: StepperMetadata | string | null);
140
142
  set selectedIndexInput(i: number | null);
141
143
  set selectedIndex(i: number | null);
144
+ private _enableCustomization;
142
145
  disableRippleInput: boolean;
143
- enableCustomization: boolean;
146
+ set enableCustomization(value: boolean);
147
+ get enableCustomization(): boolean;
144
148
  labelPosition?: 'bottom' | 'end';
145
149
  color?: ThemePalette;
146
150
  /**
@@ -247,6 +251,7 @@ declare class PraxisStepper implements OnInit, AfterViewInit, OnDestroy {
247
251
  previous(): void;
248
252
  onFormReady(stepIndex: number, ev: FormReadyEvent, component?: PraxisDynamicForm): void;
249
253
  onFormValueChange(stepIndex: number, ev: FormValueChangeEvent): void;
254
+ private syncStepFormValues;
250
255
  onReactiveDeterminationExecuted(stepIndex: number, event: ReactiveDeterminationExecutionEvent): void;
251
256
  onReactiveDeterminationPendingChange(stepIndex: number, pending: boolean): void;
252
257
  private emitReactiveDeterminationStability;