@praxisui/stepper 1.0.0-beta.59 → 1.0.0-beta.61

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
@@ -210,6 +210,7 @@ Notas:
210
210
  - `widgetsBeforeForm` permite inserir cards/infos antes do formulário em cada etapa.
211
211
  - `blocks` (wizard) permite inserir conteúdos editoriais (benefits/content/notice/divider) antes ou depois do formulário.
212
212
  - `zones` (wizard) permite separar blocos em `intro`, `body` e `footer` (mapeados para before/after form).
213
+ - `contentBlock` permanece suportado por compatibilidade, mas entrou em deprecação formal para novo authoring. O destino preferencial de convergência é `widget:rich-text-block`.
213
214
  - Cada bloco pode definir `id` (string) para gerar `blockId` estável em runtime; sem `id`, o fallback usa índice posicional.
214
215
  - `blocks` e `zones` são mutuamente exclusivos no contrato. Se ambos forem enviados, `zones` tem prioridade no runtime.
215
216
  - O wizard faz validação runtime (campos essenciais e exclusividade de `blocks`/`zones`). Em `devMode`, lança erro para facilitar o debug; em produção, emite `console.warn`.
@@ -9,7 +9,7 @@ import * as i6 from '@angular/material/button';
9
9
  import { MatButtonModule } from '@angular/material/button';
10
10
  import * as i5$1 from '@angular/material/icon';
11
11
  import { MatIconModule } from '@angular/material/icon';
12
- import { IconPickerService, PraxisIconDirective, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, DynamicWidgetLoaderDirective, EmptyStateCardComponent, ComponentMetadataRegistry, createCorporateLoggerConfig, ConsoleLoggerSink, CONFIG_STORAGE } from '@praxisui/core';
12
+ import { IconPickerService, PraxisIconDirective, deepMerge, ASYNC_CONFIG_STORAGE, ComponentKeyService, LoggerService, DynamicWidgetLoaderDirective, EmptyStateCardComponent, EDITORIAL_WIDGET_TAG, ComponentMetadataRegistry, createCorporateLoggerConfig, ConsoleLoggerSink, CONFIG_STORAGE } from '@praxisui/core';
13
13
  import * as i2 from '@angular/forms';
14
14
  import { FormsModule, ReactiveFormsModule } from '@angular/forms';
15
15
  import { PraxisDynamicFormConfigEditor, PraxisDynamicForm } from '@praxisui/dynamic-form';
