@praxisui/expansion 9.0.0-beta.9 → 9.0.0-beta.90
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 +1923 -0
- package/fesm2022/praxisui-expansion.mjs +12 -13
- package/package.json +10 -6
|
@@ -0,0 +1,1923 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0.0",
|
|
3
|
+
"generatedAt": "2026-07-24T12:32:39.440Z",
|
|
4
|
+
"packageName": "@praxisui/expansion",
|
|
5
|
+
"packageVersion": "9.0.0-beta.90",
|
|
6
|
+
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
|
+
"sourceRegistryVersion": "1.0.0",
|
|
8
|
+
"componentCount": 1,
|
|
9
|
+
"components": {
|
|
10
|
+
"praxis-expansion": {
|
|
11
|
+
"id": "praxis-expansion",
|
|
12
|
+
"description": "Acordeão/Painéis de expansão configuráveis por metadata, com aparência e tokens M3.",
|
|
13
|
+
"inputs": [
|
|
14
|
+
{
|
|
15
|
+
"name": "config",
|
|
16
|
+
"type": "ExpansionMetadata",
|
|
17
|
+
"required": false,
|
|
18
|
+
"description": "Configuração JSON (acordeão, aparência e painéis)",
|
|
19
|
+
"label": "Configuração"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"name": "expansionId",
|
|
23
|
+
"type": "string",
|
|
24
|
+
"required": false,
|
|
25
|
+
"description": "Identificador para persistência (obrigatório)",
|
|
26
|
+
"label": "ID"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "componentInstanceId",
|
|
30
|
+
"type": "string",
|
|
31
|
+
"required": false,
|
|
32
|
+
"description": "Identificador opcional para múltiplas instâncias na mesma rota",
|
|
33
|
+
"label": "ID da instância"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "enableCustomization",
|
|
37
|
+
"type": "boolean",
|
|
38
|
+
"required": false,
|
|
39
|
+
"label": "Modo de customização",
|
|
40
|
+
"default": false
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "context",
|
|
44
|
+
"type": "Record<string, any>",
|
|
45
|
+
"required": false,
|
|
46
|
+
"label": "Contexto"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "strictValidation",
|
|
50
|
+
"type": "boolean",
|
|
51
|
+
"required": false,
|
|
52
|
+
"default": true
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "defaultOptions",
|
|
56
|
+
"type": "MatExpansionPanelDefaultOptions",
|
|
57
|
+
"required": false,
|
|
58
|
+
"label": "Opções padrão do painel"
|
|
59
|
+
}
|
|
60
|
+
],
|
|
61
|
+
"outputs": [
|
|
62
|
+
{
|
|
63
|
+
"name": "opened",
|
|
64
|
+
"type": "{ panelId?: string; panelIndex: number }",
|
|
65
|
+
"required": false,
|
|
66
|
+
"label": "Painel aberto"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"name": "closed",
|
|
70
|
+
"type": "{ panelId?: string; panelIndex: number }",
|
|
71
|
+
"required": false,
|
|
72
|
+
"label": "Painel fechado"
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "expandedChange",
|
|
76
|
+
"type": "{ panelId?: string; panelIndex: number; expanded: boolean }",
|
|
77
|
+
"required": false,
|
|
78
|
+
"label": "Alterou expansão"
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
"name": "afterExpand",
|
|
82
|
+
"type": "{ panelId?: string; panelIndex: number }",
|
|
83
|
+
"required": false,
|
|
84
|
+
"label": "Após expandir"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"name": "afterCollapse",
|
|
88
|
+
"type": "{ panelId?: string; panelIndex: number }",
|
|
89
|
+
"required": false,
|
|
90
|
+
"label": "Após colapsar"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"name": "destroyed",
|
|
94
|
+
"type": "{ panelId?: string; panelIndex: number }",
|
|
95
|
+
"required": false,
|
|
96
|
+
"label": "Destruído"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"name": "widgetEvent",
|
|
100
|
+
"type": "WidgetEventEnvelope",
|
|
101
|
+
"required": false,
|
|
102
|
+
"label": "Evento interno"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"configSchemaId": null,
|
|
106
|
+
"selector": "praxis-expansion",
|
|
107
|
+
"friendlyName": "Praxis Expansion Panel",
|
|
108
|
+
"icon": "unfold_more",
|
|
109
|
+
"tags": [
|
|
110
|
+
"widget",
|
|
111
|
+
"expansion",
|
|
112
|
+
"accordion",
|
|
113
|
+
"configurable"
|
|
114
|
+
],
|
|
115
|
+
"lib": "@praxisui/expansion",
|
|
116
|
+
"actions": [
|
|
117
|
+
{
|
|
118
|
+
"id": "panel-opened",
|
|
119
|
+
"label": "Painel aberto",
|
|
120
|
+
"icon": "unfold_more",
|
|
121
|
+
"description": "Emite evento ao abrir um painel",
|
|
122
|
+
"emit": "opened",
|
|
123
|
+
"payloadSchema": {
|
|
124
|
+
"type": "object",
|
|
125
|
+
"properties": {
|
|
126
|
+
"panelId": {
|
|
127
|
+
"type": "string",
|
|
128
|
+
"description": "ID do painel"
|
|
129
|
+
},
|
|
130
|
+
"panelIndex": {
|
|
131
|
+
"type": "number",
|
|
132
|
+
"description": "Índice do painel"
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
"required": [
|
|
136
|
+
"panelIndex"
|
|
137
|
+
],
|
|
138
|
+
"example": {
|
|
139
|
+
"panelIndex": 0
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
"scope": "context"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"id": "panel-closed",
|
|
146
|
+
"label": "Painel fechado",
|
|
147
|
+
"icon": "unfold_less",
|
|
148
|
+
"description": "Emite evento ao fechar um painel",
|
|
149
|
+
"emit": "closed",
|
|
150
|
+
"payloadSchema": {
|
|
151
|
+
"type": "object",
|
|
152
|
+
"properties": {
|
|
153
|
+
"panelId": {
|
|
154
|
+
"type": "string",
|
|
155
|
+
"description": "ID do painel"
|
|
156
|
+
},
|
|
157
|
+
"panelIndex": {
|
|
158
|
+
"type": "number",
|
|
159
|
+
"description": "Índice do painel"
|
|
160
|
+
}
|
|
161
|
+
},
|
|
162
|
+
"required": [
|
|
163
|
+
"panelIndex"
|
|
164
|
+
],
|
|
165
|
+
"example": {
|
|
166
|
+
"panelIndex": 0
|
|
167
|
+
}
|
|
168
|
+
},
|
|
169
|
+
"scope": "context"
|
|
170
|
+
},
|
|
171
|
+
{
|
|
172
|
+
"id": "panel-toggle",
|
|
173
|
+
"label": "Alternar painel",
|
|
174
|
+
"icon": "open_in_full",
|
|
175
|
+
"description": "Emite evento ao alternar expansão do painel",
|
|
176
|
+
"emit": "expandedChange",
|
|
177
|
+
"payloadSchema": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"properties": {
|
|
180
|
+
"panelId": {
|
|
181
|
+
"type": "string",
|
|
182
|
+
"description": "ID do painel"
|
|
183
|
+
},
|
|
184
|
+
"panelIndex": {
|
|
185
|
+
"type": "number",
|
|
186
|
+
"description": "Índice do painel"
|
|
187
|
+
},
|
|
188
|
+
"expanded": {
|
|
189
|
+
"type": "boolean",
|
|
190
|
+
"description": "Estado expandido"
|
|
191
|
+
}
|
|
192
|
+
},
|
|
193
|
+
"required": [
|
|
194
|
+
"panelIndex",
|
|
195
|
+
"expanded"
|
|
196
|
+
],
|
|
197
|
+
"example": {
|
|
198
|
+
"panelIndex": 0,
|
|
199
|
+
"expanded": true
|
|
200
|
+
}
|
|
201
|
+
},
|
|
202
|
+
"scope": "context"
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"ports": [
|
|
206
|
+
{
|
|
207
|
+
"id": "config",
|
|
208
|
+
"label": "Configuracao",
|
|
209
|
+
"direction": "input",
|
|
210
|
+
"semanticKind": "config-fragment",
|
|
211
|
+
"schema": {
|
|
212
|
+
"id": "ExpansionMetadata",
|
|
213
|
+
"kind": "ts-type",
|
|
214
|
+
"ref": "ExpansionMetadata"
|
|
215
|
+
},
|
|
216
|
+
"description": "Fragmento canonico de configuracao dos paineis e dos widgets internos.",
|
|
217
|
+
"exposure": {
|
|
218
|
+
"public": true,
|
|
219
|
+
"group": "config"
|
|
220
|
+
}
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
"id": "widgetEvent",
|
|
224
|
+
"label": "Evento interno de widget",
|
|
225
|
+
"direction": "output",
|
|
226
|
+
"semanticKind": "event",
|
|
227
|
+
"schema": {
|
|
228
|
+
"id": "WidgetEventEnvelope",
|
|
229
|
+
"kind": "ts-type",
|
|
230
|
+
"ref": "WidgetEventEnvelope"
|
|
231
|
+
},
|
|
232
|
+
"cardinality": "stream",
|
|
233
|
+
"description": "Bridge composta para transporte de eventos internos. As portas canonicas dos filhos sao resolvidas por component-port + nestedPath.",
|
|
234
|
+
"exposure": {
|
|
235
|
+
"public": true,
|
|
236
|
+
"advanced": true,
|
|
237
|
+
"group": "composite"
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
],
|
|
241
|
+
"configEditor": {
|
|
242
|
+
"component": "[ref:PraxisExpansionWidgetConfigEditor]",
|
|
243
|
+
"title": "Configure expansion"
|
|
244
|
+
},
|
|
245
|
+
"authoringManifestRef": {
|
|
246
|
+
"componentId": "praxis-expansion",
|
|
247
|
+
"source": "PRAXIS_EXPANSION_AUTHORING_MANIFEST"
|
|
248
|
+
},
|
|
249
|
+
"source": "projects/praxis-expansion/src/lib/praxis-expansion.metadata.ts",
|
|
250
|
+
"exportName": "PRAXIS_EXPANSION_COMPONENT_METADATA",
|
|
251
|
+
"componentCapabilities": [
|
|
252
|
+
{
|
|
253
|
+
"path": "appearance",
|
|
254
|
+
"category": "appearance",
|
|
255
|
+
"valueKind": "object",
|
|
256
|
+
"description": "Appearance settings."
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"path": "appearance.density",
|
|
260
|
+
"category": "appearance",
|
|
261
|
+
"valueKind": "enum",
|
|
262
|
+
"allowedValues": [
|
|
263
|
+
"compact",
|
|
264
|
+
"comfortable",
|
|
265
|
+
"spacious"
|
|
266
|
+
],
|
|
267
|
+
"description": "Density preset."
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"path": "appearance.themeClass",
|
|
271
|
+
"category": "appearance",
|
|
272
|
+
"valueKind": "string",
|
|
273
|
+
"description": "Theme CSS class for root."
|
|
274
|
+
},
|
|
275
|
+
{
|
|
276
|
+
"path": "appearance.customCss",
|
|
277
|
+
"category": "appearance",
|
|
278
|
+
"valueKind": "string",
|
|
279
|
+
"description": "Custom CSS injected into component.",
|
|
280
|
+
"safetyNotes": "CSS is injected as raw string."
|
|
281
|
+
},
|
|
282
|
+
{
|
|
283
|
+
"path": "appearance.tokens",
|
|
284
|
+
"category": "appearance",
|
|
285
|
+
"valueKind": "object",
|
|
286
|
+
"description": "Token map for theme overrides."
|
|
287
|
+
},
|
|
288
|
+
{
|
|
289
|
+
"path": "appearance.tokens.[token]",
|
|
290
|
+
"category": "appearance",
|
|
291
|
+
"valueKind": "string",
|
|
292
|
+
"allowedValues": [
|
|
293
|
+
"header-background-color"
|
|
294
|
+
],
|
|
295
|
+
"description": "Token value (CSS or var).",
|
|
296
|
+
"safetyNotes": "Only keys supported by styleCss()."
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"path": "accordion",
|
|
300
|
+
"category": "accordion",
|
|
301
|
+
"valueKind": "object",
|
|
302
|
+
"description": "Accordion behavior settings."
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"path": "accordion.multi",
|
|
306
|
+
"category": "accordion",
|
|
307
|
+
"valueKind": "boolean",
|
|
308
|
+
"description": "Allow multiple panels open."
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
"path": "accordion.displayMode",
|
|
312
|
+
"category": "accordion",
|
|
313
|
+
"valueKind": "enum",
|
|
314
|
+
"allowedValues": [
|
|
315
|
+
"default",
|
|
316
|
+
"flat"
|
|
317
|
+
],
|
|
318
|
+
"description": "Accordion display mode."
|
|
319
|
+
},
|
|
320
|
+
{
|
|
321
|
+
"path": "accordion.togglePosition",
|
|
322
|
+
"category": "accordion",
|
|
323
|
+
"valueKind": "enum",
|
|
324
|
+
"allowedValues": [
|
|
325
|
+
"before",
|
|
326
|
+
"after"
|
|
327
|
+
],
|
|
328
|
+
"description": "Toggle icon position."
|
|
329
|
+
},
|
|
330
|
+
{
|
|
331
|
+
"path": "accordion.hideToggle",
|
|
332
|
+
"category": "accordion",
|
|
333
|
+
"valueKind": "boolean",
|
|
334
|
+
"description": "Hide toggle icon."
|
|
335
|
+
},
|
|
336
|
+
{
|
|
337
|
+
"path": "accordion.id",
|
|
338
|
+
"category": "accordion",
|
|
339
|
+
"valueKind": "string",
|
|
340
|
+
"description": "Accordion id."
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
"path": "panels",
|
|
344
|
+
"category": "panels",
|
|
345
|
+
"valueKind": "array",
|
|
346
|
+
"description": "Panel list."
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
"path": "panels[]",
|
|
350
|
+
"category": "panels",
|
|
351
|
+
"valueKind": "object",
|
|
352
|
+
"description": "Panel definition."
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
"path": "panels[].id",
|
|
356
|
+
"category": "panels",
|
|
357
|
+
"valueKind": "string",
|
|
358
|
+
"description": "Panel id."
|
|
359
|
+
},
|
|
360
|
+
{
|
|
361
|
+
"path": "panels[].title",
|
|
362
|
+
"category": "panels",
|
|
363
|
+
"valueKind": "string",
|
|
364
|
+
"description": "Panel title."
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
"path": "panels[].description",
|
|
368
|
+
"category": "panels",
|
|
369
|
+
"valueKind": "string",
|
|
370
|
+
"description": "Panel description."
|
|
371
|
+
},
|
|
372
|
+
{
|
|
373
|
+
"path": "panels[].icon",
|
|
374
|
+
"category": "panels",
|
|
375
|
+
"valueKind": "string",
|
|
376
|
+
"description": "Panel header icon rendered through PraxisIconDirective."
|
|
377
|
+
},
|
|
378
|
+
{
|
|
379
|
+
"path": "panels[].disabled",
|
|
380
|
+
"category": "panels",
|
|
381
|
+
"valueKind": "boolean",
|
|
382
|
+
"description": "Disable panel."
|
|
383
|
+
},
|
|
384
|
+
{
|
|
385
|
+
"path": "panels[].expanded",
|
|
386
|
+
"category": "panels",
|
|
387
|
+
"valueKind": "boolean",
|
|
388
|
+
"description": "Expanded state."
|
|
389
|
+
},
|
|
390
|
+
{
|
|
391
|
+
"path": "panels[].hideToggle",
|
|
392
|
+
"category": "panels",
|
|
393
|
+
"valueKind": "boolean",
|
|
394
|
+
"description": "Hide toggle icon for panel."
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
"path": "panels[].collapsedHeight",
|
|
398
|
+
"category": "panels",
|
|
399
|
+
"valueKind": "string",
|
|
400
|
+
"description": "Collapsed header height (e.g., 48px)."
|
|
401
|
+
},
|
|
402
|
+
{
|
|
403
|
+
"path": "panels[].expandedHeight",
|
|
404
|
+
"category": "panels",
|
|
405
|
+
"valueKind": "string",
|
|
406
|
+
"description": "Expanded header height (e.g., 64px)."
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
"path": "panels[].content",
|
|
410
|
+
"category": "panels",
|
|
411
|
+
"valueKind": "array",
|
|
412
|
+
"description": "Dynamic field metadata list (legacy)."
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
"path": "panels[].content[]",
|
|
416
|
+
"category": "panels",
|
|
417
|
+
"valueKind": "object",
|
|
418
|
+
"description": "Dynamic field metadata item.",
|
|
419
|
+
"safetyNotes": "Use FieldMetadata base when no controlType catalog exists."
|
|
420
|
+
},
|
|
421
|
+
{
|
|
422
|
+
"path": "panels[].widgets",
|
|
423
|
+
"category": "panels",
|
|
424
|
+
"valueKind": "array",
|
|
425
|
+
"description": "WidgetDefinition list for content."
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
"path": "panels[].widgets[]",
|
|
429
|
+
"category": "panels",
|
|
430
|
+
"valueKind": "object",
|
|
431
|
+
"description": "WidgetDefinition item."
|
|
432
|
+
},
|
|
433
|
+
{
|
|
434
|
+
"path": "panels[].widgets[].id",
|
|
435
|
+
"category": "panels",
|
|
436
|
+
"valueKind": "enum",
|
|
437
|
+
"allowedValues": [
|
|
438
|
+
"praxis-dynamic-form",
|
|
439
|
+
"praxis-list",
|
|
440
|
+
"pdx-material-searchable-select",
|
|
441
|
+
"praxis-files-upload"
|
|
442
|
+
],
|
|
443
|
+
"description": "Component registry id for widget."
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
"path": "panels[].widgets[].inputs",
|
|
447
|
+
"category": "panels",
|
|
448
|
+
"valueKind": "object",
|
|
449
|
+
"description": "Inputs bound into the widget instance."
|
|
450
|
+
},
|
|
451
|
+
{
|
|
452
|
+
"path": "panels[].widgets[].outputs",
|
|
453
|
+
"category": "panels",
|
|
454
|
+
"valueKind": "object",
|
|
455
|
+
"description": "Outputs mapped to actions."
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
"path": "panels[].widgets[].outputs.[outputName]",
|
|
459
|
+
"category": "panels",
|
|
460
|
+
"valueKind": "object",
|
|
461
|
+
"description": "Output action mapping (ActionDefinition or \"emit\")."
|
|
462
|
+
},
|
|
463
|
+
{
|
|
464
|
+
"path": "panels[].widgets[].bindingOrder",
|
|
465
|
+
"category": "panels",
|
|
466
|
+
"valueKind": "array",
|
|
467
|
+
"description": "Explicit input binding order."
|
|
468
|
+
},
|
|
469
|
+
{
|
|
470
|
+
"path": "panels[].widgets[].bindingOrder[]",
|
|
471
|
+
"category": "panels",
|
|
472
|
+
"valueKind": "string",
|
|
473
|
+
"description": "Input name applied first."
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
"path": "panels[].actionButtons",
|
|
477
|
+
"category": "actions",
|
|
478
|
+
"valueKind": "array",
|
|
479
|
+
"description": "Action buttons at panel footer."
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"path": "panels[].actionButtons[]",
|
|
483
|
+
"category": "actions",
|
|
484
|
+
"valueKind": "object",
|
|
485
|
+
"description": "Action button definition."
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
"path": "panels[].actionButtons[].icon",
|
|
489
|
+
"category": "actions",
|
|
490
|
+
"valueKind": "string",
|
|
491
|
+
"description": "Action icon."
|
|
492
|
+
},
|
|
493
|
+
{
|
|
494
|
+
"path": "panels[].actionButtons[].label",
|
|
495
|
+
"category": "actions",
|
|
496
|
+
"valueKind": "string",
|
|
497
|
+
"description": "Action label."
|
|
498
|
+
},
|
|
499
|
+
{
|
|
500
|
+
"path": "panels[].actionButtons[].action",
|
|
501
|
+
"category": "actions",
|
|
502
|
+
"valueKind": "string",
|
|
503
|
+
"description": "Action identifier payload."
|
|
504
|
+
}
|
|
505
|
+
],
|
|
506
|
+
"componentCapabilityNotes": [
|
|
507
|
+
"panels[] should be merged by id or title to avoid replacing all panels.",
|
|
508
|
+
"appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.",
|
|
509
|
+
"appearance.tokens supports limited keys used by styleCss().",
|
|
510
|
+
"panels[].widgets[].id must be a ComponentMetadataRegistry id.",
|
|
511
|
+
"If a field controlType lacks a dedicated catalog, treat it as FieldMetadata base."
|
|
512
|
+
],
|
|
513
|
+
"componentContext": {
|
|
514
|
+
"version": "v1",
|
|
515
|
+
"optionsByPath": {
|
|
516
|
+
"appearance.density": {
|
|
517
|
+
"mode": "enum",
|
|
518
|
+
"options": [
|
|
519
|
+
{
|
|
520
|
+
"value": "compact",
|
|
521
|
+
"label": "Compact"
|
|
522
|
+
},
|
|
523
|
+
{
|
|
524
|
+
"value": "comfortable",
|
|
525
|
+
"label": "Comfortable"
|
|
526
|
+
},
|
|
527
|
+
{
|
|
528
|
+
"value": "spacious",
|
|
529
|
+
"label": "Spacious"
|
|
530
|
+
}
|
|
531
|
+
]
|
|
532
|
+
},
|
|
533
|
+
"accordion.displayMode": {
|
|
534
|
+
"mode": "enum",
|
|
535
|
+
"options": [
|
|
536
|
+
{
|
|
537
|
+
"value": "default",
|
|
538
|
+
"label": "Default"
|
|
539
|
+
},
|
|
540
|
+
{
|
|
541
|
+
"value": "flat",
|
|
542
|
+
"label": "Flat"
|
|
543
|
+
}
|
|
544
|
+
]
|
|
545
|
+
},
|
|
546
|
+
"accordion.togglePosition": {
|
|
547
|
+
"mode": "enum",
|
|
548
|
+
"options": [
|
|
549
|
+
{
|
|
550
|
+
"value": "before",
|
|
551
|
+
"label": "Before"
|
|
552
|
+
},
|
|
553
|
+
{
|
|
554
|
+
"value": "after",
|
|
555
|
+
"label": "After"
|
|
556
|
+
}
|
|
557
|
+
]
|
|
558
|
+
}
|
|
559
|
+
},
|
|
560
|
+
"actionCatalog": [
|
|
561
|
+
{
|
|
562
|
+
"id": "appearance.density.set",
|
|
563
|
+
"intentExamples": [
|
|
564
|
+
"density",
|
|
565
|
+
"compact",
|
|
566
|
+
"spacious"
|
|
567
|
+
],
|
|
568
|
+
"patchTemplate": {
|
|
569
|
+
"appearance": {
|
|
570
|
+
"density": "{{value}}"
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
},
|
|
574
|
+
{
|
|
575
|
+
"id": "accordion.multi.enable",
|
|
576
|
+
"intentExamples": [
|
|
577
|
+
"multiple panels",
|
|
578
|
+
"multi expand",
|
|
579
|
+
"allow multiple"
|
|
580
|
+
],
|
|
581
|
+
"patchTemplate": {
|
|
582
|
+
"accordion": {
|
|
583
|
+
"multi": true
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
},
|
|
587
|
+
{
|
|
588
|
+
"id": "accordion.multi.disable",
|
|
589
|
+
"intentExamples": [
|
|
590
|
+
"single panel",
|
|
591
|
+
"only one open"
|
|
592
|
+
],
|
|
593
|
+
"patchTemplate": {
|
|
594
|
+
"accordion": {
|
|
595
|
+
"multi": false
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
},
|
|
599
|
+
{
|
|
600
|
+
"id": "accordion.hideToggle.enable",
|
|
601
|
+
"intentExamples": [
|
|
602
|
+
"hide toggle",
|
|
603
|
+
"no caret"
|
|
604
|
+
],
|
|
605
|
+
"patchTemplate": {
|
|
606
|
+
"accordion": {
|
|
607
|
+
"hideToggle": true
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
},
|
|
611
|
+
{
|
|
612
|
+
"id": "accordion.hideToggle.disable",
|
|
613
|
+
"intentExamples": [
|
|
614
|
+
"show toggle",
|
|
615
|
+
"show caret"
|
|
616
|
+
],
|
|
617
|
+
"patchTemplate": {
|
|
618
|
+
"accordion": {
|
|
619
|
+
"hideToggle": false
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
},
|
|
623
|
+
{
|
|
624
|
+
"id": "panel.add",
|
|
625
|
+
"intentExamples": [
|
|
626
|
+
"add panel",
|
|
627
|
+
"new panel",
|
|
628
|
+
"create panel"
|
|
629
|
+
],
|
|
630
|
+
"patchTemplate": {
|
|
631
|
+
"panels": [
|
|
632
|
+
{
|
|
633
|
+
"id": "{{target}}",
|
|
634
|
+
"title": "{{value}}"
|
|
635
|
+
}
|
|
636
|
+
]
|
|
637
|
+
}
|
|
638
|
+
},
|
|
639
|
+
{
|
|
640
|
+
"id": "panel.title.set",
|
|
641
|
+
"intentExamples": [
|
|
642
|
+
"rename panel",
|
|
643
|
+
"panel title"
|
|
644
|
+
],
|
|
645
|
+
"patchTemplate": {
|
|
646
|
+
"panels": [
|
|
647
|
+
{
|
|
648
|
+
"id": "{{target}}",
|
|
649
|
+
"title": "{{value}}"
|
|
650
|
+
}
|
|
651
|
+
]
|
|
652
|
+
}
|
|
653
|
+
},
|
|
654
|
+
{
|
|
655
|
+
"id": "panel.description.set",
|
|
656
|
+
"intentExamples": [
|
|
657
|
+
"panel description",
|
|
658
|
+
"subtitle"
|
|
659
|
+
],
|
|
660
|
+
"patchTemplate": {
|
|
661
|
+
"panels": [
|
|
662
|
+
{
|
|
663
|
+
"id": "{{target}}",
|
|
664
|
+
"description": "{{value}}"
|
|
665
|
+
}
|
|
666
|
+
]
|
|
667
|
+
}
|
|
668
|
+
},
|
|
669
|
+
{
|
|
670
|
+
"id": "panel.expand",
|
|
671
|
+
"intentExamples": [
|
|
672
|
+
"expand panel",
|
|
673
|
+
"open panel"
|
|
674
|
+
],
|
|
675
|
+
"patchTemplate": {
|
|
676
|
+
"panels": [
|
|
677
|
+
{
|
|
678
|
+
"id": "{{target}}",
|
|
679
|
+
"expanded": true
|
|
680
|
+
}
|
|
681
|
+
]
|
|
682
|
+
}
|
|
683
|
+
},
|
|
684
|
+
{
|
|
685
|
+
"id": "panel.collapse",
|
|
686
|
+
"intentExamples": [
|
|
687
|
+
"collapse panel",
|
|
688
|
+
"close panel"
|
|
689
|
+
],
|
|
690
|
+
"patchTemplate": {
|
|
691
|
+
"panels": [
|
|
692
|
+
{
|
|
693
|
+
"id": "{{target}}",
|
|
694
|
+
"expanded": false
|
|
695
|
+
}
|
|
696
|
+
]
|
|
697
|
+
}
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
"id": "panel.disable",
|
|
701
|
+
"intentExamples": [
|
|
702
|
+
"disable panel",
|
|
703
|
+
"lock panel"
|
|
704
|
+
],
|
|
705
|
+
"patchTemplate": {
|
|
706
|
+
"panels": [
|
|
707
|
+
{
|
|
708
|
+
"id": "{{target}}",
|
|
709
|
+
"disabled": true
|
|
710
|
+
}
|
|
711
|
+
]
|
|
712
|
+
}
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
"id": "panel.enable",
|
|
716
|
+
"intentExamples": [
|
|
717
|
+
"enable panel",
|
|
718
|
+
"unlock panel"
|
|
719
|
+
],
|
|
720
|
+
"patchTemplate": {
|
|
721
|
+
"panels": [
|
|
722
|
+
{
|
|
723
|
+
"id": "{{target}}",
|
|
724
|
+
"disabled": false
|
|
725
|
+
}
|
|
726
|
+
]
|
|
727
|
+
}
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
"id": "panel.hideToggle.enable",
|
|
731
|
+
"intentExamples": [
|
|
732
|
+
"hide panel toggle",
|
|
733
|
+
"no panel toggle"
|
|
734
|
+
],
|
|
735
|
+
"patchTemplate": {
|
|
736
|
+
"panels": [
|
|
737
|
+
{
|
|
738
|
+
"id": "{{target}}",
|
|
739
|
+
"hideToggle": true
|
|
740
|
+
}
|
|
741
|
+
]
|
|
742
|
+
}
|
|
743
|
+
},
|
|
744
|
+
{
|
|
745
|
+
"id": "panel.hideToggle.disable",
|
|
746
|
+
"intentExamples": [
|
|
747
|
+
"show panel toggle",
|
|
748
|
+
"panel caret"
|
|
749
|
+
],
|
|
750
|
+
"patchTemplate": {
|
|
751
|
+
"panels": [
|
|
752
|
+
{
|
|
753
|
+
"id": "{{target}}",
|
|
754
|
+
"hideToggle": false
|
|
755
|
+
}
|
|
756
|
+
]
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
],
|
|
760
|
+
"fieldResolvers": {
|
|
761
|
+
"panels[]": [
|
|
762
|
+
"id",
|
|
763
|
+
"title"
|
|
764
|
+
]
|
|
765
|
+
},
|
|
766
|
+
"hints": [
|
|
767
|
+
"Use panels[].id or panels[].title as merge keys; avoid array indexes.",
|
|
768
|
+
"Panels merge by id/title; prefer patching a single panel at a time.",
|
|
769
|
+
"DOC: Widget purpose: accordion/expansion panels with optional fields or widgets.",
|
|
770
|
+
"DOC: Host inputs: expansionId (required) and config (optional).",
|
|
771
|
+
"DOC: Minimal config: panels[] with title for each panel.",
|
|
772
|
+
"DOC: Panel content can be fields (content) or widgets (widgets)."
|
|
773
|
+
]
|
|
774
|
+
},
|
|
775
|
+
"authoringManifest": {
|
|
776
|
+
"schemaVersion": "1.0.0",
|
|
777
|
+
"componentId": "praxis-expansion",
|
|
778
|
+
"ownerPackage": "@praxisui/expansion",
|
|
779
|
+
"configSchemaId": "ExpansionMetadata",
|
|
780
|
+
"manifestVersion": "1.0.0",
|
|
781
|
+
"runtimeInputs": [
|
|
782
|
+
{
|
|
783
|
+
"name": "config",
|
|
784
|
+
"type": "ExpansionMetadata",
|
|
785
|
+
"description": "Canonical accordion and panel configuration."
|
|
786
|
+
},
|
|
787
|
+
{
|
|
788
|
+
"name": "expansionId",
|
|
789
|
+
"type": "string",
|
|
790
|
+
"description": "Stable id used to derive expansion config persistence scope."
|
|
791
|
+
},
|
|
792
|
+
{
|
|
793
|
+
"name": "componentInstanceId",
|
|
794
|
+
"type": "string",
|
|
795
|
+
"description": "Optional instance discriminator for persistence scope."
|
|
796
|
+
},
|
|
797
|
+
{
|
|
798
|
+
"name": "context",
|
|
799
|
+
"type": "Record<string, any>",
|
|
800
|
+
"description": "Context passed to nested widgets."
|
|
801
|
+
},
|
|
802
|
+
{
|
|
803
|
+
"name": "strictValidation",
|
|
804
|
+
"type": "boolean",
|
|
805
|
+
"description": "Controls nested widget validation strictness."
|
|
806
|
+
},
|
|
807
|
+
{
|
|
808
|
+
"name": "defaultOptions",
|
|
809
|
+
"type": "MatExpansionPanelDefaultOptions",
|
|
810
|
+
"description": "Instance-level Material expansion defaults."
|
|
811
|
+
},
|
|
812
|
+
{
|
|
813
|
+
"name": "enableCustomization",
|
|
814
|
+
"type": "boolean",
|
|
815
|
+
"description": "Enables Settings Panel authoring surfaces."
|
|
816
|
+
}
|
|
817
|
+
],
|
|
818
|
+
"editableTargets": [
|
|
819
|
+
{
|
|
820
|
+
"kind": "panel",
|
|
821
|
+
"resolver": "panel-by-id-or-title",
|
|
822
|
+
"description": "A panel in config.panels[]."
|
|
823
|
+
},
|
|
824
|
+
{
|
|
825
|
+
"kind": "panelHeader",
|
|
826
|
+
"resolver": "panel-by-id-or-title",
|
|
827
|
+
"description": "Header title, description, icon and heights for a panel."
|
|
828
|
+
},
|
|
829
|
+
{
|
|
830
|
+
"kind": "panelContent",
|
|
831
|
+
"resolver": "panel-content-by-id",
|
|
832
|
+
"description": "Lazy panel content hosted through fields, widgets or action buttons."
|
|
833
|
+
},
|
|
834
|
+
{
|
|
835
|
+
"kind": "expandedState",
|
|
836
|
+
"resolver": "panel-by-id-or-title",
|
|
837
|
+
"description": "Panel expanded state and default expanded selection."
|
|
838
|
+
},
|
|
839
|
+
{
|
|
840
|
+
"kind": "disabledState",
|
|
841
|
+
"resolver": "panel-by-id-or-title",
|
|
842
|
+
"description": "Panel disabled state."
|
|
843
|
+
},
|
|
844
|
+
{
|
|
845
|
+
"kind": "layout",
|
|
846
|
+
"resolver": "expansion-layout-config",
|
|
847
|
+
"description": "Accordion display mode, toggle position, density and visual layout."
|
|
848
|
+
},
|
|
849
|
+
{
|
|
850
|
+
"kind": "behavior",
|
|
851
|
+
"resolver": "expansion-behavior-config",
|
|
852
|
+
"description": "Accordion multi-expand and hide-toggle behavior."
|
|
853
|
+
}
|
|
854
|
+
],
|
|
855
|
+
"operations": [
|
|
856
|
+
{
|
|
857
|
+
"operationId": "panel.add",
|
|
858
|
+
"title": "Add panel",
|
|
859
|
+
"scope": "global",
|
|
860
|
+
"targetKind": "panel",
|
|
861
|
+
"target": {
|
|
862
|
+
"kind": "panel",
|
|
863
|
+
"resolver": "panels-array",
|
|
864
|
+
"ambiguityPolicy": "fail",
|
|
865
|
+
"required": false
|
|
866
|
+
},
|
|
867
|
+
"inputSchema": {
|
|
868
|
+
"type": "object",
|
|
869
|
+
"required": [
|
|
870
|
+
"id",
|
|
871
|
+
"title"
|
|
872
|
+
],
|
|
873
|
+
"properties": {
|
|
874
|
+
"id": {
|
|
875
|
+
"type": "string"
|
|
876
|
+
},
|
|
877
|
+
"title": {
|
|
878
|
+
"type": "string"
|
|
879
|
+
},
|
|
880
|
+
"description": {
|
|
881
|
+
"type": "string"
|
|
882
|
+
},
|
|
883
|
+
"icon": {
|
|
884
|
+
"type": "string"
|
|
885
|
+
},
|
|
886
|
+
"disabled": {
|
|
887
|
+
"type": "boolean"
|
|
888
|
+
},
|
|
889
|
+
"expanded": {
|
|
890
|
+
"type": "boolean"
|
|
891
|
+
},
|
|
892
|
+
"hideToggle": {
|
|
893
|
+
"type": "boolean"
|
|
894
|
+
},
|
|
895
|
+
"collapsedHeight": {
|
|
896
|
+
"type": "string"
|
|
897
|
+
},
|
|
898
|
+
"expandedHeight": {
|
|
899
|
+
"type": "string"
|
|
900
|
+
},
|
|
901
|
+
"content": {
|
|
902
|
+
"type": "array",
|
|
903
|
+
"items": {
|
|
904
|
+
"type": "object"
|
|
905
|
+
}
|
|
906
|
+
},
|
|
907
|
+
"widgets": {
|
|
908
|
+
"type": "array",
|
|
909
|
+
"items": {
|
|
910
|
+
"type": "object"
|
|
911
|
+
}
|
|
912
|
+
},
|
|
913
|
+
"actionButtons": {
|
|
914
|
+
"type": "array",
|
|
915
|
+
"items": {
|
|
916
|
+
"type": "object"
|
|
917
|
+
}
|
|
918
|
+
}
|
|
919
|
+
}
|
|
920
|
+
},
|
|
921
|
+
"effects": [
|
|
922
|
+
{
|
|
923
|
+
"kind": "append-unique",
|
|
924
|
+
"path": "panels[]",
|
|
925
|
+
"key": "id"
|
|
926
|
+
}
|
|
927
|
+
],
|
|
928
|
+
"destructive": false,
|
|
929
|
+
"requiresConfirmation": false,
|
|
930
|
+
"validators": [
|
|
931
|
+
"panel-id-unique",
|
|
932
|
+
"panel-order-deterministic",
|
|
933
|
+
"panel-content-valid"
|
|
934
|
+
],
|
|
935
|
+
"affectedPaths": [
|
|
936
|
+
"panels[]"
|
|
937
|
+
],
|
|
938
|
+
"submissionImpact": "config-only",
|
|
939
|
+
"preconditions": [
|
|
940
|
+
"config-initialized"
|
|
941
|
+
]
|
|
942
|
+
},
|
|
943
|
+
{
|
|
944
|
+
"operationId": "panel.remove",
|
|
945
|
+
"title": "Remove panel",
|
|
946
|
+
"scope": "layout",
|
|
947
|
+
"targetKind": "panel",
|
|
948
|
+
"target": {
|
|
949
|
+
"kind": "panel",
|
|
950
|
+
"resolver": "panel-by-id-or-title",
|
|
951
|
+
"ambiguityPolicy": "fail",
|
|
952
|
+
"required": true
|
|
953
|
+
},
|
|
954
|
+
"inputSchema": {
|
|
955
|
+
"type": "object",
|
|
956
|
+
"properties": {
|
|
957
|
+
"replacementExpandedPanelId": {
|
|
958
|
+
"type": "string"
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
},
|
|
962
|
+
"effects": [
|
|
963
|
+
{
|
|
964
|
+
"kind": "compile-domain-patch",
|
|
965
|
+
"handler": "expansion-panel-remove",
|
|
966
|
+
"handlerContract": {
|
|
967
|
+
"reads": [
|
|
968
|
+
"accordion.multi",
|
|
969
|
+
"panels[]",
|
|
970
|
+
"panels[].id",
|
|
971
|
+
"panels[].expanded"
|
|
972
|
+
],
|
|
973
|
+
"writes": [
|
|
974
|
+
"panels[]",
|
|
975
|
+
"panels[].expanded"
|
|
976
|
+
],
|
|
977
|
+
"identityKeys": [
|
|
978
|
+
"panels[].id"
|
|
979
|
+
],
|
|
980
|
+
"inputSchema": {
|
|
981
|
+
"type": "object",
|
|
982
|
+
"properties": {
|
|
983
|
+
"replacementExpandedPanelId": {
|
|
984
|
+
"type": "string"
|
|
985
|
+
}
|
|
986
|
+
}
|
|
987
|
+
},
|
|
988
|
+
"failureModes": [
|
|
989
|
+
"panel-not-found",
|
|
990
|
+
"replacement-panel-not-found",
|
|
991
|
+
"content-removal-not-confirmed",
|
|
992
|
+
"single-expand-conflict"
|
|
993
|
+
],
|
|
994
|
+
"description": "Removes the target panel by stable id and applies replacement expanded state when the removed panel was expanded."
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
],
|
|
998
|
+
"destructive": true,
|
|
999
|
+
"requiresConfirmation": true,
|
|
1000
|
+
"validators": [
|
|
1001
|
+
"panel-exists",
|
|
1002
|
+
"default-expanded-removal-safe",
|
|
1003
|
+
"panel-content-removal-confirmed"
|
|
1004
|
+
],
|
|
1005
|
+
"affectedPaths": [
|
|
1006
|
+
"panels[]",
|
|
1007
|
+
"panels[].expanded"
|
|
1008
|
+
],
|
|
1009
|
+
"submissionImpact": "config-only",
|
|
1010
|
+
"preconditions": [
|
|
1011
|
+
"config-initialized",
|
|
1012
|
+
"target-panel-exists",
|
|
1013
|
+
"confirmation-collected"
|
|
1014
|
+
]
|
|
1015
|
+
},
|
|
1016
|
+
{
|
|
1017
|
+
"operationId": "panel.title.set",
|
|
1018
|
+
"title": "Set panel title",
|
|
1019
|
+
"scope": "layout",
|
|
1020
|
+
"targetKind": "panelHeader",
|
|
1021
|
+
"target": {
|
|
1022
|
+
"kind": "panelHeader",
|
|
1023
|
+
"resolver": "panel-by-id-or-title",
|
|
1024
|
+
"ambiguityPolicy": "fail",
|
|
1025
|
+
"required": true
|
|
1026
|
+
},
|
|
1027
|
+
"inputSchema": {
|
|
1028
|
+
"type": "object",
|
|
1029
|
+
"required": [
|
|
1030
|
+
"title"
|
|
1031
|
+
],
|
|
1032
|
+
"properties": {
|
|
1033
|
+
"title": {
|
|
1034
|
+
"type": "string"
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
},
|
|
1038
|
+
"effects": [
|
|
1039
|
+
{
|
|
1040
|
+
"kind": "merge-by-key",
|
|
1041
|
+
"path": "panels[]",
|
|
1042
|
+
"key": "id"
|
|
1043
|
+
}
|
|
1044
|
+
],
|
|
1045
|
+
"destructive": false,
|
|
1046
|
+
"requiresConfirmation": false,
|
|
1047
|
+
"validators": [
|
|
1048
|
+
"panel-exists",
|
|
1049
|
+
"panel-title-valid"
|
|
1050
|
+
],
|
|
1051
|
+
"affectedPaths": [
|
|
1052
|
+
"panels[].title"
|
|
1053
|
+
],
|
|
1054
|
+
"submissionImpact": "config-only",
|
|
1055
|
+
"preconditions": [
|
|
1056
|
+
"config-initialized",
|
|
1057
|
+
"target-panel-exists"
|
|
1058
|
+
]
|
|
1059
|
+
},
|
|
1060
|
+
{
|
|
1061
|
+
"operationId": "panel.description.set",
|
|
1062
|
+
"title": "Set panel description",
|
|
1063
|
+
"scope": "layout",
|
|
1064
|
+
"targetKind": "panelHeader",
|
|
1065
|
+
"target": {
|
|
1066
|
+
"kind": "panelHeader",
|
|
1067
|
+
"resolver": "panel-by-id-or-title",
|
|
1068
|
+
"ambiguityPolicy": "fail",
|
|
1069
|
+
"required": true
|
|
1070
|
+
},
|
|
1071
|
+
"inputSchema": {
|
|
1072
|
+
"type": "object",
|
|
1073
|
+
"required": [
|
|
1074
|
+
"description"
|
|
1075
|
+
],
|
|
1076
|
+
"properties": {
|
|
1077
|
+
"description": {
|
|
1078
|
+
"type": "string"
|
|
1079
|
+
}
|
|
1080
|
+
}
|
|
1081
|
+
},
|
|
1082
|
+
"effects": [
|
|
1083
|
+
{
|
|
1084
|
+
"kind": "merge-by-key",
|
|
1085
|
+
"path": "panels[]",
|
|
1086
|
+
"key": "id"
|
|
1087
|
+
}
|
|
1088
|
+
],
|
|
1089
|
+
"destructive": false,
|
|
1090
|
+
"requiresConfirmation": false,
|
|
1091
|
+
"validators": [
|
|
1092
|
+
"panel-exists",
|
|
1093
|
+
"panel-description-valid"
|
|
1094
|
+
],
|
|
1095
|
+
"affectedPaths": [
|
|
1096
|
+
"panels[].description"
|
|
1097
|
+
],
|
|
1098
|
+
"submissionImpact": "config-only",
|
|
1099
|
+
"preconditions": [
|
|
1100
|
+
"config-initialized",
|
|
1101
|
+
"target-panel-exists"
|
|
1102
|
+
]
|
|
1103
|
+
},
|
|
1104
|
+
{
|
|
1105
|
+
"operationId": "panel.icon.set",
|
|
1106
|
+
"title": "Set panel icon",
|
|
1107
|
+
"scope": "layout",
|
|
1108
|
+
"targetKind": "panelHeader",
|
|
1109
|
+
"target": {
|
|
1110
|
+
"kind": "panelHeader",
|
|
1111
|
+
"resolver": "panel-by-id-or-title",
|
|
1112
|
+
"ambiguityPolicy": "fail",
|
|
1113
|
+
"required": true
|
|
1114
|
+
},
|
|
1115
|
+
"inputSchema": {
|
|
1116
|
+
"type": "object",
|
|
1117
|
+
"required": [
|
|
1118
|
+
"icon"
|
|
1119
|
+
],
|
|
1120
|
+
"properties": {
|
|
1121
|
+
"icon": {
|
|
1122
|
+
"type": "string"
|
|
1123
|
+
}
|
|
1124
|
+
}
|
|
1125
|
+
},
|
|
1126
|
+
"effects": [
|
|
1127
|
+
{
|
|
1128
|
+
"kind": "merge-by-key",
|
|
1129
|
+
"path": "panels[]",
|
|
1130
|
+
"key": "id"
|
|
1131
|
+
}
|
|
1132
|
+
],
|
|
1133
|
+
"destructive": false,
|
|
1134
|
+
"requiresConfirmation": false,
|
|
1135
|
+
"validators": [
|
|
1136
|
+
"panel-exists",
|
|
1137
|
+
"panel-icon-valid",
|
|
1138
|
+
"editor-runtime-round-trip"
|
|
1139
|
+
],
|
|
1140
|
+
"affectedPaths": [
|
|
1141
|
+
"panels[].icon"
|
|
1142
|
+
],
|
|
1143
|
+
"submissionImpact": "config-only",
|
|
1144
|
+
"preconditions": [
|
|
1145
|
+
"config-initialized",
|
|
1146
|
+
"target-panel-exists"
|
|
1147
|
+
]
|
|
1148
|
+
},
|
|
1149
|
+
{
|
|
1150
|
+
"operationId": "panel.order.set",
|
|
1151
|
+
"title": "Reorder panels",
|
|
1152
|
+
"scope": "layout",
|
|
1153
|
+
"targetKind": "panel",
|
|
1154
|
+
"target": {
|
|
1155
|
+
"kind": "panel",
|
|
1156
|
+
"resolver": "panel-by-id-or-title",
|
|
1157
|
+
"ambiguityPolicy": "fail",
|
|
1158
|
+
"required": true
|
|
1159
|
+
},
|
|
1160
|
+
"inputSchema": {
|
|
1161
|
+
"type": "object",
|
|
1162
|
+
"required": [
|
|
1163
|
+
"beforePanelId"
|
|
1164
|
+
],
|
|
1165
|
+
"properties": {
|
|
1166
|
+
"beforePanelId": {
|
|
1167
|
+
"type": "string"
|
|
1168
|
+
}
|
|
1169
|
+
}
|
|
1170
|
+
},
|
|
1171
|
+
"effects": [
|
|
1172
|
+
{
|
|
1173
|
+
"kind": "reorder-by-key",
|
|
1174
|
+
"path": "panels[]",
|
|
1175
|
+
"key": "id"
|
|
1176
|
+
}
|
|
1177
|
+
],
|
|
1178
|
+
"destructive": false,
|
|
1179
|
+
"requiresConfirmation": false,
|
|
1180
|
+
"validators": [
|
|
1181
|
+
"panel-exists",
|
|
1182
|
+
"panel-order-deterministic"
|
|
1183
|
+
],
|
|
1184
|
+
"affectedPaths": [
|
|
1185
|
+
"panels[]"
|
|
1186
|
+
],
|
|
1187
|
+
"submissionImpact": "config-only",
|
|
1188
|
+
"preconditions": [
|
|
1189
|
+
"config-initialized",
|
|
1190
|
+
"target-panel-exists"
|
|
1191
|
+
]
|
|
1192
|
+
},
|
|
1193
|
+
{
|
|
1194
|
+
"operationId": "panel.disabled.set",
|
|
1195
|
+
"title": "Set disabled state",
|
|
1196
|
+
"scope": "interaction",
|
|
1197
|
+
"targetKind": "disabledState",
|
|
1198
|
+
"target": {
|
|
1199
|
+
"kind": "disabledState",
|
|
1200
|
+
"resolver": "panel-by-id-or-title",
|
|
1201
|
+
"ambiguityPolicy": "fail",
|
|
1202
|
+
"required": true
|
|
1203
|
+
},
|
|
1204
|
+
"inputSchema": {
|
|
1205
|
+
"type": "object",
|
|
1206
|
+
"required": [
|
|
1207
|
+
"disabled"
|
|
1208
|
+
],
|
|
1209
|
+
"properties": {
|
|
1210
|
+
"disabled": {
|
|
1211
|
+
"type": "boolean"
|
|
1212
|
+
}
|
|
1213
|
+
}
|
|
1214
|
+
},
|
|
1215
|
+
"effects": [
|
|
1216
|
+
{
|
|
1217
|
+
"kind": "merge-by-key",
|
|
1218
|
+
"path": "panels[]",
|
|
1219
|
+
"key": "id"
|
|
1220
|
+
}
|
|
1221
|
+
],
|
|
1222
|
+
"destructive": false,
|
|
1223
|
+
"requiresConfirmation": false,
|
|
1224
|
+
"validators": [
|
|
1225
|
+
"panel-exists",
|
|
1226
|
+
"disabled-expanded-compatible"
|
|
1227
|
+
],
|
|
1228
|
+
"affectedPaths": [
|
|
1229
|
+
"panels[].disabled",
|
|
1230
|
+
"panels[].expanded"
|
|
1231
|
+
],
|
|
1232
|
+
"submissionImpact": "config-only",
|
|
1233
|
+
"preconditions": [
|
|
1234
|
+
"config-initialized",
|
|
1235
|
+
"target-panel-exists"
|
|
1236
|
+
]
|
|
1237
|
+
},
|
|
1238
|
+
{
|
|
1239
|
+
"operationId": "behavior.multiExpand.set",
|
|
1240
|
+
"title": "Set multi-expand behavior",
|
|
1241
|
+
"scope": "interaction",
|
|
1242
|
+
"targetKind": "behavior",
|
|
1243
|
+
"target": {
|
|
1244
|
+
"kind": "behavior",
|
|
1245
|
+
"resolver": "expansion-behavior-config",
|
|
1246
|
+
"ambiguityPolicy": "fail",
|
|
1247
|
+
"required": true
|
|
1248
|
+
},
|
|
1249
|
+
"inputSchema": {
|
|
1250
|
+
"type": "object",
|
|
1251
|
+
"required": [
|
|
1252
|
+
"multi"
|
|
1253
|
+
],
|
|
1254
|
+
"properties": {
|
|
1255
|
+
"multi": {
|
|
1256
|
+
"type": "boolean"
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
},
|
|
1260
|
+
"effects": [
|
|
1261
|
+
{
|
|
1262
|
+
"kind": "compile-domain-patch",
|
|
1263
|
+
"handler": "expansion-multi-expand-set",
|
|
1264
|
+
"handlerContract": {
|
|
1265
|
+
"reads": [
|
|
1266
|
+
"accordion.multi",
|
|
1267
|
+
"panels[]",
|
|
1268
|
+
"panels[].id",
|
|
1269
|
+
"panels[].expanded"
|
|
1270
|
+
],
|
|
1271
|
+
"writes": [
|
|
1272
|
+
"accordion.multi",
|
|
1273
|
+
"panels[].expanded"
|
|
1274
|
+
],
|
|
1275
|
+
"identityKeys": [
|
|
1276
|
+
"panels[].id"
|
|
1277
|
+
],
|
|
1278
|
+
"inputSchema": {
|
|
1279
|
+
"type": "object",
|
|
1280
|
+
"required": [
|
|
1281
|
+
"multi"
|
|
1282
|
+
],
|
|
1283
|
+
"properties": {
|
|
1284
|
+
"multi": {
|
|
1285
|
+
"type": "boolean"
|
|
1286
|
+
}
|
|
1287
|
+
}
|
|
1288
|
+
},
|
|
1289
|
+
"failureModes": [
|
|
1290
|
+
"multiple-expanded-panels-conflict",
|
|
1291
|
+
"panel-id-missing"
|
|
1292
|
+
],
|
|
1293
|
+
"description": "Sets accordion.multi and collapses competing expanded panels when switching to single-expand behavior."
|
|
1294
|
+
}
|
|
1295
|
+
}
|
|
1296
|
+
],
|
|
1297
|
+
"destructive": false,
|
|
1298
|
+
"requiresConfirmation": false,
|
|
1299
|
+
"validators": [
|
|
1300
|
+
"multi-expand-default-compatible",
|
|
1301
|
+
"accordion-values-valid",
|
|
1302
|
+
"editor-runtime-round-trip"
|
|
1303
|
+
],
|
|
1304
|
+
"affectedPaths": [
|
|
1305
|
+
"accordion.multi",
|
|
1306
|
+
"panels[].expanded"
|
|
1307
|
+
],
|
|
1308
|
+
"submissionImpact": "config-only",
|
|
1309
|
+
"preconditions": [
|
|
1310
|
+
"config-initialized"
|
|
1311
|
+
]
|
|
1312
|
+
},
|
|
1313
|
+
{
|
|
1314
|
+
"operationId": "behavior.defaultExpanded.set",
|
|
1315
|
+
"title": "Set default expanded panel",
|
|
1316
|
+
"scope": "interaction",
|
|
1317
|
+
"targetKind": "expandedState",
|
|
1318
|
+
"target": {
|
|
1319
|
+
"kind": "expandedState",
|
|
1320
|
+
"resolver": "panel-by-id-or-title",
|
|
1321
|
+
"ambiguityPolicy": "fail",
|
|
1322
|
+
"required": true
|
|
1323
|
+
},
|
|
1324
|
+
"inputSchema": {
|
|
1325
|
+
"type": "object",
|
|
1326
|
+
"required": [
|
|
1327
|
+
"expanded"
|
|
1328
|
+
],
|
|
1329
|
+
"properties": {
|
|
1330
|
+
"expanded": {
|
|
1331
|
+
"type": "boolean"
|
|
1332
|
+
},
|
|
1333
|
+
"collapseOthers": {
|
|
1334
|
+
"type": "boolean"
|
|
1335
|
+
}
|
|
1336
|
+
}
|
|
1337
|
+
},
|
|
1338
|
+
"effects": [
|
|
1339
|
+
{
|
|
1340
|
+
"kind": "compile-domain-patch",
|
|
1341
|
+
"handler": "expansion-default-expanded-upsert",
|
|
1342
|
+
"handlerContract": {
|
|
1343
|
+
"reads": [
|
|
1344
|
+
"accordion.multi",
|
|
1345
|
+
"panels[]",
|
|
1346
|
+
"panels[].id",
|
|
1347
|
+
"panels[].expanded",
|
|
1348
|
+
"panels[].disabled"
|
|
1349
|
+
],
|
|
1350
|
+
"writes": [
|
|
1351
|
+
"panels[].expanded"
|
|
1352
|
+
],
|
|
1353
|
+
"identityKeys": [
|
|
1354
|
+
"panels[].id"
|
|
1355
|
+
],
|
|
1356
|
+
"inputSchema": {
|
|
1357
|
+
"type": "object",
|
|
1358
|
+
"required": [
|
|
1359
|
+
"panelId",
|
|
1360
|
+
"expanded"
|
|
1361
|
+
],
|
|
1362
|
+
"properties": {
|
|
1363
|
+
"panelId": {
|
|
1364
|
+
"type": "string"
|
|
1365
|
+
},
|
|
1366
|
+
"expanded": {
|
|
1367
|
+
"type": "boolean"
|
|
1368
|
+
},
|
|
1369
|
+
"collapseOthers": {
|
|
1370
|
+
"type": "boolean"
|
|
1371
|
+
}
|
|
1372
|
+
}
|
|
1373
|
+
},
|
|
1374
|
+
"failureModes": [
|
|
1375
|
+
"panel-not-found",
|
|
1376
|
+
"panel-disabled",
|
|
1377
|
+
"single-expand-conflict"
|
|
1378
|
+
],
|
|
1379
|
+
"description": "Sets a panel expanded state and collapses competing panels when accordion.multi is false."
|
|
1380
|
+
}
|
|
1381
|
+
}
|
|
1382
|
+
],
|
|
1383
|
+
"validators": [
|
|
1384
|
+
"panel-exists",
|
|
1385
|
+
"default-expanded-panel-exists",
|
|
1386
|
+
"multi-expand-default-compatible",
|
|
1387
|
+
"disabled-expanded-compatible"
|
|
1388
|
+
],
|
|
1389
|
+
"destructive": false,
|
|
1390
|
+
"requiresConfirmation": false,
|
|
1391
|
+
"affectedPaths": [
|
|
1392
|
+
"panels[].expanded",
|
|
1393
|
+
"accordion.multi"
|
|
1394
|
+
],
|
|
1395
|
+
"submissionImpact": "config-only",
|
|
1396
|
+
"preconditions": [
|
|
1397
|
+
"config-initialized",
|
|
1398
|
+
"target-panel-exists"
|
|
1399
|
+
]
|
|
1400
|
+
},
|
|
1401
|
+
{
|
|
1402
|
+
"operationId": "panel.content.set",
|
|
1403
|
+
"title": "Set panel content",
|
|
1404
|
+
"scope": "layout",
|
|
1405
|
+
"targetKind": "panelContent",
|
|
1406
|
+
"target": {
|
|
1407
|
+
"kind": "panelContent",
|
|
1408
|
+
"resolver": "panel-content-by-id",
|
|
1409
|
+
"ambiguityPolicy": "fail",
|
|
1410
|
+
"required": true
|
|
1411
|
+
},
|
|
1412
|
+
"inputSchema": {
|
|
1413
|
+
"type": "object",
|
|
1414
|
+
"minProperties": 1,
|
|
1415
|
+
"properties": {
|
|
1416
|
+
"id": {
|
|
1417
|
+
"type": "string"
|
|
1418
|
+
},
|
|
1419
|
+
"title": {
|
|
1420
|
+
"type": "string"
|
|
1421
|
+
},
|
|
1422
|
+
"description": {
|
|
1423
|
+
"type": "string"
|
|
1424
|
+
},
|
|
1425
|
+
"icon": {
|
|
1426
|
+
"type": "string"
|
|
1427
|
+
},
|
|
1428
|
+
"disabled": {
|
|
1429
|
+
"type": "boolean"
|
|
1430
|
+
},
|
|
1431
|
+
"expanded": {
|
|
1432
|
+
"type": "boolean"
|
|
1433
|
+
},
|
|
1434
|
+
"hideToggle": {
|
|
1435
|
+
"type": "boolean"
|
|
1436
|
+
},
|
|
1437
|
+
"collapsedHeight": {
|
|
1438
|
+
"type": "string"
|
|
1439
|
+
},
|
|
1440
|
+
"expandedHeight": {
|
|
1441
|
+
"type": "string"
|
|
1442
|
+
},
|
|
1443
|
+
"content": {
|
|
1444
|
+
"type": "array",
|
|
1445
|
+
"items": {
|
|
1446
|
+
"type": "object"
|
|
1447
|
+
}
|
|
1448
|
+
},
|
|
1449
|
+
"widgets": {
|
|
1450
|
+
"type": "array",
|
|
1451
|
+
"items": {
|
|
1452
|
+
"type": "object"
|
|
1453
|
+
}
|
|
1454
|
+
},
|
|
1455
|
+
"actionButtons": {
|
|
1456
|
+
"type": "array",
|
|
1457
|
+
"items": {
|
|
1458
|
+
"type": "object"
|
|
1459
|
+
}
|
|
1460
|
+
}
|
|
1461
|
+
}
|
|
1462
|
+
},
|
|
1463
|
+
"effects": [
|
|
1464
|
+
{
|
|
1465
|
+
"kind": "merge-by-key",
|
|
1466
|
+
"path": "panels[]",
|
|
1467
|
+
"key": "id"
|
|
1468
|
+
}
|
|
1469
|
+
],
|
|
1470
|
+
"destructive": false,
|
|
1471
|
+
"requiresConfirmation": false,
|
|
1472
|
+
"validators": [
|
|
1473
|
+
"panel-exists",
|
|
1474
|
+
"panel-content-valid",
|
|
1475
|
+
"lazy-content-compatible",
|
|
1476
|
+
"nested-widget-contract-delegated"
|
|
1477
|
+
],
|
|
1478
|
+
"affectedPaths": [
|
|
1479
|
+
"panels[].content",
|
|
1480
|
+
"panels[].widgets",
|
|
1481
|
+
"panels[].actionButtons"
|
|
1482
|
+
],
|
|
1483
|
+
"submissionImpact": "affects-schema-backed-data",
|
|
1484
|
+
"preconditions": [
|
|
1485
|
+
"config-initialized",
|
|
1486
|
+
"target-panel-exists"
|
|
1487
|
+
]
|
|
1488
|
+
}
|
|
1489
|
+
],
|
|
1490
|
+
"validators": [
|
|
1491
|
+
{
|
|
1492
|
+
"validatorId": "panel-id-unique",
|
|
1493
|
+
"level": "error",
|
|
1494
|
+
"code": "PEXP001",
|
|
1495
|
+
"description": "Panel ids must be unique and stable within config.panels[]."
|
|
1496
|
+
},
|
|
1497
|
+
{
|
|
1498
|
+
"validatorId": "panel-exists",
|
|
1499
|
+
"level": "error",
|
|
1500
|
+
"code": "PEXP002",
|
|
1501
|
+
"description": "Target panel must exist before applying the operation."
|
|
1502
|
+
},
|
|
1503
|
+
{
|
|
1504
|
+
"validatorId": "panel-order-deterministic",
|
|
1505
|
+
"level": "error",
|
|
1506
|
+
"code": "PEXP003",
|
|
1507
|
+
"description": "Panel ordering must use stable ids, not transient array index as identity."
|
|
1508
|
+
},
|
|
1509
|
+
{
|
|
1510
|
+
"validatorId": "panel-title-valid",
|
|
1511
|
+
"level": "error",
|
|
1512
|
+
"code": "PEXP004",
|
|
1513
|
+
"description": "Panel title must be a non-empty text value after localization/domain projection."
|
|
1514
|
+
},
|
|
1515
|
+
{
|
|
1516
|
+
"validatorId": "panel-description-valid",
|
|
1517
|
+
"level": "warning",
|
|
1518
|
+
"code": "PEXP005",
|
|
1519
|
+
"description": "Panel description should remain plain header-support text and not replace panel content."
|
|
1520
|
+
},
|
|
1521
|
+
{
|
|
1522
|
+
"validatorId": "panel-icon-valid",
|
|
1523
|
+
"level": "warning",
|
|
1524
|
+
"code": "PEXP006",
|
|
1525
|
+
"description": "Panel icon metadata must remain compatible with PraxisIconDirective and editor round-trip."
|
|
1526
|
+
},
|
|
1527
|
+
{
|
|
1528
|
+
"validatorId": "panel-content-valid",
|
|
1529
|
+
"level": "error",
|
|
1530
|
+
"code": "PEXP007",
|
|
1531
|
+
"description": "Panel content must remain valid FieldMetadata[], WidgetDefinition[] or action button metadata."
|
|
1532
|
+
},
|
|
1533
|
+
{
|
|
1534
|
+
"validatorId": "panel-content-removal-confirmed",
|
|
1535
|
+
"level": "error",
|
|
1536
|
+
"code": "PEXP008",
|
|
1537
|
+
"description": "Removing a panel with fields, widgets or action buttons is destructive and requires confirmation."
|
|
1538
|
+
},
|
|
1539
|
+
{
|
|
1540
|
+
"validatorId": "default-expanded-panel-exists",
|
|
1541
|
+
"level": "error",
|
|
1542
|
+
"code": "PEXP009",
|
|
1543
|
+
"description": "Default expanded state must reference an existing panel id."
|
|
1544
|
+
},
|
|
1545
|
+
{
|
|
1546
|
+
"validatorId": "default-expanded-removal-safe",
|
|
1547
|
+
"level": "error",
|
|
1548
|
+
"code": "PEXP010",
|
|
1549
|
+
"description": "Removing an expanded panel requires deterministic replacement state or explicit confirmation."
|
|
1550
|
+
},
|
|
1551
|
+
{
|
|
1552
|
+
"validatorId": "multi-expand-default-compatible",
|
|
1553
|
+
"level": "error",
|
|
1554
|
+
"code": "PEXP011",
|
|
1555
|
+
"description": "When accordion.multi is false, at most one panel may be marked expanded by default."
|
|
1556
|
+
},
|
|
1557
|
+
{
|
|
1558
|
+
"validatorId": "disabled-expanded-compatible",
|
|
1559
|
+
"level": "warning",
|
|
1560
|
+
"code": "PEXP012",
|
|
1561
|
+
"description": "A disabled panel should not be the only expanded/default focus target without explicit intent."
|
|
1562
|
+
},
|
|
1563
|
+
{
|
|
1564
|
+
"validatorId": "accordion-values-valid",
|
|
1565
|
+
"level": "error",
|
|
1566
|
+
"code": "PEXP013",
|
|
1567
|
+
"description": "Accordion behavior values must match ExpansionMetadata and Angular Material expansion bindings."
|
|
1568
|
+
},
|
|
1569
|
+
{
|
|
1570
|
+
"validatorId": "lazy-content-compatible",
|
|
1571
|
+
"level": "info",
|
|
1572
|
+
"code": "PEXP015",
|
|
1573
|
+
"description": "Panel content remains lazy through matExpansionPanelContent and should not require eager child runtime state."
|
|
1574
|
+
},
|
|
1575
|
+
{
|
|
1576
|
+
"validatorId": "nested-widget-contract-delegated",
|
|
1577
|
+
"level": "info",
|
|
1578
|
+
"code": "PEXP016",
|
|
1579
|
+
"description": "Nested widget content remains governed by child component contracts and component-port nestedPath semantics."
|
|
1580
|
+
},
|
|
1581
|
+
{
|
|
1582
|
+
"validatorId": "editor-runtime-round-trip",
|
|
1583
|
+
"level": "error",
|
|
1584
|
+
"code": "PEXP017",
|
|
1585
|
+
"description": "Settings Panel editor, runtime persistence and registry projection must preserve panel ids, order, icons and expanded state."
|
|
1586
|
+
}
|
|
1587
|
+
],
|
|
1588
|
+
"roundTripRequirements": [
|
|
1589
|
+
"Operations must preserve stable panel ids; array index may be used only as a resolver fallback, never as canonical identity.",
|
|
1590
|
+
"Settings Panel editor, runtime persistence and registry projection must round-trip ExpansionMetadata without losing panel ids, order, icons or expanded state.",
|
|
1591
|
+
"When accordion.multi is false, authoring must collapse competing panels or fail validation instead of producing multiple default-expanded panels.",
|
|
1592
|
+
"Lazy panel content remains represented by panels[].content, panels[].widgets and panels[].actionButtons; authoring cannot require eager child component instances.",
|
|
1593
|
+
"Nested widgets remain delegated through WidgetDefinition and component-port nestedPath semantics instead of being redefined by the expansion contract."
|
|
1594
|
+
],
|
|
1595
|
+
"examples": [
|
|
1596
|
+
{
|
|
1597
|
+
"id": "add-summary-panel",
|
|
1598
|
+
"request": "Add a summary panel before the audit panel.",
|
|
1599
|
+
"operationId": "panel.add",
|
|
1600
|
+
"params": {
|
|
1601
|
+
"id": "summary",
|
|
1602
|
+
"title": "Summary"
|
|
1603
|
+
},
|
|
1604
|
+
"isPositive": true
|
|
1605
|
+
},
|
|
1606
|
+
{
|
|
1607
|
+
"id": "rename-details-panel",
|
|
1608
|
+
"request": "Rename details to Account details.",
|
|
1609
|
+
"operationId": "panel.title.set",
|
|
1610
|
+
"target": "details",
|
|
1611
|
+
"params": {
|
|
1612
|
+
"title": "Account details"
|
|
1613
|
+
},
|
|
1614
|
+
"isPositive": true
|
|
1615
|
+
},
|
|
1616
|
+
{
|
|
1617
|
+
"id": "describe-audit-panel",
|
|
1618
|
+
"request": "Set audit panel description to Recent changes.",
|
|
1619
|
+
"operationId": "panel.description.set",
|
|
1620
|
+
"target": "audit",
|
|
1621
|
+
"params": {
|
|
1622
|
+
"description": "Recent changes"
|
|
1623
|
+
},
|
|
1624
|
+
"isPositive": true
|
|
1625
|
+
},
|
|
1626
|
+
{
|
|
1627
|
+
"id": "set-panel-icon",
|
|
1628
|
+
"request": "Use the info icon on the summary panel.",
|
|
1629
|
+
"operationId": "panel.icon.set",
|
|
1630
|
+
"target": "summary",
|
|
1631
|
+
"params": {
|
|
1632
|
+
"icon": "info"
|
|
1633
|
+
},
|
|
1634
|
+
"isPositive": true
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
"id": "set-default-expanded-panel",
|
|
1638
|
+
"request": "Open the summary panel by default.",
|
|
1639
|
+
"operationId": "behavior.defaultExpanded.set",
|
|
1640
|
+
"target": "summary",
|
|
1641
|
+
"params": {
|
|
1642
|
+
"expanded": true,
|
|
1643
|
+
"collapseOthers": true
|
|
1644
|
+
},
|
|
1645
|
+
"isPositive": true
|
|
1646
|
+
},
|
|
1647
|
+
{
|
|
1648
|
+
"id": "enable-multi-expand",
|
|
1649
|
+
"request": "Allow multiple panels to stay open.",
|
|
1650
|
+
"operationId": "behavior.multiExpand.set",
|
|
1651
|
+
"params": {
|
|
1652
|
+
"multi": true
|
|
1653
|
+
},
|
|
1654
|
+
"isPositive": true
|
|
1655
|
+
},
|
|
1656
|
+
{
|
|
1657
|
+
"id": "disable-archive-panel",
|
|
1658
|
+
"request": "Disable the archive panel.",
|
|
1659
|
+
"operationId": "panel.disabled.set",
|
|
1660
|
+
"target": "archive",
|
|
1661
|
+
"params": {
|
|
1662
|
+
"disabled": true
|
|
1663
|
+
},
|
|
1664
|
+
"isPositive": true
|
|
1665
|
+
},
|
|
1666
|
+
{
|
|
1667
|
+
"id": "reject-missing-default-expanded",
|
|
1668
|
+
"request": "Open the missing panel by default.",
|
|
1669
|
+
"operationId": "behavior.defaultExpanded.set",
|
|
1670
|
+
"target": "missing",
|
|
1671
|
+
"params": {
|
|
1672
|
+
"expanded": true
|
|
1673
|
+
},
|
|
1674
|
+
"isPositive": false
|
|
1675
|
+
},
|
|
1676
|
+
{
|
|
1677
|
+
"id": "reject-duplicate-panel-id",
|
|
1678
|
+
"request": "Add another panel with id summary.",
|
|
1679
|
+
"operationId": "panel.add",
|
|
1680
|
+
"params": {
|
|
1681
|
+
"id": "summary",
|
|
1682
|
+
"title": "Duplicate summary"
|
|
1683
|
+
},
|
|
1684
|
+
"isPositive": false
|
|
1685
|
+
},
|
|
1686
|
+
{
|
|
1687
|
+
"id": "confirm-remove-content-panel",
|
|
1688
|
+
"request": "Remove the details panel that contains widgets.",
|
|
1689
|
+
"operationId": "panel.remove",
|
|
1690
|
+
"target": "details",
|
|
1691
|
+
"params": {
|
|
1692
|
+
"replacementExpandedPanelId": "summary"
|
|
1693
|
+
},
|
|
1694
|
+
"isPositive": true
|
|
1695
|
+
}
|
|
1696
|
+
]
|
|
1697
|
+
},
|
|
1698
|
+
"chunks": [
|
|
1699
|
+
{
|
|
1700
|
+
"chunkIndex": 0,
|
|
1701
|
+
"chunkKind": "summary",
|
|
1702
|
+
"content": "Component ID: praxis-expansion\nSelector: praxis-expansion\nFriendly Name: Praxis Expansion Panel\nDescription: Acordeão/Painéis de expansão configuráveis por metadata, com aparência e tokens M3.\nLib/Package: @praxisui/expansion\nTags: widget, expansion, accordion, configurable\nInputs:\n - config (ExpansionMetadata)\n - expansionId (string)\n - componentInstanceId (string)\n - enableCustomization (boolean)\n - context (Record<string, any>)\n - strictValidation (boolean)\n - defaultOptions (MatExpansionPanelDefaultOptions)\nOutputs:\n - opened ({ panelId?: string; panelIndex: number })\n - closed ({ panelId?: string; panelIndex: number })\n - expandedChange ({ panelId?: string; panelIndex: number; expanded: boolean })\n - afterExpand ({ panelId?: string; panelIndex: number })\n - afterCollapse ({ panelId?: string; panelIndex: number })\n - destroyed ({ panelId?: string; panelIndex: number })\n - widgetEvent (WidgetEventEnvelope)\n",
|
|
1703
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/praxis-expansion.metadata.ts",
|
|
1704
|
+
"contentHash": "30ccb793a31c22baf57710e1c70b92fc952e40dcea38869a7f32ce91d1600ece",
|
|
1705
|
+
"sourceKind": "component_definition",
|
|
1706
|
+
"sourceId": "praxis-expansion",
|
|
1707
|
+
"corpusVersion": "1.0.0"
|
|
1708
|
+
},
|
|
1709
|
+
{
|
|
1710
|
+
"chunkIndex": 1,
|
|
1711
|
+
"chunkKind": "capabilities",
|
|
1712
|
+
"content": "Component Capability:\n - Path: appearance\n Category: appearance\n Kind: object\n Description: Appearance settings.\n\nComponent Capability:\n - Path: appearance.density\n Category: appearance\n Kind: enum\n Description: Density preset.\n\nComponent Capability:\n - Path: appearance.themeClass\n Category: appearance\n Kind: string\n Description: Theme CSS class for root.\n\nComponent Capability:\n - Path: appearance.customCss\n Category: appearance\n Kind: string\n Description: Custom CSS injected into component.\n\nComponent Capability:\n - Path: appearance.tokens\n Category: appearance\n Kind: object\n Description: Token map for theme overrides.\n\nComponent Capability:\n - Path: appearance.tokens.[token]\n Category: appearance\n Kind: string\n Description: Token value (CSS or var).\n\nComponent Capability:\n - Path: accordion\n Category: accordion\n Kind: object\n Description: Accordion behavior settings.\n\nComponent Capability:\n - Path: accordion.multi\n Category: accordion\n Kind: boolean\n Description: Allow multiple panels open.\n\nComponent Capability:\n - Path: accordion.displayMode\n Category: accordion\n Kind: enum\n Description: Accordion display mode.\n\nComponent Capability:\n - Path: accordion.togglePosition\n Category: accordion\n Kind: enum\n Description: Toggle icon position.\n\nComponent Capability:\n - Path: accordion.hideToggle\n Category: accordion\n Kind: boolean\n Description: Hide toggle icon.\n\nComponent Capability:\n - Path: accordion.id\n Category: accordion\n Kind: string\n Description: Accordion id.\n\nComponent Capability:\n - Path: panels\n Category: panels\n Kind: array\n Description: Panel list.\n\nComponent Capability:\n - Path: panels[]\n Category: panels\n Kind: object\n Description: Panel definition.\n\nComponent Capability:\n - Path: panels[].id\n Category: panels\n Kind: string\n Description: Panel id.\n\nComponent Capability:\n - Path: panels[].title\n Category: panels\n Kind: string\n Description: Panel title.\n\nComponent Capability:\n - Path: panels[].description\n Category: panels\n Kind: string\n Description: Panel description.\n\nComponent Capability:\n - Path: panels[].icon\n Category: panels\n Kind: string\n Description: Panel header icon rendered through PraxisIconDirective.\n\nComponent Capability:\n - Path: panels[].disabled\n Category: panels\n Kind: boolean\n Description: Disable panel.\n\nComponent Capability:\n - Path: panels[].expanded\n Category: panels\n Kind: boolean\n Description: Expanded state.\n\nComponent Capability:\n - Path: panels[].hideToggle\n Category: panels\n Kind: boolean\n Description: Hide toggle icon for panel.\n\nComponent Capability:\n - Path: panels[].collapsedHeight\n Category: panels\n Kind: string\n Description: Collapsed header height (e.g., 48px).\n\nComponent Capability:\n - Path: panels[].expandedHeight\n Category: panels\n Kind: string\n Description: Expanded header height (e.g., 64px).\n\nComponent Capability:\n - Path: panels[].content\n Category: panels\n Kind: array\n Description: Dynamic field metadata list (legacy).\n\nComponent Capability:\n - Path: panels[].content[]\n Category: panels\n Kind: object\n Description: Dynamic field metadata item.\n\nComponent Capability:\n - Path: panels[].widgets\n Category: panels\n Kind: array\n Description: WidgetDefinition list for content.\n\nComponent Capability:\n - Path: panels[].widgets[]\n Category: panels\n Kind: object\n Description: WidgetDefinition item.\n\nComponent Capability:\n - Path: panels[].widgets[].id\n Category: panels\n Kind: enum\n Description: Component registry id for widget.\n\nComponent Capability:\n - Path: panels[].widgets[].inputs\n Category: panels\n Kind: object\n Description: Inputs bound into the widget instance.\n\nComponent Capability:\n - Path: panels[].widgets[].outputs\n Category: panels\n Kind: object\n Description: Outputs mapped to actions.\n\nComponent Capability:\n - Path: panels[].widgets[].outputs.[outputName]\n Category: panels\n Kind: object\n Description: Output action mapping (ActionDefinition or \"emit\").\n\nComponent Capability:\n - Path: panels[].widgets[].bindingOrder\n Category: panels\n Kind: array\n Description: Explicit input binding order.\n\nComponent Capability:\n - Path: panels[].widgets[].bindingOrder[]\n Category: panels\n Kind: string\n Description: Input name applied first.\n\nComponent Capability:\n - Path: panels[].actionButtons\n Category: actions\n Kind: array\n Description: Action buttons at panel footer.\n\nComponent Capability:\n - Path: panels[].actionButtons[]\n Category: actions\n Kind: object\n Description: Action button definition.\n\nComponent Capability:\n - Path: panels[].actionButtons[].icon\n Category: actions\n Kind: string\n Description: Action icon.\n\nComponent Capability:\n - Path: panels[].actionButtons[].label\n Category: actions\n Kind: string\n Description: Action label.\n\nComponent Capability:\n - Path: panels[].actionButtons[].action\n Category: actions\n Kind: string\n Description: Action identifier payload.\n\nCapability Note:\n - panels[] should be merged by id or title to avoid replacing all panels.\n\nCapability Note:\n - appearance.customCss is injected into a <style> tag; avoid unsafe CSS from untrusted sources.\n\nCapability Note:\n - appearance.tokens supports limited keys used by styleCss().\n\nCapability Note:\n - panels[].widgets[].id must be a ComponentMetadataRegistry id.\n\nCapability Note:\n - If a field controlType lacks a dedicated catalog, treat it as FieldMetadata base.",
|
|
1713
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/expansion-ai-capabilities.ts",
|
|
1714
|
+
"contentHash": "98245f248a9fe27eeebb93eaa0887aa80b0596e8fd211a99f08270af7c19490c",
|
|
1715
|
+
"sourceKind": "component_definition",
|
|
1716
|
+
"sourceId": "praxis-expansion",
|
|
1717
|
+
"corpusVersion": "1.0.0"
|
|
1718
|
+
},
|
|
1719
|
+
{
|
|
1720
|
+
"chunkIndex": 2,
|
|
1721
|
+
"chunkKind": "authoring_manifest",
|
|
1722
|
+
"content": "{\"operationId\":\"panel.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add panel Effects: append-unique. Add a summary panel before the audit panel. Add another panel with id summary.\",\"scope\":\"global\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panels-array\",\"required\":false},\"inputContract\":{\"required\":[\"id\",\"title\"],\"properties\":[\"id\",\"title\",\"description\",\"icon\",\"disabled\",\"expanded\",\"hideToggle\",\"collapsedHeight\",\"expandedHeight\",\"content\",\"widgets\",\"actionButtons\"],\"semanticTerms\":[\"id\",\"title\",\"description\",\"icon\",\"disabled\",\"expanded\",\"hideToggle\",\"collapsedHeight\",\"expandedHeight\",\"content\",\"widgets\",\"actionButtons\"]},\"effects\":[\"append-unique\"],\"affectedPaths\":[\"panels[]\"],\"validators\":[{\"validatorId\":\"panel-id-unique\",\"level\":\"error\",\"code\":\"PEXP001\",\"description\":\"Panel ids must be unique and stable within config.panels[].\"},{\"validatorId\":\"panel-order-deterministic\",\"level\":\"error\",\"code\":\"PEXP003\",\"description\":\"Panel ordering must use stable ids, not transient array index as identity.\"},{\"validatorId\":\"panel-content-valid\",\"level\":\"error\",\"code\":\"PEXP007\",\"description\":\"Panel content must remain valid FieldMetadata[], WidgetDefinition[] or action button metadata.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-summary-panel\",\"request\":\"Add a summary panel before the audit panel.\",\"operationId\":\"panel.add\",\"params\":{\"id\":\"summary\",\"title\":\"Summary\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-duplicate-panel-id\",\"request\":\"Add another panel with id summary.\",\"operationId\":\"panel.add\",\"params\":{\"id\":\"summary\",\"title\":\"Duplicate summary\"},\"isPositive\":false}]}",
|
|
1723
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1724
|
+
"contentHash": "73fd6392cb70afba5b1fff3b00f8bec17c4ecbff236aa672f9e314edd43fd434",
|
|
1725
|
+
"sourceKind": "component_definition",
|
|
1726
|
+
"sourceId": "praxis-expansion",
|
|
1727
|
+
"corpusVersion": "1.0.0"
|
|
1728
|
+
},
|
|
1729
|
+
{
|
|
1730
|
+
"chunkIndex": 3,
|
|
1731
|
+
"chunkKind": "authoring_manifest",
|
|
1732
|
+
"content": "{\"operationId\":\"panel.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove panel Effects: compile-domain-patch. Remove the details panel that contains widgets.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"replacementExpandedPanelId\"],\"semanticTerms\":[\"replacementExpandedPanelId\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"panels[]\",\"panels[].expanded\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"default-expanded-removal-safe\",\"level\":\"error\",\"code\":\"PEXP010\",\"description\":\"Removing an expanded panel requires deterministic replacement state or explicit confirmation.\"},{\"validatorId\":\"panel-content-removal-confirmed\",\"level\":\"error\",\"code\":\"PEXP008\",\"description\":\"Removing a panel with fields, widgets or action buttons is destructive and requires confirmation.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\",\"confirmation-collected\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"confirm-remove-content-panel\",\"request\":\"Remove the details panel that contains widgets.\",\"operationId\":\"panel.remove\",\"target\":\"details\",\"params\":{\"replacementExpandedPanelId\":\"summary\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1733
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1734
|
+
"contentHash": "689c307a764b5dbed4ff24e1a041aed660f645e09cf75c12f953dd43de5fb498",
|
|
1735
|
+
"sourceKind": "component_definition",
|
|
1736
|
+
"sourceId": "praxis-expansion",
|
|
1737
|
+
"corpusVersion": "1.0.0"
|
|
1738
|
+
},
|
|
1739
|
+
{
|
|
1740
|
+
"chunkIndex": 4,
|
|
1741
|
+
"chunkKind": "authoring_manifest",
|
|
1742
|
+
"content": "{\"operationId\":\"panel.title.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set panel title Effects: merge-by-key. Rename details to Account details.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"title\"],\"properties\":[\"title\"],\"semanticTerms\":[\"title\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"panels[].title\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-title-valid\",\"level\":\"error\",\"code\":\"PEXP004\",\"description\":\"Panel title must be a non-empty text value after localization/domain projection.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"rename-details-panel\",\"request\":\"Rename details to Account details.\",\"operationId\":\"panel.title.set\",\"target\":\"details\",\"params\":{\"title\":\"Account details\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1743
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1744
|
+
"contentHash": "e24314ba997eb176c69692034cded6aeb4a7173ff3a7cb594cd955c46c13de9a",
|
|
1745
|
+
"sourceKind": "component_definition",
|
|
1746
|
+
"sourceId": "praxis-expansion",
|
|
1747
|
+
"corpusVersion": "1.0.0"
|
|
1748
|
+
},
|
|
1749
|
+
{
|
|
1750
|
+
"chunkIndex": 5,
|
|
1751
|
+
"chunkKind": "authoring_manifest",
|
|
1752
|
+
"content": "{\"operationId\":\"panel.description.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set panel description Effects: merge-by-key. Set audit panel description to Recent changes.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"description\"],\"properties\":[\"description\"],\"semanticTerms\":[\"description\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"panels[].description\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-description-valid\",\"level\":\"warning\",\"code\":\"PEXP005\",\"description\":\"Panel description should remain plain header-support text and not replace panel content.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"describe-audit-panel\",\"request\":\"Set audit panel description to Recent changes.\",\"operationId\":\"panel.description.set\",\"target\":\"audit\",\"params\":{\"description\":\"Recent changes\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1753
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1754
|
+
"contentHash": "2bf1bfac1267f918cdbea6bafc72236bad7b98e7f2d566495b743d4e80f9fe84",
|
|
1755
|
+
"sourceKind": "component_definition",
|
|
1756
|
+
"sourceId": "praxis-expansion",
|
|
1757
|
+
"corpusVersion": "1.0.0"
|
|
1758
|
+
},
|
|
1759
|
+
{
|
|
1760
|
+
"chunkIndex": 6,
|
|
1761
|
+
"chunkKind": "authoring_manifest",
|
|
1762
|
+
"content": "{\"operationId\":\"panel.icon.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set panel icon Effects: merge-by-key. Use the info icon on the summary panel.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"icon\"],\"properties\":[\"icon\"],\"semanticTerms\":[\"icon\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"panels[].icon\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-icon-valid\",\"level\":\"warning\",\"code\":\"PEXP006\",\"description\":\"Panel icon metadata must remain compatible with PraxisIconDirective and editor round-trip.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PEXP017\",\"description\":\"Settings Panel editor, runtime persistence and registry projection must preserve panel ids, order, icons and expanded state.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-panel-icon\",\"request\":\"Use the info icon on the summary panel.\",\"operationId\":\"panel.icon.set\",\"target\":\"summary\",\"params\":{\"icon\":\"info\"},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1763
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1764
|
+
"contentHash": "a4df412bb1a3a05597863f5d466b541efc3176a81f3348ad1cb3932765a01021",
|
|
1765
|
+
"sourceKind": "component_definition",
|
|
1766
|
+
"sourceId": "praxis-expansion",
|
|
1767
|
+
"corpusVersion": "1.0.0"
|
|
1768
|
+
},
|
|
1769
|
+
{
|
|
1770
|
+
"chunkIndex": 7,
|
|
1771
|
+
"chunkKind": "authoring_manifest",
|
|
1772
|
+
"content": "{\"operationId\":\"panel.order.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Reorder panels Effects: reorder-by-key.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"beforePanelId\"],\"properties\":[\"beforePanelId\"],\"semanticTerms\":[\"beforePanelId\"]},\"effects\":[\"reorder-by-key\"],\"affectedPaths\":[\"panels[]\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-order-deterministic\",\"level\":\"error\",\"code\":\"PEXP003\",\"description\":\"Panel ordering must use stable ids, not transient array index as identity.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
|
|
1773
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1774
|
+
"contentHash": "7149c19f4377823c95d170dfb4c60d7f0b18b8da3177f0f08c22768601e4be0f",
|
|
1775
|
+
"sourceKind": "component_definition",
|
|
1776
|
+
"sourceId": "praxis-expansion",
|
|
1777
|
+
"corpusVersion": "1.0.0"
|
|
1778
|
+
},
|
|
1779
|
+
{
|
|
1780
|
+
"chunkIndex": 8,
|
|
1781
|
+
"chunkKind": "authoring_manifest",
|
|
1782
|
+
"content": "{\"operationId\":\"panel.disabled.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set disabled state Effects: merge-by-key. Disable the archive panel.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"disabledState\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"disabled\"],\"properties\":[\"disabled\"],\"semanticTerms\":[\"disabled\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"panels[].disabled\",\"panels[].expanded\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"disabled-expanded-compatible\",\"level\":\"warning\",\"code\":\"PEXP012\",\"description\":\"A disabled panel should not be the only expanded/default focus target without explicit intent.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"disable-archive-panel\",\"request\":\"Disable the archive panel.\",\"operationId\":\"panel.disabled.set\",\"target\":\"archive\",\"params\":{\"disabled\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1783
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1784
|
+
"contentHash": "702af7cb24268840ecbeb252e0023f9878524370c2baff2d2832091b4a328d21",
|
|
1785
|
+
"sourceKind": "component_definition",
|
|
1786
|
+
"sourceId": "praxis-expansion",
|
|
1787
|
+
"corpusVersion": "1.0.0"
|
|
1788
|
+
},
|
|
1789
|
+
{
|
|
1790
|
+
"chunkIndex": 9,
|
|
1791
|
+
"chunkKind": "authoring_manifest",
|
|
1792
|
+
"content": "{\"operationId\":\"behavior.multiExpand.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set multi-expand behavior Effects: compile-domain-patch. Allow multiple panels to stay open.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"behavior\",\"resolver\":\"expansion-behavior-config\",\"required\":true},\"inputContract\":{\"required\":[\"multi\"],\"properties\":[\"multi\"],\"semanticTerms\":[\"multi\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"accordion.multi\",\"panels[].expanded\"],\"validators\":[{\"validatorId\":\"multi-expand-default-compatible\",\"level\":\"error\",\"code\":\"PEXP011\",\"description\":\"When accordion.multi is false, at most one panel may be marked expanded by default.\"},{\"validatorId\":\"accordion-values-valid\",\"level\":\"error\",\"code\":\"PEXP013\",\"description\":\"Accordion behavior values must match ExpansionMetadata and Angular Material expansion bindings.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PEXP017\",\"description\":\"Settings Panel editor, runtime persistence and registry projection must preserve panel ids, order, icons and expanded state.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"enable-multi-expand\",\"request\":\"Allow multiple panels to stay open.\",\"operationId\":\"behavior.multiExpand.set\",\"params\":{\"multi\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
|
|
1793
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1794
|
+
"contentHash": "50e11f0fb76ca38e031dbbc50467212729884c363473b48c2e6474a73a2b7b6f",
|
|
1795
|
+
"sourceKind": "component_definition",
|
|
1796
|
+
"sourceId": "praxis-expansion",
|
|
1797
|
+
"corpusVersion": "1.0.0"
|
|
1798
|
+
},
|
|
1799
|
+
{
|
|
1800
|
+
"chunkIndex": 10,
|
|
1801
|
+
"chunkKind": "authoring_manifest",
|
|
1802
|
+
"content": "{\"operationId\":\"behavior.defaultExpanded.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set default expanded panel Effects: compile-domain-patch. Open the summary panel by default. Open the missing panel by default.\",\"scope\":\"interaction\",\"target\":{\"kind\":\"expandedState\",\"resolver\":\"panel-by-id-or-title\",\"required\":true},\"inputContract\":{\"required\":[\"expanded\"],\"properties\":[\"expanded\",\"collapseOthers\"],\"semanticTerms\":[\"expanded\",\"collapseOthers\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"panels[].expanded\",\"accordion.multi\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"default-expanded-panel-exists\",\"level\":\"error\",\"code\":\"PEXP009\",\"description\":\"Default expanded state must reference an existing panel id.\"},{\"validatorId\":\"multi-expand-default-compatible\",\"level\":\"error\",\"code\":\"PEXP011\",\"description\":\"When accordion.multi is false, at most one panel may be marked expanded by default.\"},{\"validatorId\":\"disabled-expanded-compatible\",\"level\":\"warning\",\"code\":\"PEXP012\",\"description\":\"A disabled panel should not be the only expanded/default focus target without explicit intent.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-default-expanded-panel\",\"request\":\"Open the summary panel by default.\",\"operationId\":\"behavior.defaultExpanded.set\",\"target\":\"summary\",\"params\":{\"expanded\":true,\"collapseOthers\":true},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-missing-default-expanded\",\"request\":\"Open the missing panel by default.\",\"operationId\":\"behavior.defaultExpanded.set\",\"target\":\"missing\",\"params\":{\"expanded\":true},\"isPositive\":false}]}",
|
|
1803
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1804
|
+
"contentHash": "c89df6f9faac8b4998432b35ac288fc06cb6636d60cc81b230d6fd2826a97722",
|
|
1805
|
+
"sourceKind": "component_definition",
|
|
1806
|
+
"sourceId": "praxis-expansion",
|
|
1807
|
+
"corpusVersion": "1.0.0"
|
|
1808
|
+
},
|
|
1809
|
+
{
|
|
1810
|
+
"chunkIndex": 11,
|
|
1811
|
+
"chunkKind": "authoring_manifest",
|
|
1812
|
+
"content": "{\"operationId\":\"panel.content.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set panel content Effects: merge-by-key.\",\"scope\":\"layout\",\"target\":{\"kind\":\"panelContent\",\"resolver\":\"panel-content-by-id\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"id\",\"title\",\"description\",\"icon\",\"disabled\",\"expanded\",\"hideToggle\",\"collapsedHeight\",\"expandedHeight\",\"content\",\"widgets\",\"actionButtons\"],\"semanticTerms\":[\"id\",\"title\",\"description\",\"icon\",\"disabled\",\"expanded\",\"hideToggle\",\"collapsedHeight\",\"expandedHeight\",\"content\",\"widgets\",\"actionButtons\"]},\"effects\":[\"merge-by-key\"],\"affectedPaths\":[\"panels[].content\",\"panels[].widgets\",\"panels[].actionButtons\"],\"validators\":[{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-content-valid\",\"level\":\"error\",\"code\":\"PEXP007\",\"description\":\"Panel content must remain valid FieldMetadata[], WidgetDefinition[] or action button metadata.\"},{\"validatorId\":\"lazy-content-compatible\",\"level\":\"info\",\"code\":\"PEXP015\",\"description\":\"Panel content remains lazy through matExpansionPanelContent and should not require eager child runtime state.\"},{\"validatorId\":\"nested-widget-contract-delegated\",\"level\":\"info\",\"code\":\"PEXP016\",\"description\":\"Nested widget content remains governed by child component contracts and component-port nestedPath semantics.\"}],\"preconditions\":[\"config-initialized\",\"target-panel-exists\"],\"submissionImpact\":\"affects-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
|
|
1813
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1814
|
+
"contentHash": "4c7447cfc7ce40e2a173793afe29eb1214d6b70e50c084f96a417db403b96bb5",
|
|
1815
|
+
"sourceKind": "component_definition",
|
|
1816
|
+
"sourceId": "praxis-expansion",
|
|
1817
|
+
"corpusVersion": "1.0.0"
|
|
1818
|
+
},
|
|
1819
|
+
{
|
|
1820
|
+
"chunkIndex": 12,
|
|
1821
|
+
"chunkKind": "authoring_manifest",
|
|
1822
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"identity\"}",
|
|
1823
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1824
|
+
"contentHash": "95f8606354a71b9e4d77d13556d18180d62cbf5555e0bdce6a7d56a5e5605735",
|
|
1825
|
+
"sourceKind": "component_definition",
|
|
1826
|
+
"sourceId": "praxis-expansion",
|
|
1827
|
+
"corpusVersion": "1.0.0"
|
|
1828
|
+
},
|
|
1829
|
+
{
|
|
1830
|
+
"chunkIndex": 13,
|
|
1831
|
+
"chunkKind": "authoring_manifest",
|
|
1832
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"config\",\"type\":\"ExpansionMetadata\",\"description\":\"Canonical accordion and panel configuration.\"},{\"name\":\"expansionId\",\"type\":\"string\",\"description\":\"Stable id used to derive expansion config persistence scope.\"},{\"name\":\"componentInstanceId\",\"type\":\"string\",\"description\":\"Optional instance discriminator for persistence scope.\"},{\"name\":\"context\",\"type\":\"Record<string, any>\",\"description\":\"Context passed to nested widgets.\"},{\"name\":\"strictValidation\",\"type\":\"boolean\",\"description\":\"Controls nested widget validation strictness.\"},{\"name\":\"defaultOptions\",\"type\":\"MatExpansionPanelDefaultOptions\",\"description\":\"Instance-level Material expansion defaults.\"},{\"name\":\"enableCustomization\",\"type\":\"boolean\",\"description\":\"Enables Settings Panel authoring surfaces.\"}]}",
|
|
1833
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1834
|
+
"contentHash": "087beeaa793a947e5c4de9b19068ef3bd5ba74a5d8503a08339c73f6e1c81bfd",
|
|
1835
|
+
"sourceKind": "component_definition",
|
|
1836
|
+
"sourceId": "praxis-expansion",
|
|
1837
|
+
"corpusVersion": "1.0.0"
|
|
1838
|
+
},
|
|
1839
|
+
{
|
|
1840
|
+
"chunkIndex": 14,
|
|
1841
|
+
"chunkKind": "authoring_manifest",
|
|
1842
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"panel\",\"resolver\":\"panel-by-id-or-title\",\"description\":\"A panel in config.panels[].\"},{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"description\":\"Header title, description, icon and heights for a panel.\"},{\"kind\":\"panelContent\",\"resolver\":\"panel-content-by-id\",\"description\":\"Lazy panel content hosted through fields, widgets or action buttons.\"},{\"kind\":\"expandedState\",\"resolver\":\"panel-by-id-or-title\",\"description\":\"Panel expanded state and default expanded selection.\"},{\"kind\":\"disabledState\",\"resolver\":\"panel-by-id-or-title\",\"description\":\"Panel disabled state.\"},{\"kind\":\"layout\",\"resolver\":\"expansion-layout-config\",\"description\":\"Accordion display mode, toggle position, density and visual layout.\"},{\"kind\":\"behavior\",\"resolver\":\"expansion-behavior-config\",\"description\":\"Accordion multi-expand and hide-toggle behavior.\"}]}",
|
|
1843
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1844
|
+
"contentHash": "6b2afeb7d28836fb285a64e79190200d968ad34d72eeae6311c9073fb4a41d50",
|
|
1845
|
+
"sourceKind": "component_definition",
|
|
1846
|
+
"sourceId": "praxis-expansion",
|
|
1847
|
+
"corpusVersion": "1.0.0"
|
|
1848
|
+
},
|
|
1849
|
+
{
|
|
1850
|
+
"chunkIndex": 15,
|
|
1851
|
+
"chunkKind": "authoring_manifest",
|
|
1852
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"panel.add\",\"title\":\"Add panel\",\"scope\":\"global\",\"targetKind\":\"panel\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panels-array\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"id\",\"title\"],\"properties\":{\"id\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"disabled\":{\"type\":\"boolean\"},\"expanded\":{\"type\":\"boolean\"},\"hideToggle\":{\"type\":\"boolean\"},\"collapsedHeight\":{\"type\":\"string\"},\"expandedHeight\":{\"type\":\"string\"},\"content\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"widgets\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"actionButtons\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}},\"effects\":[{\"kind\":\"append-unique\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-id-unique\",\"panel-order-deterministic\",\"panel-content-valid\"],\"affectedPaths\":[\"panels[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"panel.remove\",\"title\":\"Remove panel\",\"scope\":\"layout\",\"targetKind\":\"panel\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"replacementExpandedPanelId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"expansion-panel-remove\",\"handlerContract\":{\"reads\":[\"accordion.multi\",\"panels[]\",\"panels[].id\",\"panels[].expanded\"],\"writes\":[\"panels[]\",\"panels[].expanded\"],\"identityKeys\":[\"panels[].id\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"replacementExpandedPanelId\":{\"type\":\"string\"}}},\"failureModes\":[\"panel-not-found\",\"replacement-panel-not-found\",\"content-removal-not-confirmed\",\"single-expand-conflict\"],\"description\":\"Removes the target panel by stable id and applies replacement expanded state when the removed panel was expanded.\"}}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"panel-exists\",\"default-expanded-removal-safe\",\"panel-content-removal-confirmed\"],\"affectedPaths\":[\"panels[]\",\"panels[].expanded\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\",\"confirmation-collected\"]},{\"operationId\":\"panel.title.set\",\"title\":\"Set panel title\",\"scope\":\"layout\",\"targetKind\":\"panelHeader\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"title\"],\"properties\":{\"title\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"panel-title-valid\"],\"affectedPaths\":[\"panels[].title\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]},{\"operationId\":\"panel.description.set\",\"title\":\"Set panel description\",\"scope\":\"layout\",\"targetKind\":\"panelHeader\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"description\"],\"properties\":{\"description\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"panel-description-valid\"],\"affectedPaths\":[\"panels[].description\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]},{\"operationId\":\"panel.icon.set\",\"title\":\"Set panel icon\",\"scope\":\"layout\",\"targetKind\":\"panelHeader\",\"target\":{\"kind\":\"panelHeader\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"icon\"],\"properties\":{\"icon\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"panel-icon-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"panels[].icon\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]},{\"operationId\":\"panel.order.set\",\"title\":\"Reorder panels\",\"scope\":\"layout\",\"targetKind\":\"panel\",\"target\":{\"kind\":\"panel\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"beforePanelId\"],\"properties\":{\"beforePanelId\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"reorder-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"panel-order-deterministic\"],\"affectedPaths\":[\"panels[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]},{\"operationId\":\"panel.disabled.set\",\"title\":\"Set disabled state\",\"scope\":\"interaction\",\"targetKind\":\"disabledState\",\"target\":{\"kind\":\"disabledState\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"disabled\"],\"properties\":{\"disabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"disabled-expanded-compatible\"],\"affectedPaths\":[\"panels[].disabled\",\"panels[].expanded\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]},{\"operationId\":\"behavior.multiExpand.set\",\"title\":\"Set multi-expand behavior\",\"scope\":\"interaction\",\"targetKind\":\"behavior\",\"target\":{\"kind\":\"behavior\",\"resolver\":\"expansion-behavior-config\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"multi\"],\"properties\":{\"multi\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"expansion-multi-expand-set\",\"handlerContract\":{\"reads\":[\"accordion.multi\",\"panels[]\",\"panels[].id\",\"panels[].expanded\"],\"writes\":[\"accordion.multi\",\"panels[].expanded\"],\"identityKeys\":[\"panels[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"multi\"],\"properties\":{\"multi\":{\"type\":\"boolean\"}}},\"failureModes\":[\"multiple-expanded-panels-conflict\",\"panel-id-missing\"],\"description\":\"Sets accordion.multi and collapses competing expanded panels when switching to single-expand behavior.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"multi-expand-default-compatible\",\"accordion-values-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"accordion.multi\",\"panels[].expanded\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"behavior.defaultExpanded.set\",\"title\":\"Set default expanded panel\",\"scope\":\"interaction\",\"targetKind\":\"expandedState\",\"target\":{\"kind\":\"expandedState\",\"resolver\":\"panel-by-id-or-title\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"expanded\"],\"properties\":{\"expanded\":{\"type\":\"boolean\"},\"collapseOthers\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"expansion-default-expanded-upsert\",\"handlerContract\":{\"reads\":[\"accordion.multi\",\"panels[]\",\"panels[].id\",\"panels[].expanded\",\"panels[].disabled\"],\"writes\":[\"panels[].expanded\"],\"identityKeys\":[\"panels[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"panelId\",\"expanded\"],\"properties\":{\"panelId\":{\"type\":\"string\"},\"expanded\":{\"type\":\"boolean\"},\"collapseOthers\":{\"type\":\"boolean\"}}},\"failureModes\":[\"panel-not-found\",\"panel-disabled\",\"single-expand-conflict\"],\"description\":\"Sets a panel expanded state and collapses competing panels when accordion.multi is false.\"}}],\"validators\":[\"panel-exists\",\"default-expanded-panel-exists\",\"multi-expand-default-compatible\",\"disabled-expanded-compatible\"],\"destructive\":false,\"requiresConfirmation\":false,\"affectedPaths\":[\"panels[].expanded\",\"accordion.multi\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]}]}",
|
|
1853
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1854
|
+
"contentHash": "39661388601522b6e79510f657c2c8cd7e8ca7d1e9402f32dcb0f242904397b4",
|
|
1855
|
+
"sourceKind": "component_definition",
|
|
1856
|
+
"sourceId": "praxis-expansion",
|
|
1857
|
+
"corpusVersion": "1.0.0"
|
|
1858
|
+
},
|
|
1859
|
+
{
|
|
1860
|
+
"chunkIndex": 16,
|
|
1861
|
+
"chunkKind": "authoring_manifest",
|
|
1862
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"panel.content.set\",\"title\":\"Set panel content\",\"scope\":\"layout\",\"targetKind\":\"panelContent\",\"target\":{\"kind\":\"panelContent\",\"resolver\":\"panel-content-by-id\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"minProperties\":1,\"properties\":{\"id\":{\"type\":\"string\"},\"title\":{\"type\":\"string\"},\"description\":{\"type\":\"string\"},\"icon\":{\"type\":\"string\"},\"disabled\":{\"type\":\"boolean\"},\"expanded\":{\"type\":\"boolean\"},\"hideToggle\":{\"type\":\"boolean\"},\"collapsedHeight\":{\"type\":\"string\"},\"expandedHeight\":{\"type\":\"string\"},\"content\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"widgets\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"actionButtons\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}}}},\"effects\":[{\"kind\":\"merge-by-key\",\"path\":\"panels[]\",\"key\":\"id\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"panel-exists\",\"panel-content-valid\",\"lazy-content-compatible\",\"nested-widget-contract-delegated\"],\"affectedPaths\":[\"panels[].content\",\"panels[].widgets\",\"panels[].actionButtons\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\",\"target-panel-exists\"]}]}",
|
|
1863
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1864
|
+
"contentHash": "08aab4c31ec32c247181559404641649b19078241ef3cb10e0c7835d903de875",
|
|
1865
|
+
"sourceKind": "component_definition",
|
|
1866
|
+
"sourceId": "praxis-expansion",
|
|
1867
|
+
"corpusVersion": "1.0.0"
|
|
1868
|
+
},
|
|
1869
|
+
{
|
|
1870
|
+
"chunkIndex": 17,
|
|
1871
|
+
"chunkKind": "authoring_manifest",
|
|
1872
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"validators\",\"validators\":[{\"validatorId\":\"panel-id-unique\",\"level\":\"error\",\"code\":\"PEXP001\",\"description\":\"Panel ids must be unique and stable within config.panels[].\"},{\"validatorId\":\"panel-exists\",\"level\":\"error\",\"code\":\"PEXP002\",\"description\":\"Target panel must exist before applying the operation.\"},{\"validatorId\":\"panel-order-deterministic\",\"level\":\"error\",\"code\":\"PEXP003\",\"description\":\"Panel ordering must use stable ids, not transient array index as identity.\"},{\"validatorId\":\"panel-title-valid\",\"level\":\"error\",\"code\":\"PEXP004\",\"description\":\"Panel title must be a non-empty text value after localization/domain projection.\"},{\"validatorId\":\"panel-description-valid\",\"level\":\"warning\",\"code\":\"PEXP005\",\"description\":\"Panel description should remain plain header-support text and not replace panel content.\"},{\"validatorId\":\"panel-icon-valid\",\"level\":\"warning\",\"code\":\"PEXP006\",\"description\":\"Panel icon metadata must remain compatible with PraxisIconDirective and editor round-trip.\"},{\"validatorId\":\"panel-content-valid\",\"level\":\"error\",\"code\":\"PEXP007\",\"description\":\"Panel content must remain valid FieldMetadata[], WidgetDefinition[] or action button metadata.\"},{\"validatorId\":\"panel-content-removal-confirmed\",\"level\":\"error\",\"code\":\"PEXP008\",\"description\":\"Removing a panel with fields, widgets or action buttons is destructive and requires confirmation.\"},{\"validatorId\":\"default-expanded-panel-exists\",\"level\":\"error\",\"code\":\"PEXP009\",\"description\":\"Default expanded state must reference an existing panel id.\"},{\"validatorId\":\"default-expanded-removal-safe\",\"level\":\"error\",\"code\":\"PEXP010\",\"description\":\"Removing an expanded panel requires deterministic replacement state or explicit confirmation.\"},{\"validatorId\":\"multi-expand-default-compatible\",\"level\":\"error\",\"code\":\"PEXP011\",\"description\":\"When accordion.multi is false, at most one panel may be marked expanded by default.\"},{\"validatorId\":\"disabled-expanded-compatible\",\"level\":\"warning\",\"code\":\"PEXP012\",\"description\":\"A disabled panel should not be the only expanded/default focus target without explicit intent.\"},{\"validatorId\":\"accordion-values-valid\",\"level\":\"error\",\"code\":\"PEXP013\",\"description\":\"Accordion behavior values must match ExpansionMetadata and Angular Material expansion bindings.\"},{\"validatorId\":\"lazy-content-compatible\",\"level\":\"info\",\"code\":\"PEXP015\",\"description\":\"Panel content remains lazy through matExpansionPanelContent and should not require eager child runtime state.\"},{\"validatorId\":\"nested-widget-contract-delegated\",\"level\":\"info\",\"code\":\"PEXP016\",\"description\":\"Nested widget content remains governed by child component contracts and component-port nestedPath semantics.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"PEXP017\",\"description\":\"Settings Panel editor, runtime persistence and registry projection must preserve panel ids, order, icons and expanded state.\"}]}",
|
|
1873
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1874
|
+
"contentHash": "f762e564457ae43f9031a8a8b1be3999b76acce2c78b3727dcce7348c5ad6a07",
|
|
1875
|
+
"sourceKind": "component_definition",
|
|
1876
|
+
"sourceId": "praxis-expansion",
|
|
1877
|
+
"corpusVersion": "1.0.0"
|
|
1878
|
+
},
|
|
1879
|
+
{
|
|
1880
|
+
"chunkIndex": 18,
|
|
1881
|
+
"chunkKind": "authoring_manifest",
|
|
1882
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"Operations must preserve stable panel ids; array index may be used only as a resolver fallback, never as canonical identity.\",\"Settings Panel editor, runtime persistence and registry projection must round-trip ExpansionMetadata without losing panel ids, order, icons or expanded state.\",\"When accordion.multi is false, authoring must collapse competing panels or fail validation instead of producing multiple default-expanded panels.\",\"Lazy panel content remains represented by panels[].content, panels[].widgets and panels[].actionButtons; authoring cannot require eager child component instances.\",\"Nested widgets remain delegated through WidgetDefinition and component-port nestedPath semantics instead of being redefined by the expansion contract.\"]}",
|
|
1883
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1884
|
+
"contentHash": "2150d2f6758ec20426bfbeb240a5a2c650dadbaad07cd2f1a4fd0eb4abf90afc",
|
|
1885
|
+
"sourceKind": "component_definition",
|
|
1886
|
+
"sourceId": "praxis-expansion",
|
|
1887
|
+
"corpusVersion": "1.0.0"
|
|
1888
|
+
},
|
|
1889
|
+
{
|
|
1890
|
+
"chunkIndex": 19,
|
|
1891
|
+
"chunkKind": "authoring_manifest",
|
|
1892
|
+
"content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-expansion\",\"ownerPackage\":\"@praxisui/expansion\",\"configSchemaId\":\"ExpansionMetadata\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"add-summary-panel\",\"request\":\"Add a summary panel before the audit panel.\",\"operationId\":\"panel.add\",\"params\":{\"id\":\"summary\",\"title\":\"Summary\"},\"isPositive\":true},{\"id\":\"rename-details-panel\",\"request\":\"Rename details to Account details.\",\"operationId\":\"panel.title.set\",\"target\":\"details\",\"params\":{\"title\":\"Account details\"},\"isPositive\":true},{\"id\":\"describe-audit-panel\",\"request\":\"Set audit panel description to Recent changes.\",\"operationId\":\"panel.description.set\",\"target\":\"audit\",\"params\":{\"description\":\"Recent changes\"},\"isPositive\":true},{\"id\":\"set-panel-icon\",\"request\":\"Use the info icon on the summary panel.\",\"operationId\":\"panel.icon.set\",\"target\":\"summary\",\"params\":{\"icon\":\"info\"},\"isPositive\":true},{\"id\":\"set-default-expanded-panel\",\"request\":\"Open the summary panel by default.\",\"operationId\":\"behavior.defaultExpanded.set\",\"target\":\"summary\",\"params\":{\"expanded\":true,\"collapseOthers\":true},\"isPositive\":true},{\"id\":\"enable-multi-expand\",\"request\":\"Allow multiple panels to stay open.\",\"operationId\":\"behavior.multiExpand.set\",\"params\":{\"multi\":true},\"isPositive\":true},{\"id\":\"disable-archive-panel\",\"request\":\"Disable the archive panel.\",\"operationId\":\"panel.disabled.set\",\"target\":\"archive\",\"params\":{\"disabled\":true},\"isPositive\":true},{\"id\":\"reject-missing-default-expanded\",\"request\":\"Open the missing panel by default.\",\"operationId\":\"behavior.defaultExpanded.set\",\"target\":\"missing\",\"params\":{\"expanded\":true},\"isPositive\":false},{\"id\":\"reject-duplicate-panel-id\",\"request\":\"Add another panel with id summary.\",\"operationId\":\"panel.add\",\"params\":{\"id\":\"summary\",\"title\":\"Duplicate summary\"},\"isPositive\":false},{\"id\":\"confirm-remove-content-panel\",\"request\":\"Remove the details panel that contains widgets.\",\"operationId\":\"panel.remove\",\"target\":\"details\",\"params\":{\"replacementExpandedPanelId\":\"summary\"},\"isPositive\":true}]}",
|
|
1893
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/praxis-expansion-authoring-manifest.ts",
|
|
1894
|
+
"contentHash": "9b2292c012663eed522075ca7cddec933e51a7454ebc2f13daef030eaf15bb0c",
|
|
1895
|
+
"sourceKind": "component_definition",
|
|
1896
|
+
"sourceId": "praxis-expansion",
|
|
1897
|
+
"corpusVersion": "1.0.0"
|
|
1898
|
+
},
|
|
1899
|
+
{
|
|
1900
|
+
"chunkIndex": 20,
|
|
1901
|
+
"chunkKind": "context_pack",
|
|
1902
|
+
"content": "{\"componentContext\":{\"version\":\"v1\",\"optionsByPath\":{\"appearance.density\":{\"mode\":\"enum\",\"options\":[{\"value\":\"compact\",\"label\":\"Compact\"},{\"value\":\"comfortable\",\"label\":\"Comfortable\"},{\"value\":\"spacious\",\"label\":\"Spacious\"}]},\"accordion.displayMode\":{\"mode\":\"enum\",\"options\":[{\"value\":\"default\",\"label\":\"Default\"},{\"value\":\"flat\",\"label\":\"Flat\"}]},\"accordion.togglePosition\":{\"mode\":\"enum\",\"options\":[{\"value\":\"before\",\"label\":\"Before\"},{\"value\":\"after\",\"label\":\"After\"}]}},\"actionCatalog\":[{\"id\":\"appearance.density.set\",\"intentExamples\":[\"density\",\"compact\",\"spacious\"],\"patchTemplate\":{\"appearance\":{\"density\":\"{{value}}\"}}},{\"id\":\"accordion.multi.enable\",\"intentExamples\":[\"multiple panels\",\"multi expand\",\"allow multiple\"],\"patchTemplate\":{\"accordion\":{\"multi\":true}}},{\"id\":\"accordion.multi.disable\",\"intentExamples\":[\"single panel\",\"only one open\"],\"patchTemplate\":{\"accordion\":{\"multi\":false}}},{\"id\":\"accordion.hideToggle.enable\",\"intentExamples\":[\"hide toggle\",\"no caret\"],\"patchTemplate\":{\"accordion\":{\"hideToggle\":true}}},{\"id\":\"accordion.hideToggle.disable\",\"intentExamples\":[\"show toggle\",\"show caret\"],\"patchTemplate\":{\"accordion\":{\"hideToggle\":false}}},{\"id\":\"panel.add\",\"intentExamples\":[\"add panel\",\"new panel\",\"create panel\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"title\":\"{{value}}\"}]}},{\"id\":\"panel.title.set\",\"intentExamples\":[\"rename panel\",\"panel title\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"title\":\"{{value}}\"}]}},{\"id\":\"panel.description.set\",\"intentExamples\":[\"panel description\",\"subtitle\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"description\":\"{{value}}\"}]}},{\"id\":\"panel.expand\",\"intentExamples\":[\"expand panel\",\"open panel\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"expanded\":true}]}},{\"id\":\"panel.collapse\",\"intentExamples\":[\"collapse panel\",\"close panel\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"expanded\":false}]}},{\"id\":\"panel.disable\",\"intentExamples\":[\"disable panel\",\"lock panel\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"disabled\":true}]}},{\"id\":\"panel.enable\",\"intentExamples\":[\"enable panel\",\"unlock panel\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"disabled\":false}]}},{\"id\":\"panel.hideToggle.enable\",\"intentExamples\":[\"hide panel toggle\",\"no panel toggle\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"hideToggle\":true}]}},{\"id\":\"panel.hideToggle.disable\",\"intentExamples\":[\"show panel toggle\",\"panel caret\"],\"patchTemplate\":{\"panels\":[{\"id\":\"{{target}}\",\"hideToggle\":false}]}}],\"fieldResolvers\":{\"panels[]\":[\"id\",\"title\"]},\"hints\":[\"Use panels[].id or panels[].title as merge keys; avoid array indexes.\",\"Panels merge by id/title; prefer patching a single panel at a time.\",\"DOC: Widget purpose: accordion/expansion panels with optional fields or widgets.\",\"DOC: Host inputs: expansionId (required) and config (optional).\",\"DOC: Minimal config: panels[] with title for each panel.\",\"DOC: Panel content can be fields (content) or widgets (widgets).\"]}}",
|
|
1903
|
+
"sourcePointer": "projects/praxis-expansion/src/lib/ai/expansion-context-pack.ts",
|
|
1904
|
+
"contentHash": "aaa9168a106177e549361b9ef1027a088e707152c70f36f93d01a1bc102b2fc2",
|
|
1905
|
+
"sourceKind": "component_definition",
|
|
1906
|
+
"sourceId": "praxis-expansion",
|
|
1907
|
+
"corpusVersion": "1.0.0"
|
|
1908
|
+
},
|
|
1909
|
+
{
|
|
1910
|
+
"chunkIndex": 21,
|
|
1911
|
+
"chunkKind": "recipe",
|
|
1912
|
+
"content": "{\"_comment\":\"Recipe for Praxis Expansion configuration with panels and form content.\",\"templateMeta\":{\"registryKey\":\"praxis-expansion\",\"variantId\":\"base\",\"useWhen\":\"Base expansion panel configuration.\",\"examplePrompts\":[\"create an expansion panel group\",\"add panels with icons and descriptions\"]},\"config\":{\"appearance\":{\"density\":\"comfortable\",\"themeClass\":\"expansion-theme\",\"tokens\":{\"header-background-color\":\"#f5f7fb\"}},\"accordion\":{\"multi\":true,\"displayMode\":\"default\",\"togglePosition\":\"after\",\"hideToggle\":false,\"id\":\"profile-expansion\"},\"panels\":[{\"id\":\"panel-profile\",\"title\":\"Profile\",\"description\":\"Basic information\",\"expanded\":true,\"content\":[{\"name\":\"fullName\",\"label\":\"Full name\",\"controlType\":\"input\",\"inputType\":\"text\",\"required\":true},{\"name\":\"email\",\"label\":\"Email\",\"controlType\":\"input\",\"inputType\":\"email\"},{\"name\":\"status\",\"label\":\"Status\",\"controlType\":\"select\",\"options\":[{\"label\":\"Active\",\"value\":\"active\"},{\"label\":\"Inactive\",\"value\":\"inactive\"}]}],\"actionButtons\":[{\"label\":\"Save\",\"icon\":\"save\",\"action\":\"save-profile\"}]},{\"id\":\"panel-preferences\",\"title\":\"Preferences\",\"description\":\"Notifications and defaults\",\"content\":[{\"name\":\"notifyEmail\",\"label\":\"Email notifications\",\"controlType\":\"checkbox\"},{\"name\":\"timezone\",\"label\":\"Timezone\",\"controlType\":\"select\",\"options\":[{\"label\":\"UTC-03\",\"value\":\"America/Sao_Paulo\"},{\"label\":\"UTC\",\"value\":\"UTC\"}]}]}]}}",
|
|
1913
|
+
"sourcePointer": "examples/ai-recipes/praxis-expansion.json",
|
|
1914
|
+
"contentHash": "297210dd0309f0bf1209df390cb67aee14ddff463cc1715d0a14a9085e428be2",
|
|
1915
|
+
"sourceKind": "component_definition",
|
|
1916
|
+
"sourceId": "praxis-expansion",
|
|
1917
|
+
"corpusVersion": "1.0.0"
|
|
1918
|
+
}
|
|
1919
|
+
]
|
|
1920
|
+
}
|
|
1921
|
+
},
|
|
1922
|
+
"note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
|
|
1923
|
+
}
|