@praxisui/stepper 9.0.0-beta.6 → 9.0.0-beta.60
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 -1
- package/ai/component-registry.json +2118 -0
- package/fesm2022/praxisui-stepper.mjs +1 -1
- package/package.json +14 -10
|
@@ -0,0 +1,2118 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0.0",
|
|
3
|
+
"generatedAt": "2026-07-09T12:14:45.592Z",
|
|
4
|
+
"packageName": "@praxisui/stepper",
|
|
5
|
+
"packageVersion": "9.0.0-beta.60",
|
|
6
|
+
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
|
+
"sourceRegistryVersion": "1.0.0",
|
|
8
|
+
"componentCount": 1,
|
|
9
|
+
"components": {
|
|
10
|
+
"praxis-stepper": {
|
|
11
|
+
"id": "praxis-stepper",
|
|
12
|
+
"description": "Stepper configurável (horizontal/vertical/linear) com passos e conteúdo dinâmico.",
|
|
13
|
+
"inputs": [
|
|
14
|
+
{
|
|
15
|
+
"name": "stepperId",
|
|
16
|
+
"type": "string",
|
|
17
|
+
"required": false
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "componentInstanceId",
|
|
21
|
+
"type": "string",
|
|
22
|
+
"required": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "config",
|
|
26
|
+
"type": "StepperMetadata",
|
|
27
|
+
"required": false
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "selectedIndex",
|
|
31
|
+
"type": "number",
|
|
32
|
+
"required": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "selectedIndexInput",
|
|
36
|
+
"type": "number",
|
|
37
|
+
"required": false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "disableRippleInput",
|
|
41
|
+
"type": "boolean",
|
|
42
|
+
"required": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "enableCustomization",
|
|
46
|
+
"type": "boolean",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "labelPosition",
|
|
51
|
+
"type": "'bottom' | 'end'",
|
|
52
|
+
"required": false
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "color",
|
|
56
|
+
"type": "ThemePalette",
|
|
57
|
+
"required": false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "serverValidate",
|
|
61
|
+
"type": "(args) => Promise<{ ok: boolean; fieldErrors?: Record<string,string[]>; formErrors?: string[] }>",
|
|
62
|
+
"required": false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "stepperContext",
|
|
66
|
+
"type": "Record<string, any>",
|
|
67
|
+
"required": false
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
"outputs": [
|
|
71
|
+
{
|
|
72
|
+
"name": "selectionChange",
|
|
73
|
+
"type": "any",
|
|
74
|
+
"required": false
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"name": "selectedIndexChange",
|
|
78
|
+
"type": "number",
|
|
79
|
+
"required": false
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "animationDone",
|
|
83
|
+
"type": "void",
|
|
84
|
+
"required": false
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "widgetEvent",
|
|
88
|
+
"type": "WidgetEventEnvelope",
|
|
89
|
+
"required": false
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"name": "stepFormReady",
|
|
93
|
+
"type": "{ stepId?: string; stepIndex: number; event: FormReadyEvent }",
|
|
94
|
+
"required": false
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"name": "stepFormValueChange",
|
|
98
|
+
"type": "{ stepId?: string; stepIndex: number; event: FormValueChangeEvent }",
|
|
99
|
+
"required": false
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"configSchemaId": null,
|
|
103
|
+
"selector": "praxis-stepper",
|
|
104
|
+
"friendlyName": "Praxis Stepper",
|
|
105
|
+
"icon": "format_list_numbered",
|
|
106
|
+
"tags": [
|
|
107
|
+
"widget",
|
|
108
|
+
"container",
|
|
109
|
+
"stepper",
|
|
110
|
+
"configurable"
|
|
111
|
+
],
|
|
112
|
+
"lib": "@praxisui/stepper",
|
|
113
|
+
"layoutHints": {
|
|
114
|
+
"recommendedCols": 8,
|
|
115
|
+
"recommendedRows": 6,
|
|
116
|
+
"minCols": 4,
|
|
117
|
+
"minRows": 4
|
|
118
|
+
},
|
|
119
|
+
"source": "projects/praxis-stepper/src/lib/praxis-stepper.metadata.ts",
|
|
120
|
+
"exportName": "PRAXIS_STEPPER_COMPONENT_METADATA",
|
|
121
|
+
"componentCapabilities": [
|
|
122
|
+
{
|
|
123
|
+
"path": "orientation",
|
|
124
|
+
"category": "layout",
|
|
125
|
+
"valueKind": "enum",
|
|
126
|
+
"description": "Orientation of the stepper."
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"path": "linear",
|
|
130
|
+
"category": "behavior",
|
|
131
|
+
"valueKind": "boolean",
|
|
132
|
+
"description": "Require sequential completion of steps."
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
"path": "headerPosition",
|
|
136
|
+
"category": "layout",
|
|
137
|
+
"valueKind": "enum",
|
|
138
|
+
"description": "Header position (vertical only)."
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"path": "labelPosition",
|
|
142
|
+
"category": "layout",
|
|
143
|
+
"valueKind": "enum",
|
|
144
|
+
"description": "Label position for horizontal stepper."
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
"path": "color",
|
|
148
|
+
"category": "appearance",
|
|
149
|
+
"valueKind": "enum",
|
|
150
|
+
"description": "Material color palette."
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
"path": "disableRipple",
|
|
154
|
+
"category": "behavior",
|
|
155
|
+
"valueKind": "boolean",
|
|
156
|
+
"description": "Disable ripple for headers."
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
"path": "animationDuration",
|
|
160
|
+
"category": "behavior",
|
|
161
|
+
"valueKind": "string",
|
|
162
|
+
"description": "Animation duration, e.g. 300ms."
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"path": "selectedIndex",
|
|
166
|
+
"category": "behavior",
|
|
167
|
+
"valueKind": "number",
|
|
168
|
+
"description": "Current step index."
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"path": "density",
|
|
172
|
+
"category": "appearance",
|
|
173
|
+
"valueKind": "enum",
|
|
174
|
+
"description": "Density preset."
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"path": "stepperClass",
|
|
178
|
+
"category": "appearance",
|
|
179
|
+
"valueKind": "string",
|
|
180
|
+
"description": "CSS class for stepper root."
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
"path": "headerClass",
|
|
184
|
+
"category": "appearance",
|
|
185
|
+
"valueKind": "string",
|
|
186
|
+
"description": "CSS class for header."
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
"path": "contentClass",
|
|
190
|
+
"category": "appearance",
|
|
191
|
+
"valueKind": "string",
|
|
192
|
+
"description": "CSS class for content area."
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"path": "appearance",
|
|
196
|
+
"category": "appearance",
|
|
197
|
+
"valueKind": "object",
|
|
198
|
+
"description": "Appearance settings."
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"path": "appearance.themeClass",
|
|
202
|
+
"category": "appearance",
|
|
203
|
+
"valueKind": "string",
|
|
204
|
+
"description": "Theme CSS class for root."
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
"path": "appearance.tokens",
|
|
208
|
+
"category": "appearance",
|
|
209
|
+
"valueKind": "object",
|
|
210
|
+
"description": "Token map for theme overrides."
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"path": "appearance.tokens.[token]",
|
|
214
|
+
"category": "appearance",
|
|
215
|
+
"valueKind": "string",
|
|
216
|
+
"description": "Token value (CSS value or var).",
|
|
217
|
+
"safetyNotes": "Token keys follow mat.stepper-overrides."
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"path": "appearance.icons",
|
|
221
|
+
"category": "appearance",
|
|
222
|
+
"valueKind": "object",
|
|
223
|
+
"description": "Stepper icon overrides."
|
|
224
|
+
},
|
|
225
|
+
{
|
|
226
|
+
"path": "appearance.icons.number",
|
|
227
|
+
"category": "appearance",
|
|
228
|
+
"valueKind": "string",
|
|
229
|
+
"description": "Icon for number state."
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
"path": "appearance.icons.done",
|
|
233
|
+
"category": "appearance",
|
|
234
|
+
"valueKind": "string",
|
|
235
|
+
"description": "Icon for done state."
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
"path": "appearance.icons.edit",
|
|
239
|
+
"category": "appearance",
|
|
240
|
+
"valueKind": "string",
|
|
241
|
+
"description": "Icon for edit state."
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
"path": "appearance.icons.error",
|
|
245
|
+
"category": "appearance",
|
|
246
|
+
"valueKind": "string",
|
|
247
|
+
"description": "Icon for error state."
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"path": "appearance.iconsSet",
|
|
251
|
+
"category": "appearance",
|
|
252
|
+
"valueKind": "enum",
|
|
253
|
+
"description": "Icon set class name (Material Symbols)."
|
|
254
|
+
},
|
|
255
|
+
{
|
|
256
|
+
"path": "navigation",
|
|
257
|
+
"category": "navigation",
|
|
258
|
+
"valueKind": "object",
|
|
259
|
+
"description": "Footer navigation config."
|
|
260
|
+
},
|
|
261
|
+
{
|
|
262
|
+
"path": "navigation.visible",
|
|
263
|
+
"category": "navigation",
|
|
264
|
+
"valueKind": "boolean",
|
|
265
|
+
"description": "Show navigation buttons."
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
"path": "navigation.prevLabel",
|
|
269
|
+
"category": "navigation",
|
|
270
|
+
"valueKind": "string",
|
|
271
|
+
"description": "Previous button label."
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"path": "navigation.nextLabel",
|
|
275
|
+
"category": "navigation",
|
|
276
|
+
"valueKind": "string",
|
|
277
|
+
"description": "Next button label."
|
|
278
|
+
},
|
|
279
|
+
{
|
|
280
|
+
"path": "navigation.prevIcon",
|
|
281
|
+
"category": "navigation",
|
|
282
|
+
"valueKind": "string",
|
|
283
|
+
"description": "Previous button icon."
|
|
284
|
+
},
|
|
285
|
+
{
|
|
286
|
+
"path": "navigation.nextIcon",
|
|
287
|
+
"category": "navigation",
|
|
288
|
+
"valueKind": "string",
|
|
289
|
+
"description": "Next button icon."
|
|
290
|
+
},
|
|
291
|
+
{
|
|
292
|
+
"path": "navigation.variant",
|
|
293
|
+
"category": "navigation",
|
|
294
|
+
"valueKind": "enum",
|
|
295
|
+
"description": "Button variant."
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
"path": "navigation.color",
|
|
299
|
+
"category": "navigation",
|
|
300
|
+
"valueKind": "enum",
|
|
301
|
+
"description": "Button color."
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"path": "navigation.align",
|
|
305
|
+
"category": "navigation",
|
|
306
|
+
"valueKind": "enum",
|
|
307
|
+
"description": "Navigation alignment."
|
|
308
|
+
},
|
|
309
|
+
{
|
|
310
|
+
"path": "steps",
|
|
311
|
+
"category": "steps",
|
|
312
|
+
"valueKind": "array",
|
|
313
|
+
"description": "Step definitions."
|
|
314
|
+
},
|
|
315
|
+
{
|
|
316
|
+
"path": "steps[]",
|
|
317
|
+
"category": "steps",
|
|
318
|
+
"valueKind": "object",
|
|
319
|
+
"description": "Step definition."
|
|
320
|
+
},
|
|
321
|
+
{
|
|
322
|
+
"path": "steps[].id",
|
|
323
|
+
"category": "steps",
|
|
324
|
+
"valueKind": "string",
|
|
325
|
+
"description": "Step id."
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
"path": "steps[].label",
|
|
329
|
+
"category": "steps",
|
|
330
|
+
"valueKind": "string",
|
|
331
|
+
"description": "Step label."
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"path": "steps[].description",
|
|
335
|
+
"category": "steps",
|
|
336
|
+
"valueKind": "string",
|
|
337
|
+
"description": "Step description."
|
|
338
|
+
},
|
|
339
|
+
{
|
|
340
|
+
"path": "steps[].optional",
|
|
341
|
+
"category": "steps",
|
|
342
|
+
"valueKind": "boolean",
|
|
343
|
+
"description": "Mark step as optional."
|
|
344
|
+
},
|
|
345
|
+
{
|
|
346
|
+
"path": "steps[].editable",
|
|
347
|
+
"category": "steps",
|
|
348
|
+
"valueKind": "boolean",
|
|
349
|
+
"description": "Allow editing completed steps."
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
"path": "steps[].completed",
|
|
353
|
+
"category": "steps",
|
|
354
|
+
"valueKind": "boolean",
|
|
355
|
+
"description": "Force completed state."
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
"path": "steps[].hasError",
|
|
359
|
+
"category": "steps",
|
|
360
|
+
"valueKind": "boolean",
|
|
361
|
+
"description": "Force error state."
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"path": "steps[].stateIcon",
|
|
365
|
+
"category": "steps",
|
|
366
|
+
"valueKind": "string",
|
|
367
|
+
"description": "Custom state icon key."
|
|
368
|
+
},
|
|
369
|
+
{
|
|
370
|
+
"path": "steps[].state",
|
|
371
|
+
"category": "steps",
|
|
372
|
+
"valueKind": "string",
|
|
373
|
+
"description": "Custom state name for matStepperIcon."
|
|
374
|
+
},
|
|
375
|
+
{
|
|
376
|
+
"path": "steps[].errorMessage",
|
|
377
|
+
"category": "steps",
|
|
378
|
+
"valueKind": "string",
|
|
379
|
+
"description": "Error message shown in header."
|
|
380
|
+
},
|
|
381
|
+
{
|
|
382
|
+
"path": "steps[].ariaLabel",
|
|
383
|
+
"category": "accessibility",
|
|
384
|
+
"valueKind": "string",
|
|
385
|
+
"description": "ARIA label for step header."
|
|
386
|
+
},
|
|
387
|
+
{
|
|
388
|
+
"path": "steps[].ariaLabelledby",
|
|
389
|
+
"category": "accessibility",
|
|
390
|
+
"valueKind": "string",
|
|
391
|
+
"description": "ARIA labelledby for step header."
|
|
392
|
+
},
|
|
393
|
+
{
|
|
394
|
+
"path": "steps[].form",
|
|
395
|
+
"category": "steps",
|
|
396
|
+
"valueKind": "object",
|
|
397
|
+
"description": "Optional Dynamic Form config for step."
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
"path": "steps[].form.resourcePath",
|
|
401
|
+
"category": "steps",
|
|
402
|
+
"valueKind": "string",
|
|
403
|
+
"description": "Resource path for Dynamic Form."
|
|
404
|
+
},
|
|
405
|
+
{
|
|
406
|
+
"path": "steps[].form.resourceId",
|
|
407
|
+
"category": "steps",
|
|
408
|
+
"valueKind": "string",
|
|
409
|
+
"description": "Resource id for Dynamic Form (string or number).",
|
|
410
|
+
"example": "123",
|
|
411
|
+
"safetyNotes": "Accepts string or number."
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
"path": "steps[].form.mode",
|
|
415
|
+
"category": "steps",
|
|
416
|
+
"valueKind": "enum",
|
|
417
|
+
"description": "Form mode."
|
|
418
|
+
},
|
|
419
|
+
{
|
|
420
|
+
"path": "steps[].form.config",
|
|
421
|
+
"category": "steps",
|
|
422
|
+
"valueKind": "object",
|
|
423
|
+
"description": "FormConfig for Dynamic Form.",
|
|
424
|
+
"safetyNotes": "Use the form catalog for nested paths and FieldMetadata details."
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
"path": "steps[].form.config.editorialContext",
|
|
428
|
+
"category": "steps",
|
|
429
|
+
"valueKind": "object",
|
|
430
|
+
"description": "Contexto editorial compartilhado entre blocos hospedados pelo Dynamic Form da etapa."
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"path": "steps[].form.config.formBlocksBefore",
|
|
434
|
+
"category": "steps",
|
|
435
|
+
"valueKind": "object",
|
|
436
|
+
"description": "RichContentDocument hospedado antes do formulario da etapa."
|
|
437
|
+
},
|
|
438
|
+
{
|
|
439
|
+
"path": "steps[].form.config.formBlocksBeforeActions",
|
|
440
|
+
"category": "steps",
|
|
441
|
+
"valueKind": "object",
|
|
442
|
+
"description": "RichContentDocument hospedado depois das secoes e antes da area principal de acoes do formulario da etapa."
|
|
443
|
+
},
|
|
444
|
+
{
|
|
445
|
+
"path": "steps[].form.config.formBlocksAfter",
|
|
446
|
+
"category": "steps",
|
|
447
|
+
"valueKind": "object",
|
|
448
|
+
"description": "RichContentDocument hospedado depois do formulario inteiro da etapa."
|
|
449
|
+
},
|
|
450
|
+
{
|
|
451
|
+
"path": "steps[].form.schemaSource",
|
|
452
|
+
"category": "steps",
|
|
453
|
+
"valueKind": "enum",
|
|
454
|
+
"description": "Schema source for Dynamic Form."
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"path": "steps[].form.formId",
|
|
458
|
+
"category": "steps",
|
|
459
|
+
"valueKind": "string",
|
|
460
|
+
"description": "Form id for Dynamic Form."
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"path": "steps[].stepBlocksBeforeForm",
|
|
464
|
+
"category": "steps",
|
|
465
|
+
"valueKind": "object",
|
|
466
|
+
"description": "RichContentDocument rendered before the step form."
|
|
467
|
+
},
|
|
468
|
+
{
|
|
469
|
+
"path": "steps[].stepBlocksAfterForm",
|
|
470
|
+
"category": "steps",
|
|
471
|
+
"valueKind": "object",
|
|
472
|
+
"description": "RichContentDocument rendered after the step form."
|
|
473
|
+
},
|
|
474
|
+
{
|
|
475
|
+
"path": "steps[].widgets",
|
|
476
|
+
"category": "steps",
|
|
477
|
+
"valueKind": "array",
|
|
478
|
+
"description": "Advanced host-owned WidgetDefinition list rendered after canonical rich content.",
|
|
479
|
+
"safetyNotes": "Use only for embedded components that cannot be represented as RichContentDocument."
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"path": "steps[].widgets[]",
|
|
483
|
+
"category": "steps",
|
|
484
|
+
"valueKind": "object",
|
|
485
|
+
"description": "Advanced WidgetDefinition item."
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
"path": "steps[].widgets[].id",
|
|
489
|
+
"category": "steps",
|
|
490
|
+
"valueKind": "enum",
|
|
491
|
+
"description": "Component registry id for advanced widget.",
|
|
492
|
+
"safetyNotes": "Use ids registered in ComponentMetadataRegistry. Do not use widgets for step editorial copy/cards."
|
|
493
|
+
},
|
|
494
|
+
{
|
|
495
|
+
"path": "steps[].widgets[].inputs",
|
|
496
|
+
"category": "steps",
|
|
497
|
+
"valueKind": "object",
|
|
498
|
+
"description": "Inputs bound into the advanced widget instance."
|
|
499
|
+
}
|
|
500
|
+
],
|
|
501
|
+
"componentCapabilityNotes": [
|
|
502
|
+
"steps[] should be merged by id or label to avoid replacing all steps.",
|
|
503
|
+
"steps[].form.config uses FormConfig (see form catalog) and may include sections/actions/fieldMetadata.",
|
|
504
|
+
"steps[].form.config tambem pode usar a surface editorial do dynamic-form: formBlocksBefore, formBlocksBeforeActions, formBlocksAfter e editorialContext como RichContentDocument.",
|
|
505
|
+
"Use steps[].stepBlocksBeforeForm and steps[].stepBlocksAfterForm for editorial step content; both are RichContentDocument surfaces rendered by @praxisui/rich-content.",
|
|
506
|
+
"steps[].widgets is reserved for advanced embedded components that do not have a canonical rich-content representation.",
|
|
507
|
+
"appearance.tokens is a free-form map; host may validate/sanitize.",
|
|
508
|
+
"When editing steps[].form.config.fieldMetadata, use FieldMetadata base if no controlType catalog exists."
|
|
509
|
+
],
|
|
510
|
+
"componentContext": {
|
|
511
|
+
"version": "v1",
|
|
512
|
+
"optionsByPath": {
|
|
513
|
+
"orientation": {
|
|
514
|
+
"mode": "enum",
|
|
515
|
+
"options": [
|
|
516
|
+
{
|
|
517
|
+
"value": "horizontal",
|
|
518
|
+
"label": "Horizontal"
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
"value": "vertical",
|
|
522
|
+
"label": "Vertical"
|
|
523
|
+
}
|
|
524
|
+
]
|
|
525
|
+
},
|
|
526
|
+
"headerPosition": {
|
|
527
|
+
"mode": "enum",
|
|
528
|
+
"options": [
|
|
529
|
+
{
|
|
530
|
+
"value": "top",
|
|
531
|
+
"label": "Top"
|
|
532
|
+
},
|
|
533
|
+
{
|
|
534
|
+
"value": "bottom",
|
|
535
|
+
"label": "Bottom"
|
|
536
|
+
}
|
|
537
|
+
]
|
|
538
|
+
},
|
|
539
|
+
"labelPosition": {
|
|
540
|
+
"mode": "enum",
|
|
541
|
+
"options": [
|
|
542
|
+
{
|
|
543
|
+
"value": "bottom",
|
|
544
|
+
"label": "Bottom"
|
|
545
|
+
},
|
|
546
|
+
{
|
|
547
|
+
"value": "end",
|
|
548
|
+
"label": "End"
|
|
549
|
+
}
|
|
550
|
+
]
|
|
551
|
+
},
|
|
552
|
+
"density": {
|
|
553
|
+
"mode": "enum",
|
|
554
|
+
"options": [
|
|
555
|
+
{
|
|
556
|
+
"value": "default",
|
|
557
|
+
"label": "Default"
|
|
558
|
+
},
|
|
559
|
+
{
|
|
560
|
+
"value": "comfortable",
|
|
561
|
+
"label": "Comfortable"
|
|
562
|
+
},
|
|
563
|
+
{
|
|
564
|
+
"value": "compact",
|
|
565
|
+
"label": "Compact"
|
|
566
|
+
}
|
|
567
|
+
]
|
|
568
|
+
},
|
|
569
|
+
"color": {
|
|
570
|
+
"mode": "enum",
|
|
571
|
+
"options": [
|
|
572
|
+
{
|
|
573
|
+
"value": "primary",
|
|
574
|
+
"label": "Primary"
|
|
575
|
+
},
|
|
576
|
+
{
|
|
577
|
+
"value": "accent",
|
|
578
|
+
"label": "Accent"
|
|
579
|
+
},
|
|
580
|
+
{
|
|
581
|
+
"value": "warn",
|
|
582
|
+
"label": "Warn"
|
|
583
|
+
}
|
|
584
|
+
]
|
|
585
|
+
},
|
|
586
|
+
"navigation.variant": {
|
|
587
|
+
"mode": "enum",
|
|
588
|
+
"options": [
|
|
589
|
+
{
|
|
590
|
+
"value": "basic",
|
|
591
|
+
"label": "Basic"
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"value": "flat",
|
|
595
|
+
"label": "Flat"
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"value": "stroked",
|
|
599
|
+
"label": "Stroked"
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"value": "raised",
|
|
603
|
+
"label": "Raised"
|
|
604
|
+
}
|
|
605
|
+
]
|
|
606
|
+
},
|
|
607
|
+
"navigation.align": {
|
|
608
|
+
"mode": "enum",
|
|
609
|
+
"options": [
|
|
610
|
+
{
|
|
611
|
+
"value": "start",
|
|
612
|
+
"label": "Start"
|
|
613
|
+
},
|
|
614
|
+
{
|
|
615
|
+
"value": "center",
|
|
616
|
+
"label": "Center"
|
|
617
|
+
},
|
|
618
|
+
{
|
|
619
|
+
"value": "end",
|
|
620
|
+
"label": "End"
|
|
621
|
+
},
|
|
622
|
+
{
|
|
623
|
+
"value": "space-between",
|
|
624
|
+
"label": "Space between"
|
|
625
|
+
}
|
|
626
|
+
]
|
|
627
|
+
},
|
|
628
|
+
"navigation.color": {
|
|
629
|
+
"mode": "enum",
|
|
630
|
+
"options": [
|
|
631
|
+
{
|
|
632
|
+
"value": "primary",
|
|
633
|
+
"label": "Primary"
|
|
634
|
+
},
|
|
635
|
+
{
|
|
636
|
+
"value": "accent",
|
|
637
|
+
"label": "Accent"
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
"value": "warn",
|
|
641
|
+
"label": "Warn"
|
|
642
|
+
}
|
|
643
|
+
]
|
|
644
|
+
},
|
|
645
|
+
"steps[].form.mode": {
|
|
646
|
+
"mode": "enum",
|
|
647
|
+
"options": [
|
|
648
|
+
{
|
|
649
|
+
"value": "create",
|
|
650
|
+
"label": "Create"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"value": "edit",
|
|
654
|
+
"label": "Edit"
|
|
655
|
+
},
|
|
656
|
+
{
|
|
657
|
+
"value": "view",
|
|
658
|
+
"label": "View"
|
|
659
|
+
}
|
|
660
|
+
]
|
|
661
|
+
},
|
|
662
|
+
"steps[].form.schemaSource": {
|
|
663
|
+
"mode": "enum",
|
|
664
|
+
"options": [
|
|
665
|
+
{
|
|
666
|
+
"value": "resource",
|
|
667
|
+
"label": "Resource"
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
"value": "filter",
|
|
671
|
+
"label": "Filter"
|
|
672
|
+
}
|
|
673
|
+
]
|
|
674
|
+
},
|
|
675
|
+
"appearance.iconsSet": {
|
|
676
|
+
"mode": "enum",
|
|
677
|
+
"options": [
|
|
678
|
+
{
|
|
679
|
+
"value": "material-symbols-outlined",
|
|
680
|
+
"label": "Outlined"
|
|
681
|
+
},
|
|
682
|
+
{
|
|
683
|
+
"value": "material-symbols-rounded",
|
|
684
|
+
"label": "Rounded"
|
|
685
|
+
},
|
|
686
|
+
{
|
|
687
|
+
"value": "material-symbols-sharp",
|
|
688
|
+
"label": "Sharp"
|
|
689
|
+
}
|
|
690
|
+
]
|
|
691
|
+
}
|
|
692
|
+
},
|
|
693
|
+
"actionCatalog": [
|
|
694
|
+
{
|
|
695
|
+
"id": "orientation.set",
|
|
696
|
+
"intentExamples": [
|
|
697
|
+
"orientation",
|
|
698
|
+
"horizontal",
|
|
699
|
+
"vertical"
|
|
700
|
+
],
|
|
701
|
+
"patchTemplate": {
|
|
702
|
+
"orientation": "{{value}}"
|
|
703
|
+
}
|
|
704
|
+
},
|
|
705
|
+
{
|
|
706
|
+
"id": "headerPosition.set",
|
|
707
|
+
"intentExamples": [
|
|
708
|
+
"header position",
|
|
709
|
+
"header"
|
|
710
|
+
],
|
|
711
|
+
"patchTemplate": {
|
|
712
|
+
"headerPosition": "{{value}}"
|
|
713
|
+
}
|
|
714
|
+
},
|
|
715
|
+
{
|
|
716
|
+
"id": "labelPosition.set",
|
|
717
|
+
"intentExamples": [
|
|
718
|
+
"label position",
|
|
719
|
+
"label align"
|
|
720
|
+
],
|
|
721
|
+
"patchTemplate": {
|
|
722
|
+
"labelPosition": "{{value}}"
|
|
723
|
+
}
|
|
724
|
+
},
|
|
725
|
+
{
|
|
726
|
+
"id": "density.set",
|
|
727
|
+
"intentExamples": [
|
|
728
|
+
"density",
|
|
729
|
+
"compact",
|
|
730
|
+
"comfortable"
|
|
731
|
+
],
|
|
732
|
+
"patchTemplate": {
|
|
733
|
+
"density": "{{value}}"
|
|
734
|
+
}
|
|
735
|
+
},
|
|
736
|
+
{
|
|
737
|
+
"id": "color.set",
|
|
738
|
+
"intentExamples": [
|
|
739
|
+
"color",
|
|
740
|
+
"theme color"
|
|
741
|
+
],
|
|
742
|
+
"patchTemplate": {
|
|
743
|
+
"color": "{{value}}"
|
|
744
|
+
}
|
|
745
|
+
},
|
|
746
|
+
{
|
|
747
|
+
"id": "linear.enable",
|
|
748
|
+
"intentExamples": [
|
|
749
|
+
"linear",
|
|
750
|
+
"sequential",
|
|
751
|
+
"require order"
|
|
752
|
+
],
|
|
753
|
+
"patchTemplate": {
|
|
754
|
+
"linear": true
|
|
755
|
+
}
|
|
756
|
+
},
|
|
757
|
+
{
|
|
758
|
+
"id": "linear.disable",
|
|
759
|
+
"intentExamples": [
|
|
760
|
+
"non linear",
|
|
761
|
+
"free navigation"
|
|
762
|
+
],
|
|
763
|
+
"patchTemplate": {
|
|
764
|
+
"linear": false
|
|
765
|
+
}
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
"id": "selectedIndex.set",
|
|
769
|
+
"intentExamples": [
|
|
770
|
+
"select step",
|
|
771
|
+
"active step",
|
|
772
|
+
"selected index"
|
|
773
|
+
],
|
|
774
|
+
"patchTemplate": {
|
|
775
|
+
"selectedIndex": "{{value}}"
|
|
776
|
+
}
|
|
777
|
+
},
|
|
778
|
+
{
|
|
779
|
+
"id": "navigation.visible.enable",
|
|
780
|
+
"intentExamples": [
|
|
781
|
+
"show navigation",
|
|
782
|
+
"show buttons"
|
|
783
|
+
],
|
|
784
|
+
"patchTemplate": {
|
|
785
|
+
"navigation": {
|
|
786
|
+
"visible": true
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
},
|
|
790
|
+
{
|
|
791
|
+
"id": "navigation.visible.disable",
|
|
792
|
+
"intentExamples": [
|
|
793
|
+
"hide navigation",
|
|
794
|
+
"hide buttons"
|
|
795
|
+
],
|
|
796
|
+
"patchTemplate": {
|
|
797
|
+
"navigation": {
|
|
798
|
+
"visible": false
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
"id": "navigation.labels.set",
|
|
804
|
+
"intentExamples": [
|
|
805
|
+
"next label",
|
|
806
|
+
"previous label",
|
|
807
|
+
"navigation labels"
|
|
808
|
+
],
|
|
809
|
+
"patchTemplate": {
|
|
810
|
+
"navigation": {
|
|
811
|
+
"prevLabel": "{{params.prev}}",
|
|
812
|
+
"nextLabel": "{{params.next}}"
|
|
813
|
+
}
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
{
|
|
817
|
+
"id": "step.add",
|
|
818
|
+
"intentExamples": [
|
|
819
|
+
"add step",
|
|
820
|
+
"new step",
|
|
821
|
+
"create step"
|
|
822
|
+
],
|
|
823
|
+
"patchTemplate": {
|
|
824
|
+
"steps": [
|
|
825
|
+
{
|
|
826
|
+
"id": "{{target}}",
|
|
827
|
+
"label": "{{value}}"
|
|
828
|
+
}
|
|
829
|
+
]
|
|
830
|
+
}
|
|
831
|
+
},
|
|
832
|
+
{
|
|
833
|
+
"id": "step.label.set",
|
|
834
|
+
"intentExamples": [
|
|
835
|
+
"rename step",
|
|
836
|
+
"step label"
|
|
837
|
+
],
|
|
838
|
+
"patchTemplate": {
|
|
839
|
+
"steps": [
|
|
840
|
+
{
|
|
841
|
+
"id": "{{target}}",
|
|
842
|
+
"label": "{{value}}"
|
|
843
|
+
}
|
|
844
|
+
]
|
|
845
|
+
}
|
|
846
|
+
},
|
|
847
|
+
{
|
|
848
|
+
"id": "step.description.set",
|
|
849
|
+
"intentExamples": [
|
|
850
|
+
"step description",
|
|
851
|
+
"description"
|
|
852
|
+
],
|
|
853
|
+
"patchTemplate": {
|
|
854
|
+
"steps": [
|
|
855
|
+
{
|
|
856
|
+
"id": "{{target}}",
|
|
857
|
+
"description": "{{value}}"
|
|
858
|
+
}
|
|
859
|
+
]
|
|
860
|
+
}
|
|
861
|
+
},
|
|
862
|
+
{
|
|
863
|
+
"id": "step.optional.enable",
|
|
864
|
+
"intentExamples": [
|
|
865
|
+
"optional step",
|
|
866
|
+
"not required"
|
|
867
|
+
],
|
|
868
|
+
"patchTemplate": {
|
|
869
|
+
"steps": [
|
|
870
|
+
{
|
|
871
|
+
"id": "{{target}}",
|
|
872
|
+
"optional": true
|
|
873
|
+
}
|
|
874
|
+
]
|
|
875
|
+
}
|
|
876
|
+
},
|
|
877
|
+
{
|
|
878
|
+
"id": "step.optional.disable",
|
|
879
|
+
"intentExamples": [
|
|
880
|
+
"required step"
|
|
881
|
+
],
|
|
882
|
+
"patchTemplate": {
|
|
883
|
+
"steps": [
|
|
884
|
+
{
|
|
885
|
+
"id": "{{target}}",
|
|
886
|
+
"optional": false
|
|
887
|
+
}
|
|
888
|
+
]
|
|
889
|
+
}
|
|
890
|
+
},
|
|
891
|
+
{
|
|
892
|
+
"id": "step.completed.set",
|
|
893
|
+
"intentExamples": [
|
|
894
|
+
"mark completed",
|
|
895
|
+
"completed step"
|
|
896
|
+
],
|
|
897
|
+
"patchTemplate": {
|
|
898
|
+
"steps": [
|
|
899
|
+
{
|
|
900
|
+
"id": "{{target}}",
|
|
901
|
+
"completed": "{{value}}"
|
|
902
|
+
}
|
|
903
|
+
]
|
|
904
|
+
}
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
"id": "step.error.set",
|
|
908
|
+
"intentExamples": [
|
|
909
|
+
"mark error",
|
|
910
|
+
"step error"
|
|
911
|
+
],
|
|
912
|
+
"patchTemplate": {
|
|
913
|
+
"steps": [
|
|
914
|
+
{
|
|
915
|
+
"id": "{{target}}",
|
|
916
|
+
"hasError": "{{value}}"
|
|
917
|
+
}
|
|
918
|
+
]
|
|
919
|
+
}
|
|
920
|
+
},
|
|
921
|
+
{
|
|
922
|
+
"id": "step.form.resourcePath.set",
|
|
923
|
+
"intentExamples": [
|
|
924
|
+
"form resource",
|
|
925
|
+
"resource path",
|
|
926
|
+
"step form"
|
|
927
|
+
],
|
|
928
|
+
"patchTemplate": {
|
|
929
|
+
"steps": [
|
|
930
|
+
{
|
|
931
|
+
"id": "{{target}}",
|
|
932
|
+
"form": {
|
|
933
|
+
"resourcePath": "{{value}}"
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
]
|
|
937
|
+
}
|
|
938
|
+
},
|
|
939
|
+
{
|
|
940
|
+
"id": "step.form.mode.set",
|
|
941
|
+
"intentExamples": [
|
|
942
|
+
"form mode",
|
|
943
|
+
"create mode",
|
|
944
|
+
"edit mode",
|
|
945
|
+
"view mode"
|
|
946
|
+
],
|
|
947
|
+
"patchTemplate": {
|
|
948
|
+
"steps": [
|
|
949
|
+
{
|
|
950
|
+
"id": "{{target}}",
|
|
951
|
+
"form": {
|
|
952
|
+
"mode": "{{value}}"
|
|
953
|
+
}
|
|
954
|
+
}
|
|
955
|
+
]
|
|
956
|
+
}
|
|
957
|
+
},
|
|
958
|
+
{
|
|
959
|
+
"id": "step.form.formId.set",
|
|
960
|
+
"intentExamples": [
|
|
961
|
+
"form id",
|
|
962
|
+
"form reference"
|
|
963
|
+
],
|
|
964
|
+
"patchTemplate": {
|
|
965
|
+
"steps": [
|
|
966
|
+
{
|
|
967
|
+
"id": "{{target}}",
|
|
968
|
+
"form": {
|
|
969
|
+
"formId": "{{value}}"
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
]
|
|
973
|
+
}
|
|
974
|
+
}
|
|
975
|
+
],
|
|
976
|
+
"fieldResolvers": {
|
|
977
|
+
"steps[]": [
|
|
978
|
+
"id",
|
|
979
|
+
"label"
|
|
980
|
+
]
|
|
981
|
+
},
|
|
982
|
+
"hints": [
|
|
983
|
+
"Use steps[].id or steps[].label as merge keys; avoid array indexes.",
|
|
984
|
+
"Step form config merges by id; avoid replacing entire steps array.",
|
|
985
|
+
"Selected index expects a zero-based number.",
|
|
986
|
+
"DOC: Widget purpose: stepper with ordered steps and optional per-step forms.",
|
|
987
|
+
"DOC: Host inputs: stepperId (required) and config (optional).",
|
|
988
|
+
"DOC: When config is provided, steps[] should be present; each step requires label.",
|
|
989
|
+
"DOC: Optional step.form embeds a dynamic form; use form.resourcePath + form.config as needed."
|
|
990
|
+
]
|
|
991
|
+
},
|
|
992
|
+
"authoringManifest": {
|
|
993
|
+
"schemaVersion": "1.0.0",
|
|
994
|
+
"componentId": "praxis-stepper",
|
|
995
|
+
"ownerPackage": "@praxisui/stepper",
|
|
996
|
+
"configSchemaId": "StepperMetadata",
|
|
997
|
+
"manifestVersion": "1.0.0",
|
|
998
|
+
"runtimeInputs": [
|
|
999
|
+
{
|
|
1000
|
+
"name": "config",
|
|
1001
|
+
"type": "StepperMetadata",
|
|
1002
|
+
"description": "Canonical multi-step flow configuration."
|
|
1003
|
+
},
|
|
1004
|
+
{
|
|
1005
|
+
"name": "stepperId",
|
|
1006
|
+
"type": "string",
|
|
1007
|
+
"description": "Stable id used to derive stepper config persistence scope."
|
|
1008
|
+
},
|
|
1009
|
+
{
|
|
1010
|
+
"name": "componentInstanceId",
|
|
1011
|
+
"type": "string",
|
|
1012
|
+
"description": "Optional instance discriminator for persistence scope."
|
|
1013
|
+
},
|
|
1014
|
+
{
|
|
1015
|
+
"name": "selectedIndex",
|
|
1016
|
+
"type": "number",
|
|
1017
|
+
"description": "Selected step index, compatible with two-way binding."
|
|
1018
|
+
},
|
|
1019
|
+
{
|
|
1020
|
+
"name": "serverValidate",
|
|
1021
|
+
"type": "function",
|
|
1022
|
+
"description": "Optional host-owned async validation gate for step progression."
|
|
1023
|
+
},
|
|
1024
|
+
{
|
|
1025
|
+
"name": "stepperContext",
|
|
1026
|
+
"type": "Record<string, any>",
|
|
1027
|
+
"description": "Context passed to nested widgets and rich content."
|
|
1028
|
+
},
|
|
1029
|
+
{
|
|
1030
|
+
"name": "enableCustomization",
|
|
1031
|
+
"type": "boolean",
|
|
1032
|
+
"description": "Enables Settings Panel authoring surfaces."
|
|
1033
|
+
}
|
|
1034
|
+
],
|
|
1035
|
+
"editableTargets": [
|
|
1036
|
+
{
|
|
1037
|
+
"kind": "step",
|
|
1038
|
+
"resolver": "step-by-id-or-label",
|
|
1039
|
+
"description": "A step in config.steps[]."
|
|
1040
|
+
},
|
|
1041
|
+
{
|
|
1042
|
+
"kind": "stepLabel",
|
|
1043
|
+
"resolver": "step-by-id-or-label",
|
|
1044
|
+
"description": "The visible label of a step."
|
|
1045
|
+
},
|
|
1046
|
+
{
|
|
1047
|
+
"kind": "stepContent",
|
|
1048
|
+
"resolver": "step-content-by-id",
|
|
1049
|
+
"description": "Dynamic form, rich content or advanced widgets hosted inside a step."
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
"kind": "navigation",
|
|
1053
|
+
"resolver": "stepper-navigation-config",
|
|
1054
|
+
"description": "Footer navigation labels, icons, variant, alignment and visibility."
|
|
1055
|
+
},
|
|
1056
|
+
{
|
|
1057
|
+
"kind": "completionRule",
|
|
1058
|
+
"resolver": "step-by-id-or-label",
|
|
1059
|
+
"description": "Optional/completed/error state metadata for a step."
|
|
1060
|
+
},
|
|
1061
|
+
{
|
|
1062
|
+
"kind": "validationGate",
|
|
1063
|
+
"resolver": "step-validation-by-id",
|
|
1064
|
+
"description": "Validation gate that controls linear navigation and remote validation delegation."
|
|
1065
|
+
},
|
|
1066
|
+
{
|
|
1067
|
+
"kind": "orientation",
|
|
1068
|
+
"resolver": "stepper-layout-config",
|
|
1069
|
+
"description": "Stepper orientation, header position and label position."
|
|
1070
|
+
}
|
|
1071
|
+
],
|
|
1072
|
+
"operations": [
|
|
1073
|
+
{
|
|
1074
|
+
"operationId": "step.add",
|
|
1075
|
+
"title": "Add step",
|
|
1076
|
+
"scope": "global",
|
|
1077
|
+
"targetKind": "step",
|
|
1078
|
+
"target": {
|
|
1079
|
+
"kind": "step",
|
|
1080
|
+
"resolver": "steps-array",
|
|
1081
|
+
"ambiguityPolicy": "fail",
|
|
1082
|
+
"required": false
|
|
1083
|
+
},
|
|
1084
|
+
"inputSchema": {
|
|
1085
|
+
"type": "object",
|
|
1086
|
+
"required": [
|
|
1087
|
+
"id",
|
|
1088
|
+
"label"
|
|
1089
|
+
],
|
|
1090
|
+
"properties": {
|
|
1091
|
+
"id": {
|
|
1092
|
+
"type": "string"
|
|
1093
|
+
},
|
|
1094
|
+
"label": {
|
|
1095
|
+
"type": "string"
|
|
1096
|
+
},
|
|
1097
|
+
"description": {
|
|
1098
|
+
"type": "string"
|
|
1099
|
+
},
|
|
1100
|
+
"optional": {
|
|
1101
|
+
"type": "boolean"
|
|
1102
|
+
},
|
|
1103
|
+
"editable": {
|
|
1104
|
+
"type": "boolean"
|
|
1105
|
+
},
|
|
1106
|
+
"completed": {
|
|
1107
|
+
"type": "boolean"
|
|
1108
|
+
},
|
|
1109
|
+
"hasError": {
|
|
1110
|
+
"type": "boolean"
|
|
1111
|
+
},
|
|
1112
|
+
"state": {
|
|
1113
|
+
"type": "string"
|
|
1114
|
+
},
|
|
1115
|
+
"stateIcon": {
|
|
1116
|
+
"type": "string"
|
|
1117
|
+
},
|
|
1118
|
+
"errorMessage": {
|
|
1119
|
+
"type": "string"
|
|
1120
|
+
},
|
|
1121
|
+
"ariaLabel": {
|
|
1122
|
+
"type": "string"
|
|
1123
|
+
},
|
|
1124
|
+
"ariaLabelledby": {
|
|
1125
|
+
"type": "string"
|
|
1126
|
+
},
|
|
1127
|
+
"form": {
|
|
1128
|
+
"type": "object"
|
|
1129
|
+
},
|
|
1130
|
+
"stepBlocksBeforeForm": {
|
|
1131
|
+
"type": "object"
|
|
1132
|
+
},
|
|
1133
|
+
"stepBlocksAfterForm": {
|
|
1134
|
+
"type": "object"
|
|
1135
|
+
},
|
|
1136
|
+
"widgets": {
|
|
1137
|
+
"type": "array",
|
|
1138
|
+
"items": {
|
|
1139
|
+
"type": "object"
|
|
1140
|
+
}
|
|
1141
|
+
}
|
|
1142
|
+
}
|
|
1143
|
+
},
|
|
1144
|
+
"effects": [
|
|
1145
|
+
{
|
|
1146
|
+
"kind": "append-unique",
|
|
1147
|
+
"path": "steps[]",
|
|
1148
|
+
"key": "id"
|
|
1149
|
+
}
|
|
1150
|
+
],
|
|
1151
|
+
"destructive": false,
|
|
1152
|
+
"requiresConfirmation": false,
|
|
1153
|
+
"validators": [
|
|
1154
|
+
"step-id-unique",
|
|
1155
|
+
"step-order-deterministic",
|
|
1156
|
+
"step-content-valid"
|
|
1157
|
+
],
|
|
1158
|
+
"affectedPaths": [
|
|
1159
|
+
"steps[]"
|
|
1160
|
+
],
|
|
1161
|
+
"submissionImpact": "config-only",
|
|
1162
|
+
"preconditions": [
|
|
1163
|
+
"config-initialized"
|
|
1164
|
+
]
|
|
1165
|
+
},
|
|
1166
|
+
{
|
|
1167
|
+
"operationId": "step.remove",
|
|
1168
|
+
"title": "Remove step",
|
|
1169
|
+
"scope": "layout",
|
|
1170
|
+
"targetKind": "step",
|
|
1171
|
+
"target": {
|
|
1172
|
+
"kind": "step",
|
|
1173
|
+
"resolver": "step-by-id-or-label",
|
|
1174
|
+
"ambiguityPolicy": "fail",
|
|
1175
|
+
"required": true
|
|
1176
|
+
},
|
|
1177
|
+
"inputSchema": {
|
|
1178
|
+
"type": "object",
|
|
1179
|
+
"properties": {
|
|
1180
|
+
"replacementStepId": {
|
|
1181
|
+
"type": "string"
|
|
1182
|
+
}
|
|
1183
|
+
}
|
|
1184
|
+
},
|
|
1185
|
+
"effects": [
|
|
1186
|
+
{
|
|
1187
|
+
"kind": "compile-domain-patch",
|
|
1188
|
+
"handler": "stepper-step-remove",
|
|
1189
|
+
"handlerContract": {
|
|
1190
|
+
"reads": [
|
|
1191
|
+
"steps[]",
|
|
1192
|
+
"selectedIndex"
|
|
1193
|
+
],
|
|
1194
|
+
"writes": [
|
|
1195
|
+
"steps[]",
|
|
1196
|
+
"selectedIndex"
|
|
1197
|
+
],
|
|
1198
|
+
"identityKeys": [
|
|
1199
|
+
"steps[].id"
|
|
1200
|
+
],
|
|
1201
|
+
"inputSchema": {
|
|
1202
|
+
"type": "object",
|
|
1203
|
+
"properties": {
|
|
1204
|
+
"replacementStepId": {
|
|
1205
|
+
"type": "string"
|
|
1206
|
+
}
|
|
1207
|
+
}
|
|
1208
|
+
},
|
|
1209
|
+
"failureModes": [
|
|
1210
|
+
"step-not-found",
|
|
1211
|
+
"replacement-step-not-found",
|
|
1212
|
+
"content-removal-not-confirmed"
|
|
1213
|
+
],
|
|
1214
|
+
"description": "Removes the target step by stable id and recomputes selectedIndex to preserve deterministic navigation state."
|
|
1215
|
+
}
|
|
1216
|
+
}
|
|
1217
|
+
],
|
|
1218
|
+
"destructive": true,
|
|
1219
|
+
"requiresConfirmation": true,
|
|
1220
|
+
"validators": [
|
|
1221
|
+
"step-exists",
|
|
1222
|
+
"selected-step-removal-safe",
|
|
1223
|
+
"step-content-removal-confirmed"
|
|
1224
|
+
],
|
|
1225
|
+
"affectedPaths": [
|
|
1226
|
+
"steps[]",
|
|
1227
|
+
"selectedIndex"
|
|
1228
|
+
],
|
|
1229
|
+
"submissionImpact": "config-only",
|
|
1230
|
+
"preconditions": [
|
|
1231
|
+
"config-initialized",
|
|
1232
|
+
"target-step-exists",
|
|
1233
|
+
"confirmation-collected"
|
|
1234
|
+
]
|
|
1235
|
+
},
|
|
1236
|
+
{
|
|
1237
|
+
"operationId": "step.label.set",
|
|
1238
|
+
"title": "Set step label",
|
|
1239
|
+
"scope": "layout",
|
|
1240
|
+
"targetKind": "stepLabel",
|
|
1241
|
+
"target": {
|
|
1242
|
+
"kind": "stepLabel",
|
|
1243
|
+
"resolver": "step-by-id-or-label",
|
|
1244
|
+
"ambiguityPolicy": "fail",
|
|
1245
|
+
"required": true
|
|
1246
|
+
},
|
|
1247
|
+
"inputSchema": {
|
|
1248
|
+
"type": "object",
|
|
1249
|
+
"required": [
|
|
1250
|
+
"label"
|
|
1251
|
+
],
|
|
1252
|
+
"properties": {
|
|
1253
|
+
"label": {
|
|
1254
|
+
"type": "string"
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
},
|
|
1258
|
+
"effects": [
|
|
1259
|
+
{
|
|
1260
|
+
"kind": "merge-by-key",
|
|
1261
|
+
"path": "steps[]",
|
|
1262
|
+
"key": "id"
|
|
1263
|
+
}
|
|
1264
|
+
],
|
|
1265
|
+
"destructive": false,
|
|
1266
|
+
"requiresConfirmation": false,
|
|
1267
|
+
"validators": [
|
|
1268
|
+
"step-exists",
|
|
1269
|
+
"step-label-valid"
|
|
1270
|
+
],
|
|
1271
|
+
"affectedPaths": [
|
|
1272
|
+
"steps[].label"
|
|
1273
|
+
],
|
|
1274
|
+
"submissionImpact": "config-only",
|
|
1275
|
+
"preconditions": [
|
|
1276
|
+
"config-initialized",
|
|
1277
|
+
"target-step-exists"
|
|
1278
|
+
]
|
|
1279
|
+
},
|
|
1280
|
+
{
|
|
1281
|
+
"operationId": "step.order.set",
|
|
1282
|
+
"title": "Reorder steps",
|
|
1283
|
+
"scope": "layout",
|
|
1284
|
+
"targetKind": "step",
|
|
1285
|
+
"target": {
|
|
1286
|
+
"kind": "step",
|
|
1287
|
+
"resolver": "step-by-id-or-label",
|
|
1288
|
+
"ambiguityPolicy": "fail",
|
|
1289
|
+
"required": true
|
|
1290
|
+
},
|
|
1291
|
+
"inputSchema": {
|
|
1292
|
+
"type": "object",
|
|
1293
|
+
"required": [
|
|
1294
|
+
"beforeStepId"
|
|
1295
|
+
],
|
|
1296
|
+
"properties": {
|
|
1297
|
+
"beforeStepId": {
|
|
1298
|
+
"type": "string"
|
|
1299
|
+
}
|
|
1300
|
+
}
|
|
1301
|
+
},
|
|
1302
|
+
"effects": [
|
|
1303
|
+
{
|
|
1304
|
+
"kind": "compile-domain-patch",
|
|
1305
|
+
"handler": "stepper-step-reorder",
|
|
1306
|
+
"handlerContract": {
|
|
1307
|
+
"reads": [
|
|
1308
|
+
"steps[]",
|
|
1309
|
+
"selectedIndex"
|
|
1310
|
+
],
|
|
1311
|
+
"writes": [
|
|
1312
|
+
"steps[]",
|
|
1313
|
+
"selectedIndex"
|
|
1314
|
+
],
|
|
1315
|
+
"identityKeys": [
|
|
1316
|
+
"steps[].id"
|
|
1317
|
+
],
|
|
1318
|
+
"inputSchema": {
|
|
1319
|
+
"type": "object",
|
|
1320
|
+
"required": [
|
|
1321
|
+
"beforeStepId"
|
|
1322
|
+
],
|
|
1323
|
+
"properties": {
|
|
1324
|
+
"beforeStepId": {
|
|
1325
|
+
"type": "string"
|
|
1326
|
+
}
|
|
1327
|
+
}
|
|
1328
|
+
},
|
|
1329
|
+
"failureModes": [
|
|
1330
|
+
"step-not-found",
|
|
1331
|
+
"before-step-not-found",
|
|
1332
|
+
"ambiguous-step-target"
|
|
1333
|
+
],
|
|
1334
|
+
"description": "Moves the target step before another stable step id and recomputes selectedIndex by preserving selected step identity."
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
],
|
|
1338
|
+
"destructive": false,
|
|
1339
|
+
"requiresConfirmation": false,
|
|
1340
|
+
"validators": [
|
|
1341
|
+
"step-exists",
|
|
1342
|
+
"step-order-deterministic",
|
|
1343
|
+
"selected-index-preserved"
|
|
1344
|
+
],
|
|
1345
|
+
"affectedPaths": [
|
|
1346
|
+
"steps[]",
|
|
1347
|
+
"selectedIndex"
|
|
1348
|
+
],
|
|
1349
|
+
"submissionImpact": "config-only",
|
|
1350
|
+
"preconditions": [
|
|
1351
|
+
"config-initialized",
|
|
1352
|
+
"target-step-exists"
|
|
1353
|
+
]
|
|
1354
|
+
},
|
|
1355
|
+
{
|
|
1356
|
+
"operationId": "step.optional.set",
|
|
1357
|
+
"title": "Set optional state",
|
|
1358
|
+
"scope": "interaction",
|
|
1359
|
+
"targetKind": "completionRule",
|
|
1360
|
+
"target": {
|
|
1361
|
+
"kind": "completionRule",
|
|
1362
|
+
"resolver": "step-by-id-or-label",
|
|
1363
|
+
"ambiguityPolicy": "fail",
|
|
1364
|
+
"required": true
|
|
1365
|
+
},
|
|
1366
|
+
"inputSchema": {
|
|
1367
|
+
"type": "object",
|
|
1368
|
+
"required": [
|
|
1369
|
+
"optional"
|
|
1370
|
+
],
|
|
1371
|
+
"properties": {
|
|
1372
|
+
"optional": {
|
|
1373
|
+
"type": "boolean"
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
},
|
|
1377
|
+
"effects": [
|
|
1378
|
+
{
|
|
1379
|
+
"kind": "merge-by-key",
|
|
1380
|
+
"path": "steps[]",
|
|
1381
|
+
"key": "id"
|
|
1382
|
+
}
|
|
1383
|
+
],
|
|
1384
|
+
"destructive": false,
|
|
1385
|
+
"requiresConfirmation": false,
|
|
1386
|
+
"validators": [
|
|
1387
|
+
"step-exists",
|
|
1388
|
+
"completion-rule-compatible"
|
|
1389
|
+
],
|
|
1390
|
+
"affectedPaths": [
|
|
1391
|
+
"steps[].optional"
|
|
1392
|
+
],
|
|
1393
|
+
"submissionImpact": "config-only",
|
|
1394
|
+
"preconditions": [
|
|
1395
|
+
"config-initialized",
|
|
1396
|
+
"target-step-exists"
|
|
1397
|
+
]
|
|
1398
|
+
},
|
|
1399
|
+
{
|
|
1400
|
+
"operationId": "step.completed.set",
|
|
1401
|
+
"title": "Set completed state",
|
|
1402
|
+
"scope": "interaction",
|
|
1403
|
+
"targetKind": "completionRule",
|
|
1404
|
+
"target": {
|
|
1405
|
+
"kind": "completionRule",
|
|
1406
|
+
"resolver": "step-by-id-or-label",
|
|
1407
|
+
"ambiguityPolicy": "fail",
|
|
1408
|
+
"required": true
|
|
1409
|
+
},
|
|
1410
|
+
"inputSchema": {
|
|
1411
|
+
"type": "object",
|
|
1412
|
+
"required": [
|
|
1413
|
+
"completed"
|
|
1414
|
+
],
|
|
1415
|
+
"properties": {
|
|
1416
|
+
"completed": {
|
|
1417
|
+
"type": "boolean"
|
|
1418
|
+
},
|
|
1419
|
+
"hasError": {
|
|
1420
|
+
"type": "boolean"
|
|
1421
|
+
},
|
|
1422
|
+
"errorMessage": {
|
|
1423
|
+
"type": "string"
|
|
1424
|
+
}
|
|
1425
|
+
}
|
|
1426
|
+
},
|
|
1427
|
+
"effects": [
|
|
1428
|
+
{
|
|
1429
|
+
"kind": "merge-by-key",
|
|
1430
|
+
"path": "steps[]",
|
|
1431
|
+
"key": "id"
|
|
1432
|
+
}
|
|
1433
|
+
],
|
|
1434
|
+
"destructive": false,
|
|
1435
|
+
"requiresConfirmation": false,
|
|
1436
|
+
"validators": [
|
|
1437
|
+
"step-exists",
|
|
1438
|
+
"completion-rule-compatible",
|
|
1439
|
+
"linear-completion-safe"
|
|
1440
|
+
],
|
|
1441
|
+
"affectedPaths": [
|
|
1442
|
+
"steps[].completed",
|
|
1443
|
+
"steps[].hasError",
|
|
1444
|
+
"steps[].errorMessage"
|
|
1445
|
+
],
|
|
1446
|
+
"submissionImpact": "config-only",
|
|
1447
|
+
"preconditions": [
|
|
1448
|
+
"config-initialized",
|
|
1449
|
+
"target-step-exists"
|
|
1450
|
+
]
|
|
1451
|
+
},
|
|
1452
|
+
{
|
|
1453
|
+
"operationId": "navigation.mode.set",
|
|
1454
|
+
"title": "Set navigation mode",
|
|
1455
|
+
"scope": "interaction",
|
|
1456
|
+
"targetKind": "navigation",
|
|
1457
|
+
"target": {
|
|
1458
|
+
"kind": "navigation",
|
|
1459
|
+
"resolver": "stepper-navigation-config",
|
|
1460
|
+
"ambiguityPolicy": "fail",
|
|
1461
|
+
"required": true
|
|
1462
|
+
},
|
|
1463
|
+
"inputSchema": {
|
|
1464
|
+
"type": "object",
|
|
1465
|
+
"properties": {
|
|
1466
|
+
"linear": {
|
|
1467
|
+
"type": "boolean"
|
|
1468
|
+
},
|
|
1469
|
+
"visible": {
|
|
1470
|
+
"type": "boolean"
|
|
1471
|
+
},
|
|
1472
|
+
"prevLabel": {
|
|
1473
|
+
"type": "string"
|
|
1474
|
+
},
|
|
1475
|
+
"nextLabel": {
|
|
1476
|
+
"type": "string"
|
|
1477
|
+
},
|
|
1478
|
+
"prevIcon": {
|
|
1479
|
+
"type": "string"
|
|
1480
|
+
},
|
|
1481
|
+
"nextIcon": {
|
|
1482
|
+
"type": "string"
|
|
1483
|
+
},
|
|
1484
|
+
"variant": {
|
|
1485
|
+
"enum": [
|
|
1486
|
+
"basic",
|
|
1487
|
+
"flat",
|
|
1488
|
+
"stroked",
|
|
1489
|
+
"raised"
|
|
1490
|
+
]
|
|
1491
|
+
},
|
|
1492
|
+
"color": {
|
|
1493
|
+
"enum": [
|
|
1494
|
+
"primary",
|
|
1495
|
+
"accent",
|
|
1496
|
+
"warn"
|
|
1497
|
+
]
|
|
1498
|
+
},
|
|
1499
|
+
"align": {
|
|
1500
|
+
"enum": [
|
|
1501
|
+
"start",
|
|
1502
|
+
"center",
|
|
1503
|
+
"end",
|
|
1504
|
+
"space-between"
|
|
1505
|
+
]
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
},
|
|
1509
|
+
"effects": [
|
|
1510
|
+
{
|
|
1511
|
+
"kind": "merge-object",
|
|
1512
|
+
"path": "navigation"
|
|
1513
|
+
},
|
|
1514
|
+
{
|
|
1515
|
+
"kind": "set-value",
|
|
1516
|
+
"path": "linear"
|
|
1517
|
+
}
|
|
1518
|
+
],
|
|
1519
|
+
"destructive": false,
|
|
1520
|
+
"requiresConfirmation": false,
|
|
1521
|
+
"validators": [
|
|
1522
|
+
"navigation-values-valid",
|
|
1523
|
+
"linear-navigation-valid",
|
|
1524
|
+
"editor-runtime-round-trip"
|
|
1525
|
+
],
|
|
1526
|
+
"affectedPaths": [
|
|
1527
|
+
"navigation.visible",
|
|
1528
|
+
"navigation.prevLabel",
|
|
1529
|
+
"navigation.nextLabel",
|
|
1530
|
+
"navigation.prevIcon",
|
|
1531
|
+
"navigation.nextIcon",
|
|
1532
|
+
"navigation.variant",
|
|
1533
|
+
"navigation.color",
|
|
1534
|
+
"navigation.align",
|
|
1535
|
+
"linear"
|
|
1536
|
+
],
|
|
1537
|
+
"submissionImpact": "config-only",
|
|
1538
|
+
"preconditions": [
|
|
1539
|
+
"config-initialized"
|
|
1540
|
+
]
|
|
1541
|
+
},
|
|
1542
|
+
{
|
|
1543
|
+
"operationId": "orientation.set",
|
|
1544
|
+
"title": "Set orientation",
|
|
1545
|
+
"scope": "layout",
|
|
1546
|
+
"targetKind": "orientation",
|
|
1547
|
+
"target": {
|
|
1548
|
+
"kind": "orientation",
|
|
1549
|
+
"resolver": "stepper-layout-config",
|
|
1550
|
+
"ambiguityPolicy": "fail",
|
|
1551
|
+
"required": true
|
|
1552
|
+
},
|
|
1553
|
+
"inputSchema": {
|
|
1554
|
+
"type": "object",
|
|
1555
|
+
"required": [
|
|
1556
|
+
"orientation"
|
|
1557
|
+
],
|
|
1558
|
+
"properties": {
|
|
1559
|
+
"orientation": {
|
|
1560
|
+
"enum": [
|
|
1561
|
+
"horizontal",
|
|
1562
|
+
"vertical"
|
|
1563
|
+
]
|
|
1564
|
+
},
|
|
1565
|
+
"headerPosition": {
|
|
1566
|
+
"enum": [
|
|
1567
|
+
"top",
|
|
1568
|
+
"bottom"
|
|
1569
|
+
]
|
|
1570
|
+
},
|
|
1571
|
+
"labelPosition": {
|
|
1572
|
+
"enum": [
|
|
1573
|
+
"bottom",
|
|
1574
|
+
"end"
|
|
1575
|
+
]
|
|
1576
|
+
},
|
|
1577
|
+
"density": {
|
|
1578
|
+
"enum": [
|
|
1579
|
+
"default",
|
|
1580
|
+
"comfortable",
|
|
1581
|
+
"compact"
|
|
1582
|
+
]
|
|
1583
|
+
}
|
|
1584
|
+
}
|
|
1585
|
+
},
|
|
1586
|
+
"effects": [
|
|
1587
|
+
{
|
|
1588
|
+
"kind": "set-value",
|
|
1589
|
+
"path": "orientation"
|
|
1590
|
+
},
|
|
1591
|
+
{
|
|
1592
|
+
"kind": "set-value",
|
|
1593
|
+
"path": "headerPosition"
|
|
1594
|
+
},
|
|
1595
|
+
{
|
|
1596
|
+
"kind": "set-value",
|
|
1597
|
+
"path": "labelPosition"
|
|
1598
|
+
},
|
|
1599
|
+
{
|
|
1600
|
+
"kind": "set-value",
|
|
1601
|
+
"path": "density"
|
|
1602
|
+
}
|
|
1603
|
+
],
|
|
1604
|
+
"destructive": false,
|
|
1605
|
+
"requiresConfirmation": false,
|
|
1606
|
+
"validators": [
|
|
1607
|
+
"orientation-values-valid",
|
|
1608
|
+
"label-position-compatible",
|
|
1609
|
+
"editor-runtime-round-trip"
|
|
1610
|
+
],
|
|
1611
|
+
"affectedPaths": [
|
|
1612
|
+
"orientation",
|
|
1613
|
+
"headerPosition",
|
|
1614
|
+
"labelPosition",
|
|
1615
|
+
"density"
|
|
1616
|
+
],
|
|
1617
|
+
"submissionImpact": "config-only",
|
|
1618
|
+
"preconditions": [
|
|
1619
|
+
"config-initialized"
|
|
1620
|
+
]
|
|
1621
|
+
},
|
|
1622
|
+
{
|
|
1623
|
+
"operationId": "validation.rule.add",
|
|
1624
|
+
"title": "Add validation rule",
|
|
1625
|
+
"scope": "rule",
|
|
1626
|
+
"targetKind": "validationGate",
|
|
1627
|
+
"target": {
|
|
1628
|
+
"kind": "validationGate",
|
|
1629
|
+
"resolver": "step-validation-by-id",
|
|
1630
|
+
"ambiguityPolicy": "fail",
|
|
1631
|
+
"required": true
|
|
1632
|
+
},
|
|
1633
|
+
"inputSchema": {
|
|
1634
|
+
"type": "object",
|
|
1635
|
+
"required": [
|
|
1636
|
+
"stepId",
|
|
1637
|
+
"rule"
|
|
1638
|
+
],
|
|
1639
|
+
"properties": {
|
|
1640
|
+
"stepId": {
|
|
1641
|
+
"type": "string"
|
|
1642
|
+
},
|
|
1643
|
+
"fieldName": {
|
|
1644
|
+
"type": "string"
|
|
1645
|
+
},
|
|
1646
|
+
"childComponentId": {
|
|
1647
|
+
"type": "string"
|
|
1648
|
+
},
|
|
1649
|
+
"rule": {
|
|
1650
|
+
"type": "object"
|
|
1651
|
+
},
|
|
1652
|
+
"message": {
|
|
1653
|
+
"type": "string"
|
|
1654
|
+
},
|
|
1655
|
+
"remote": {
|
|
1656
|
+
"type": "boolean"
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
},
|
|
1660
|
+
"effects": [
|
|
1661
|
+
{
|
|
1662
|
+
"kind": "compile-domain-patch",
|
|
1663
|
+
"handler": "stepper-validation-rule-upsert",
|
|
1664
|
+
"handlerContract": {
|
|
1665
|
+
"reads": [
|
|
1666
|
+
"steps[]",
|
|
1667
|
+
"steps[].form",
|
|
1668
|
+
"steps[].form.config",
|
|
1669
|
+
"steps[].widgets",
|
|
1670
|
+
"linear"
|
|
1671
|
+
],
|
|
1672
|
+
"writes": [
|
|
1673
|
+
"steps[].form.config",
|
|
1674
|
+
"steps[].form.config.sections",
|
|
1675
|
+
"steps[].form.config.fieldMetadata",
|
|
1676
|
+
"steps[].hasError",
|
|
1677
|
+
"steps[].errorMessage"
|
|
1678
|
+
],
|
|
1679
|
+
"identityKeys": [
|
|
1680
|
+
"steps[].id",
|
|
1681
|
+
"steps[].form.formId",
|
|
1682
|
+
"steps[].widgets[].id"
|
|
1683
|
+
],
|
|
1684
|
+
"inputSchema": {
|
|
1685
|
+
"type": "object",
|
|
1686
|
+
"required": [
|
|
1687
|
+
"stepId",
|
|
1688
|
+
"rule"
|
|
1689
|
+
],
|
|
1690
|
+
"properties": {
|
|
1691
|
+
"stepId": {
|
|
1692
|
+
"type": "string"
|
|
1693
|
+
},
|
|
1694
|
+
"fieldName": {
|
|
1695
|
+
"type": "string"
|
|
1696
|
+
},
|
|
1697
|
+
"childComponentId": {
|
|
1698
|
+
"type": "string"
|
|
1699
|
+
},
|
|
1700
|
+
"rule": {
|
|
1701
|
+
"type": "object"
|
|
1702
|
+
},
|
|
1703
|
+
"message": {
|
|
1704
|
+
"type": "string"
|
|
1705
|
+
},
|
|
1706
|
+
"remote": {
|
|
1707
|
+
"type": "boolean"
|
|
1708
|
+
}
|
|
1709
|
+
}
|
|
1710
|
+
},
|
|
1711
|
+
"failureModes": [
|
|
1712
|
+
"step-not-found",
|
|
1713
|
+
"validation-target-not-found",
|
|
1714
|
+
"dynamic-form-config-missing",
|
|
1715
|
+
"remote-validation-requires-host-serverValidate"
|
|
1716
|
+
],
|
|
1717
|
+
"description": "Projects a validation rule into the step dynamic-form config or delegates it to the host serverValidate gate without redefining child component contracts."
|
|
1718
|
+
}
|
|
1719
|
+
}
|
|
1720
|
+
],
|
|
1721
|
+
"validators": [
|
|
1722
|
+
"step-exists",
|
|
1723
|
+
"validation-rule-target-exists",
|
|
1724
|
+
"validation-rule-compatible",
|
|
1725
|
+
"server-validation-delegated"
|
|
1726
|
+
],
|
|
1727
|
+
"destructive": false,
|
|
1728
|
+
"requiresConfirmation": false,
|
|
1729
|
+
"affectedPaths": [
|
|
1730
|
+
"steps[].form.config",
|
|
1731
|
+
"steps[].form.config.sections",
|
|
1732
|
+
"steps[].form.config.fieldMetadata",
|
|
1733
|
+
"steps[].hasError",
|
|
1734
|
+
"steps[].errorMessage"
|
|
1735
|
+
],
|
|
1736
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1737
|
+
"preconditions": [
|
|
1738
|
+
"config-initialized",
|
|
1739
|
+
"target-step-exists"
|
|
1740
|
+
]
|
|
1741
|
+
},
|
|
1742
|
+
{
|
|
1743
|
+
"operationId": "step.content.set",
|
|
1744
|
+
"title": "Set step content",
|
|
1745
|
+
"scope": "layout",
|
|
1746
|
+
"targetKind": "stepContent",
|
|
1747
|
+
"target": {
|
|
1748
|
+
"kind": "stepContent",
|
|
1749
|
+
"resolver": "step-content-by-id",
|
|
1750
|
+
"ambiguityPolicy": "fail",
|
|
1751
|
+
"required": true
|
|
1752
|
+
},
|
|
1753
|
+
"inputSchema": {
|
|
1754
|
+
"type": "object",
|
|
1755
|
+
"minProperties": 1,
|
|
1756
|
+
"properties": {
|
|
1757
|
+
"id": {
|
|
1758
|
+
"type": "string"
|
|
1759
|
+
},
|
|
1760
|
+
"label": {
|
|
1761
|
+
"type": "string"
|
|
1762
|
+
},
|
|
1763
|
+
"description": {
|
|
1764
|
+
"type": "string"
|
|
1765
|
+
},
|
|
1766
|
+
"optional": {
|
|
1767
|
+
"type": "boolean"
|
|
1768
|
+
},
|
|
1769
|
+
"editable": {
|
|
1770
|
+
"type": "boolean"
|
|
1771
|
+
},
|
|
1772
|
+
"completed": {
|
|
1773
|
+
"type": "boolean"
|
|
1774
|
+
},
|
|
1775
|
+
"hasError": {
|
|
1776
|
+
"type": "boolean"
|
|
1777
|
+
},
|
|
1778
|
+
"state": {
|
|
1779
|
+
"type": "string"
|
|
1780
|
+
},
|
|
1781
|
+
"stateIcon": {
|
|
1782
|
+
"type": "string"
|
|
1783
|
+
},
|
|
1784
|
+
"errorMessage": {
|
|
1785
|
+
"type": "string"
|
|
1786
|
+
},
|
|
1787
|
+
"form": {
|
|
1788
|
+
"type": "object"
|
|
1789
|
+
},
|
|
1790
|
+
"stepBlocksBeforeForm": {
|
|
1791
|
+
"type": "object"
|
|
1792
|
+
},
|
|
1793
|
+
"stepBlocksAfterForm": {
|
|
1794
|
+
"type": "object"
|
|
1795
|
+
},
|
|
1796
|
+
"widgets": {
|
|
1797
|
+
"type": "array",
|
|
1798
|
+
"items": {
|
|
1799
|
+
"type": "object"
|
|
1800
|
+
}
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
},
|
|
1804
|
+
"effects": [
|
|
1805
|
+
{
|
|
1806
|
+
"kind": "merge-by-key",
|
|
1807
|
+
"path": "steps[]",
|
|
1808
|
+
"key": "id"
|
|
1809
|
+
}
|
|
1810
|
+
],
|
|
1811
|
+
"destructive": false,
|
|
1812
|
+
"requiresConfirmation": false,
|
|
1813
|
+
"validators": [
|
|
1814
|
+
"step-exists",
|
|
1815
|
+
"step-content-valid",
|
|
1816
|
+
"nested-widget-contract-delegated"
|
|
1817
|
+
],
|
|
1818
|
+
"affectedPaths": [
|
|
1819
|
+
"steps[].form",
|
|
1820
|
+
"steps[].stepBlocksBeforeForm",
|
|
1821
|
+
"steps[].stepBlocksAfterForm",
|
|
1822
|
+
"steps[].widgets"
|
|
1823
|
+
],
|
|
1824
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1825
|
+
"preconditions": [
|
|
1826
|
+
"config-initialized",
|
|
1827
|
+
"target-step-exists"
|
|
1828
|
+
]
|
|
1829
|
+
}
|
|
1830
|
+
],
|
|
1831
|
+
"validators": [
|
|
1832
|
+
{
|
|
1833
|
+
"validatorId": "step-id-unique",
|
|
1834
|
+
"level": "error",
|
|
1835
|
+
"code": "PSTEP001",
|
|
1836
|
+
"description": "Step ids must be unique and stable within config.steps[]."
|
|
1837
|
+
},
|
|
1838
|
+
{
|
|
1839
|
+
"validatorId": "step-exists",
|
|
1840
|
+
"level": "error",
|
|
1841
|
+
"code": "PSTEP002",
|
|
1842
|
+
"description": "Target step must exist before applying the operation."
|
|
1843
|
+
},
|
|
1844
|
+
{
|
|
1845
|
+
"validatorId": "step-order-deterministic",
|
|
1846
|
+
"level": "error",
|
|
1847
|
+
"code": "PSTEP003",
|
|
1848
|
+
"description": "Step ordering must use stable ids, not transient array index as identity."
|
|
1849
|
+
},
|
|
1850
|
+
{
|
|
1851
|
+
"validatorId": "step-content-valid",
|
|
1852
|
+
"level": "error",
|
|
1853
|
+
"code": "PSTEP004",
|
|
1854
|
+
"description": "Step content must remain valid Dynamic Form config, RichContentDocument or WidgetDefinition[] metadata."
|
|
1855
|
+
},
|
|
1856
|
+
{
|
|
1857
|
+
"validatorId": "step-content-removal-confirmed",
|
|
1858
|
+
"level": "error",
|
|
1859
|
+
"code": "PSTEP005",
|
|
1860
|
+
"description": "Removing a step with form, rich content or widgets is destructive and requires confirmation."
|
|
1861
|
+
},
|
|
1862
|
+
{
|
|
1863
|
+
"validatorId": "selected-step-removal-safe",
|
|
1864
|
+
"level": "error",
|
|
1865
|
+
"code": "PSTEP006",
|
|
1866
|
+
"description": "Removing the selected step requires a deterministic replacement selected index or explicit confirmation."
|
|
1867
|
+
},
|
|
1868
|
+
{
|
|
1869
|
+
"validatorId": "selected-index-preserved",
|
|
1870
|
+
"level": "warning",
|
|
1871
|
+
"code": "PSTEP007",
|
|
1872
|
+
"description": "Reordering steps must preserve selected step identity and only recompute selectedIndex after resolution."
|
|
1873
|
+
},
|
|
1874
|
+
{
|
|
1875
|
+
"validatorId": "step-label-valid",
|
|
1876
|
+
"level": "error",
|
|
1877
|
+
"code": "PSTEP008",
|
|
1878
|
+
"description": "Step labels must be non-empty text values after localization/domain projection."
|
|
1879
|
+
},
|
|
1880
|
+
{
|
|
1881
|
+
"validatorId": "completion-rule-compatible",
|
|
1882
|
+
"level": "error",
|
|
1883
|
+
"code": "PSTEP009",
|
|
1884
|
+
"description": "Optional, completed, hasError and errorMessage flags must remain compatible with Material stepper semantics."
|
|
1885
|
+
},
|
|
1886
|
+
{
|
|
1887
|
+
"validatorId": "linear-completion-safe",
|
|
1888
|
+
"level": "warning",
|
|
1889
|
+
"code": "PSTEP010",
|
|
1890
|
+
"description": "Forcing completion in linear mode should not bypass invalid Dynamic Form or server validation gates."
|
|
1891
|
+
},
|
|
1892
|
+
{
|
|
1893
|
+
"validatorId": "navigation-values-valid",
|
|
1894
|
+
"level": "error",
|
|
1895
|
+
"code": "PSTEP011",
|
|
1896
|
+
"description": "Navigation labels, icons, variant, color and alignment must match StepperMetadata enums and runtime bindings."
|
|
1897
|
+
},
|
|
1898
|
+
{
|
|
1899
|
+
"validatorId": "linear-navigation-valid",
|
|
1900
|
+
"level": "error",
|
|
1901
|
+
"code": "PSTEP012",
|
|
1902
|
+
"description": "Linear navigation depends on form validity and must not be replaced by host-local navigation rules."
|
|
1903
|
+
},
|
|
1904
|
+
{
|
|
1905
|
+
"validatorId": "orientation-values-valid",
|
|
1906
|
+
"level": "error",
|
|
1907
|
+
"code": "PSTEP013",
|
|
1908
|
+
"description": "Orientation, headerPosition, labelPosition and density values must match StepperMetadata enums."
|
|
1909
|
+
},
|
|
1910
|
+
{
|
|
1911
|
+
"validatorId": "label-position-compatible",
|
|
1912
|
+
"level": "warning",
|
|
1913
|
+
"code": "PSTEP014",
|
|
1914
|
+
"description": "labelPosition only affects horizontal steppers and must round-trip without corrupting vertical layout."
|
|
1915
|
+
},
|
|
1916
|
+
{
|
|
1917
|
+
"validatorId": "validation-rule-target-exists",
|
|
1918
|
+
"level": "error",
|
|
1919
|
+
"code": "PSTEP015",
|
|
1920
|
+
"description": "Validation rules must reference an existing field inside the step form or an existing child widget/component."
|
|
1921
|
+
},
|
|
1922
|
+
{
|
|
1923
|
+
"validatorId": "validation-rule-compatible",
|
|
1924
|
+
"level": "error",
|
|
1925
|
+
"code": "PSTEP016",
|
|
1926
|
+
"description": "Validation rules must compile into Dynamic Form metadata or host serverValidate delegation without inventing a parallel stepper rule DSL."
|
|
1927
|
+
},
|
|
1928
|
+
{
|
|
1929
|
+
"validatorId": "server-validation-delegated",
|
|
1930
|
+
"level": "info",
|
|
1931
|
+
"code": "PSTEP017",
|
|
1932
|
+
"description": "Remote validation remains delegated to the serverValidate input and is not implemented as hidden stepper metadata."
|
|
1933
|
+
},
|
|
1934
|
+
{
|
|
1935
|
+
"validatorId": "nested-widget-contract-delegated",
|
|
1936
|
+
"level": "info",
|
|
1937
|
+
"code": "PSTEP018",
|
|
1938
|
+
"description": "Nested widget content remains governed by the child component contract and widgetEvent path delegation."
|
|
1939
|
+
},
|
|
1940
|
+
{
|
|
1941
|
+
"validatorId": "editor-runtime-round-trip",
|
|
1942
|
+
"level": "error",
|
|
1943
|
+
"code": "PSTEP019",
|
|
1944
|
+
"description": "Settings Panel editor, runtime and registry projection must preserve step ids, order, navigation and validation intent."
|
|
1945
|
+
}
|
|
1946
|
+
],
|
|
1947
|
+
"roundTripRequirements": [
|
|
1948
|
+
"Operations must preserve stable step ids; array index may be used only as a resolver fallback, never as canonical identity.",
|
|
1949
|
+
"Settings Panel editor, runtime persistence and registry projection must round-trip StepperMetadata without losing step ids, order or selectedIndex.",
|
|
1950
|
+
"Validation authoring must target Dynamic Form metadata or the host-owned serverValidate gate; the stepper manifest must not define a parallel validation DSL.",
|
|
1951
|
+
"Nested widgets remain delegated through WidgetDefinition and widgetEvent path enrichment instead of being redefined by the stepper contract.",
|
|
1952
|
+
"Removing a step with form, rich content or widgets requires explicit confirmation because it can delete nested authoring content."
|
|
1953
|
+
],
|
|
1954
|
+
"examples": [
|
|
1955
|
+
{
|
|
1956
|
+
"id": "add-review-step",
|
|
1957
|
+
"request": "Add a review step after the documents step.",
|
|
1958
|
+
"operationId": "step.add",
|
|
1959
|
+
"params": {
|
|
1960
|
+
"id": "review",
|
|
1961
|
+
"label": "Review"
|
|
1962
|
+
},
|
|
1963
|
+
"isPositive": true
|
|
1964
|
+
},
|
|
1965
|
+
{
|
|
1966
|
+
"id": "rename-profile-step",
|
|
1967
|
+
"request": "Rename the profile step to Customer profile.",
|
|
1968
|
+
"operationId": "step.label.set",
|
|
1969
|
+
"target": "profile",
|
|
1970
|
+
"params": {
|
|
1971
|
+
"label": "Customer profile"
|
|
1972
|
+
},
|
|
1973
|
+
"isPositive": true
|
|
1974
|
+
},
|
|
1975
|
+
{
|
|
1976
|
+
"id": "move-confirm-before-submit",
|
|
1977
|
+
"request": "Move confirm before submit.",
|
|
1978
|
+
"operationId": "step.order.set",
|
|
1979
|
+
"target": "confirm",
|
|
1980
|
+
"params": {
|
|
1981
|
+
"beforeStepId": "submit"
|
|
1982
|
+
},
|
|
1983
|
+
"isPositive": true
|
|
1984
|
+
},
|
|
1985
|
+
{
|
|
1986
|
+
"id": "make-upload-optional",
|
|
1987
|
+
"request": "Make the upload step optional.",
|
|
1988
|
+
"operationId": "step.optional.set",
|
|
1989
|
+
"target": "upload",
|
|
1990
|
+
"params": {
|
|
1991
|
+
"optional": true
|
|
1992
|
+
},
|
|
1993
|
+
"isPositive": true
|
|
1994
|
+
},
|
|
1995
|
+
{
|
|
1996
|
+
"id": "set-linear-navigation",
|
|
1997
|
+
"request": "Use linear navigation with Back and Continue labels.",
|
|
1998
|
+
"operationId": "navigation.mode.set",
|
|
1999
|
+
"params": {
|
|
2000
|
+
"linear": true,
|
|
2001
|
+
"prevLabel": "Back",
|
|
2002
|
+
"nextLabel": "Continue"
|
|
2003
|
+
},
|
|
2004
|
+
"isPositive": true
|
|
2005
|
+
},
|
|
2006
|
+
{
|
|
2007
|
+
"id": "switch-vertical-layout",
|
|
2008
|
+
"request": "Make the stepper vertical.",
|
|
2009
|
+
"operationId": "orientation.set",
|
|
2010
|
+
"params": {
|
|
2011
|
+
"orientation": "vertical",
|
|
2012
|
+
"headerPosition": "top"
|
|
2013
|
+
},
|
|
2014
|
+
"isPositive": true
|
|
2015
|
+
},
|
|
2016
|
+
{
|
|
2017
|
+
"id": "require-email-on-profile",
|
|
2018
|
+
"request": "Require email before continuing from profile.",
|
|
2019
|
+
"operationId": "validation.rule.add",
|
|
2020
|
+
"target": "profile",
|
|
2021
|
+
"params": {
|
|
2022
|
+
"stepId": "profile",
|
|
2023
|
+
"fieldName": "email",
|
|
2024
|
+
"rule": {
|
|
2025
|
+
"required": true
|
|
2026
|
+
},
|
|
2027
|
+
"message": "Email is required"
|
|
2028
|
+
},
|
|
2029
|
+
"isPositive": true
|
|
2030
|
+
},
|
|
2031
|
+
{
|
|
2032
|
+
"id": "reject-duplicate-step-id",
|
|
2033
|
+
"request": "Add another step with id review.",
|
|
2034
|
+
"operationId": "step.add",
|
|
2035
|
+
"params": {
|
|
2036
|
+
"id": "review",
|
|
2037
|
+
"label": "Duplicate review"
|
|
2038
|
+
},
|
|
2039
|
+
"isPositive": false
|
|
2040
|
+
},
|
|
2041
|
+
{
|
|
2042
|
+
"id": "confirm-remove-content-step",
|
|
2043
|
+
"request": "Remove the documents step that contains an upload widget.",
|
|
2044
|
+
"operationId": "step.remove",
|
|
2045
|
+
"target": "documents",
|
|
2046
|
+
"params": {
|
|
2047
|
+
"replacementStepId": "review"
|
|
2048
|
+
},
|
|
2049
|
+
"isPositive": true
|
|
2050
|
+
}
|
|
2051
|
+
]
|
|
2052
|
+
},
|
|
2053
|
+
"chunks": [
|
|
2054
|
+
{
|
|
2055
|
+
"chunkIndex": 0,
|
|
2056
|
+
"chunkKind": "summary",
|
|
2057
|
+
"content": "Component ID: praxis-stepper\nSelector: praxis-stepper\nFriendly Name: Praxis Stepper\nDescription: Stepper configurável (horizontal/vertical/linear) com passos e conteúdo dinâmico.\nLib/Package: @praxisui/stepper\nTags: widget, container, stepper, configurable\nInputs:\n - stepperId (string)\n - componentInstanceId (string)\n - config (StepperMetadata)\n - selectedIndex (number)\n - selectedIndexInput (number)\n - disableRippleInput (boolean)\n - enableCustomization (boolean)\n - labelPosition ('bottom' | 'end')\n - color (ThemePalette)\n - serverValidate ((args) => Promise<{ ok: boolean; fieldErrors?: Record<string,string[]>; formErrors?: string[] }>)\n - stepperContext (Record<string, any>)\nOutputs:\n - selectionChange (any)\n - selectedIndexChange (number)\n - animationDone (void)\n - widgetEvent (WidgetEventEnvelope)\n - stepFormReady ({ stepId?: string; stepIndex: number; event: FormReadyEvent })\n - stepFormValueChange ({ stepId?: string; stepIndex: number; event: FormValueChangeEvent })\n",
|
|
2058
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-stepper/src/lib/praxis-stepper.metadata.ts",
|
|
2059
|
+
"contentHash": "d753191bcc0a9e88df19ce2d3becb8dbc928e8c22db0d488dcfcdde2381c8e79",
|
|
2060
|
+
"sourceKind": "component_definition",
|
|
2061
|
+
"sourceId": "praxis-stepper",
|
|
2062
|
+
"corpusVersion": "1.0.0"
|
|
2063
|
+
},
|
|
2064
|
+
{
|
|
2065
|
+
"chunkIndex": 1,
|
|
2066
|
+
"chunkKind": "capabilities",
|
|
2067
|
+
"content": "Component Capabilities:\n - Path: orientation\n Category: layout\n Kind: enum\n Description: Orientation of the stepper.\n - Path: linear\n Category: behavior\n Kind: boolean\n Description: Require sequential completion of steps.\n - Path: headerPosition\n Category: layout\n Kind: enum\n Description: Header position (vertical only).\n - Path: labelPosition\n Category: layout\n Kind: enum\n Description: Label position for horizontal stepper.\n - Path: color\n Category: appearance\n Kind: enum\n Description: Material color palette.\n - Path: disableRipple\n Category: behavior\n Kind: boolean\n Description: Disable ripple for headers.\n - Path: animationDuration\n Category: behavior\n Kind: string\n Description: Animation duration, e.g. 300ms.\n - Path: selectedIndex\n Category: behavior\n Kind: number\n Description: Current step index.\n - Path: density\n Category: appearance\n Kind: enum\n Description: Density preset.\n - Path: stepperClass\n Category: appearance\n Kind: string\n Description: CSS class for stepper root.\n - Path: headerClass\n Category: appearance\n Kind: string\n Description: CSS class for header.\n - Path: contentClass\n Category: appearance\n Kind: string\n Description: CSS class for content area.\n - Path: appearance\n Category: appearance\n Kind: object\n Description: Appearance settings.\n - Path: appearance.themeClass\n Category: appearance\n Kind: string\n Description: Theme CSS class for root.\n - Path: appearance.tokens\n Category: appearance\n Kind: object\n Description: Token map for theme overrides.\n - Path: appearance.tokens.[token]\n Category: appearance\n Kind: string\n Description: Token value (CSS value or var).\n - Path: appearance.icons\n Category: appearance\n Kind: object\n Description: Stepper icon overrides.\n - Path: appearance.icons.number\n Category: appearance\n Kind: string\n Description: Icon for number state.\n - Path: appearance.icons.done\n Category: appearance\n Kind: string\n Description: Icon for done state.\n - Path: appearance.icons.edit\n Category: appearance\n Kind: string\n Description: Icon for edit state.\n - Path: appearance.icons.error\n Category: appearance\n Kind: string\n Description: Icon for error state.\n - Path: appearance.iconsSet\n Category: appearance\n Kind: enum\n Description: Icon set class name (Material Symbols).\n - Path: navigation\n Category: navigation\n Kind: object\n Description: Footer navigation config.\n - Path: navigation.visible\n Category: navigation\n Kind: boolean\n Description: Show navigation buttons.\n - Path: navigation.prevLabel\n Category: navigation\n Kind: string\n Description: Previous button label.\n - Path: navigation.nextLabel\n Category: navigation\n Kind: string\n Description: Next button label.\n - Path: navigation.prevIcon\n Category: navigation\n Kind: string\n Description: Previous button icon.\n - Path: navigation.nextIcon\n Category: navigation\n Kind: string\n Description: Next button icon.\n - Path: navigation.variant\n Category: navigation\n Kind: enum\n Description: Button variant.\n - Path: navigation.color\n Category: navigation\n Kind: enum\n Description: Button color.\n - Path: navigation.align\n Category: navigation\n Kind: enum\n Description: Navigation alignment.\n - Path: steps\n Category: steps\n Kind: array\n Description: Step definitions.\n - Path: steps[]\n Category: steps\n Kind: object\n Description: Step definition.\n - Path: steps[].id\n Category: steps\n Kind: string\n Description: Step id.\n - Path: steps[].label\n Category: steps\n Kind: string\n Description: Step label.\n - Path: steps[].description\n Category: steps\n Kind: string\n Description: Step description.\n - Path: steps[].optional\n Category: steps\n Kind: boolean\n Description: Mark step as optional.\n - Path: steps[].editable\n Category: steps\n Kind: boolean\n Description: Allow editing completed steps.\n - Path: steps[].completed\n Category: steps\n Kind: boolean\n Description: Force completed state.\n - Path: steps[].hasError\n Category: steps\n Kind: boolean\n Description: Force error state.\n - Path: steps[].stateIcon\n Category: steps\n Kind: string\n Description: Custom state icon key.\n - Path: steps[].state\n Category: steps\n Kind: string\n Description: Custom state name for matStepperIcon.\n - Path: steps[].errorMessage\n Category: steps\n Kind: string\n Description: Error message shown in header.\n - Path: steps[].ariaLabel\n Category: accessibility\n Kind: string\n Description: ARIA label for step header.\n - Path: steps[].ariaLabelledby\n Category: accessibility\n Kind: string\n Description: ARIA labelledby for step header.\n - Path: steps[].form\n Category: steps\n Kind: object\n Description: Optional Dynamic Form config for step.\n - Path: steps[].form.resourcePath\n Category: steps\n Kind: string\n Description: Resource path for Dynamic Form.\n - Path: steps[].form.resourceId\n Category: steps\n Kind: string\n Description: Resource id for Dynamic Form (string or number).\n - Path: steps[].form.mode\n Category: steps\n Kind: enum\n Description: Form mode.\n - Path: steps[].form.config\n Category: steps\n Kind: object\n Description: FormConfig for Dynamic Form.\n - Path: steps[].form.config.editorialContext\n Category: steps\n Kind: object\n Description: Contexto editorial compartilhado entre blocos hospedados pelo Dynamic Form da etapa.\n - Path: steps[].form.config.formBlocksBefore\n Category: steps\n Kind: object\n Description: RichContentDocument hospedado antes do formulario da etapa.\n - Path: steps[].form.config.formBlocksBeforeActions\n Category: steps\n Kind: object\n Description: RichContentDocument hospedado depois das secoes e antes da area principal de acoes do formulario da etapa.\n - Path: steps[].form.config.formBlocksAfter\n Category: steps\n Kind: object\n Description: RichContentDocument hospedado depois do formulario inteiro da etapa.\n - Path: steps[].form.schemaSource\n Category: steps\n Kind: enum\n Description: Schema source for Dynamic Form.\n - Path: steps[].form.formId\n Category: steps\n Kind: string\n Description: Form id for Dynamic Form.\n - Path: steps[].stepBlocksBeforeForm\n Category: steps\n Kind: object\n Description: RichContentDocument rendered before the step form.\n - Path: steps[].stepBlocksAfterForm\n Category: steps\n Kind: object\n Description: RichContentDocument rendered after the step form.\n - Path: steps[].widgets\n Category: steps\n Kind: array\n Description: Advanced host-owned WidgetDefinition list rendered after canonical rich content.\n - Path: steps[].widgets[]\n Category: steps\n Kind: object\n Description: Advanced WidgetDefinition item.\n - Path: steps[].widgets[].id\n Category: steps\n Kind: enum\n Description: Component registry id for advanced widget.\n - Path: steps[].widgets[].inputs\n Category: steps\n Kind: object\n Description: Inputs bound into the advanced widget instance.\nCapability Notes:\n - steps[] should be merged by id or label to avoid replacing all steps.\n - steps[].form.config uses FormConfig (see form catalog) and may include sections/actions/fieldMetadata.\n - steps[].form.config tambem pode usar a surface editorial do dynamic-form: formBlocksBefore, formBlocksBeforeActions, formBlocksAfter e editorialContext como RichContentDocument.\n - Use steps[].stepBlocksBeforeForm and steps[].stepBlocksAfterForm for editorial step content; both are RichContentDocument surfaces rendered by @praxisui/rich-content.\n - steps[].widgets is reserved for advanced embedded components that do not have a canonical rich-content representation.\n - appearance.tokens is a free-form map; host may validate/sanitize.\n - When editing steps[].form.config.fieldMetadata, use FieldMetadata base if no controlType catalog exists.\n",
|
|
2068
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-stepper/src/lib/ai/stepper-ai-capabilities.ts",
|
|
2069
|
+
"contentHash": "b54dccb3bc67e250cbe279708f7a01617fe1c9f4742fee36c092541ddebc0d8a",
|
|
2070
|
+
"sourceKind": "component_definition",
|
|
2071
|
+
"sourceId": "praxis-stepper",
|
|
2072
|
+
"corpusVersion": "1.0.0"
|
|
2073
|
+
},
|
|
2074
|
+
{
|
|
2075
|
+
"chunkIndex": 2,
|
|
2076
|
+
"chunkKind": "authoring_manifest",
|
|
2077
|
+
"content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-stepper\",\n \"ownerPackage\": \"@praxisui/stepper\",\n \"configSchemaId\": \"StepperMetadata\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"config\",\n \"type\": \"StepperMetadata\",\n \"description\": \"Canonical multi-step flow configuration.\"\n },\n {\n \"name\": \"stepperId\",\n \"type\": \"string\",\n \"description\": \"Stable id used to derive stepper config persistence scope.\"\n },\n {\n \"name\": \"componentInstanceId\",\n \"type\": \"string\",\n \"description\": \"Optional instance discriminator for persistence scope.\"\n },\n {\n \"name\": \"selectedIndex\",\n \"type\": \"number\",\n \"description\": \"Selected step index, compatible with two-way binding.\"\n },\n {\n \"name\": \"serverValidate\",\n \"type\": \"function\",\n \"description\": \"Optional host-owned async validation gate for step progression.\"\n },\n {\n \"name\": \"stepperContext\",\n \"type\": \"Record<string, any>\",\n \"description\": \"Context passed to nested widgets and rich content.\"\n },\n {\n \"name\": \"enableCustomization\",\n \"type\": \"boolean\",\n \"description\": \"Enables Settings Panel authoring surfaces.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"step\",\n \"resolver\": \"step-by-id-or-label\",\n \"description\": \"A step in config.steps[].\"\n },\n {\n \"kind\": \"stepLabel\",\n \"resolver\": \"step-by-id-or-label\",\n \"description\": \"The visible label of a step.\"\n },\n {\n \"kind\": \"stepContent\",\n \"resolver\": \"step-content-by-id\",\n \"description\": \"Dynamic form, rich content or advanced widgets hosted inside a step.\"\n },\n {\n \"kind\": \"navigation\",\n \"resolver\": \"stepper-navigation-config\",\n \"description\": \"Footer navigation labels, icons, variant, alignment and visibility.\"\n },\n {\n \"kind\": \"completionRule\",\n \"resolver\": \"step-by-id-or-label\",\n \"description\": \"Optional/completed/error state metadata for a step.\"\n },\n {\n \"kind\": \"validationGate\",\n \"resolver\": \"step-validation-by-id\",\n \"description\": \"Validation gate that controls linear navigation and remote validation delegation.\"\n },\n {\n \"kind\": \"orientation\",\n \"resolver\": \"stepper-layout-config\",\n \"description\": \"Stepper orientation, header position and label position.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"step.add\",\n \"title\": \"Add step\",\n \"scope\": \"global\",\n \"targetKind\": \"step\",\n \"target\": {\n \"kind\": \"step\",\n \"resolver\": \"steps-array\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"id\",\n \"label\"\n ],\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"optional\": {\n \"type\": \"boolean\"\n },\n \"editable\": {\n \"type\": \"boolean\"\n },\n \"completed\": {\n \"type\": \"boolean\"\n },\n \"hasError\": {\n \"type\": \"boolean\"\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"stateIcon\": {\n \"type\": \"string\"\n },\n \"errorMessage\": {\n \"type\": \"string\"\n },\n \"ariaLabel\": {\n \"type\": \"string\"\n },\n \"ariaLabelledby\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\"\n },\n \"stepBlocksBeforeForm\": {\n \"type\": \"object\"\n },\n \"stepBlocksAfterForm\": {\n \"type\": \"object\"\n },\n \"widgets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"append-unique\",\n \"path\": \"steps[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-id-unique\",\n \"step-order-deterministic\",\n \"step-content-valid\"\n ],\n \"affectedPaths\": [\n \"steps[]\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"step.remove\",\n \"title\": \"Remove step\",\n \"scope\": \"layout\",\n \"targetKind\": \"step\",\n \"target\": {\n \"kind\": \"step\",\n \"resolver\": \"step-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacementStepId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"stepper-step-remove\",\n \"handlerContract\": {\n \"reads\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"writes\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"identityKeys\": [\n \"steps[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"replacementStepId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"step-not-found\",\n \"replacement-step-not-found\",\n \"content-removal-not-confirmed\"\n ],\n \"description\": \"Removes the target step by stable id and recomputes selectedIndex to preserve deterministic navigation state.\"\n }\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"step-exists\",\n \"selected-step-removal-safe\",\n \"step-content-removal-confirmed\"\n ],\n \"affectedPaths\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"step.label.set\",\n \"title\": \"Set step label\",\n \"scope\": \"layout\",\n \"targetKind\": \"stepLabel\",\n \"target\": {\n \"kind\": \"stepLabel\",\n \"resolver\": \"step-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"label\"\n ],\n \"properties\": {\n \"label\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"steps[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-exists\",\n \"step-label-valid\"\n ],\n \"affectedPaths\": [\n \"steps[].label\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n },\n {\n \"operationId\": \"step.order.set\",\n \"title\": \"Reorder steps\",\n \"scope\": \"layout\",\n \"targetKind\": \"step\",\n \"target\": {\n \"kind\": \"step\",\n \"resolver\": \"step-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"beforeStepId\"\n ],\n \"properties\": {\n \"beforeStepId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"stepper-step-reorder\",\n \"handlerContract\": {\n \"reads\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"writes\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"identityKeys\": [\n \"steps[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"beforeStepId\"\n ],\n \"properties\": {\n \"beforeStepId\": {\n \"type\": \"string\"\n }\n }\n },\n \"failureModes\": [\n \"step-not-found\",\n \"before-step-not-found\",\n \"ambiguous-step-target\"\n ],\n \"description\": \"Moves the target step before another stable step id and recomputes selectedIndex by preserving selected step identity.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-exists\",\n \"step-order-deterministic\",\n \"selected-index-preserved\"\n ],\n \"affectedPaths\": [\n \"steps[]\",\n \"selectedIndex\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n },\n {\n \"operationId\": \"step.optional.set\",\n \"title\": \"Set optional state\",\n \"scope\": \"interaction\",\n \"targetKind\": \"completionRule\",\n \"target\": {\n \"kind\": \"completionRule\",\n \"resolver\": \"step-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"optional\"\n ],\n \"properties\": {\n \"optional\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"steps[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-exists\",\n \"completion-rule-compatible\"\n ],\n \"affectedPaths\": [\n \"steps[].optional\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n },\n {\n \"operationId\": \"step.completed.set\",\n \"title\": \"Set completed state\",\n \"scope\": \"interaction\",\n \"targetKind\": \"completionRule\",\n \"target\": {\n \"kind\": \"completionRule\",\n \"resolver\": \"step-by-id-or-label\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"completed\"\n ],\n \"properties\": {\n \"completed\": {\n \"type\": \"boolean\"\n },\n \"hasError\": {\n \"type\": \"boolean\"\n },\n \"errorMessage\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"steps[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-exists\",\n \"completion-rule-compatible\",\n \"linear-completion-safe\"\n ],\n \"affectedPaths\": [\n \"steps[].completed\",\n \"steps[].hasError\",\n \"steps[].errorMessage\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n },\n {\n \"operationId\": \"navigation.mode.set\",\n \"title\": \"Set navigation mode\",\n \"scope\": \"interaction\",\n \"targetKind\": \"navigation\",\n \"target\": {\n \"kind\": \"navigation\",\n \"resolver\": \"stepper-navigation-config\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"properties\": {\n \"linear\": {\n \"type\": \"boolean\"\n },\n \"visible\": {\n \"type\": \"boolean\"\n },\n \"prevLabel\": {\n \"type\": \"string\"\n },\n \"nextLabel\": {\n \"type\": \"string\"\n },\n \"prevIcon\": {\n \"type\": \"string\"\n },\n \"nextIcon\": {\n \"type\": \"string\"\n },\n \"variant\": {\n \"enum\": [\n \"basic\",\n \"flat\",\n \"stroked\",\n \"raised\"\n ]\n },\n \"color\": {\n \"enum\": [\n \"primary\",\n \"accent\",\n \"warn\"\n ]\n },\n \"align\": {\n \"enum\": [\n \"start\",\n \"center\",\n \"end\",\n \"space-between\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"navigation\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"linear\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"navigation-values-valid\",\n \"linear-navigation-valid\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"navigation.visible\",\n \"navigation.prevLabel\",\n \"navigation.nextLabel\",\n \"navigation.prevIcon\",\n \"navigation.nextIcon\",\n \"navigation.variant\",\n \"navigation.color\",\n \"navigation.align\",\n \"linear\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"orientation.set\",\n \"title\": \"Set orientation\",\n \"scope\": \"layout\",\n \"targetKind\": \"orientation\",\n \"target\": {\n \"kind\": \"orientation\",\n \"resolver\": \"stepper-layout-config\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"orientation\"\n ],\n \"properties\": {\n \"orientation\": {\n \"enum\": [\n \"horizontal\",\n \"vertical\"\n ]\n },\n \"headerPosition\": {\n \"enum\": [\n \"top\",\n \"bottom\"\n ]\n },\n \"labelPosition\": {\n \"enum\": [\n \"bottom\",\n \"end\"\n ]\n },\n \"density\": {\n \"enum\": [\n \"default\",\n \"comfortable\",\n \"compact\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"orientation\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"headerPosition\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"labelPosition\"\n },\n {\n \"kind\": \"set-value\",\n \"path\": \"density\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"orientation-values-valid\",\n \"label-position-compatible\",\n \"editor-runtime-round-trip\"\n ],\n \"affectedPaths\": [\n \"orientation\",\n \"headerPosition\",\n \"labelPosition\",\n \"density\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"validation.rule.add\",\n \"title\": \"Add validation rule\",\n \"scope\": \"rule\",\n \"targetKind\": \"validationGate\",\n \"target\": {\n \"kind\": \"validationGate\",\n \"resolver\": \"step-validation-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"stepId\",\n \"rule\"\n ],\n \"properties\": {\n \"stepId\": {\n \"type\": \"string\"\n },\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"childComponentId\": {\n \"type\": \"string\"\n },\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"remote\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"stepper-validation-rule-upsert\",\n \"handlerContract\": {\n \"reads\": [\n \"steps[]\",\n \"steps[].form\",\n \"steps[].form.config\",\n \"steps[].widgets\",\n \"linear\"\n ],\n \"writes\": [\n \"steps[].form.config\",\n \"steps[].form.config.sections\",\n \"steps[].form.config.fieldMetadata\",\n \"steps[].hasError\",\n \"steps[].errorMessage\"\n ],\n \"identityKeys\": [\n \"steps[].id\",\n \"steps[].form.formId\",\n \"steps[].widgets[].id\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"stepId\",\n \"rule\"\n ],\n \"properties\": {\n \"stepId\": {\n \"type\": \"string\"\n },\n \"fieldName\": {\n \"type\": \"string\"\n },\n \"childComponentId\": {\n \"type\": \"string\"\n },\n \"rule\": {\n \"type\": \"object\"\n },\n \"message\": {\n \"type\": \"string\"\n },\n \"remote\": {\n \"type\": \"boolean\"\n }\n }\n },\n \"failureModes\": [\n \"step-not-found\",\n \"validation-target-not-found\",\n \"dynamic-form-config-missing\",\n \"remote-validation-requires-host-serverValidate\"\n ],\n \"description\": \"Projects a validation rule into the step dynamic-form config or delegates it to the host serverValidate gate without redefining child component contracts.\"\n }\n }\n ],\n \"validators\": [\n \"step-exists\",\n \"validation-rule-target-exists\",\n \"validation-rule-compatible\",\n \"server-validation-delegated\"\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"affectedPaths\": [\n \"steps[].form.config\",\n \"steps[].form.config.sections\",\n \"steps[].form.config.fieldMetadata\",\n \"steps[].hasError\",\n \"steps[].errorMessage\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n },\n {\n \"operationId\": \"step.content.set\",\n \"title\": \"Set step content\",\n \"scope\": \"layout\",\n \"targetKind\": \"stepContent\",\n \"target\": {\n \"kind\": \"stepContent\",\n \"resolver\": \"step-content-by-id\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"id\": {\n \"type\": \"string\"\n },\n \"label\": {\n \"type\": \"string\"\n },\n \"description\": {\n \"type\": \"string\"\n },\n \"optional\": {\n \"type\": \"boolean\"\n },\n \"editable\": {\n \"type\": \"boolean\"\n },\n \"completed\": {\n \"type\": \"boolean\"\n },\n \"hasError\": {\n \"type\": \"boolean\"\n },\n \"state\": {\n \"type\": \"string\"\n },\n \"stateIcon\": {\n \"type\": \"string\"\n },\n \"errorMessage\": {\n \"type\": \"string\"\n },\n \"form\": {\n \"type\": \"object\"\n },\n \"stepBlocksBeforeForm\": {\n \"type\": \"object\"\n },\n \"stepBlocksAfterForm\": {\n \"type\": \"object\"\n },\n \"widgets\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\"\n }\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-by-key\",\n \"path\": \"steps[]\",\n \"key\": \"id\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"step-exists\",\n \"step-content-valid\",\n \"nested-widget-contract-delegated\"\n ],\n \"affectedPaths\": [\n \"steps[].form\",\n \"steps[].stepBlocksBeforeForm\",\n \"steps[].stepBlocksAfterForm\",\n \"steps[].widgets\"\n ],\n \"submissionImpact\": \"affects-schema-backed-data\",\n \"preconditions\": [\n \"config-initialized\",\n \"target-step-exists\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"step-id-unique\",\n \"level\": \"error\",\n \"code\": \"PSTEP001\",\n \"description\": \"Step ids must be unique and stable within config.steps[].\"\n },\n {\n \"validatorId\": \"step-exists\",\n \"level\": \"error\",\n \"code\": \"PSTEP002\",\n \"description\": \"Target step must exist before applying the operation.\"\n },\n {\n \"validatorId\": \"step-order-deterministic\",\n \"level\": \"error\",\n \"code\": \"PSTEP003\",\n \"description\": \"Step ordering must use stable ids, not transient array index as identity.\"\n },\n {\n \"validatorId\": \"step-content-valid\",\n \"level\": \"error\",\n \"code\": \"PSTEP004\",\n \"description\": \"Step content must remain valid Dynamic Form config, RichContentDocument or WidgetDefinition[] metadata.\"\n },\n {\n \"validatorId\": \"step-content-removal-confirmed\",\n \"level\": \"error\",\n \"code\": \"PSTEP005\",\n \"description\": \"Removing a step with form, rich content or widgets is destructive and requires confirmation.\"\n },\n {\n \"validatorId\": \"selected-step-removal-safe\",\n \"level\": \"error\",\n \"code\": \"PSTEP006\",\n \"description\": \"Removing the selected step requires a deterministic replacement selected index or explicit confirmation.\"\n },\n {\n \"validatorId\": \"selected-index-preserved\",\n \"level\": \"warning\",\n \"code\": \"PSTEP007\",\n \"description\": \"Reordering steps must preserve selected step identity and only recompute selectedIndex after resolution.\"\n },\n {\n \"validatorId\": \"step-label-valid\",\n \"level\": \"error\",\n \"code\": \"PSTEP008\",\n \"description\": \"Step labels must be non-empty text values after localization/domain projection.\"\n },\n {\n \"validatorId\": \"completion-rule-compatible\",\n \"level\": \"error\",\n \"code\": \"PSTEP009\",\n \"description\": \"Optional, completed, hasError and errorMessage flags must remain compatible with Material stepper semantics.\"\n },\n {\n \"validatorId\": \"linear-completion-safe\",\n \"level\": \"warning\",\n \"code\": \"PSTEP010\",\n \"description\": \"Forcing completion in linear mode should not bypass invalid Dynamic Form or server validation gates.\"\n },\n {\n \"validatorId\": \"navigation-values-valid\",\n \"level\": \"error\",\n \"code\": \"PSTEP011\",\n \"description\": \"Navigation labels, icons, variant, color and alignment must match StepperMetadata enums and runtime bindings.\"\n },\n {\n \"validatorId\": \"linear-navigation-valid\",\n \"level\": \"error\",\n \"code\": \"PSTEP012\",\n \"description\": \"Linear navigation depends on form validity and must not be replaced by host-local navigation rules.\"\n },\n {\n \"validatorId\": \"orientation-values-valid\",\n \"level\": \"error\",\n \"code\": \"PSTEP013\",\n \"description\": \"Orientation, headerPosition, labelPosition and density values must match StepperMetadata enums.\"\n },\n {\n \"validatorId\": \"label-position-compatible\",\n \"level\": \"warning\",\n \"code\": \"PSTEP014\",\n \"description\": \"labelPosition only affects horizontal steppers and must round-trip without corrupting vertical layout.\"\n },\n {\n \"validatorId\": \"validation-rule-target-exists\",\n \"level\": \"error\",\n \"code\": \"PSTEP015\",\n \"description\": \"Validation rules must reference an existing field inside the step form or an existing child widget/component.\"\n },\n {\n \"validatorId\": \"validation-rule-compatible\",\n \"level\": \"error\",\n \"code\": \"PSTEP016\",\n \"description\": \"Validation rules must compile into Dynamic Form metadata or host serverValidate delegation without inventing a parallel stepper rule DSL.\"\n },\n {\n \"validatorId\": \"server-validation-delegated\",\n \"level\": \"info\",\n \"code\": \"PSTEP017\",\n \"description\": \"Remote validation remains delegated to the serverValidate input and is not implemented as hidden stepper metadata.\"\n },\n {\n \"validatorId\": \"nested-widget-contract-delegated\",\n \"level\": \"info\",\n \"code\": \"PSTEP018\",\n \"description\": \"Nested widget content remains governed by the child component contract and widgetEvent path delegation.\"\n },\n {\n \"validatorId\": \"editor-runtime-round-trip\",\n \"level\": \"error\",\n \"code\": \"PSTEP019\",\n \"description\": \"Settings Panel editor, runtime and registry projection must preserve step ids, order, navigation and validation intent.\"\n }\n ],\n \"roundTripRequirements\": [\n \"Operations must preserve stable step ids; array index may be used only as a resolver fallback, never as canonical identity.\",\n \"Settings Panel editor, runtime persistence and registry projection must round-trip StepperMetadata without losing step ids, order or selectedIndex.\",\n \"Validation authoring must target Dynamic Form metadata or the host-owned serverValidate gate; the stepper manifest must not define a parallel validation DSL.\",\n \"Nested widgets remain delegated through WidgetDefinition and widgetEvent path enrichment instead of being redefined by the stepper contract.\",\n \"Removing a step with form, rich content or widgets requires explicit confirmation because it can delete nested authoring content.\"\n ],\n \"examples\": [\n {\n \"id\": \"add-review-step\",\n \"request\": \"Add a review step after the documents step.\",\n \"operationId\": \"step.add\",\n \"params\": {\n \"id\": \"review\",\n \"label\": \"Review\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"rename-profile-step\",\n \"request\": \"Rename the profile step to Customer profile.\",\n \"operationId\": \"step.label.set\",\n \"target\": \"profile\",\n \"params\": {\n \"label\": \"Customer profile\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"move-confirm-before-submit\",\n \"request\": \"Move confirm before submit.\",\n \"operationId\": \"step.order.set\",\n \"target\": \"confirm\",\n \"params\": {\n \"beforeStepId\": \"submit\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"make-upload-optional\",\n \"request\": \"Make the upload step optional.\",\n \"operationId\": \"step.optional.set\",\n \"target\": \"upload\",\n \"params\": {\n \"optional\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-linear-navigation\",\n \"request\": \"Use linear navigation with Back and Continue labels.\",\n \"operationId\": \"navigation.mode.set\",\n \"params\": {\n \"linear\": true,\n \"prevLabel\": \"Back\",\n \"nextLabel\": \"Continue\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"switch-vertical-layout\",\n \"request\": \"Make the stepper vertical.\",\n \"operationId\": \"orientation.set\",\n \"params\": {\n \"orientation\": \"vertical\",\n \"headerPosition\": \"top\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"require-email-on-profile\",\n \"request\": \"Require email before continuing from profile.\",\n \"operationId\": \"validation.rule.add\",\n \"target\": \"profile\",\n \"params\": {\n \"stepId\": \"profile\",\n \"fieldName\": \"email\",\n \"rule\": {\n \"required\": true\n },\n \"message\": \"Email is required\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-duplicate-step-id\",\n \"request\": \"Add another step with id review.\",\n \"operationId\": \"step.add\",\n \"params\": {\n \"id\": \"review\",\n \"label\": \"Duplicate review\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"confirm-remove-content-step\",\n \"request\": \"Remove the documents step that contains an upload widget.\",\n \"operationId\": \"step.remove\",\n \"target\": \"documents\",\n \"params\": {\n \"replacementStepId\": \"review\"\n },\n \"isPositive\": true\n }\n ]\n}",
|
|
2078
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-stepper/src/lib/ai/praxis-stepper-authoring-manifest.ts",
|
|
2079
|
+
"contentHash": "383c96e0499ae3e38eaa0cbe599351de5be83ca5bdf0daaf3d8558a88c848eed",
|
|
2080
|
+
"sourceKind": "component_definition",
|
|
2081
|
+
"sourceId": "praxis-stepper",
|
|
2082
|
+
"corpusVersion": "1.0.0"
|
|
2083
|
+
},
|
|
2084
|
+
{
|
|
2085
|
+
"chunkIndex": 3,
|
|
2086
|
+
"chunkKind": "context_pack",
|
|
2087
|
+
"content": "{\n \"componentContext\": {\n \"version\": \"v1\",\n \"optionsByPath\": {\n \"orientation\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"horizontal\",\n \"label\": \"Horizontal\"\n },\n {\n \"value\": \"vertical\",\n \"label\": \"Vertical\"\n }\n ]\n },\n \"headerPosition\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"top\",\n \"label\": \"Top\"\n },\n {\n \"value\": \"bottom\",\n \"label\": \"Bottom\"\n }\n ]\n },\n \"labelPosition\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"bottom\",\n \"label\": \"Bottom\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n }\n ]\n },\n \"density\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"default\",\n \"label\": \"Default\"\n },\n {\n \"value\": \"comfortable\",\n \"label\": \"Comfortable\"\n },\n {\n \"value\": \"compact\",\n \"label\": \"Compact\"\n }\n ]\n },\n \"color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"navigation.variant\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"basic\",\n \"label\": \"Basic\"\n },\n {\n \"value\": \"flat\",\n \"label\": \"Flat\"\n },\n {\n \"value\": \"stroked\",\n \"label\": \"Stroked\"\n },\n {\n \"value\": \"raised\",\n \"label\": \"Raised\"\n }\n ]\n },\n \"navigation.align\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"start\",\n \"label\": \"Start\"\n },\n {\n \"value\": \"center\",\n \"label\": \"Center\"\n },\n {\n \"value\": \"end\",\n \"label\": \"End\"\n },\n {\n \"value\": \"space-between\",\n \"label\": \"Space between\"\n }\n ]\n },\n \"navigation.color\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"primary\",\n \"label\": \"Primary\"\n },\n {\n \"value\": \"accent\",\n \"label\": \"Accent\"\n },\n {\n \"value\": \"warn\",\n \"label\": \"Warn\"\n }\n ]\n },\n \"steps[].form.mode\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"create\",\n \"label\": \"Create\"\n },\n {\n \"value\": \"edit\",\n \"label\": \"Edit\"\n },\n {\n \"value\": \"view\",\n \"label\": \"View\"\n }\n ]\n },\n \"steps[].form.schemaSource\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"resource\",\n \"label\": \"Resource\"\n },\n {\n \"value\": \"filter\",\n \"label\": \"Filter\"\n }\n ]\n },\n \"appearance.iconsSet\": {\n \"mode\": \"enum\",\n \"options\": [\n {\n \"value\": \"material-symbols-outlined\",\n \"label\": \"Outlined\"\n },\n {\n \"value\": \"material-symbols-rounded\",\n \"label\": \"Rounded\"\n },\n {\n \"value\": \"material-symbols-sharp\",\n \"label\": \"Sharp\"\n }\n ]\n }\n },\n \"actionCatalog\": [\n {\n \"id\": \"orientation.set\",\n \"intentExamples\": [\n \"orientation\",\n \"horizontal\",\n \"vertical\"\n ],\n \"patchTemplate\": {\n \"orientation\": \"{{value}}\"\n }\n },\n {\n \"id\": \"headerPosition.set\",\n \"intentExamples\": [\n \"header position\",\n \"header\"\n ],\n \"patchTemplate\": {\n \"headerPosition\": \"{{value}}\"\n }\n },\n {\n \"id\": \"labelPosition.set\",\n \"intentExamples\": [\n \"label position\",\n \"label align\"\n ],\n \"patchTemplate\": {\n \"labelPosition\": \"{{value}}\"\n }\n },\n {\n \"id\": \"density.set\",\n \"intentExamples\": [\n \"density\",\n \"compact\",\n \"comfortable\"\n ],\n \"patchTemplate\": {\n \"density\": \"{{value}}\"\n }\n },\n {\n \"id\": \"color.set\",\n \"intentExamples\": [\n \"color\",\n \"theme color\"\n ],\n \"patchTemplate\": {\n \"color\": \"{{value}}\"\n }\n },\n {\n \"id\": \"linear.enable\",\n \"intentExamples\": [\n \"linear\",\n \"sequential\",\n \"require order\"\n ],\n \"patchTemplate\": {\n \"linear\": true\n }\n },\n {\n \"id\": \"linear.disable\",\n \"intentExamples\": [\n \"non linear\",\n \"free navigation\"\n ],\n \"patchTemplate\": {\n \"linear\": false\n }\n },\n {\n \"id\": \"selectedIndex.set\",\n \"intentExamples\": [\n \"select step\",\n \"active step\",\n \"selected index\"\n ],\n \"patchTemplate\": {\n \"selectedIndex\": \"{{value}}\"\n }\n },\n {\n \"id\": \"navigation.visible.enable\",\n \"intentExamples\": [\n \"show navigation\",\n \"show buttons\"\n ],\n \"patchTemplate\": {\n \"navigation\": {\n \"visible\": true\n }\n }\n },\n {\n \"id\": \"navigation.visible.disable\",\n \"intentExamples\": [\n \"hide navigation\",\n \"hide buttons\"\n ],\n \"patchTemplate\": {\n \"navigation\": {\n \"visible\": false\n }\n }\n },\n {\n \"id\": \"navigation.labels.set\",\n \"intentExamples\": [\n \"next label\",\n \"previous label\",\n \"navigation labels\"\n ],\n \"patchTemplate\": {\n \"navigation\": {\n \"prevLabel\": \"{{params.prev}}\",\n \"nextLabel\": \"{{params.next}}\"\n }\n }\n },\n {\n \"id\": \"step.add\",\n \"intentExamples\": [\n \"add step\",\n \"new step\",\n \"create step\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"step.label.set\",\n \"intentExamples\": [\n \"rename step\",\n \"step label\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"label\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"step.description.set\",\n \"intentExamples\": [\n \"step description\",\n \"description\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"description\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"step.optional.enable\",\n \"intentExamples\": [\n \"optional step\",\n \"not required\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"optional\": true\n }\n ]\n }\n },\n {\n \"id\": \"step.optional.disable\",\n \"intentExamples\": [\n \"required step\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"optional\": false\n }\n ]\n }\n },\n {\n \"id\": \"step.completed.set\",\n \"intentExamples\": [\n \"mark completed\",\n \"completed step\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"completed\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"step.error.set\",\n \"intentExamples\": [\n \"mark error\",\n \"step error\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"hasError\": \"{{value}}\"\n }\n ]\n }\n },\n {\n \"id\": \"step.form.resourcePath.set\",\n \"intentExamples\": [\n \"form resource\",\n \"resource path\",\n \"step form\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"form\": {\n \"resourcePath\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"step.form.mode.set\",\n \"intentExamples\": [\n \"form mode\",\n \"create mode\",\n \"edit mode\",\n \"view mode\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"form\": {\n \"mode\": \"{{value}}\"\n }\n }\n ]\n }\n },\n {\n \"id\": \"step.form.formId.set\",\n \"intentExamples\": [\n \"form id\",\n \"form reference\"\n ],\n \"patchTemplate\": {\n \"steps\": [\n {\n \"id\": \"{{target}}\",\n \"form\": {\n \"formId\": \"{{value}}\"\n }\n }\n ]\n }\n }\n ],\n \"fieldResolvers\": {\n \"steps[]\": [\n \"id\",\n \"label\"\n ]\n },\n \"hints\": [\n \"Use steps[].id or steps[].label as merge keys; avoid array indexes.\",\n \"Step form config merges by id; avoid replacing entire steps array.\",\n \"Selected index expects a zero-based number.\",\n \"DOC: Widget purpose: stepper with ordered steps and optional per-step forms.\",\n \"DOC: Host inputs: stepperId (required) and config (optional).\",\n \"DOC: When config is provided, steps[] should be present; each step requires label.\",\n \"DOC: Optional step.form embeds a dynamic form; use form.resourcePath + form.config as needed.\"\n ]\n }\n}",
|
|
2088
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-stepper/src/lib/ai/stepper-context-pack.ts",
|
|
2089
|
+
"contentHash": "a4d489c116c40e41705d3031a094689eb1fe872a7e774abc93f5800ab8acdcdb",
|
|
2090
|
+
"sourceKind": "component_definition",
|
|
2091
|
+
"sourceId": "praxis-stepper",
|
|
2092
|
+
"corpusVersion": "1.0.0"
|
|
2093
|
+
},
|
|
2094
|
+
{
|
|
2095
|
+
"chunkIndex": 4,
|
|
2096
|
+
"chunkKind": "recipe",
|
|
2097
|
+
"content": "{\n \"_comment\": \"Wizard avançado com stepper e formulários dinâmicos (Acesso > Conta > Preferências).\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-stepper\",\n \"variantId\": \"advanced-wizard\",\n \"useWhen\": \"Criar um wizard avançado de onboarding com conteúdo editorial e CTA sticky.\",\n \"examplePrompts\": [\n \"wizard avançado em três passos\",\n \"cadastro guiado com preferências\"\n ]\n },\n \"id\": \"advanced-onboarding-wizard\",\n \"brand\": \"PRAXIS UI\",\n \"progress\": {\n \"variant\": \"line\",\n \"showLabels\": true,\n \"labelPosition\": \"bottom\"\n },\n \"cta\": {\n \"label\": \"Continuar\",\n \"action\": \"next\",\n \"secondaryLabel\": \"Voltar\",\n \"secondaryAction\": \"prev\",\n \"sticky\": true\n },\n \"preferences\": {\n \"stepId\": \"preferences\",\n \"storageKey\": \"praxis:advanced-wizard\",\n \"persistFields\": [\"novidadesProduto\", \"eventosConteudo\", \"recomendacoes\"]\n },\n \"theme\": {\n \"praxis-wizard-card-bg\": \"#fff7ef\",\n \"md-sys-color-surface\": \"#fff7ef\",\n \"md-sys-color-on-surface\": \"#33302e\",\n \"praxis-wizard-accent\": \"#0d7680\",\n \"praxis-wizard-border\": \"#cfcfcf\",\n \"md-sys-color-outline-variant\": \"#cfcfcf\",\n \"ft-font-head\": \"Georgia, \\\"Times New Roman\\\", serif\",\n \"ft-font-body\": \"\\\"Source Sans 3\\\", \\\"Segoe UI\\\", Arial, sans-serif\",\n \"ft-radius\": \"0\",\n \"ft-shadow\": \"none\",\n \"ft-header-border\": \"1px solid #cfcfcf\"\n },\n \"steps\": [\n {\n \"id\": \"access\",\n \"label\": \"Acesso\",\n \"title\": \"Crie sua conta\",\n \"subtitle\": \"Ative seu acesso em poucos passos e personalize a experiência desde o início.\",\n \"zones\": {\n \"intro\": [\n {\n \"type\": \"benefitsGrid\",\n \"title\": \"Por que se cadastrar?\",\n \"columns\": 4,\n \"boxed\": true,\n \"items\": [\n {\n \"icon\": \"format_quote\",\n \"title\": \"Conteúdo relevante\",\n \"text\": \"Receba atualizações, novidades e materiais selecionados para o seu perfil.\"\n },\n {\n \"icon\": \"edit_note\",\n \"title\": \"Fluxo guiado\",\n \"text\": \"Conclua o cadastro com uma jornada simples, clara e orientada por etapas.\"\n },\n {\n \"icon\": \"bookmarks\",\n \"title\": \"Preferências salvas\",\n \"text\": \"Defina suas escolhas iniciais e retome o processo sem perder o progresso.\"\n },\n {\n \"icon\": \"mail\",\n \"title\": \"Comunicação sob controle\",\n \"text\": \"Escolha como deseja receber novidades, alertas e recomendações.\"\n }\n ]\n }\n ],\n \"footer\": [\n {\n \"type\": \"inlineNotice\",\n \"text\": \"Ao continuar, você concorda com os termos de uso e com a política de privacidade da plataforma.\"\n }\n ]\n },\n \"cta\": {\n \"label\": \"Começar cadastro\",\n \"action\": \"next\"\n },\n \"form\": {\n \"config\": {\n \"sections\": [\n {\n \"id\": \"access-section\",\n \"rows\": [\n {\n \"columns\": [\n {\n \"fields\": [\"confirmAge\", \"receberNovidades\"]\n }\n ]\n }\n ]\n }\n ],\n \"fieldMetadata\": [\n {\n \"name\": \"confirmAge\",\n \"label\": \"\",\n \"controlType\": \"checkbox\",\n \"required\": true,\n \"layout\": \"horizontal\",\n \"options\": [\n {\n \"label\": \"Confirmo que li e aceito os termos de uso e a política de privacidade.\",\n \"value\": true\n }\n ]\n },\n {\n \"name\": \"receberNovidades\",\n \"label\": \"Receber novidades por e-mail\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true,\n \"hint\": \"Você pode alterar essa preferência a qualquer momento nas configurações da conta.\"\n }\n ],\n \"actions\": {\n \"submit\": { \"visible\": false, \"label\": \"Salvar\" },\n \"cancel\": { \"visible\": false, \"label\": \"Cancelar\" },\n \"reset\": { \"visible\": false, \"label\": \"Limpar\" }\n }\n }\n }\n },\n {\n \"id\": \"account\",\n \"label\": \"Conta\",\n \"title\": \"Configure seu acesso\",\n \"subtitle\": \"Esses dados serão usados para criar e proteger sua conta.\",\n \"zones\": {\n \"intro\": [\n {\n \"type\": \"inlineNotice\",\n \"text\": \"Use um e-mail válido para confirmar o cadastro e recuperar o acesso quando necessário.\",\n \"tone\": \"info\"\n }\n ],\n \"footer\": [\n {\n \"type\": \"inlineNotice\",\n \"text\": \"Mensagens de segurança e comunicações operacionais continuam ativas mesmo se você desativar novidades.\"\n }\n ]\n },\n \"form\": {\n \"config\": {\n \"sections\": [\n {\n \"id\": \"account-section\",\n \"rows\": [\n {\n \"columns\": [\n { \"fields\": [\"email\", \"password\"] },\n { \"fields\": [\"aceitaComunicacoes\"] }\n ]\n }\n ]\n }\n ],\n \"fieldMetadata\": [\n {\n \"name\": \"email\",\n \"label\": \"E-mail\",\n \"controlType\": \"email\",\n \"required\": true,\n \"placeholder\": \"Digite seu e-mail\"\n },\n {\n \"name\": \"password\",\n \"label\": \"Senha\",\n \"controlType\": \"password\",\n \"required\": true,\n \"placeholder\": \"Crie uma senha\",\n \"hint\": \"Use 8 ou mais caracteres, combinando letras, números e símbolos.\",\n \"validators\": {\n \"minLength\": 8\n },\n \"revealToggle\": {\n \"enabled\": true,\n \"style\": \"icon\",\n \"showLabel\": \"Mostrar senha\",\n \"hideLabel\": \"Ocultar senha\",\n \"ariaLabel\": \"Alternar visibilidade da senha\",\n \"iconShow\": \"visibility\",\n \"iconHide\": \"visibility_off\"\n }\n },\n {\n \"name\": \"aceitaComunicacoes\",\n \"label\": \"Receber comunicações da plataforma\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true,\n \"hint\": \"Inclui novidades de produto, convites para eventos e conteúdos de apoio.\"\n }\n ],\n \"actions\": {\n \"submit\": { \"visible\": false, \"label\": \"Salvar\" },\n \"cancel\": { \"visible\": false, \"label\": \"Cancelar\" },\n \"reset\": { \"visible\": false, \"label\": \"Limpar\" }\n }\n }\n }\n },\n {\n \"id\": \"preferences\",\n \"label\": \"Preferências\",\n \"title\": \"Personalize sua experiência\",\n \"subtitle\": \"Você pode alterar essas configurações a qualquer momento no painel da conta.\",\n \"description\": \"Escolha quais comunicações e recomendações fazem sentido para o seu contexto.\",\n \"zones\": {\n \"footer\": [\n {\n \"type\": \"divider\"\n },\n {\n \"type\": \"inlineNotice\",\n \"text\": \"Alertas de segurança e mensagens essenciais sobre a conta permanecem ativos para garantir a operação.\"\n }\n ]\n },\n \"cta\": {\n \"label\": \"Concluir cadastro\",\n \"action\": \"submit\",\n \"secondaryLabel\": \"Voltar\",\n \"secondaryAction\": \"prev\"\n },\n \"form\": {\n \"config\": {\n \"sections\": [\n {\n \"id\": \"prefs-section\",\n \"rows\": [\n {\n \"columns\": [\n { \"fields\": [\"novidadesProduto\"] },\n { \"fields\": [\"eventosConteudo\"] },\n { \"fields\": [\"recomendacoes\"] }\n ]\n }\n ]\n }\n ],\n \"fieldMetadata\": [\n {\n \"name\": \"novidadesProduto\",\n \"label\": \"Novidades de produto\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true,\n \"hint\": \"Receba lançamentos, melhorias e comunicados importantes sobre a plataforma.\"\n },\n {\n \"name\": \"eventosConteudo\",\n \"label\": \"Eventos e conteúdos especiais\",\n \"controlType\": \"toggle\",\n \"defaultValue\": true,\n \"hint\": \"Seja avisado sobre webinars, materiais técnicos e convites para trilhas de capacitação.\"\n },\n {\n \"name\": \"recomendacoes\",\n \"label\": \"Recomendações personalizadas\",\n \"controlType\": \"toggle\",\n \"defaultValue\": false,\n \"hint\": \"Receba sugestões de recursos e exemplos com base nas suas preferências de uso.\"\n }\n ],\n \"actions\": {\n \"submit\": { \"visible\": false, \"label\": \"Salvar\" },\n \"cancel\": { \"visible\": false, \"label\": \"Cancelar\" },\n \"reset\": { \"visible\": false, \"label\": \"Limpar\" }\n }\n }\n }\n }\n ]\n}\n",
|
|
2098
|
+
"sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-ft-wizard.json",
|
|
2099
|
+
"contentHash": "711201cf1f1729a1081b69e8276d5b0f25b562f41e4ac449f412dbe74aa23d2e",
|
|
2100
|
+
"sourceKind": "component_definition",
|
|
2101
|
+
"sourceId": "praxis-stepper",
|
|
2102
|
+
"corpusVersion": "1.0.0"
|
|
2103
|
+
},
|
|
2104
|
+
{
|
|
2105
|
+
"chunkIndex": 5,
|
|
2106
|
+
"chunkKind": "recipe",
|
|
2107
|
+
"content": "{\n \"_comment\": \"Recipe for the current @praxisui/stepper contract. Use steps[].form for Dynamic Form steps, stepBlocksBeforeForm/stepBlocksAfterForm for editorial rich content, and steps[].widgets only for real nested runtime widgets.\",\n \"templateMeta\": {\n \"registryKey\": \"praxis-stepper\",\n \"variantId\": \"onboarding-workflow\",\n \"useWhen\": \"Create a guided multi-step workflow with forms, rich content, nested widgets and event bubbling.\",\n \"examplePrompts\": [\n \"create an employee onboarding stepper\",\n \"show a stepper with a form step, upload step and approval checklist\",\n \"configure praxis-stepper with nested widgets\"\n ]\n },\n \"authoringGuidance\": [\n \"Use a stable stepperId for persistence and configuration editing.\",\n \"Use steps[].form.config for step-local Dynamic Form sections, fieldMetadata, validators and formRules.\",\n \"Use stepBlocksBeforeForm and stepBlocksAfterForm for copy, badges, notices and other editorial content.\",\n \"Use steps[].widgets only for runtime components such as praxis-files-upload or praxis-list.\",\n \"Do not use legacy steps[].content or icon-only fields as the source of runtime content.\"\n ],\n \"config\": {\n \"orientation\": \"horizontal\",\n \"linear\": true,\n \"labelPosition\": \"bottom\",\n \"selectedIndex\": 0,\n \"density\": \"comfortable\",\n \"appearance\": {\n \"preset\": \"ft-light\",\n \"icons\": {\n \"number\": \"radio_button_unchecked\",\n \"done\": \"check_circle\",\n \"edit\": \"edit_note\",\n \"error\": \"error\"\n }\n },\n \"navigation\": {\n \"visible\": true,\n \"prevLabel\": \"Back\",\n \"nextLabel\": \"Continue\",\n \"prevIcon\": \"arrow_back\",\n \"nextIcon\": \"arrow_forward\",\n \"variant\": \"stroked\",\n \"color\": \"primary\",\n \"align\": \"space-between\"\n },\n \"steps\": [\n {\n \"id\": \"employee-intake\",\n \"label\": \"Employee\",\n \"description\": \"Capture identity, assignment and workflow-only risk fields.\",\n \"editable\": true,\n \"stepBlocksBeforeForm\": {\n \"kind\": \"praxis.rich-content\",\n \"version\": \"1.0.0\",\n \"nodes\": [\n {\n \"type\": \"text\",\n \"text\": \"The step owns its local Dynamic Form config. Backend metadata can replace this config later without changing the Stepper host template.\"\n },\n { \"type\": \"badge\", \"label\": \"form rules\" },\n { \"type\": \"badge\", \"label\": \"validators\" }\n ]\n },\n \"form\": {\n \"mode\": \"create\",\n \"formId\": \"employee-onboarding-intake-form\",\n \"schemaSource\": \"resource\",\n \"config\": {\n \"metadata\": {\n \"name\": \"Employee onboarding intake\",\n \"version\": \"1.0.0\"\n },\n \"behavior\": {\n \"reactiveValidation\": true,\n \"reactiveValidationDebounceMs\": 200\n },\n \"sections\": [\n {\n \"id\": \"identity\",\n \"title\": \"Identity\",\n \"description\": \"Candidate identity and contact data.\",\n \"appearance\": \"outlined\",\n \"rows\": [\n {\n \"id\": \"identity-row\",\n \"columns\": [\n { \"id\": \"identity-main\", \"span\": { \"md\": 6, \"lg\": 6 }, \"fields\": [\"nomeCompleto\", \"email\"] },\n { \"id\": \"identity-contact\", \"span\": { \"md\": 6, \"lg\": 6 }, \"fields\": [\"telefone\", \"dataNascimento\"] }\n ]\n }\n ]\n },\n {\n \"id\": \"assignment\",\n \"title\": \"Assignment\",\n \"description\": \"Initial role and payroll policy.\",\n \"appearance\": \"outlined\",\n \"rows\": [\n {\n \"id\": \"assignment-row\",\n \"columns\": [\n { \"id\": \"assignment-main\", \"span\": { \"md\": 6, \"lg\": 6 }, \"fields\": [\"cargoId\", \"departamentoId\"] },\n { \"id\": \"assignment-payroll\", \"span\": { \"md\": 6, \"lg\": 6 }, \"fields\": [\"salario\", \"requiresSecurityReview\"] }\n ]\n }\n ]\n }\n ],\n \"fieldMetadata\": [\n {\n \"name\": \"nomeCompleto\",\n \"label\": \"Nome Completo\",\n \"controlType\": \"input\",\n \"validators\": { \"required\": true, \"minLength\": 3, \"maxLength\": 160 }\n },\n {\n \"name\": \"email\",\n \"label\": \"Email\",\n \"controlType\": \"email\",\n \"validators\": { \"required\": true, \"email\": true }\n },\n {\n \"name\": \"telefone\",\n \"label\": \"Telefone\",\n \"controlType\": \"phone\",\n \"validators\": { \"required\": true }\n },\n {\n \"name\": \"dataNascimento\",\n \"label\": \"Data de Nascimento\",\n \"controlType\": \"date\",\n \"validators\": { \"required\": true }\n },\n {\n \"name\": \"cargoId\",\n \"label\": \"Cargo\",\n \"controlType\": \"select\",\n \"validators\": { \"required\": true },\n \"options\": [\n { \"label\": \"Analista de Operacoes\", \"value\": \"analyst\" },\n { \"label\": \"Agente de Campo\", \"value\": \"field-agent\" },\n { \"label\": \"Diretor de P&D\", \"value\": \"director-rd\" }\n ]\n },\n {\n \"name\": \"departamentoId\",\n \"label\": \"Departamento\",\n \"controlType\": \"select\",\n \"validators\": { \"required\": true },\n \"options\": [\n { \"label\": \"Operacoes\", \"value\": \"operations\" },\n { \"label\": \"Pesquisa\", \"value\": \"research\" },\n { \"label\": \"Seguranca\", \"value\": \"security\" }\n ]\n },\n {\n \"name\": \"salario\",\n \"label\": \"Salario inicial\",\n \"controlType\": \"currency\",\n \"currencyCode\": \"BRL\",\n \"locale\": \"pt-BR\",\n \"validators\": { \"required\": true, \"min\": 1800 }\n },\n {\n \"name\": \"requiresSecurityReview\",\n \"label\": \"Requires security review\",\n \"controlType\": \"toggle\"\n }\n ]\n }\n }\n },\n {\n \"id\": \"evidence\",\n \"label\": \"Evidence\",\n \"description\": \"Collect supporting files through a nested Files Upload widget.\",\n \"optional\": true,\n \"widgets\": [\n {\n \"id\": \"praxis-files-upload\",\n \"inputs\": {\n \"filesUploadId\": \"employee-onboarding-evidence\",\n \"baseUrl\": \"/api/files\",\n \"displayMode\": \"compact\",\n \"config\": {\n \"strategy\": \"direct\",\n \"ui\": {\n \"showDropzone\": true,\n \"showConflictPolicySelector\": true,\n \"showMetadataForm\": true,\n \"showProgress\": true,\n \"manualUpload\": true\n },\n \"limits\": {\n \"maxFileSizeBytes\": 10485760,\n \"maxFilesPerBulk\": 4,\n \"maxBulkSizeBytes\": 31457280\n }\n }\n }\n }\n ]\n },\n {\n \"id\": \"approval\",\n \"label\": \"Approval\",\n \"description\": \"Review completion criteria before sending the workflow to the host.\",\n \"widgets\": [\n {\n \"id\": \"praxis-list\",\n \"inputs\": {\n \"listId\": \"employee-onboarding-approval-checklist\",\n \"config\": {\n \"dataSource\": {\n \"data\": [\n { \"id\": 1, \"title\": \"Identity fields validated\", \"owner\": \"People Ops\", \"status\": \"Required\", \"priority\": \"P0\" },\n { \"id\": 2, \"title\": \"Evidence attached or waived\", \"owner\": \"Hiring Manager\", \"status\": \"Required\", \"priority\": \"P0\" },\n { \"id\": 3, \"title\": \"Security review completed\", \"owner\": \"Security\", \"status\": \"Conditional\", \"priority\": \"P1\" }\n ]\n },\n \"selection\": {\n \"mode\": \"multiple\",\n \"compareBy\": \"id\",\n \"return\": \"id\"\n },\n \"templating\": {\n \"leading\": { \"type\": \"icon\", \"expr\": \"task_alt\" },\n \"primary\": { \"type\": \"text\", \"expr\": \"${item.title}\" },\n \"secondary\": { \"type\": \"text\", \"expr\": \"${item.owner}\" },\n \"meta\": { \"type\": \"chip\", \"expr\": \"${item.priority}\", \"variant\": \"filled\" },\n \"trailing\": { \"type\": \"chip\", \"expr\": \"${item.status}\", \"variant\": \"outlined\" }\n }\n }\n }\n }\n ]\n }\n ]\n },\n \"outputs\": {\n \"selectionChange\": \"emit\",\n \"selectedIndexChange\": \"emit\",\n \"stepFormReady\": \"emit\",\n \"stepFormValueChange\": \"emit\"\n }\n}\n",
|
|
2108
|
+
"sourcePointer": "praxis-ui-angular/examples/ai-recipes/praxis-stepper.json",
|
|
2109
|
+
"contentHash": "82b7552fd91871031da3faf7a73dd2cee5bee5c4167275350eb0aaf9a380ef44",
|
|
2110
|
+
"sourceKind": "component_definition",
|
|
2111
|
+
"sourceId": "praxis-stepper",
|
|
2112
|
+
"corpusVersion": "1.0.0"
|
|
2113
|
+
}
|
|
2114
|
+
]
|
|
2115
|
+
}
|
|
2116
|
+
},
|
|
2117
|
+
"note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
|
|
2118
|
+
}
|