@@ -163,6 +163,32 @@ class WizardWidgetConfigDialogComponent {
163
163
  removeBenefit(index) {
164
164
  this.benefits.splice(index, 1);
165
165
  }
166
+ get statusMessage() {
167
+ switch (this.wizardWidgetId) {
168
+ case 'praxis-wizard-content':
169
+ return {
170
+ title: 'Legado em deprecação',
171
+ body: 'Este bloco continua suportado para compatibilidade, mas novo authoring deve preferir widget:rich-text-block. O shape atual do wizard segue válido neste ciclo.',
172
+ };
173
+ case 'praxis-wizard-inline-notice':
174
+ return {
175
+ title: 'Semântica em aberto',
176
+ body: 'Este bloco permanece ativo no wizard até a definição final entre legal-notice e um eventual info-callout compartilhado.',
177
+ };
178
+ case 'praxis-wizard-benefits':
179
+ return {
180
+ title: 'Mantido temporariamente',
181
+ body: 'Ainda não existe equivalente canônico compartilhado para este grid no backlog editorial atual.',
182
+ };
183
+ case 'praxis-wizard-divider':
184
+ return {
185
+ title: 'Mantido temporariamente',
186
+ body: 'Este divisor continua como bloco legado do wizard enquanto não houver equivalente compartilhado priorizado.',
187
+ };
188
+ default:
189
+ return null;
190
+ }
191
+ }
166
192
  cancel() {
167
193
  this.ref.close();
168
194
  }
@@ -258,6 +284,11 @@ class WizardWidgetConfigDialogComponent {
258
284
  <h2 mat-dialog-title>{{ dialogTitle }}</h2>
259
285
 
260
286
  <div mat-dialog-content class="dialog-grid">
287
+ <div class="status-banner" *ngIf="statusMessage as status">
288
+ <strong>{{ status.title }}</strong>
289
+ <span>{{ status.body }}</span>
290
+ </div>
291
+
261
292
  <ng-container [ngSwitch]="wizardWidgetId">
262
293
  <ng-container *ngSwitchCase="'praxis-wizard-inline-notice'">
263
294
  <mat-form-field appearance="outline" class="full">
@@ -342,9 +373,9 @@ class WizardWidgetConfigDialogComponent {
342
373
  <summary>Avançado</summary>
343
374
  <div class="advanced-body">
344
375
  <mat-form-field appearance="outline" class="full">
345
- <mat-label>ID estável (avançado)</mat-label>
376
+ <mat-label>Block ID legado (avançado)</mat-label>
346
377
  <input matInput [(ngModel)]="model.blockId" placeholder="Ex.: ft-edit-wizard:access:block:hero" />
347
- <mat-hint>Use como chave estável de telemetria/E2E. Evite alterar após publicar.</mat-hint>
378
+ <mat-hint>Identificador operacional legado do wizard para telemetria/E2E e compatibilidade com editor/adapter. No modelo convergido, instanceId será a convenção editorial preferencial.</mat-hint>
348
379
  </mat-form-field>
349
380
  </div>
350
381
  </details>
@@ -354,7 +385,7 @@ class WizardWidgetConfigDialogComponent {
354
385
  <button mat-button type="button" (click)="cancel()">Cancelar</button>
355
386
  <button mat-flat-button color="primary" type="button" (click)="save()">Salvar</button>
356
387
  </div>
357
- `, isInline: true, styles: [".dialog-grid{display:grid;gap:12px;min-width:min(760px,92vw)}.full{grid-column:1 / -1}.benefits{display:grid;gap:10px;border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.benefits-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.benefit-card{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));padding:10px;border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest)}.benefit-head{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.advanced{border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);padding:8px 10px;background:var(--md-sys-color-surface-container-lowest)}.advanced>summary{cursor:pointer;font-weight:600;list-style:none}.advanced>summary::-webkit-details-marker{display:none}.advanced-body{margin-top:10px;display:grid;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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"] }] });
388
+ `, isInline: true, styles: [".dialog-grid{display:grid;gap:12px;min-width:min(760px,92vw)}.full{grid-column:1 / -1}.status-banner{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface-variant);font-size:12px}.benefits{display:grid;gap:10px;border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.benefits-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.benefit-card{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));padding:10px;border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest)}.benefit-head{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.advanced{border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);padding:8px 10px;background:var(--md-sys-color-surface-container-lowest)}.advanced>summary{cursor:pointer;font-weight:600;list-style:none}.advanced>summary::-webkit-details-marker{display:none}.advanced-body{margin-top:10px;display:grid;gap:8px}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: i1.MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: i1.MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "directive", type: i1.MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "directive", type: i3.MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i5.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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"] }] });
358
389
  }
