@praxisui/dialog 9.0.0-beta.7 → 9.0.0-beta.70
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 +1157 -0
- package/fesm2022/praxisui-dialog.mjs +34 -2
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -19,7 +19,7 @@ npm i @praxisui/dialog@latest
|
|
|
19
19
|
Peer dependencies:
|
|
20
20
|
|
|
21
21
|
- `@angular/common`, `@angular/core`, `@angular/cdk`, `@angular/forms`, `@angular/material`, `@angular/platform-browser` `^21.0.0`
|
|
22
|
-
- `@praxisui/core` `^9.0.0-beta.
|
|
22
|
+
- `@praxisui/core` `^9.0.0-beta.12`
|
|
23
23
|
- `rxjs` `~7.8.0`
|
|
24
24
|
|
|
25
25
|
## Use The Service API
|
|
@@ -0,0 +1,1157 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": "1.0.0",
|
|
3
|
+
"generatedAt": "2026-07-10T23:38:40.443Z",
|
|
4
|
+
"packageName": "@praxisui/dialog",
|
|
5
|
+
"packageVersion": "9.0.0-beta.70",
|
|
6
|
+
"sourceRegistry": "praxis-component-registry-ingestion",
|
|
7
|
+
"sourceRegistryVersion": "1.0.0",
|
|
8
|
+
"componentCount": 1,
|
|
9
|
+
"components": {
|
|
10
|
+
"praxis-dialog": {
|
|
11
|
+
"id": "praxis-dialog",
|
|
12
|
+
"description": "Dialog shell for overlay and embedded authoring, with governed size, position, backdrop, close policy, presets and child host delegation.",
|
|
13
|
+
"inputs": [
|
|
14
|
+
{
|
|
15
|
+
"name": "title",
|
|
16
|
+
"type": "string",
|
|
17
|
+
"required": false
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"name": "actions",
|
|
21
|
+
"type": "DialogAction[]",
|
|
22
|
+
"required": false
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"name": "actionsLayout",
|
|
26
|
+
"type": "ActionsLayout",
|
|
27
|
+
"required": false
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "width",
|
|
31
|
+
"type": "string | number",
|
|
32
|
+
"required": false
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"name": "height",
|
|
36
|
+
"type": "string | number",
|
|
37
|
+
"required": false
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
"name": "minWidth",
|
|
41
|
+
"type": "string | number",
|
|
42
|
+
"required": false
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "maxWidth",
|
|
46
|
+
"type": "string | number",
|
|
47
|
+
"required": false
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "minHeight",
|
|
51
|
+
"type": "string | number",
|
|
52
|
+
"required": false
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "maxHeight",
|
|
56
|
+
"type": "string | number",
|
|
57
|
+
"required": false
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
"name": "themeColor",
|
|
61
|
+
"type": "DialogThemeColor",
|
|
62
|
+
"required": false
|
|
63
|
+
},
|
|
64
|
+
{
|
|
65
|
+
"name": "disableClose",
|
|
66
|
+
"type": "boolean",
|
|
67
|
+
"required": false
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"name": "hasBackdrop",
|
|
71
|
+
"type": "boolean",
|
|
72
|
+
"required": false
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
"name": "closeOnBackdropClick",
|
|
76
|
+
"type": "boolean",
|
|
77
|
+
"required": false
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
"name": "panelClass",
|
|
81
|
+
"type": "string | string[] | Record<string, boolean>",
|
|
82
|
+
"required": false
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
"name": "backdropClass",
|
|
86
|
+
"type": "string | string[] | Record<string, boolean>",
|
|
87
|
+
"required": false
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"name": "position",
|
|
91
|
+
"type": "PraxisDialogPosition",
|
|
92
|
+
"required": false
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
"name": "ariaRole",
|
|
96
|
+
"type": "'dialog' | 'alertdialog'",
|
|
97
|
+
"required": false
|
|
98
|
+
},
|
|
99
|
+
{
|
|
100
|
+
"name": "ariaLabel",
|
|
101
|
+
"type": "string",
|
|
102
|
+
"required": false
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
"name": "ariaLabelledBy",
|
|
106
|
+
"type": "string",
|
|
107
|
+
"required": false
|
|
108
|
+
},
|
|
109
|
+
{
|
|
110
|
+
"name": "ariaDescribedBy",
|
|
111
|
+
"type": "string",
|
|
112
|
+
"required": false
|
|
113
|
+
}
|
|
114
|
+
],
|
|
115
|
+
"outputs": [
|
|
116
|
+
{
|
|
117
|
+
"name": "action",
|
|
118
|
+
"type": "DialogAction",
|
|
119
|
+
"required": false
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
"name": "close",
|
|
123
|
+
"type": "unknown",
|
|
124
|
+
"required": false
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"name": "opened",
|
|
128
|
+
"type": "void",
|
|
129
|
+
"required": false
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"name": "afterClosed",
|
|
133
|
+
"type": "void",
|
|
134
|
+
"required": false
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"configSchemaId": null,
|
|
138
|
+
"selector": "praxis-dialog",
|
|
139
|
+
"friendlyName": "Praxis Dialog",
|
|
140
|
+
"icon": "dialogs",
|
|
141
|
+
"tags": [
|
|
142
|
+
"dialog",
|
|
143
|
+
"overlay",
|
|
144
|
+
"shell",
|
|
145
|
+
"authoring"
|
|
146
|
+
],
|
|
147
|
+
"lib": "@praxisui/dialog",
|
|
148
|
+
"source": "projects/praxis-dialog/src/lib/praxis-dialog.metadata.ts",
|
|
149
|
+
"exportName": "PRAXIS_DIALOG_COMPONENT_METADATA",
|
|
150
|
+
"authoringManifest": {
|
|
151
|
+
"schemaVersion": "1.0.0",
|
|
152
|
+
"componentId": "praxis-dialog",
|
|
153
|
+
"ownerPackage": "@praxisui/dialog",
|
|
154
|
+
"configSchemaId": "PraxisDialogConfig",
|
|
155
|
+
"manifestVersion": "1.0.0",
|
|
156
|
+
"runtimeInputs": [
|
|
157
|
+
{
|
|
158
|
+
"name": "config",
|
|
159
|
+
"type": "PraxisDialogConfig",
|
|
160
|
+
"description": "Canonical shell configuration consumed by PraxisDialog.open and tag mode."
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
"name": "content",
|
|
164
|
+
"type": "ComponentType | TemplateRef | DialogContentDescriptor",
|
|
165
|
+
"description": "Dialog child host content. Child semantics remain owned by the child component manifest."
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
"name": "variant",
|
|
169
|
+
"type": "string",
|
|
170
|
+
"description": "Optional global preset variant merged after dialog type presets and before local config."
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"name": "componentId",
|
|
174
|
+
"type": "string",
|
|
175
|
+
"description": "Component metadata or dialog registry id used by global dialog open actions."
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"name": "inputs",
|
|
179
|
+
"type": "Record<string, unknown>",
|
|
180
|
+
"description": "Inputs applied to the child component after opening the dialog."
|
|
181
|
+
}
|
|
182
|
+
],
|
|
183
|
+
"editableTargets": [
|
|
184
|
+
{
|
|
185
|
+
"kind": "dialogShell",
|
|
186
|
+
"resolver": "praxis-dialog-config-root",
|
|
187
|
+
"description": "Top-level PraxisDialogConfig shell fields such as title, role, actions and theme."
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"kind": "size",
|
|
191
|
+
"resolver": "praxis-dialog-size-fields",
|
|
192
|
+
"description": "Width, height, min/max size fields on PraxisDialogConfig."
|
|
193
|
+
},
|
|
194
|
+
{
|
|
195
|
+
"kind": "position",
|
|
196
|
+
"resolver": "praxis-dialog-position-fields",
|
|
197
|
+
"description": "Overlay position fields top, bottom, left and right."
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"kind": "backdrop",
|
|
201
|
+
"resolver": "praxis-dialog-backdrop-fields",
|
|
202
|
+
"description": "Backdrop enablement and backdrop class semantics."
|
|
203
|
+
},
|
|
204
|
+
{
|
|
205
|
+
"kind": "closePolicy",
|
|
206
|
+
"resolver": "praxis-dialog-close-policy-fields",
|
|
207
|
+
"description": "disableClose, closeOnBackdropClick, closeOnNavigation, restoreFocus and autofocus behavior."
|
|
208
|
+
},
|
|
209
|
+
{
|
|
210
|
+
"kind": "preset",
|
|
211
|
+
"resolver": "praxis-dialog-global-preset-by-type-variant",
|
|
212
|
+
"description": "Type and variant presets merged through PRAXIS_DIALOG_GLOBAL_PRESETS."
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"kind": "childHost",
|
|
216
|
+
"resolver": "praxis-dialog-child-component-or-template-host",
|
|
217
|
+
"description": "Component/template registry child host and input/data envelope."
|
|
218
|
+
}
|
|
219
|
+
],
|
|
220
|
+
"operations": [
|
|
221
|
+
{
|
|
222
|
+
"operationId": "dialog.shell.set",
|
|
223
|
+
"title": "Set dialog shell fields",
|
|
224
|
+
"scope": "global",
|
|
225
|
+
"targetKind": "dialogShell",
|
|
226
|
+
"target": {
|
|
227
|
+
"kind": "dialogShell",
|
|
228
|
+
"resolver": "praxis-dialog-config-root",
|
|
229
|
+
"ambiguityPolicy": "fail",
|
|
230
|
+
"required": false
|
|
231
|
+
},
|
|
232
|
+
"inputSchema": {
|
|
233
|
+
"type": "object",
|
|
234
|
+
"minProperties": 1,
|
|
235
|
+
"properties": {
|
|
236
|
+
"title": {
|
|
237
|
+
"type": "string"
|
|
238
|
+
},
|
|
239
|
+
"titleIcon": {
|
|
240
|
+
"type": "string"
|
|
241
|
+
},
|
|
242
|
+
"ariaRole": {
|
|
243
|
+
"enum": [
|
|
244
|
+
"dialog",
|
|
245
|
+
"alertdialog"
|
|
246
|
+
]
|
|
247
|
+
},
|
|
248
|
+
"ariaLabel": {
|
|
249
|
+
"type": "string"
|
|
250
|
+
},
|
|
251
|
+
"ariaLabelledBy": {
|
|
252
|
+
"type": "string"
|
|
253
|
+
},
|
|
254
|
+
"ariaDescribedBy": {
|
|
255
|
+
"type": "string"
|
|
256
|
+
},
|
|
257
|
+
"themeColor": {
|
|
258
|
+
"enum": [
|
|
259
|
+
"primary",
|
|
260
|
+
"light",
|
|
261
|
+
"dark"
|
|
262
|
+
]
|
|
263
|
+
},
|
|
264
|
+
"actionsLayout": {
|
|
265
|
+
"enum": [
|
|
266
|
+
"start",
|
|
267
|
+
"center",
|
|
268
|
+
"end",
|
|
269
|
+
"stretched"
|
|
270
|
+
]
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
},
|
|
274
|
+
"effects": [
|
|
275
|
+
{
|
|
276
|
+
"kind": "merge-object",
|
|
277
|
+
"path": "config"
|
|
278
|
+
}
|
|
279
|
+
],
|
|
280
|
+
"destructive": false,
|
|
281
|
+
"requiresConfirmation": false,
|
|
282
|
+
"validators": [
|
|
283
|
+
"accessibility-label-preserved",
|
|
284
|
+
"aria-role-valid",
|
|
285
|
+
"shell-fields-supported",
|
|
286
|
+
"dialog-round-trip"
|
|
287
|
+
],
|
|
288
|
+
"affectedPaths": [
|
|
289
|
+
"config.title",
|
|
290
|
+
"config.titleIcon",
|
|
291
|
+
"config.ariaRole",
|
|
292
|
+
"config.ariaLabel",
|
|
293
|
+
"config.ariaLabelledBy",
|
|
294
|
+
"config.ariaDescribedBy",
|
|
295
|
+
"config.themeColor",
|
|
296
|
+
"config.actionsLayout"
|
|
297
|
+
],
|
|
298
|
+
"submissionImpact": "config-only",
|
|
299
|
+
"preconditions": [
|
|
300
|
+
"config-initialized"
|
|
301
|
+
]
|
|
302
|
+
},
|
|
303
|
+
{
|
|
304
|
+
"operationId": "dialog.size.set",
|
|
305
|
+
"title": "Set dialog size",
|
|
306
|
+
"scope": "layout",
|
|
307
|
+
"targetKind": "size",
|
|
308
|
+
"target": {
|
|
309
|
+
"kind": "size",
|
|
310
|
+
"resolver": "praxis-dialog-size-fields",
|
|
311
|
+
"ambiguityPolicy": "fail",
|
|
312
|
+
"required": false
|
|
313
|
+
},
|
|
314
|
+
"inputSchema": {
|
|
315
|
+
"type": "object",
|
|
316
|
+
"minProperties": 1,
|
|
317
|
+
"properties": {
|
|
318
|
+
"width": {
|
|
319
|
+
"oneOf": [
|
|
320
|
+
{
|
|
321
|
+
"type": "string"
|
|
322
|
+
},
|
|
323
|
+
{
|
|
324
|
+
"type": "number"
|
|
325
|
+
}
|
|
326
|
+
]
|
|
327
|
+
},
|
|
328
|
+
"height": {
|
|
329
|
+
"oneOf": [
|
|
330
|
+
{
|
|
331
|
+
"type": "string"
|
|
332
|
+
},
|
|
333
|
+
{
|
|
334
|
+
"type": "number"
|
|
335
|
+
}
|
|
336
|
+
]
|
|
337
|
+
},
|
|
338
|
+
"minWidth": {
|
|
339
|
+
"oneOf": [
|
|
340
|
+
{
|
|
341
|
+
"type": "string"
|
|
342
|
+
},
|
|
343
|
+
{
|
|
344
|
+
"type": "number"
|
|
345
|
+
}
|
|
346
|
+
]
|
|
347
|
+
},
|
|
348
|
+
"maxWidth": {
|
|
349
|
+
"oneOf": [
|
|
350
|
+
{
|
|
351
|
+
"type": "string"
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
"type": "number"
|
|
355
|
+
}
|
|
356
|
+
]
|
|
357
|
+
},
|
|
358
|
+
"minHeight": {
|
|
359
|
+
"oneOf": [
|
|
360
|
+
{
|
|
361
|
+
"type": "string"
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
"type": "number"
|
|
365
|
+
}
|
|
366
|
+
]
|
|
367
|
+
},
|
|
368
|
+
"maxHeight": {
|
|
369
|
+
"oneOf": [
|
|
370
|
+
{
|
|
371
|
+
"type": "string"
|
|
372
|
+
},
|
|
373
|
+
{
|
|
374
|
+
"type": "number"
|
|
375
|
+
}
|
|
376
|
+
]
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
},
|
|
380
|
+
"effects": [
|
|
381
|
+
{
|
|
382
|
+
"kind": "merge-object",
|
|
383
|
+
"path": "config"
|
|
384
|
+
}
|
|
385
|
+
],
|
|
386
|
+
"destructive": false,
|
|
387
|
+
"requiresConfirmation": false,
|
|
388
|
+
"validators": [
|
|
389
|
+
"size-values-safe",
|
|
390
|
+
"size-min-max-consistent",
|
|
391
|
+
"dialog-round-trip"
|
|
392
|
+
],
|
|
393
|
+
"affectedPaths": [
|
|
394
|
+
"config.width",
|
|
395
|
+
"config.height",
|
|
396
|
+
"config.minWidth",
|
|
397
|
+
"config.maxWidth",
|
|
398
|
+
"config.minHeight",
|
|
399
|
+
"config.maxHeight"
|
|
400
|
+
],
|
|
401
|
+
"submissionImpact": "visual-only",
|
|
402
|
+
"preconditions": [
|
|
403
|
+
"config-initialized"
|
|
404
|
+
]
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"operationId": "dialog.position.set",
|
|
408
|
+
"title": "Set dialog position",
|
|
409
|
+
"scope": "layout",
|
|
410
|
+
"targetKind": "position",
|
|
411
|
+
"target": {
|
|
412
|
+
"kind": "position",
|
|
413
|
+
"resolver": "praxis-dialog-position-fields",
|
|
414
|
+
"ambiguityPolicy": "fail",
|
|
415
|
+
"required": false
|
|
416
|
+
},
|
|
417
|
+
"inputSchema": {
|
|
418
|
+
"type": "object",
|
|
419
|
+
"minProperties": 1,
|
|
420
|
+
"properties": {
|
|
421
|
+
"top": {
|
|
422
|
+
"type": "string"
|
|
423
|
+
},
|
|
424
|
+
"bottom": {
|
|
425
|
+
"type": "string"
|
|
426
|
+
},
|
|
427
|
+
"left": {
|
|
428
|
+
"type": "string"
|
|
429
|
+
},
|
|
430
|
+
"right": {
|
|
431
|
+
"type": "string"
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
},
|
|
435
|
+
"effects": [
|
|
436
|
+
{
|
|
437
|
+
"kind": "set-value",
|
|
438
|
+
"path": "config.position"
|
|
439
|
+
}
|
|
440
|
+
],
|
|
441
|
+
"destructive": false,
|
|
442
|
+
"requiresConfirmation": false,
|
|
443
|
+
"validators": [
|
|
444
|
+
"position-values-safe",
|
|
445
|
+
"position-not-conflicting",
|
|
446
|
+
"dialog-round-trip"
|
|
447
|
+
],
|
|
448
|
+
"affectedPaths": [
|
|
449
|
+
"config.position"
|
|
450
|
+
],
|
|
451
|
+
"submissionImpact": "visual-only",
|
|
452
|
+
"preconditions": [
|
|
453
|
+
"config-initialized"
|
|
454
|
+
]
|
|
455
|
+
},
|
|
456
|
+
{
|
|
457
|
+
"operationId": "dialog.backdrop.set",
|
|
458
|
+
"title": "Set dialog backdrop",
|
|
459
|
+
"scope": "skin",
|
|
460
|
+
"targetKind": "backdrop",
|
|
461
|
+
"target": {
|
|
462
|
+
"kind": "backdrop",
|
|
463
|
+
"resolver": "praxis-dialog-backdrop-fields",
|
|
464
|
+
"ambiguityPolicy": "fail",
|
|
465
|
+
"required": false
|
|
466
|
+
},
|
|
467
|
+
"inputSchema": {
|
|
468
|
+
"type": "object",
|
|
469
|
+
"minProperties": 1,
|
|
470
|
+
"properties": {
|
|
471
|
+
"hasBackdrop": {
|
|
472
|
+
"type": "boolean"
|
|
473
|
+
},
|
|
474
|
+
"backdropClass": {
|
|
475
|
+
"oneOf": [
|
|
476
|
+
{
|
|
477
|
+
"type": "string"
|
|
478
|
+
},
|
|
479
|
+
{
|
|
480
|
+
"type": "array"
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
"type": "object"
|
|
484
|
+
}
|
|
485
|
+
]
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
},
|
|
489
|
+
"effects": [
|
|
490
|
+
{
|
|
491
|
+
"kind": "merge-object",
|
|
492
|
+
"path": "config"
|
|
493
|
+
}
|
|
494
|
+
],
|
|
495
|
+
"destructive": false,
|
|
496
|
+
"requiresConfirmation": false,
|
|
497
|
+
"validators": [
|
|
498
|
+
"backdrop-policy-explicit",
|
|
499
|
+
"backdrop-class-safe",
|
|
500
|
+
"dialog-round-trip"
|
|
501
|
+
],
|
|
502
|
+
"affectedPaths": [
|
|
503
|
+
"config.hasBackdrop",
|
|
504
|
+
"config.backdropClass"
|
|
505
|
+
],
|
|
506
|
+
"submissionImpact": "visual-only",
|
|
507
|
+
"preconditions": [
|
|
508
|
+
"config-initialized"
|
|
509
|
+
]
|
|
510
|
+
},
|
|
511
|
+
{
|
|
512
|
+
"operationId": "dialog.closePolicy.set",
|
|
513
|
+
"title": "Set dialog close policy",
|
|
514
|
+
"scope": "accessibility",
|
|
515
|
+
"targetKind": "closePolicy",
|
|
516
|
+
"target": {
|
|
517
|
+
"kind": "closePolicy",
|
|
518
|
+
"resolver": "praxis-dialog-close-policy-fields",
|
|
519
|
+
"ambiguityPolicy": "fail",
|
|
520
|
+
"required": false
|
|
521
|
+
},
|
|
522
|
+
"inputSchema": {
|
|
523
|
+
"type": "object",
|
|
524
|
+
"minProperties": 1,
|
|
525
|
+
"properties": {
|
|
526
|
+
"disableClose": {
|
|
527
|
+
"type": "boolean"
|
|
528
|
+
},
|
|
529
|
+
"closeOnBackdropClick": {
|
|
530
|
+
"type": "boolean"
|
|
531
|
+
},
|
|
532
|
+
"closeOnNavigation": {
|
|
533
|
+
"type": "boolean"
|
|
534
|
+
},
|
|
535
|
+
"restoreFocus": {
|
|
536
|
+
"type": "boolean"
|
|
537
|
+
},
|
|
538
|
+
"autoFocus": {
|
|
539
|
+
"type": "boolean"
|
|
540
|
+
},
|
|
541
|
+
"autoFocusedElement": {
|
|
542
|
+
"type": "string"
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
},
|
|
546
|
+
"effects": [
|
|
547
|
+
{
|
|
548
|
+
"kind": "merge-object",
|
|
549
|
+
"path": "config"
|
|
550
|
+
}
|
|
551
|
+
],
|
|
552
|
+
"destructive": true,
|
|
553
|
+
"requiresConfirmation": true,
|
|
554
|
+
"validators": [
|
|
555
|
+
"close-policy-explicit",
|
|
556
|
+
"unsafe-close-confirmed-when-needed",
|
|
557
|
+
"restore-focus-preserved",
|
|
558
|
+
"alertdialog-focus-preserved",
|
|
559
|
+
"dialog-round-trip"
|
|
560
|
+
],
|
|
561
|
+
"affectedPaths": [
|
|
562
|
+
"config.disableClose",
|
|
563
|
+
"config.closeOnBackdropClick",
|
|
564
|
+
"config.closeOnNavigation",
|
|
565
|
+
"config.restoreFocus",
|
|
566
|
+
"config.autoFocus",
|
|
567
|
+
"config.autoFocusedElement"
|
|
568
|
+
],
|
|
569
|
+
"submissionImpact": "config-only",
|
|
570
|
+
"preconditions": [
|
|
571
|
+
"config-initialized",
|
|
572
|
+
"confirmation-collected"
|
|
573
|
+
]
|
|
574
|
+
},
|
|
575
|
+
{
|
|
576
|
+
"operationId": "dialog.preset.apply",
|
|
577
|
+
"title": "Apply dialog preset",
|
|
578
|
+
"scope": "global",
|
|
579
|
+
"targetKind": "preset",
|
|
580
|
+
"target": {
|
|
581
|
+
"kind": "preset",
|
|
582
|
+
"resolver": "praxis-dialog-global-preset-by-type-variant",
|
|
583
|
+
"ambiguityPolicy": "fail",
|
|
584
|
+
"required": false
|
|
585
|
+
},
|
|
586
|
+
"inputSchema": {
|
|
587
|
+
"type": "object",
|
|
588
|
+
"required": [
|
|
589
|
+
"dialogType"
|
|
590
|
+
],
|
|
591
|
+
"properties": {
|
|
592
|
+
"dialogType": {
|
|
593
|
+
"enum": [
|
|
594
|
+
"confirm",
|
|
595
|
+
"alert",
|
|
596
|
+
"prompt",
|
|
597
|
+
"custom"
|
|
598
|
+
]
|
|
599
|
+
},
|
|
600
|
+
"variant": {
|
|
601
|
+
"type": "string"
|
|
602
|
+
},
|
|
603
|
+
"localConfig": {
|
|
604
|
+
"type": "object"
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
},
|
|
608
|
+
"effects": [
|
|
609
|
+
{
|
|
610
|
+
"kind": "compile-domain-patch",
|
|
611
|
+
"handler": "dialog-preset-apply",
|
|
612
|
+
"handlerContract": {
|
|
613
|
+
"reads": [
|
|
614
|
+
"PRAXIS_DIALOG_GLOBAL_PRESETS",
|
|
615
|
+
"config",
|
|
616
|
+
"variant"
|
|
617
|
+
],
|
|
618
|
+
"writes": [
|
|
619
|
+
"config",
|
|
620
|
+
"variant"
|
|
621
|
+
],
|
|
622
|
+
"identityKeys": [
|
|
623
|
+
"dialogType",
|
|
624
|
+
"variant"
|
|
625
|
+
],
|
|
626
|
+
"inputSchema": {
|
|
627
|
+
"type": "object",
|
|
628
|
+
"required": [
|
|
629
|
+
"dialogType"
|
|
630
|
+
],
|
|
631
|
+
"properties": {
|
|
632
|
+
"dialogType": {
|
|
633
|
+
"enum": [
|
|
634
|
+
"confirm",
|
|
635
|
+
"alert",
|
|
636
|
+
"prompt",
|
|
637
|
+
"custom"
|
|
638
|
+
]
|
|
639
|
+
},
|
|
640
|
+
"variant": {
|
|
641
|
+
"type": "string"
|
|
642
|
+
},
|
|
643
|
+
"localConfig": {
|
|
644
|
+
"type": "object"
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
"failureModes": [
|
|
649
|
+
"preset-not-found",
|
|
650
|
+
"variant-not-found",
|
|
651
|
+
"preset-merge-order-invalid",
|
|
652
|
+
"accessibility-regression"
|
|
653
|
+
],
|
|
654
|
+
"description": "Applies the canonical merge order type preset -> variant -> local config without mutating child component semantics."
|
|
655
|
+
}
|
|
656
|
+
}
|
|
657
|
+
],
|
|
658
|
+
"destructive": false,
|
|
659
|
+
"requiresConfirmation": false,
|
|
660
|
+
"validators": [
|
|
661
|
+
"preset-exists",
|
|
662
|
+
"preset-merge-order-preserved",
|
|
663
|
+
"accessibility-label-preserved",
|
|
664
|
+
"dialog-round-trip"
|
|
665
|
+
],
|
|
666
|
+
"affectedPaths": [
|
|
667
|
+
"config",
|
|
668
|
+
"variant"
|
|
669
|
+
],
|
|
670
|
+
"submissionImpact": "config-only",
|
|
671
|
+
"preconditions": [
|
|
672
|
+
"config-initialized"
|
|
673
|
+
]
|
|
674
|
+
},
|
|
675
|
+
{
|
|
676
|
+
"operationId": "childHost.configure",
|
|
677
|
+
"title": "Configure dialog child host",
|
|
678
|
+
"scope": "templating",
|
|
679
|
+
"targetKind": "childHost",
|
|
680
|
+
"target": {
|
|
681
|
+
"kind": "childHost",
|
|
682
|
+
"resolver": "praxis-dialog-child-component-or-template-host",
|
|
683
|
+
"ambiguityPolicy": "fail",
|
|
684
|
+
"required": false
|
|
685
|
+
},
|
|
686
|
+
"inputSchema": {
|
|
687
|
+
"type": "object",
|
|
688
|
+
"required": [
|
|
689
|
+
"contentType"
|
|
690
|
+
],
|
|
691
|
+
"properties": {
|
|
692
|
+
"contentType": {
|
|
693
|
+
"enum": [
|
|
694
|
+
"component",
|
|
695
|
+
"template"
|
|
696
|
+
]
|
|
697
|
+
},
|
|
698
|
+
"componentId": {
|
|
699
|
+
"type": "string"
|
|
700
|
+
},
|
|
701
|
+
"templateId": {
|
|
702
|
+
"type": "string"
|
|
703
|
+
},
|
|
704
|
+
"inputs": {
|
|
705
|
+
"type": "object"
|
|
706
|
+
},
|
|
707
|
+
"data": {},
|
|
708
|
+
"childManifestComponentId": {
|
|
709
|
+
"type": "string"
|
|
710
|
+
}
|
|
711
|
+
}
|
|
712
|
+
},
|
|
713
|
+
"effects": [
|
|
714
|
+
{
|
|
715
|
+
"kind": "compile-domain-patch",
|
|
716
|
+
"handler": "dialog-child-host-configure",
|
|
717
|
+
"handlerContract": {
|
|
718
|
+
"reads": [
|
|
719
|
+
"ComponentMetadataRegistry",
|
|
720
|
+
"PRAXIS_DIALOG_CONTENT_REGISTRY",
|
|
721
|
+
"PRAXIS_DIALOG_TEMPLATE_REGISTRY",
|
|
722
|
+
"content",
|
|
723
|
+
"componentId",
|
|
724
|
+
"inputs",
|
|
725
|
+
"data"
|
|
726
|
+
],
|
|
727
|
+
"writes": [
|
|
728
|
+
"content",
|
|
729
|
+
"componentId",
|
|
730
|
+
"inputs",
|
|
731
|
+
"data"
|
|
732
|
+
],
|
|
733
|
+
"identityKeys": [
|
|
734
|
+
"componentId",
|
|
735
|
+
"templateId"
|
|
736
|
+
],
|
|
737
|
+
"failureModes": [
|
|
738
|
+
"component-not-registered",
|
|
739
|
+
"template-not-registered",
|
|
740
|
+
"child-inputs-not-serializable",
|
|
741
|
+
"child-manifest-required"
|
|
742
|
+
],
|
|
743
|
+
"description": "Configures which component/template is hosted in the dialog and serializable host inputs; child config fields remain delegated to the child manifest."
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
],
|
|
747
|
+
"destructive": false,
|
|
748
|
+
"requiresConfirmation": false,
|
|
749
|
+
"validators": [
|
|
750
|
+
"child-host-registered",
|
|
751
|
+
"child-config-delegates-to-child-manifest",
|
|
752
|
+
"child-inputs-serializable",
|
|
753
|
+
"dialog-round-trip"
|
|
754
|
+
],
|
|
755
|
+
"affectedPaths": [
|
|
756
|
+
"content",
|
|
757
|
+
"componentId",
|
|
758
|
+
"inputs",
|
|
759
|
+
"data"
|
|
760
|
+
],
|
|
761
|
+
"submissionImpact": "config-only",
|
|
762
|
+
"preconditions": [
|
|
763
|
+
"config-initialized"
|
|
764
|
+
]
|
|
765
|
+
},
|
|
766
|
+
{
|
|
767
|
+
"operationId": "childOperation.delegate",
|
|
768
|
+
"title": "Delegate operation to child manifest",
|
|
769
|
+
"scope": "templating",
|
|
770
|
+
"targetKind": "childHost",
|
|
771
|
+
"target": {
|
|
772
|
+
"kind": "childHost",
|
|
773
|
+
"resolver": "praxis-dialog-child-component-or-template-host",
|
|
774
|
+
"ambiguityPolicy": "fail",
|
|
775
|
+
"required": true
|
|
776
|
+
},
|
|
777
|
+
"inputSchema": {
|
|
778
|
+
"type": "object",
|
|
779
|
+
"required": [
|
|
780
|
+
"childManifestComponentId",
|
|
781
|
+
"operationId",
|
|
782
|
+
"params"
|
|
783
|
+
],
|
|
784
|
+
"properties": {
|
|
785
|
+
"childManifestComponentId": {
|
|
786
|
+
"type": "string"
|
|
787
|
+
},
|
|
788
|
+
"operationId": {
|
|
789
|
+
"type": "string"
|
|
790
|
+
},
|
|
791
|
+
"target": {
|
|
792
|
+
"type": "string"
|
|
793
|
+
},
|
|
794
|
+
"params": {
|
|
795
|
+
"type": "object"
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
},
|
|
799
|
+
"effects": [
|
|
800
|
+
{
|
|
801
|
+
"kind": "compile-domain-patch",
|
|
802
|
+
"handler": "dialog-child-operation-delegate",
|
|
803
|
+
"handlerContract": {
|
|
804
|
+
"reads": [
|
|
805
|
+
"childManifestComponentId",
|
|
806
|
+
"operationId",
|
|
807
|
+
"params",
|
|
808
|
+
"componentRegistry.authoringManifest"
|
|
809
|
+
],
|
|
810
|
+
"writes": [
|
|
811
|
+
"inputs",
|
|
812
|
+
"data"
|
|
813
|
+
],
|
|
814
|
+
"identityKeys": [
|
|
815
|
+
"childManifestComponentId",
|
|
816
|
+
"operationId"
|
|
817
|
+
],
|
|
818
|
+
"inputSchema": {
|
|
819
|
+
"type": "object",
|
|
820
|
+
"required": [
|
|
821
|
+
"childManifestComponentId",
|
|
822
|
+
"operationId",
|
|
823
|
+
"params"
|
|
824
|
+
],
|
|
825
|
+
"properties": {
|
|
826
|
+
"childManifestComponentId": {
|
|
827
|
+
"type": "string"
|
|
828
|
+
},
|
|
829
|
+
"operationId": {
|
|
830
|
+
"type": "string"
|
|
831
|
+
},
|
|
832
|
+
"target": {
|
|
833
|
+
"type": "string"
|
|
834
|
+
},
|
|
835
|
+
"params": {
|
|
836
|
+
"type": "object"
|
|
837
|
+
}
|
|
838
|
+
}
|
|
839
|
+
},
|
|
840
|
+
"failureModes": [
|
|
841
|
+
"child-manifest-not-found",
|
|
842
|
+
"child-operation-not-authorized",
|
|
843
|
+
"child-operation-validation-failed",
|
|
844
|
+
"dialog-shell-child-boundary-violation"
|
|
845
|
+
],
|
|
846
|
+
"description": "Delegates child component configuration edits to the child authoring manifest before projecting the validated patch into the dialog child host inputs/data envelope."
|
|
847
|
+
}
|
|
848
|
+
}
|
|
849
|
+
],
|
|
850
|
+
"destructive": false,
|
|
851
|
+
"requiresConfirmation": false,
|
|
852
|
+
"validators": [
|
|
853
|
+
"child-manifest-resolvable",
|
|
854
|
+
"child-operation-authorized",
|
|
855
|
+
"child-config-delegates-to-child-manifest",
|
|
856
|
+
"dialog-shell-boundary-preserved"
|
|
857
|
+
],
|
|
858
|
+
"affectedPaths": [
|
|
859
|
+
"inputs",
|
|
860
|
+
"data"
|
|
861
|
+
],
|
|
862
|
+
"submissionImpact": "config-only",
|
|
863
|
+
"preconditions": [
|
|
864
|
+
"child-host-configured",
|
|
865
|
+
"child-manifest-resolved"
|
|
866
|
+
]
|
|
867
|
+
}
|
|
868
|
+
],
|
|
869
|
+
"validators": [
|
|
870
|
+
{
|
|
871
|
+
"validatorId": "accessibility-label-preserved",
|
|
872
|
+
"level": "error",
|
|
873
|
+
"code": "DIALOG_ACCESSIBILITY_LABEL_PRESERVED",
|
|
874
|
+
"description": "Dialog or alertdialog must keep an accessible title or aria label."
|
|
875
|
+
},
|
|
876
|
+
{
|
|
877
|
+
"validatorId": "aria-role-valid",
|
|
878
|
+
"level": "error",
|
|
879
|
+
"code": "DIALOG_ARIA_ROLE_VALID",
|
|
880
|
+
"description": "ariaRole must be dialog or alertdialog."
|
|
881
|
+
},
|
|
882
|
+
{
|
|
883
|
+
"validatorId": "shell-fields-supported",
|
|
884
|
+
"level": "error",
|
|
885
|
+
"code": "DIALOG_SHELL_FIELDS_SUPPORTED",
|
|
886
|
+
"description": "Shell edits must target supported PraxisDialogConfig fields."
|
|
887
|
+
},
|
|
888
|
+
{
|
|
889
|
+
"validatorId": "size-values-safe",
|
|
890
|
+
"level": "error",
|
|
891
|
+
"code": "DIALOG_SIZE_VALUES_SAFE",
|
|
892
|
+
"description": "Size values must be finite numbers or safe CSS size strings."
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"validatorId": "size-min-max-consistent",
|
|
896
|
+
"level": "error",
|
|
897
|
+
"code": "DIALOG_SIZE_MIN_MAX_CONSISTENT",
|
|
898
|
+
"description": "Minimum sizes must not exceed maximum sizes."
|
|
899
|
+
},
|
|
900
|
+
{
|
|
901
|
+
"validatorId": "position-values-safe",
|
|
902
|
+
"level": "error",
|
|
903
|
+
"code": "DIALOG_POSITION_VALUES_SAFE",
|
|
904
|
+
"description": "Position values must be safe CSS size strings."
|
|
905
|
+
},
|
|
906
|
+
{
|
|
907
|
+
"validatorId": "position-not-conflicting",
|
|
908
|
+
"level": "warning",
|
|
909
|
+
"code": "DIALOG_POSITION_NOT_CONFLICTING",
|
|
910
|
+
"description": "Conflicting position pairs should be explicit and intentional."
|
|
911
|
+
},
|
|
912
|
+
{
|
|
913
|
+
"validatorId": "backdrop-policy-explicit",
|
|
914
|
+
"level": "error",
|
|
915
|
+
"code": "DIALOG_BACKDROP_POLICY_EXPLICIT",
|
|
916
|
+
"description": "Backdrop and backdrop-click behavior must be explicit when edited."
|
|
917
|
+
},
|
|
918
|
+
{
|
|
919
|
+
"validatorId": "backdrop-class-safe",
|
|
920
|
+
"level": "error",
|
|
921
|
+
"code": "DIALOG_BACKDROP_CLASS_SAFE",
|
|
922
|
+
"description": "Backdrop classes must be serializable safe class values."
|
|
923
|
+
},
|
|
924
|
+
{
|
|
925
|
+
"validatorId": "close-policy-explicit",
|
|
926
|
+
"level": "error",
|
|
927
|
+
"code": "DIALOG_CLOSE_POLICY_EXPLICIT",
|
|
928
|
+
"description": "Close behavior must explicitly describe ESC, backdrop and navigation semantics."
|
|
929
|
+
},
|
|
930
|
+
{
|
|
931
|
+
"validatorId": "unsafe-close-confirmed-when-needed",
|
|
932
|
+
"level": "error",
|
|
933
|
+
"code": "DIALOG_UNSAFE_CLOSE_CONFIRMED",
|
|
934
|
+
"description": "Disabling safe close affordances or enabling unsafe dismissal requires confirmation."
|
|
935
|
+
},
|
|
936
|
+
{
|
|
937
|
+
"validatorId": "restore-focus-preserved",
|
|
938
|
+
"level": "error",
|
|
939
|
+
"code": "DIALOG_RESTORE_FOCUS_PRESERVED",
|
|
940
|
+
"description": "restoreFocus must stay enabled unless intentionally changed with confirmation."
|
|
941
|
+
},
|
|
942
|
+
{
|
|
943
|
+
"validatorId": "alertdialog-focus-preserved",
|
|
944
|
+
"level": "error",
|
|
945
|
+
"code": "DIALOG_ALERTDIALOG_FOCUS_PRESERVED",
|
|
946
|
+
"description": "alertdialog focus behavior must keep primary action or configured focus target reachable."
|
|
947
|
+
},
|
|
948
|
+
{
|
|
949
|
+
"validatorId": "preset-exists",
|
|
950
|
+
"level": "error",
|
|
951
|
+
"code": "DIALOG_PRESET_EXISTS",
|
|
952
|
+
"description": "Preset type and variant must exist in PRAXIS_DIALOG_GLOBAL_PRESETS or be host-provided."
|
|
953
|
+
},
|
|
954
|
+
{
|
|
955
|
+
"validatorId": "preset-merge-order-preserved",
|
|
956
|
+
"level": "error",
|
|
957
|
+
"code": "DIALOG_PRESET_MERGE_ORDER_PRESERVED",
|
|
958
|
+
"description": "Preset merge order must remain type -> variant -> local config."
|
|
959
|
+
},
|
|
960
|
+
{
|
|
961
|
+
"validatorId": "child-host-registered",
|
|
962
|
+
"level": "error",
|
|
963
|
+
"code": "DIALOG_CHILD_HOST_REGISTERED",
|
|
964
|
+
"description": "Child component/template must resolve through ComponentMetadataRegistry or dialog registries."
|
|
965
|
+
},
|
|
966
|
+
{
|
|
967
|
+
"validatorId": "child-config-delegates-to-child-manifest",
|
|
968
|
+
"level": "error",
|
|
969
|
+
"code": "DIALOG_CHILD_CONFIG_DELEGATES",
|
|
970
|
+
"description": "Child component config edits must be delegated to the child authoring manifest."
|
|
971
|
+
},
|
|
972
|
+
{
|
|
973
|
+
"validatorId": "child-inputs-serializable",
|
|
974
|
+
"level": "error",
|
|
975
|
+
"code": "DIALOG_CHILD_INPUTS_SERIALIZABLE",
|
|
976
|
+
"description": "Child inputs/data persisted by authoring must be serializable safe values."
|
|
977
|
+
},
|
|
978
|
+
{
|
|
979
|
+
"validatorId": "child-manifest-resolvable",
|
|
980
|
+
"level": "error",
|
|
981
|
+
"code": "DIALOG_CHILD_MANIFEST_RESOLVABLE",
|
|
982
|
+
"description": "Delegated child operation must resolve a child component authoring manifest."
|
|
983
|
+
},
|
|
984
|
+
{
|
|
985
|
+
"validatorId": "child-operation-authorized",
|
|
986
|
+
"level": "error",
|
|
987
|
+
"code": "DIALOG_CHILD_OPERATION_AUTHORIZED",
|
|
988
|
+
"description": "Delegated child operation must be declared by the child manifest."
|
|
989
|
+
},
|
|
990
|
+
{
|
|
991
|
+
"validatorId": "dialog-shell-boundary-preserved",
|
|
992
|
+
"level": "error",
|
|
993
|
+
"code": "DIALOG_SHELL_BOUNDARY_PRESERVED",
|
|
994
|
+
"description": "Dialog shell operations must not rewrite child component semantics directly."
|
|
995
|
+
},
|
|
996
|
+
{
|
|
997
|
+
"validatorId": "dialog-round-trip",
|
|
998
|
+
"level": "error",
|
|
999
|
+
"code": "DIALOG_ROUND_TRIP",
|
|
1000
|
+
"description": "Service/tag mode must preserve shell config through open, close, afterClosed and host persistence."
|
|
1001
|
+
}
|
|
1002
|
+
],
|
|
1003
|
+
"roundTripRequirements": [
|
|
1004
|
+
"PraxisDialogConfig is the canonical shell config; child component config remains owned by the child manifest.",
|
|
1005
|
+
"Preset application must preserve merge order: type preset, then variant, then local config.",
|
|
1006
|
+
"Close policy edits must keep accessibility, focus trap, ESC/backdrop behavior and restoreFocus explicit.",
|
|
1007
|
+
"Dialog host operations must resolve component/template ids through governed registries instead of ad hoc overlays."
|
|
1008
|
+
],
|
|
1009
|
+
"examples": [
|
|
1010
|
+
{
|
|
1011
|
+
"id": "set-size",
|
|
1012
|
+
"request": "Open this dialog at 860 by 640 pixels.",
|
|
1013
|
+
"operationId": "dialog.size.set",
|
|
1014
|
+
"params": {
|
|
1015
|
+
"width": "860px",
|
|
1016
|
+
"height": "640px"
|
|
1017
|
+
},
|
|
1018
|
+
"isPositive": true
|
|
1019
|
+
},
|
|
1020
|
+
{
|
|
1021
|
+
"id": "set-position",
|
|
1022
|
+
"request": "Anchor the dialog to the right side.",
|
|
1023
|
+
"operationId": "dialog.position.set",
|
|
1024
|
+
"params": {
|
|
1025
|
+
"right": "24px",
|
|
1026
|
+
"top": "64px"
|
|
1027
|
+
},
|
|
1028
|
+
"isPositive": true
|
|
1029
|
+
},
|
|
1030
|
+
{
|
|
1031
|
+
"id": "set-backdrop",
|
|
1032
|
+
"request": "Use a backdrop with the default governed backdrop class.",
|
|
1033
|
+
"operationId": "dialog.backdrop.set",
|
|
1034
|
+
"params": {
|
|
1035
|
+
"hasBackdrop": true,
|
|
1036
|
+
"backdropClass": "pdx-dialog-backdrop"
|
|
1037
|
+
},
|
|
1038
|
+
"isPositive": true
|
|
1039
|
+
},
|
|
1040
|
+
{
|
|
1041
|
+
"id": "set-close-policy",
|
|
1042
|
+
"request": "Make this destructive confirm require explicit button close.",
|
|
1043
|
+
"operationId": "dialog.closePolicy.set",
|
|
1044
|
+
"params": {
|
|
1045
|
+
"disableClose": true,
|
|
1046
|
+
"closeOnBackdropClick": false,
|
|
1047
|
+
"restoreFocus": true
|
|
1048
|
+
},
|
|
1049
|
+
"isPositive": true
|
|
1050
|
+
},
|
|
1051
|
+
{
|
|
1052
|
+
"id": "apply-danger-preset",
|
|
1053
|
+
"request": "Apply the danger confirm preset.",
|
|
1054
|
+
"operationId": "dialog.preset.apply",
|
|
1055
|
+
"params": {
|
|
1056
|
+
"dialogType": "confirm",
|
|
1057
|
+
"variant": "danger"
|
|
1058
|
+
},
|
|
1059
|
+
"isPositive": true
|
|
1060
|
+
},
|
|
1061
|
+
{
|
|
1062
|
+
"id": "configure-child-host",
|
|
1063
|
+
"request": "Host the dynamic page component with customization enabled.",
|
|
1064
|
+
"operationId": "childHost.configure",
|
|
1065
|
+
"params": {
|
|
1066
|
+
"contentType": "component",
|
|
1067
|
+
"componentId": "praxis-dynamic-page",
|
|
1068
|
+
"inputs": {
|
|
1069
|
+
"enableCustomization": true
|
|
1070
|
+
}
|
|
1071
|
+
},
|
|
1072
|
+
"isPositive": true
|
|
1073
|
+
},
|
|
1074
|
+
{
|
|
1075
|
+
"id": "delegate-child-config",
|
|
1076
|
+
"request": "Change the table column inside the dialog.",
|
|
1077
|
+
"operationId": "childOperation.delegate",
|
|
1078
|
+
"params": {
|
|
1079
|
+
"childManifestComponentId": "praxis-table",
|
|
1080
|
+
"operationId": "column.label.set",
|
|
1081
|
+
"params": {
|
|
1082
|
+
"field": "name",
|
|
1083
|
+
"label": "Name"
|
|
1084
|
+
}
|
|
1085
|
+
},
|
|
1086
|
+
"isPositive": true
|
|
1087
|
+
},
|
|
1088
|
+
{
|
|
1089
|
+
"id": "set-shell-label",
|
|
1090
|
+
"request": "Set the dialog title and alertdialog role.",
|
|
1091
|
+
"operationId": "dialog.shell.set",
|
|
1092
|
+
"params": {
|
|
1093
|
+
"title": "Delete record",
|
|
1094
|
+
"ariaRole": "alertdialog"
|
|
1095
|
+
},
|
|
1096
|
+
"isPositive": true
|
|
1097
|
+
},
|
|
1098
|
+
{
|
|
1099
|
+
"id": "reject-child-shell-mix",
|
|
1100
|
+
"request": "Directly patch the child table config from the dialog shell manifest.",
|
|
1101
|
+
"operationId": "childOperation.delegate",
|
|
1102
|
+
"params": {
|
|
1103
|
+
"childManifestComponentId": "",
|
|
1104
|
+
"operationId": "patch-raw-child-config",
|
|
1105
|
+
"params": {}
|
|
1106
|
+
},
|
|
1107
|
+
"isPositive": false
|
|
1108
|
+
},
|
|
1109
|
+
{
|
|
1110
|
+
"id": "reject-inaccessible-alert",
|
|
1111
|
+
"request": "Make an alertdialog with no title or aria label.",
|
|
1112
|
+
"operationId": "dialog.shell.set",
|
|
1113
|
+
"params": {
|
|
1114
|
+
"ariaRole": "alertdialog",
|
|
1115
|
+
"title": ""
|
|
1116
|
+
},
|
|
1117
|
+
"isPositive": false
|
|
1118
|
+
},
|
|
1119
|
+
{
|
|
1120
|
+
"id": "reject-unsafe-close",
|
|
1121
|
+
"request": "Let a destructive dialog close on accidental backdrop click with no confirmation.",
|
|
1122
|
+
"operationId": "dialog.closePolicy.set",
|
|
1123
|
+
"params": {
|
|
1124
|
+
"closeOnBackdropClick": true,
|
|
1125
|
+
"disableClose": false,
|
|
1126
|
+
"restoreFocus": false
|
|
1127
|
+
},
|
|
1128
|
+
"isPositive": false
|
|
1129
|
+
}
|
|
1130
|
+
]
|
|
1131
|
+
},
|
|
1132
|
+
"chunks": [
|
|
1133
|
+
{
|
|
1134
|
+
"chunkIndex": 0,
|
|
1135
|
+
"chunkKind": "summary",
|
|
1136
|
+
"content": "Component ID: praxis-dialog\nSelector: praxis-dialog\nFriendly Name: Praxis Dialog\nDescription: Dialog shell for overlay and embedded authoring, with governed size, position, backdrop, close policy, presets and child host delegation.\nLib/Package: @praxisui/dialog\nTags: dialog, overlay, shell, authoring\nInputs:\n - title (string)\n - actions (DialogAction[])\n - actionsLayout (ActionsLayout)\n - width (string | number)\n - height (string | number)\n - minWidth (string | number)\n - maxWidth (string | number)\n - minHeight (string | number)\n - maxHeight (string | number)\n - themeColor (DialogThemeColor)\n - disableClose (boolean)\n - hasBackdrop (boolean)\n - closeOnBackdropClick (boolean)\n - panelClass (string | string[] | Record<string, boolean>)\n - backdropClass (string | string[] | Record<string, boolean>)\n - position (PraxisDialogPosition)\n - ariaRole ('dialog' | 'alertdialog')\n - ariaLabel (string)\n - ariaLabelledBy (string)\n - ariaDescribedBy (string)\nOutputs:\n - action (DialogAction)\n - close (unknown)\n - opened (void)\n - afterClosed (void)\n",
|
|
1137
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-dialog/src/lib/praxis-dialog.metadata.ts",
|
|
1138
|
+
"contentHash": "31805c5f46dec3934066a5cc7fabeaefe3c437478999140b23b94524447df209",
|
|
1139
|
+
"sourceKind": "component_definition",
|
|
1140
|
+
"sourceId": "praxis-dialog",
|
|
1141
|
+
"corpusVersion": "1.0.0"
|
|
1142
|
+
},
|
|
1143
|
+
{
|
|
1144
|
+
"chunkIndex": 1,
|
|
1145
|
+
"chunkKind": "authoring_manifest",
|
|
1146
|
+
"content": "{\n \"schemaVersion\": \"1.0.0\",\n \"componentId\": \"praxis-dialog\",\n \"ownerPackage\": \"@praxisui/dialog\",\n \"configSchemaId\": \"PraxisDialogConfig\",\n \"manifestVersion\": \"1.0.0\",\n \"runtimeInputs\": [\n {\n \"name\": \"config\",\n \"type\": \"PraxisDialogConfig\",\n \"description\": \"Canonical shell configuration consumed by PraxisDialog.open and tag mode.\"\n },\n {\n \"name\": \"content\",\n \"type\": \"ComponentType | TemplateRef | DialogContentDescriptor\",\n \"description\": \"Dialog child host content. Child semantics remain owned by the child component manifest.\"\n },\n {\n \"name\": \"variant\",\n \"type\": \"string\",\n \"description\": \"Optional global preset variant merged after dialog type presets and before local config.\"\n },\n {\n \"name\": \"componentId\",\n \"type\": \"string\",\n \"description\": \"Component metadata or dialog registry id used by global dialog open actions.\"\n },\n {\n \"name\": \"inputs\",\n \"type\": \"Record<string, unknown>\",\n \"description\": \"Inputs applied to the child component after opening the dialog.\"\n }\n ],\n \"editableTargets\": [\n {\n \"kind\": \"dialogShell\",\n \"resolver\": \"praxis-dialog-config-root\",\n \"description\": \"Top-level PraxisDialogConfig shell fields such as title, role, actions and theme.\"\n },\n {\n \"kind\": \"size\",\n \"resolver\": \"praxis-dialog-size-fields\",\n \"description\": \"Width, height, min/max size fields on PraxisDialogConfig.\"\n },\n {\n \"kind\": \"position\",\n \"resolver\": \"praxis-dialog-position-fields\",\n \"description\": \"Overlay position fields top, bottom, left and right.\"\n },\n {\n \"kind\": \"backdrop\",\n \"resolver\": \"praxis-dialog-backdrop-fields\",\n \"description\": \"Backdrop enablement and backdrop class semantics.\"\n },\n {\n \"kind\": \"closePolicy\",\n \"resolver\": \"praxis-dialog-close-policy-fields\",\n \"description\": \"disableClose, closeOnBackdropClick, closeOnNavigation, restoreFocus and autofocus behavior.\"\n },\n {\n \"kind\": \"preset\",\n \"resolver\": \"praxis-dialog-global-preset-by-type-variant\",\n \"description\": \"Type and variant presets merged through PRAXIS_DIALOG_GLOBAL_PRESETS.\"\n },\n {\n \"kind\": \"childHost\",\n \"resolver\": \"praxis-dialog-child-component-or-template-host\",\n \"description\": \"Component/template registry child host and input/data envelope.\"\n }\n ],\n \"operations\": [\n {\n \"operationId\": \"dialog.shell.set\",\n \"title\": \"Set dialog shell fields\",\n \"scope\": \"global\",\n \"targetKind\": \"dialogShell\",\n \"target\": {\n \"kind\": \"dialogShell\",\n \"resolver\": \"praxis-dialog-config-root\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"title\": {\n \"type\": \"string\"\n },\n \"titleIcon\": {\n \"type\": \"string\"\n },\n \"ariaRole\": {\n \"enum\": [\n \"dialog\",\n \"alertdialog\"\n ]\n },\n \"ariaLabel\": {\n \"type\": \"string\"\n },\n \"ariaLabelledBy\": {\n \"type\": \"string\"\n },\n \"ariaDescribedBy\": {\n \"type\": \"string\"\n },\n \"themeColor\": {\n \"enum\": [\n \"primary\",\n \"light\",\n \"dark\"\n ]\n },\n \"actionsLayout\": {\n \"enum\": [\n \"start\",\n \"center\",\n \"end\",\n \"stretched\"\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"accessibility-label-preserved\",\n \"aria-role-valid\",\n \"shell-fields-supported\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.title\",\n \"config.titleIcon\",\n \"config.ariaRole\",\n \"config.ariaLabel\",\n \"config.ariaLabelledBy\",\n \"config.ariaDescribedBy\",\n \"config.themeColor\",\n \"config.actionsLayout\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"dialog.size.set\",\n \"title\": \"Set dialog size\",\n \"scope\": \"layout\",\n \"targetKind\": \"size\",\n \"target\": {\n \"kind\": \"size\",\n \"resolver\": \"praxis-dialog-size-fields\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"width\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"height\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"minWidth\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"maxWidth\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"minHeight\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n },\n \"maxHeight\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"number\"\n }\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"size-values-safe\",\n \"size-min-max-consistent\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.width\",\n \"config.height\",\n \"config.minWidth\",\n \"config.maxWidth\",\n \"config.minHeight\",\n \"config.maxHeight\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"dialog.position.set\",\n \"title\": \"Set dialog position\",\n \"scope\": \"layout\",\n \"targetKind\": \"position\",\n \"target\": {\n \"kind\": \"position\",\n \"resolver\": \"praxis-dialog-position-fields\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"top\": {\n \"type\": \"string\"\n },\n \"bottom\": {\n \"type\": \"string\"\n },\n \"left\": {\n \"type\": \"string\"\n },\n \"right\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"set-value\",\n \"path\": \"config.position\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"position-values-safe\",\n \"position-not-conflicting\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.position\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"dialog.backdrop.set\",\n \"title\": \"Set dialog backdrop\",\n \"scope\": \"skin\",\n \"targetKind\": \"backdrop\",\n \"target\": {\n \"kind\": \"backdrop\",\n \"resolver\": \"praxis-dialog-backdrop-fields\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"hasBackdrop\": {\n \"type\": \"boolean\"\n },\n \"backdropClass\": {\n \"oneOf\": [\n {\n \"type\": \"string\"\n },\n {\n \"type\": \"array\"\n },\n {\n \"type\": \"object\"\n }\n ]\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"backdrop-policy-explicit\",\n \"backdrop-class-safe\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.hasBackdrop\",\n \"config.backdropClass\"\n ],\n \"submissionImpact\": \"visual-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"dialog.closePolicy.set\",\n \"title\": \"Set dialog close policy\",\n \"scope\": \"accessibility\",\n \"targetKind\": \"closePolicy\",\n \"target\": {\n \"kind\": \"closePolicy\",\n \"resolver\": \"praxis-dialog-close-policy-fields\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"minProperties\": 1,\n \"properties\": {\n \"disableClose\": {\n \"type\": \"boolean\"\n },\n \"closeOnBackdropClick\": {\n \"type\": \"boolean\"\n },\n \"closeOnNavigation\": {\n \"type\": \"boolean\"\n },\n \"restoreFocus\": {\n \"type\": \"boolean\"\n },\n \"autoFocus\": {\n \"type\": \"boolean\"\n },\n \"autoFocusedElement\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"merge-object\",\n \"path\": \"config\"\n }\n ],\n \"destructive\": true,\n \"requiresConfirmation\": true,\n \"validators\": [\n \"close-policy-explicit\",\n \"unsafe-close-confirmed-when-needed\",\n \"restore-focus-preserved\",\n \"alertdialog-focus-preserved\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config.disableClose\",\n \"config.closeOnBackdropClick\",\n \"config.closeOnNavigation\",\n \"config.restoreFocus\",\n \"config.autoFocus\",\n \"config.autoFocusedElement\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\",\n \"confirmation-collected\"\n ]\n },\n {\n \"operationId\": \"dialog.preset.apply\",\n \"title\": \"Apply dialog preset\",\n \"scope\": \"global\",\n \"targetKind\": \"preset\",\n \"target\": {\n \"kind\": \"preset\",\n \"resolver\": \"praxis-dialog-global-preset-by-type-variant\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"dialogType\"\n ],\n \"properties\": {\n \"dialogType\": {\n \"enum\": [\n \"confirm\",\n \"alert\",\n \"prompt\",\n \"custom\"\n ]\n },\n \"variant\": {\n \"type\": \"string\"\n },\n \"localConfig\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"dialog-preset-apply\",\n \"handlerContract\": {\n \"reads\": [\n \"PRAXIS_DIALOG_GLOBAL_PRESETS\",\n \"config\",\n \"variant\"\n ],\n \"writes\": [\n \"config\",\n \"variant\"\n ],\n \"identityKeys\": [\n \"dialogType\",\n \"variant\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"dialogType\"\n ],\n \"properties\": {\n \"dialogType\": {\n \"enum\": [\n \"confirm\",\n \"alert\",\n \"prompt\",\n \"custom\"\n ]\n },\n \"variant\": {\n \"type\": \"string\"\n },\n \"localConfig\": {\n \"type\": \"object\"\n }\n }\n },\n \"failureModes\": [\n \"preset-not-found\",\n \"variant-not-found\",\n \"preset-merge-order-invalid\",\n \"accessibility-regression\"\n ],\n \"description\": \"Applies the canonical merge order type preset -> variant -> local config without mutating child component semantics.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"preset-exists\",\n \"preset-merge-order-preserved\",\n \"accessibility-label-preserved\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"config\",\n \"variant\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"childHost.configure\",\n \"title\": \"Configure dialog child host\",\n \"scope\": \"templating\",\n \"targetKind\": \"childHost\",\n \"target\": {\n \"kind\": \"childHost\",\n \"resolver\": \"praxis-dialog-child-component-or-template-host\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": false\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"contentType\"\n ],\n \"properties\": {\n \"contentType\": {\n \"enum\": [\n \"component\",\n \"template\"\n ]\n },\n \"componentId\": {\n \"type\": \"string\"\n },\n \"templateId\": {\n \"type\": \"string\"\n },\n \"inputs\": {\n \"type\": \"object\"\n },\n \"data\": {},\n \"childManifestComponentId\": {\n \"type\": \"string\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"dialog-child-host-configure\",\n \"handlerContract\": {\n \"reads\": [\n \"ComponentMetadataRegistry\",\n \"PRAXIS_DIALOG_CONTENT_REGISTRY\",\n \"PRAXIS_DIALOG_TEMPLATE_REGISTRY\",\n \"content\",\n \"componentId\",\n \"inputs\",\n \"data\"\n ],\n \"writes\": [\n \"content\",\n \"componentId\",\n \"inputs\",\n \"data\"\n ],\n \"identityKeys\": [\n \"componentId\",\n \"templateId\"\n ],\n \"failureModes\": [\n \"component-not-registered\",\n \"template-not-registered\",\n \"child-inputs-not-serializable\",\n \"child-manifest-required\"\n ],\n \"description\": \"Configures which component/template is hosted in the dialog and serializable host inputs; child config fields remain delegated to the child manifest.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"child-host-registered\",\n \"child-config-delegates-to-child-manifest\",\n \"child-inputs-serializable\",\n \"dialog-round-trip\"\n ],\n \"affectedPaths\": [\n \"content\",\n \"componentId\",\n \"inputs\",\n \"data\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"config-initialized\"\n ]\n },\n {\n \"operationId\": \"childOperation.delegate\",\n \"title\": \"Delegate operation to child manifest\",\n \"scope\": \"templating\",\n \"targetKind\": \"childHost\",\n \"target\": {\n \"kind\": \"childHost\",\n \"resolver\": \"praxis-dialog-child-component-or-template-host\",\n \"ambiguityPolicy\": \"fail\",\n \"required\": true\n },\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childManifestComponentId\",\n \"operationId\",\n \"params\"\n ],\n \"properties\": {\n \"childManifestComponentId\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"type\": \"string\"\n },\n \"params\": {\n \"type\": \"object\"\n }\n }\n },\n \"effects\": [\n {\n \"kind\": \"compile-domain-patch\",\n \"handler\": \"dialog-child-operation-delegate\",\n \"handlerContract\": {\n \"reads\": [\n \"childManifestComponentId\",\n \"operationId\",\n \"params\",\n \"componentRegistry.authoringManifest\"\n ],\n \"writes\": [\n \"inputs\",\n \"data\"\n ],\n \"identityKeys\": [\n \"childManifestComponentId\",\n \"operationId\"\n ],\n \"inputSchema\": {\n \"type\": \"object\",\n \"required\": [\n \"childManifestComponentId\",\n \"operationId\",\n \"params\"\n ],\n \"properties\": {\n \"childManifestComponentId\": {\n \"type\": \"string\"\n },\n \"operationId\": {\n \"type\": \"string\"\n },\n \"target\": {\n \"type\": \"string\"\n },\n \"params\": {\n \"type\": \"object\"\n }\n }\n },\n \"failureModes\": [\n \"child-manifest-not-found\",\n \"child-operation-not-authorized\",\n \"child-operation-validation-failed\",\n \"dialog-shell-child-boundary-violation\"\n ],\n \"description\": \"Delegates child component configuration edits to the child authoring manifest before projecting the validated patch into the dialog child host inputs/data envelope.\"\n }\n }\n ],\n \"destructive\": false,\n \"requiresConfirmation\": false,\n \"validators\": [\n \"child-manifest-resolvable\",\n \"child-operation-authorized\",\n \"child-config-delegates-to-child-manifest\",\n \"dialog-shell-boundary-preserved\"\n ],\n \"affectedPaths\": [\n \"inputs\",\n \"data\"\n ],\n \"submissionImpact\": \"config-only\",\n \"preconditions\": [\n \"child-host-configured\",\n \"child-manifest-resolved\"\n ]\n }\n ],\n \"validators\": [\n {\n \"validatorId\": \"accessibility-label-preserved\",\n \"level\": \"error\",\n \"code\": \"DIALOG_ACCESSIBILITY_LABEL_PRESERVED\",\n \"description\": \"Dialog or alertdialog must keep an accessible title or aria label.\"\n },\n {\n \"validatorId\": \"aria-role-valid\",\n \"level\": \"error\",\n \"code\": \"DIALOG_ARIA_ROLE_VALID\",\n \"description\": \"ariaRole must be dialog or alertdialog.\"\n },\n {\n \"validatorId\": \"shell-fields-supported\",\n \"level\": \"error\",\n \"code\": \"DIALOG_SHELL_FIELDS_SUPPORTED\",\n \"description\": \"Shell edits must target supported PraxisDialogConfig fields.\"\n },\n {\n \"validatorId\": \"size-values-safe\",\n \"level\": \"error\",\n \"code\": \"DIALOG_SIZE_VALUES_SAFE\",\n \"description\": \"Size values must be finite numbers or safe CSS size strings.\"\n },\n {\n \"validatorId\": \"size-min-max-consistent\",\n \"level\": \"error\",\n \"code\": \"DIALOG_SIZE_MIN_MAX_CONSISTENT\",\n \"description\": \"Minimum sizes must not exceed maximum sizes.\"\n },\n {\n \"validatorId\": \"position-values-safe\",\n \"level\": \"error\",\n \"code\": \"DIALOG_POSITION_VALUES_SAFE\",\n \"description\": \"Position values must be safe CSS size strings.\"\n },\n {\n \"validatorId\": \"position-not-conflicting\",\n \"level\": \"warning\",\n \"code\": \"DIALOG_POSITION_NOT_CONFLICTING\",\n \"description\": \"Conflicting position pairs should be explicit and intentional.\"\n },\n {\n \"validatorId\": \"backdrop-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"DIALOG_BACKDROP_POLICY_EXPLICIT\",\n \"description\": \"Backdrop and backdrop-click behavior must be explicit when edited.\"\n },\n {\n \"validatorId\": \"backdrop-class-safe\",\n \"level\": \"error\",\n \"code\": \"DIALOG_BACKDROP_CLASS_SAFE\",\n \"description\": \"Backdrop classes must be serializable safe class values.\"\n },\n {\n \"validatorId\": \"close-policy-explicit\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CLOSE_POLICY_EXPLICIT\",\n \"description\": \"Close behavior must explicitly describe ESC, backdrop and navigation semantics.\"\n },\n {\n \"validatorId\": \"unsafe-close-confirmed-when-needed\",\n \"level\": \"error\",\n \"code\": \"DIALOG_UNSAFE_CLOSE_CONFIRMED\",\n \"description\": \"Disabling safe close affordances or enabling unsafe dismissal requires confirmation.\"\n },\n {\n \"validatorId\": \"restore-focus-preserved\",\n \"level\": \"error\",\n \"code\": \"DIALOG_RESTORE_FOCUS_PRESERVED\",\n \"description\": \"restoreFocus must stay enabled unless intentionally changed with confirmation.\"\n },\n {\n \"validatorId\": \"alertdialog-focus-preserved\",\n \"level\": \"error\",\n \"code\": \"DIALOG_ALERTDIALOG_FOCUS_PRESERVED\",\n \"description\": \"alertdialog focus behavior must keep primary action or configured focus target reachable.\"\n },\n {\n \"validatorId\": \"preset-exists\",\n \"level\": \"error\",\n \"code\": \"DIALOG_PRESET_EXISTS\",\n \"description\": \"Preset type and variant must exist in PRAXIS_DIALOG_GLOBAL_PRESETS or be host-provided.\"\n },\n {\n \"validatorId\": \"preset-merge-order-preserved\",\n \"level\": \"error\",\n \"code\": \"DIALOG_PRESET_MERGE_ORDER_PRESERVED\",\n \"description\": \"Preset merge order must remain type -> variant -> local config.\"\n },\n {\n \"validatorId\": \"child-host-registered\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CHILD_HOST_REGISTERED\",\n \"description\": \"Child component/template must resolve through ComponentMetadataRegistry or dialog registries.\"\n },\n {\n \"validatorId\": \"child-config-delegates-to-child-manifest\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CHILD_CONFIG_DELEGATES\",\n \"description\": \"Child component config edits must be delegated to the child authoring manifest.\"\n },\n {\n \"validatorId\": \"child-inputs-serializable\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CHILD_INPUTS_SERIALIZABLE\",\n \"description\": \"Child inputs/data persisted by authoring must be serializable safe values.\"\n },\n {\n \"validatorId\": \"child-manifest-resolvable\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CHILD_MANIFEST_RESOLVABLE\",\n \"description\": \"Delegated child operation must resolve a child component authoring manifest.\"\n },\n {\n \"validatorId\": \"child-operation-authorized\",\n \"level\": \"error\",\n \"code\": \"DIALOG_CHILD_OPERATION_AUTHORIZED\",\n \"description\": \"Delegated child operation must be declared by the child manifest.\"\n },\n {\n \"validatorId\": \"dialog-shell-boundary-preserved\",\n \"level\": \"error\",\n \"code\": \"DIALOG_SHELL_BOUNDARY_PRESERVED\",\n \"description\": \"Dialog shell operations must not rewrite child component semantics directly.\"\n },\n {\n \"validatorId\": \"dialog-round-trip\",\n \"level\": \"error\",\n \"code\": \"DIALOG_ROUND_TRIP\",\n \"description\": \"Service/tag mode must preserve shell config through open, close, afterClosed and host persistence.\"\n }\n ],\n \"roundTripRequirements\": [\n \"PraxisDialogConfig is the canonical shell config; child component config remains owned by the child manifest.\",\n \"Preset application must preserve merge order: type preset, then variant, then local config.\",\n \"Close policy edits must keep accessibility, focus trap, ESC/backdrop behavior and restoreFocus explicit.\",\n \"Dialog host operations must resolve component/template ids through governed registries instead of ad hoc overlays.\"\n ],\n \"examples\": [\n {\n \"id\": \"set-size\",\n \"request\": \"Open this dialog at 860 by 640 pixels.\",\n \"operationId\": \"dialog.size.set\",\n \"params\": {\n \"width\": \"860px\",\n \"height\": \"640px\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-position\",\n \"request\": \"Anchor the dialog to the right side.\",\n \"operationId\": \"dialog.position.set\",\n \"params\": {\n \"right\": \"24px\",\n \"top\": \"64px\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-backdrop\",\n \"request\": \"Use a backdrop with the default governed backdrop class.\",\n \"operationId\": \"dialog.backdrop.set\",\n \"params\": {\n \"hasBackdrop\": true,\n \"backdropClass\": \"pdx-dialog-backdrop\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-close-policy\",\n \"request\": \"Make this destructive confirm require explicit button close.\",\n \"operationId\": \"dialog.closePolicy.set\",\n \"params\": {\n \"disableClose\": true,\n \"closeOnBackdropClick\": false,\n \"restoreFocus\": true\n },\n \"isPositive\": true\n },\n {\n \"id\": \"apply-danger-preset\",\n \"request\": \"Apply the danger confirm preset.\",\n \"operationId\": \"dialog.preset.apply\",\n \"params\": {\n \"dialogType\": \"confirm\",\n \"variant\": \"danger\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"configure-child-host\",\n \"request\": \"Host the dynamic page component with customization enabled.\",\n \"operationId\": \"childHost.configure\",\n \"params\": {\n \"contentType\": \"component\",\n \"componentId\": \"praxis-dynamic-page\",\n \"inputs\": {\n \"enableCustomization\": true\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"delegate-child-config\",\n \"request\": \"Change the table column inside the dialog.\",\n \"operationId\": \"childOperation.delegate\",\n \"params\": {\n \"childManifestComponentId\": \"praxis-table\",\n \"operationId\": \"column.label.set\",\n \"params\": {\n \"field\": \"name\",\n \"label\": \"Name\"\n }\n },\n \"isPositive\": true\n },\n {\n \"id\": \"set-shell-label\",\n \"request\": \"Set the dialog title and alertdialog role.\",\n \"operationId\": \"dialog.shell.set\",\n \"params\": {\n \"title\": \"Delete record\",\n \"ariaRole\": \"alertdialog\"\n },\n \"isPositive\": true\n },\n {\n \"id\": \"reject-child-shell-mix\",\n \"request\": \"Directly patch the child table config from the dialog shell manifest.\",\n \"operationId\": \"childOperation.delegate\",\n \"params\": {\n \"childManifestComponentId\": \"\",\n \"operationId\": \"patch-raw-child-config\",\n \"params\": {}\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-inaccessible-alert\",\n \"request\": \"Make an alertdialog with no title or aria label.\",\n \"operationId\": \"dialog.shell.set\",\n \"params\": {\n \"ariaRole\": \"alertdialog\",\n \"title\": \"\"\n },\n \"isPositive\": false\n },\n {\n \"id\": \"reject-unsafe-close\",\n \"request\": \"Let a destructive dialog close on accidental backdrop click with no confirmation.\",\n \"operationId\": \"dialog.closePolicy.set\",\n \"params\": {\n \"closeOnBackdropClick\": true,\n \"disableClose\": false,\n \"restoreFocus\": false\n },\n \"isPositive\": false\n }\n ]\n}",
|
|
1147
|
+
"sourcePointer": "praxis-ui-angular/projects/praxis-dialog/src/lib/ai/praxis-dialog-authoring-manifest.ts",
|
|
1148
|
+
"contentHash": "bfc079b8ab2cc757b80f178d0aaeeffd9199e87c8397ce98a987fe3f22f35a8b",
|
|
1149
|
+
"sourceKind": "component_definition",
|
|
1150
|
+
"sourceId": "praxis-dialog",
|
|
1151
|
+
"corpusVersion": "1.0.0"
|
|
1152
|
+
}
|
|
1153
|
+
]
|
|
1154
|
+
}
|
|
1155
|
+
},
|
|
1156
|
+
"note": "Package-scoped Praxis component registry for source-free agent discovery. Use the canonical ingestion registry for cross-package aggregate analysis."
|
|
1157
|
+
}
|
|
@@ -1167,7 +1167,7 @@ function resolveDialogWidth(preset) {
|
|
|
1167
1167
|
return preset || undefined;
|
|
1168
1168
|
}
|
|
1169
1169
|
}
|
|
1170
|
-
function applySurfaceHostInputs(ref, hostInputs) {
|
|
1170
|
+
function applySurfaceHostInputs(ref, hostInputs, afterApply) {
|
|
1171
1171
|
const apply = () => {
|
|
1172
1172
|
if (!ref.componentInstance)
|
|
1173
1173
|
return false;
|
|
@@ -1183,12 +1183,35 @@ function applySurfaceHostInputs(ref, hostInputs) {
|
|
|
1183
1183
|
ref.componentRef?.changeDetectorRef?.detectChanges();
|
|
1184
1184
|
}
|
|
1185
1185
|
catch { }
|
|
1186
|
+
afterApply?.(ref.componentInstance);
|
|
1186
1187
|
return true;
|
|
1187
1188
|
};
|
|
1188
1189
|
if (apply())
|
|
1189
1190
|
return;
|
|
1190
1191
|
queueMicrotask(apply);
|
|
1191
1192
|
}
|
|
1193
|
+
function bindSurfaceHostSelectionResults(instance, resultSubject) {
|
|
1194
|
+
const subscriptions = [
|
|
1195
|
+
subscribeToOutput(instance?.rowClick, (payload) => resultSubject.next(toSurfaceSelectionResult('rowClick', payload))),
|
|
1196
|
+
subscribeToOutput(instance?.selectionChange, (payload) => resultSubject.next(toSurfaceSelectionResult('selectionChange', payload))),
|
|
1197
|
+
].filter((unsubscribe) => !!unsubscribe);
|
|
1198
|
+
return () => subscriptions.forEach((unsubscribe) => unsubscribe());
|
|
1199
|
+
}
|
|
1200
|
+
function subscribeToOutput(output, handler) {
|
|
1201
|
+
if (!output || typeof output.subscribe !== 'function') {
|
|
1202
|
+
return null;
|
|
1203
|
+
}
|
|
1204
|
+
const subscription = output.subscribe(handler);
|
|
1205
|
+
return () => subscription.unsubscribe();
|
|
1206
|
+
}
|
|
1207
|
+
function toSurfaceSelectionResult(output, payload) {
|
|
1208
|
+
return {
|
|
1209
|
+
type: output,
|
|
1210
|
+
data: payload,
|
|
1211
|
+
output,
|
|
1212
|
+
payload,
|
|
1213
|
+
};
|
|
1214
|
+
}
|
|
1192
1215
|
function providePraxisSurfaceGlobalActions() {
|
|
1193
1216
|
return {
|
|
1194
1217
|
provide: GLOBAL_SURFACE_SERVICE,
|
|
@@ -1230,10 +1253,19 @@ function providePraxisSurfaceGlobalActions() {
|
|
|
1230
1253
|
ref.afterClosed().subscribe(() => resultSubject.complete());
|
|
1231
1254
|
ref.result$ = resultSubject.asObservable();
|
|
1232
1255
|
ref.emitResult = (result) => resultSubject.next(result);
|
|
1256
|
+
let unbindSelectionResults = null;
|
|
1257
|
+
ref.afterClosed().subscribe(() => {
|
|
1258
|
+
unbindSelectionResults?.();
|
|
1259
|
+
unbindSelectionResults = null;
|
|
1260
|
+
});
|
|
1233
1261
|
const hostInputs = buildHostInputs(materializedPayload, context, {
|
|
1234
1262
|
surfaceRuntime: buildDialogSurfaceRuntime(ref, resultSubject),
|
|
1235
1263
|
});
|
|
1236
|
-
applySurfaceHostInputs(ref, hostInputs)
|
|
1264
|
+
applySurfaceHostInputs(ref, hostInputs, (instance) => {
|
|
1265
|
+
if (!unbindSelectionResults) {
|
|
1266
|
+
unbindSelectionResults = bindSurfaceHostSelectionResults(instance, resultSubject);
|
|
1267
|
+
}
|
|
1268
|
+
});
|
|
1237
1269
|
return ref;
|
|
1238
1270
|
},
|
|
1239
1271
|
};
|
package/package.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@praxisui/dialog",
|
|
3
|
-
"version": "9.0.0-beta.
|
|
3
|
+
"version": "9.0.0-beta.70",
|
|
4
4
|
"description": "Dialog helpers and components for Praxis UI with Angular Material integration.",
|
|
5
5
|
"peerDependencies": {
|
|
6
6
|
"@angular/common": "^21.0.0",
|
|
7
7
|
"@angular/core": "^21.0.0",
|
|
8
8
|
"@angular/cdk": "^21.0.0",
|
|
9
9
|
"@angular/forms": "^21.0.0",
|
|
10
|
-
"@praxisui/core": "^9.0.0-beta.
|
|
10
|
+
"@praxisui/core": "^9.0.0-beta.70",
|
|
11
11
|
"@angular/material": "^21.0.0",
|
|
12
12
|
"@angular/platform-browser": "^21.0.0",
|
|
13
13
|
"rxjs": "~7.8.0"
|
|
@@ -23,6 +23,7 @@
|
|
|
23
23
|
"keywords": [
|
|
24
24
|
"angular",
|
|
25
25
|
"praxisui",
|
|
26
|
+
"praxis",
|
|
26
27
|
"dialog",
|
|
27
28
|
"material",
|
|
28
29
|
"overlay",
|
|
@@ -38,7 +39,10 @@
|
|
|
38
39
|
".": {
|
|
39
40
|
"types": "./types/praxisui-dialog.d.ts",
|
|
40
41
|
"default": "./fesm2022/praxisui-dialog.mjs"
|
|
42
|
+
},
|
|
43
|
+
"./ai/component-registry.json": {
|
|
44
|
+
"default": "./ai/component-registry.json"
|
|
41
45
|
}
|
|
42
46
|
},
|
|
43
47
|
"type": "module"
|
|
44
|
-
}
|
|
48
|
+
}
|