@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 +1 -0
- package/fesm2022/praxisui-stepper.mjs +116 -38
- package/fesm2022/praxisui-stepper.mjs.map +1 -1
- package/index.d.ts +1 -0
- package/package.json +7 -7
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
|
|
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>
|
|
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
|
|
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>
|
|
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
|
|
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
|
|
2617
|
-
{ path: 'labelPosition', category: 'layout', valueKind: 'enum', allowedValues: ENUMS
|
|
2618
|
-
{ path: 'color', category: 'appearance', valueKind: 'enum', allowedValues: ENUMS
|
|
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
|
|
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
|
|
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
|
|
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
|
|
2643
|
-
{ path: 'navigation.color', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS
|
|
2644
|
-
{ path: 'navigation.align', category: 'navigation', valueKind: 'enum', allowedValues: ENUMS
|
|
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
|
|
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.
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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: '
|
|
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
|
|
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
|
|
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: '
|
|
4357
|
+
id: 'widget:rich-text-block',
|
|
4286
4358
|
inputs: {
|
|
4287
|
-
|
|
4359
|
+
instanceId: baseId,
|
|
4288
4360
|
title: block.title,
|
|
4289
4361
|
subtitle: block.subtitle,
|
|
4290
|
-
|
|
4291
|
-
|
|
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';
|