359
390
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: WizardWidgetConfigDialogComponent, decorators: [{
360
391
  type: Component,
@@ -370,6 +401,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
370
401
  <h2 mat-dialog-title>{{ dialogTitle }}</h2>
371
402
 
372
403
  <div mat-dialog-content class="dialog-grid">
404
+ <div class="status-banner" *ngIf="statusMessage as status">
405
+ <strong>{{ status.title }}</strong>
406
+ <span>{{ status.body }}</span>
407
+ </div>
408
+
373
409
  <ng-container [ngSwitch]="wizardWidgetId">
374
410
  <ng-container *ngSwitchCase="'praxis-wizard-inline-notice'">
375
411
  <mat-form-field appearance="outline" class="full">
@@ -454,9 +490,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
454
490
  <summary>Avançado</summary>
455
491
  <div class="advanced-body">
456
492
  <mat-form-field appearance="outline" class="full">
457
- <mat-label>ID estável (avançado)</mat-label>
493
+ <mat-label>Block ID legado (avançado)</mat-label>
458
494
  <input matInput [(ngModel)]="model.blockId" placeholder="Ex.: ft-edit-wizard:access:block:hero" />
459
- <mat-hint>Use como chave estável de telemetria/E2E. Evite alterar após publicar.</mat-hint>
495
+ <mat-hint>Identificador operacional legado do wizard para telemetria/E2E e compatibilidade com editor/adapter. No modelo convergido, instanceId será a convenção editorial preferencial.</mat-hint>
460
496
  </mat-form-field>
461
497
  </div>
462
498
  </details>
@@ -466,7 +502,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
466
502
  <button mat-button type="button" (click)="cancel()">Cancelar</button>
467
503
  <button mat-flat-button color="primary" type="button" (click)="save()">Salvar</button>
468
504
  </div>
469
- `, styles: [".dialog-grid{display:grid;gap:12px;min-width:min(760px,92vw)}.full{grid-column:1 / -1}.benefits{display:grid;gap:10px;border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.benefits-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.benefit-card{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));padding:10px;border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest)}.benefit-head{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.advanced{border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);padding:8px 10px;background:var(--md-sys-color-surface-container-lowest)}.advanced>summary{cursor:pointer;font-weight:600;list-style:none}.advanced>summary::-webkit-details-marker{display:none}.advanced-body{margin-top:10px;display:grid;gap:8px}\n"] }]
505
+ `, styles: [".dialog-grid{display:grid;gap:12px;min-width:min(760px,92vw)}.full{grid-column:1 / -1}.status-banner{display:grid;gap:4px;padding:10px 12px;border-radius:10px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface-variant);font-size:12px}.benefits{display:grid;gap:10px;border-top:1px solid var(--md-sys-color-outline-variant);padding-top:8px}.benefits-head{display:flex;justify-content:space-between;align-items:center;gap:8px}.benefit-card{display:grid;gap:8px;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));padding:10px;border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-lowest)}.benefit-head{grid-column:1 / -1;display:flex;align-items:center;justify-content:space-between;font-size:12px;color:var(--md-sys-color-on-surface-variant)}.advanced{border-radius:8px;border:1px solid var(--md-sys-color-outline-variant);padding:8px 10px;background:var(--md-sys-color-surface-container-lowest)}.advanced>summary{cursor:pointer;font-weight:600;list-style:none}.advanced>summary::-webkit-details-marker{display:none}.advanced-body{margin-top:10px;display:grid;gap:8px}\n"] }]
470
506
  }], ctorParameters: () => [{ type: i1.MatDialogRef }, { type: undefined, decorators: [{
471
507
  type: Inject,
472
508
  args: [MAT_DIALOG_DATA]
@@ -822,6 +858,20 @@ class PraxisStepperConfigEditor {
822
858
  return '';
823
859
  }
824
860
  }
861
+ editorialWidgetStatus(w) {
862
+ switch (w.id) {
863
+ case 'praxis-wizard-content':
864
+ return 'Legado em deprecação: novo authoring deve preferir widget:rich-text-block. O bloco continua suportado por compatibilidade neste ciclo.';
865
+ case 'praxis-wizard-inline-notice':
866
+ return 'Mantido no ciclo atual: semântica final ainda em definição entre legal-notice e info-callout.';
867
+ case 'praxis-wizard-benefits':
868
+ return 'Mantido temporariamente: ainda sem equivalente canônico no backlog editorial.';
869
+ case 'praxis-wizard-divider':
870
+ return 'Mantido temporariamente: separador legado sem equivalente compartilhado priorizado.';
871
+ default:
872
+ return 'Widget editorial do wizard.';
873
+ }
874
+ }
825
875
  addEditorialWidget(id, zone = 'before') {
826
876
  const step = this.activeStep;
827
877
  if (!step)
@@ -1480,6 +1530,7 @@ class PraxisStepperConfigEditor {
1480
1530
  <div class="info">
1481
1531
  <div class="name">{{ displayWidgetName(w) }}</div>
1482
1532
  <div class="sub">{{ editorialWidgetSummary(w) }}</div>
1533
+ <div class="meta">{{ editorialWidgetStatus(w) }}</div>
1483
1534
  <div class="meta" *ngIf="widgetBlockId(w) as blockId">ID: {{ blockId }}</div>
1484
1535
  </div>
1485
1536
  <div class="actions">
@@ -1536,6 +1587,7 @@ class PraxisStepperConfigEditor {
1536
1587
  <div class="info">
1537
1588
  <div class="name">{{ displayWidgetName(w) }}</div>
1538
1589
  <div class="sub">{{ editorialWidgetSummary(w) }}</div>
1590
+ <div class="meta">{{ editorialWidgetStatus(w) }}</div>
1539
1591
  <div class="meta" *ngIf="widgetBlockId(w) as blockId">ID: {{ blockId }}</div>
1540
1592
  </div>
1541
1593
  <div class="actions">
@@ -2152,6 +2204,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
2152
2204
  <div class="info">
2153
2205
  <div class="name">{{ displayWidgetName(w) }}</div>
2154
2206
  <div class="sub">{{ editorialWidgetSummary(w) }}</div>
2207
+ <div class="meta">{{ editorialWidgetStatus(w) }}</div>
2155
2208
  <div class="meta" *ngIf="widgetBlockId(w) as blockId">ID: {{ blockId }}</div>
2156
2209
  </div>
2157
2210
  <div class="actions">
@@ -2208,6 +2261,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
2208
2261
  <div class="info">
2209
2262
  <div class="name">{{ displayWidgetName(w) }}</div>
2210
2263
  <div class="sub">{{ editorialWidgetSummary(w) }}</div>
2264
+ <div class="meta">{{ editorialWidgetStatus(w) }}</div>
2211
2265
  <div class="meta" *ngIf="widgetBlockId(w) as blockId">ID: {{ blockId }}</div>
2212
2266
  </div>
2213
2267
  <div class="actions">
@@ -2611,37 +2665,37 @@ const ENUMS = {
2611
2665
  ],
2612
2666
  };
2613
2667
  const CAPS = [
2614
- { path: 'orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.orientation, description: 'Orientation of the stepper.' },
2668
+ { path: 'orientation', category: 'layout', valueKind: 'enum', allowedValues: ENUMS['orientation'], description: 'Orientation of the stepper.' },
2615
2669
  { path: 'linear', category: 'behavior', valueKind: 'boolean', description: 'Require sequential completion of steps.' },
2616
- { path: 'headerPosition', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.headerPosition, description: 'Header position (vertical only).' },
2617
- { path: 'labelPosition', category: 'layout', valueKind: 'enum', allowedValues: ENUMS.labelPosition, description: 'Label position for horizontal stepper.' },
2618
- { path: 'color', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'Material color palette.' },
2670
+ { path: 'headerPosition', category: 'layout', valueKind: 'enum', allowedValues: ENUMS['headerPosition'], description: 'Header position (vertical only).' },
2671
+ { path: 'labelPosition', category: 'layout', valueKind: 'enum', allowedValues: ENUMS['labelPosition'], description: 'Label position for horizontal stepper.' },
2672
+ { path: 'color', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS['matColor'], description: 'Material color palette.' },
2619
2673
  { path: 'disableRipple', category: 'behavior', valueKind: 'boolean', description: 'Disable ripple for headers.' },
2620
2674
  { path: 'animationDuration', category: 'behavior', valueKind: 'string', description: 'Animation duration, e.g. 300ms.' },
2621
2675
  { path: 'selectedIndex', category: 'behavior', valueKind: 'number', description: 'Current step index.' },
2622
- { path: 'density', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.density, description: 'Density preset.' },
2676
+ { path: 'density', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS['density'], description: 'Density preset.' },
2623
2677
  { path: 'stepperClass', category: 'appearance', valueKind: 'string', description: 'CSS class for stepper root.' },
2624
2678
  { path: 'headerClass', category: 'appearance', valueKind: 'string', description: 'CSS class for header.' },
2625
2679
  { path: 'contentClass', category: 'appearance', valueKind: 'string', description: 'CSS class for content area.' },
2626
2680
  { path: 'appearance', category: 'appearance', valueKind: 'object', description: 'Appearance settings.' },
2627
2681
  { path: 'appearance.themeClass', category: 'appearance', valueKind: 'string', description: 'Theme CSS class for root.' },
2628
2682
  { path: 'appearance.tokens', category: 'appearance', valueKind: 'object', description: 'Token map for theme overrides.' },
2629
- { path: 'appearance.tokens.[token]', category: 'appearance', valueKind: 'string', allowedValues: ENUMS.stepperTokenKey, description: 'Token value (CSS value or var).', safetyNotes: 'Token keys follow mat.stepper-overrides.' },
2683
+ { path: 'appearance.tokens.[token]', category: 'appearance', valueKind: 'string', allowedValues: ENUMS['stepperTokenKey'], description: 'Token value (CSS value or var).', safetyNotes: 'Token keys follow mat.stepper-overrides.' },
2630
2684
  { path: 'appearance.icons', category: 'appearance', valueKind: 'object', description: 'Stepper icon overrides.' },
2631
2685
  { path: 'appearance.icons.number', category: 'appearance', valueKind: 'string', description: 'Icon for number state.' },
2632
2686
  { path: 'appearance.icons.done', category: 'appearance', valueKind: 'string', description: 'Icon for done state.' },
2633
2687
  { path: 'appearance.icons.edit', category: 'appearance', valueKind: 'string', description: 'Icon for edit state.' },
2634
2688
  { path: 'appearance.icons.error', category: 'appearance', valueKind: 'string', description: 'Icon for error state.' },
2635
- { path: 'appearance.iconsSet', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS.iconsSet, description: 'Icon set class name (Material Symbols).' },
2689
+ { path: 'appearance.iconsSet', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS['iconsSet'], description: 'Icon set class name (Material Symbols).' },
2636
2690
  { path: 'navigation', category: 'navigation', valueKind: 'object', description: 'Footer navigation config.' },
2637
2691
  { path: 'navigation.visible', category: 'navigation', valueKind: 'boolean', description: 'Show navigation buttons.' },
2638
2692
  { path: 'navigation.prevLabel', category: 'navigation', valueKind: 'string', description: 'Previous button label.' },
2639
2693
  { path: 'navigation.nextLabel', category: 'navigation', valueKind: 'string', description: 'Next button label.' },
2640
2694
  { path: 'navigation.prevIcon', category: 'navigation', valueKind: 'string', description: 'Previous button icon.' },
2641
2695
  { path: 'navigation.nextIcon', category: 'navigation', valueKind: 'string', description: 'Next button icon.' },
2642
- { path: 'navigation.variant', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS.navVariant, description: 'Button variant.' },
2643
- { path: 'navigation.color', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS.matColor, description: 'Button color.' },
2644
- { path: 'navigation.align', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS.navAlign, description: 'Navigation alignment.' },
2696
+ { path: 'navigation.variant', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS['navVariant'], description: 'Button variant.' },
2697
+ { path: 'navigation.color', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS['matColor'], description: 'Button color.' },
2698
+ { path: 'navigation.align', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS['navAlign'], description: 'Navigation alignment.' },
2645
2699
  { path: 'steps', category: 'steps', valueKind: 'array', description: 'Step definitions.' },
2646
2700
  { path: 'steps[]', category: 'steps', valueKind: 'object', description: 'Step definition.' },
2647
2701
  { path: 'steps[].id', category: 'steps', valueKind: 'string', description: 'Step id.' },
@@ -2659,13 +2713,17 @@ const CAPS = [
2659
2713
  { path: 'steps[].form', category: 'steps', valueKind: 'object', description: 'Optional Dynamic Form config for step.' },
2660
2714
  { path: 'steps[].form.resourcePath', category: 'steps', valueKind: 'string', description: 'Resource path for Dynamic Form.' },
2661
2715
  { path: 'steps[].form.resourceId', category: 'steps', valueKind: 'string', description: 'Resource id for Dynamic Form (string or number).', example: '123', safetyNotes: 'Accepts string or number.' },
2662
- { path: 'steps[].form.mode', category: 'steps', valueKind: 'enum', allowedValues: ENUMS.formMode, description: 'Form mode.' },
2716
+ { path: 'steps[].form.mode', category: 'steps', valueKind: 'enum', allowedValues: ENUMS['formMode'], description: 'Form mode.' },
2663
2717
  { path: 'steps[].form.config', category: 'steps', valueKind: 'object', description: 'FormConfig for Dynamic Form.', safetyNotes: 'Use the form catalog for nested paths and FieldMetadata details.' },
2664
- { path: 'steps[].form.schemaSource', category: 'steps', valueKind: 'enum', allowedValues: ENUMS.schemaSource, description: 'Schema source for Dynamic Form.' },
2718
+ { path: 'steps[].form.config.editorialContext', category: 'steps', valueKind: 'object', description: 'Contexto editorial compartilhado entre blocos hospedados pelo Dynamic Form da etapa.' },
2719
+ { path: 'steps[].form.config.formBlocksBefore', category: 'steps', valueKind: 'array', description: 'Blocos editoriais hospedados antes do formulario da etapa.' },
2720
+ { path: 'steps[].form.config.formBlocksBeforeActions', category: 'steps', valueKind: 'array', description: 'Blocos editoriais hospedados depois das seções e antes da área principal de ações do formulario da etapa.' },
2721
+ { path: 'steps[].form.config.formBlocksAfter', category: 'steps', valueKind: 'array', description: 'Blocos editoriais hospedados depois do formulario inteiro da etapa.' },
2722
+ { path: 'steps[].form.schemaSource', category: 'steps', valueKind: 'enum', allowedValues: ENUMS['schemaSource'], description: 'Schema source for Dynamic Form.' },
2665
2723
  { path: 'steps[].form.formId', category: 'steps', valueKind: 'string', description: 'Form id for Dynamic Form.' },
2666
2724
  { path: 'steps[].widgets', category: 'steps', valueKind: 'array', description: 'WidgetDefinition list for step content.' },
2667
2725
  { path: 'steps[].widgets[]', category: 'steps', valueKind: 'object', description: 'WidgetDefinition item.' },
2668
- { path: 'steps[].widgets[].id', category: 'steps', valueKind: 'enum', allowedValues: ENUMS.widgetId, description: 'Component registry id for widget.', safetyNotes: 'Use ids registered in ComponentMetadataRegistry.' },
2726
+ { path: 'steps[].widgets[].id', category: 'steps', valueKind: 'enum', allowedValues: ENUMS['widgetId'], description: 'Component registry id for widget.', safetyNotes: 'Use ids registered in ComponentMetadataRegistry.' },
2669
2727
  { path: 'steps[].widgets[].inputs', category: 'steps', valueKind: 'object', description: 'Inputs bound into the widget instance.' },
2670
2728
  { path: 'steps[].widgets[].outputs', category: 'steps', valueKind: 'object', description: 'Outputs mapped to actions.' },
2671
2729
  { path: 'steps[].widgets[].outputs.[outputName]', category: 'steps', valueKind: 'object', description: 'Output action mapping (ActionDefinition or "emit").', safetyNotes: 'Use string "emit" to forward the output without mapping.' },
@@ -2673,7 +2731,7 @@ const CAPS = [
2673
2731
  { path: 'steps[].widgets[].bindingOrder[]', category: 'steps', valueKind: 'string', description: 'Input name applied first.' },
2674
2732
  ];
2675
2733
  const STEPPER_AI_CAPABILITIES = {
2676
- version: 'v1.2',
2734
+ version: 'v1.3',
2677
2735
  enums: ENUMS,
2678
2736
  targets: [
2679
2737
  'praxis-stepper',
@@ -2685,6 +2743,7 @@ const STEPPER_AI_CAPABILITIES = {
2685
2743
  notes: [
2686
2744
  'steps[] should be merged by id or label to avoid replacing all steps.',
2687
2745
  'steps[].form.config uses FormConfig (see form catalog) and may include sections/actions/fieldMetadata.',
2746
+ 'steps[].form.config tambem pode usar a surface editorial do dynamic-form: formBlocksBefore, formBlocksBeforeActions, formBlocksAfter e editorialContext.',
2688
2747
  'steps[].widgets[].id must be a ComponentMetadataRegistry id (see component-registry catalog).',
2689
2748
  'appearance.tokens is a free-form map; host may validate/sanitize.',
2690
2749
  'When editing steps[].form.config.fieldMetadata, use FieldMetadata base if no controlType catalog exists.',
@@ -3344,7 +3403,7 @@ class PraxisStepper {
3344
3403
  >
3345
3404
  <mat-icon fontIcon="edit"></mat-icon>
3346
3405
  </button>
3347
- `, 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)}::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-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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatStepperModule }, { kind: "component", type: i2$1.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i2$1.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i2$1.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i2$1.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5$1.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", "mode", "config", "schemaSource", "editModeEnabled", "formId", "componentInstanceId", "layout", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "visibleGlobal", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "formReady", "valueChange", "syncCompleted", "initializationError", "loadingStateChange", "editModeEnabledChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "component", type: PraxisAiAssistantComponent, selector: "praxis-ai-assistant", inputs: ["adapter", "riskPolicy", "allowManualPatchEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3406
+ `, 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)}::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-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}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1$1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1$1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1$1.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i1$1.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i1$1.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: MatStepperModule }, { kind: "component", type: i2$1.MatStep, selector: "mat-step", inputs: ["color"], exportAs: ["matStep"] }, { kind: "directive", type: i2$1.MatStepLabel, selector: "[matStepLabel]" }, { kind: "component", type: i2$1.MatStepper, selector: "mat-stepper, mat-vertical-stepper, mat-horizontal-stepper, [matStepper]", inputs: ["disableRipple", "color", "labelPosition", "headerPosition", "animationDuration"], outputs: ["animationDone"], exportAs: ["matStepper", "matVerticalStepper", "matHorizontalStepper"] }, { kind: "directive", type: i2$1.MatStepperIcon, selector: "ng-template[matStepperIcon]", inputs: ["matStepperIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i6.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: i6.MatFabButton, selector: "button[mat-fab], a[mat-fab], button[matFab], a[matFab]", inputs: ["extended"], exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i5$1.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", "editorialContext", "mode", "config", "schemaSource", "editModeEnabled", "formId", "componentInstanceId", "layout", "backConfig", "hooks", "removeEmptyContainersOnSave", "reactiveValidation", "reactiveValidationDebounceMs", "notifyIfOutdated", "snoozeMs", "autoOpenSettingsOnOutdated", "readonlyModeGlobal", "disabledModeGlobal", "presentationModeGlobal", "visibleGlobal", "customEndpoints"], outputs: ["formSubmit", "formCancel", "formReset", "configChange", "formReady", "valueChange", "syncCompleted", "initializationError", "loadingStateChange", "editModeEnabledChange", "customAction", "actionConfirmation", "schemaStatusChange", "fieldRenderError", "widgetEvent"] }, { kind: "directive", type: DynamicWidgetLoaderDirective, selector: "[dynamicWidgetLoader]", inputs: ["dynamicWidgetLoader", "context", "strictValidation", "autoWireOutputs"], outputs: ["widgetEvent"], exportAs: ["dynamicWidgetLoader"] }, { kind: "component", type: EmptyStateCardComponent, selector: "praxis-empty-state-card", inputs: ["icon", "title", "description", "primaryAction", "secondaryActions", "inline", "tone"] }, { kind: "component", type: PraxisAiAssistantComponent, selector: "praxis-ai-assistant", inputs: ["adapter", "riskPolicy", "allowManualPatchEdit"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3348
3407
  }
3349
3408
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: PraxisStepper, decorators: [{
3350
3409
  type: Component,
@@ -3788,17 +3847,20 @@ const PRAXIS_WIZARD_BENEFITS_METADATA = {
3788
3847
  selector: 'praxis-wizard-benefits-grid',
3789
3848
  component: PraxisWizardBenefitsGridComponent,
3790
3849
  friendlyName: 'Wizard Benefits Grid',
3791
- description: 'Grid de benefícios com ícones/títulos/texto (uso editorial).',
3850
+ description: 'Grid editorial de benefícios com ícones/títulos/texto. Mantido temporariamente enquanto não há equivalente canônico compartilhado no backlog editorial.',
3792
3851
  icon: 'view_module',
3793
3852
  inputs: [
3794
- { name: 'blockId', type: 'string', label: 'ID estável (avançado)', description: 'Chave estável para telemetria/e2e.' },
3853
+ { name: 'blockId', type: 'string', label: 'Block ID legado', description: 'Identificador operacional legado do wizard, usado hoje para telemetria/e2e e compatibilidade com editor/adapter.' },
3854
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador opcional da convenção editorial nova. Preferencial no modelo convergido, sem substituir automaticamente o blockId legado neste ciclo.' },
3855
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional para telemetria agregada do bloco editorial.' },
3856
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional para o bloco editorial.' },
3795
3857
  { name: 'title', type: 'string', label: 'Título' },
3796
3858
  { name: 'items', type: 'Array<{ icon?: string; title: string; text?: string }>', label: 'Itens' },
3797
3859
  { name: 'columns', type: 'number', label: 'Colunas' },
3798
3860
  { name: 'boxed', type: 'boolean', label: 'Boxed' },
3799
3861
  ],
3800
3862
  outputs: [],
3801
- tags: ['widget', 'wizard', 'content', 'benefits'],
3863
+ tags: ['widget', 'wizard', 'content', 'benefits', EDITORIAL_WIDGET_TAG],
3802
3864
  lib: '@praxisui/stepper',
3803
3865
  };
3804
3866
  const PRAXIS_WIZARD_CONTENT_METADATA = {
@@ -3806,17 +3868,21 @@ const PRAXIS_WIZARD_CONTENT_METADATA = {
3806
3868
  selector: 'praxis-wizard-content-block',
3807
3869
  component: PraxisWizardContentBlockComponent,
3808
3870
  friendlyName: 'Wizard Content Block',
3809
- description: 'Bloco editorial com título/subtítulo/texto.',
3871
+ description: 'Bloco editorial legado do wizard com título/subtítulo/texto. Está formalmente em deprecação para novo authoring e converge para widget:rich-text-block, mas continua suportado para leitura e edição de configurações existentes neste ciclo.',
3810
3872
  icon: 'article',
3811
3873
  inputs: [
3812
- { name: 'blockId', type: 'string', label: 'ID estável (avançado)', description: 'Chave estável para telemetria/e2e.' },
3874
+ { name: 'blockId', type: 'string', label: 'Block ID legado', description: 'Identificador operacional legado do wizard, usado hoje para telemetria/e2e e compatibilidade com editor/adapter.' },
3875
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador opcional da convenção editorial nova. Preferencial no modelo convergido, sem substituir automaticamente o blockId legado neste ciclo.' },
3876
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional para telemetria agregada do bloco editorial.' },
3877
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional para o bloco editorial.' },
3878
+ { name: 'contentFormat', type: "'plain' | 'markdown'", label: 'Formato do conteúdo (futuro)', description: 'Input declared-only para convergência com a fundação editorial. Não altera o comportamento operacional atual do componente neste ciclo.' },
3813
3879
  { name: 'title', type: 'string', label: 'Título' },
3814
3880
  { name: 'subtitle', type: 'string', label: 'Subtítulo' },
3815
3881
  { name: 'text', type: 'string', label: 'Texto' },
3816
3882
  { name: 'caption', type: 'string', label: 'Legenda' },
3817
3883
  ],
3818
3884
  outputs: [],
3819
- tags: ['widget', 'wizard', 'content'],
3885
+ tags: ['widget', 'wizard', 'content', 'deprecated', EDITORIAL_WIDGET_TAG],
3820
3886
  lib: '@praxisui/stepper',
3821
3887
  };
3822
3888
  const PRAXIS_WIZARD_NOTICE_METADATA = {
@@ -3824,15 +3890,18 @@ const PRAXIS_WIZARD_NOTICE_METADATA = {
3824
3890
  selector: 'praxis-wizard-inline-notice',
3825
3891
  component: PraxisWizardInlineNoticeComponent,
3826
3892
  friendlyName: 'Wizard Inline Notice',
3827
- description: 'Texto legal/nota inline para wizards.',
3893
+ description: 'Bloco editorial inline para aviso curto em wizard. Mantido temporariamente até a semântica final convergir entre legal-notice e eventual info-callout compartilhado.',
3828
3894
  icon: 'info',
3829
3895
  inputs: [
3830
- { name: 'blockId', type: 'string', label: 'ID estável (avançado)', description: 'Chave estável para telemetria/e2e.' },
3896
+ { name: 'blockId', type: 'string', label: 'Block ID legado', description: 'Identificador operacional legado do wizard, usado hoje para telemetria/e2e e compatibilidade com editor/adapter.' },
3897
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador opcional da convenção editorial nova. Preferencial no modelo convergido, sem substituir automaticamente o blockId legado neste ciclo.' },
3898
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional para telemetria agregada do bloco editorial.' },
3899
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional para o bloco editorial.' },
3831
3900
  { name: 'text', type: 'string', label: 'Texto' },
3832
3901
  { name: 'tone', type: "'neutral' | 'info' | 'warning'", label: 'Tom' },
3833
3902
  ],
3834
3903
  outputs: [],
3835
- tags: ['widget', 'wizard', 'notice'],
3904
+ tags: ['widget', 'wizard', 'notice', EDITORIAL_WIDGET_TAG],
3836
3905
  lib: '@praxisui/stepper',
3837
3906
  };
3838
3907
  const PRAXIS_WIZARD_DIVIDER_METADATA = {
@@ -3840,14 +3909,17 @@ const PRAXIS_WIZARD_DIVIDER_METADATA = {
3840
3909
  selector: 'praxis-wizard-divider',
3841
3910
  component: PraxisWizardDividerComponent,
3842
3911
  friendlyName: 'Wizard Divider',
3843
- description: 'Separador visual para fluxo.',
3912
+ description: 'Separador editorial visual para fluxo. Mantido temporariamente enquanto não há equivalente compartilhado priorizado.',
3844
3913
  icon: 'horizontal_rule',
3845
3914
  inputs: [
3846
- { name: 'blockId', type: 'string', label: 'ID estável (avançado)', description: 'Chave estável para telemetria/e2e.' },
3915
+ { name: 'blockId', type: 'string', label: 'Block ID legado', description: 'Identificador operacional legado do wizard, usado hoje para telemetria/e2e e compatibilidade com editor/adapter.' },
3916
+ { name: 'instanceId', type: 'string', label: 'Instance ID', description: 'Identificador opcional da convenção editorial nova. Preferencial no modelo convergido, sem substituir automaticamente o blockId legado neste ciclo.' },
3917
+ { name: 'analyticsId', type: 'string', label: 'Analytics ID', description: 'Identificador opcional para telemetria agregada do bloco editorial.' },
3918
+ { name: 'ariaLabel', type: 'string', label: 'Aria Label', description: 'Rótulo acessível opcional para o bloco editorial.' },
3847
3919
  { name: 'label', type: 'string', label: 'Rótulo' },
3848
3920
  ],
3849
3921
  outputs: [],
3850
- tags: ['widget', 'wizard', 'divider'],
3922
+ tags: ['widget', 'wizard', 'divider', EDITORIAL_WIDGET_TAG],
3851
3923
  lib: '@praxisui/stepper',
3852
3924
  };
3853
3925
  function providePraxisStepperMetadata() {
@@ -4282,13 +4354,13 @@ function toWidget(block, wizardId, stepId, index) {
4282
4354
  };
4283
4355
  case 'contentBlock':
4284
4356
  return {
4285
- id: 'praxis-wizard-content',
4357
+ id: 'widget:rich-text-block',
4286
4358
  inputs: {
4287
- blockId: baseId,
4359
+ instanceId: baseId,
4288
4360
  title: block.title,
4289
4361
  subtitle: block.subtitle,
4290
- text: block.text,
4291
- caption: block.caption,
4362
+ contentFormat: 'plain',
4363
+ content: joinContentParts(block.text, block.caption),
4292
4364
  },
4293
4365
  };
4294
4366
  case 'inlineNotice':
@@ -4312,6 +4384,12 @@ function toWidget(block, wizardId, stepId, index) {
4312
4384
  return null;
4313
4385
  }
4314
4386
  }
4387
+ function joinContentParts(text, caption) {
4388
+ const parts = [text, caption]
4389
+ .map((value) => (typeof value === 'string' ? value.trim() : ''))
4390
+ .filter(Boolean);
4391
+ return parts.join('\n\n');
4392
+ }
4315
4393
 
4316
4394
  class PraxisWizardCtaBarComponent {
4317
4395
  primaryLabel = 'Continue';