@praxisui/dialog 9.0.0-beta.71 → 9.0.0-beta.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -124,6 +124,12 @@ Preset merge order is `type -> variant -> local config`. Use presets for UX poli
124
124
 
125
125
  Main exports: `PraxisDialog`, `PraxisDialogComponent`, template directives, `PraxisDialogRef`, dialog config types, dialog tokens, `providePraxisDialogGlobalActions`, `provideDialogGlobalPresetsFromGlobalConfig`, `PRAXIS_DIALOG_METADATA`, and `PRAXIS_DIALOG_AUTHORING_MANIFEST`.
126
126
 
127
+ ## Host theming
128
+
129
+ Theme dialogs through the semantic `--praxis-theme-*` roles exported by `@praxisui/core`, not by targeting Angular Material or MDC internals. The dialog resolves `surface`, `surface-raised`, `surface-overlay`, `on-surface`, `on-surface-muted`, `outline`, `outline-strong`, `focus-outline`, and `elevation` before its Material fallback. This keeps overlays, keyboard focus, and contrast coherent when a host supplies its own light or dark theme.
130
+
131
+ Component-specific dialog variables remain available for deliberate local customization; define either layer in a global theme scope because dialogs are rendered in the CDK overlay container.
132
+
127
133
  ## Accessibility
128
134
 
129
135
  `PraxisDialog` configures dialog roles, backdrop behavior, Escape handling, focus restoration and `aria-*` fields. Use `ariaRole: 'alertdialog'` for destructive or blocking confirmations, and always provide a visible title or accessible label.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-07-11T00:12:06.404Z",
3
+ "generatedAt": "2026-07-12T01:34:40.567Z",
4
4
  "packageName": "@praxisui/dialog",
5
- "packageVersion": "9.0.0-beta.71",
5
+ "packageVersion": "9.0.0-beta.73",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 1,
@@ -14,124 +14,168 @@
14
14
  {
15
15
  "name": "title",
16
16
  "type": "string",
17
- "required": false
17
+ "required": false,
18
+ "description": "Dialog title text.",
19
+ "label": "Title"
18
20
  },
19
21
  {
20
22
  "name": "actions",
21
23
  "type": "DialogAction[]",
22
- "required": false
24
+ "required": false,
25
+ "description": "Dialog footer actions and payloads.",
26
+ "label": "Actions"
23
27
  },
24
28
  {
25
29
  "name": "actionsLayout",
26
30
  "type": "ActionsLayout",
27
- "required": false
31
+ "required": false,
32
+ "description": "Footer action alignment.",
33
+ "label": "Actions layout"
28
34
  },
29
35
  {
30
36
  "name": "width",
31
37
  "type": "string | number",
32
- "required": false
38
+ "required": false,
39
+ "description": "Dialog width.",
40
+ "label": "Width"
33
41
  },
34
42
  {
35
43
  "name": "height",
36
44
  "type": "string | number",
37
- "required": false
45
+ "required": false,
46
+ "description": "Dialog height.",
47
+ "label": "Height"
38
48
  },
39
49
  {
40
50
  "name": "minWidth",
41
51
  "type": "string | number",
42
- "required": false
52
+ "required": false,
53
+ "description": "Minimum dialog width.",
54
+ "label": "Minimum width"
43
55
  },
44
56
  {
45
57
  "name": "maxWidth",
46
58
  "type": "string | number",
47
- "required": false
59
+ "required": false,
60
+ "description": "Maximum dialog width.",
61
+ "label": "Maximum width"
48
62
  },
49
63
  {
50
64
  "name": "minHeight",
51
65
  "type": "string | number",
52
- "required": false
66
+ "required": false,
67
+ "description": "Minimum dialog height.",
68
+ "label": "Minimum height"
53
69
  },
54
70
  {
55
71
  "name": "maxHeight",
56
72
  "type": "string | number",
57
- "required": false
73
+ "required": false,
74
+ "description": "Maximum dialog height.",
75
+ "label": "Maximum height"
58
76
  },
59
77
  {
60
78
  "name": "themeColor",
61
79
  "type": "DialogThemeColor",
62
- "required": false
80
+ "required": false,
81
+ "description": "Dialog visual theme.",
82
+ "label": "Theme color"
63
83
  },
64
84
  {
65
85
  "name": "disableClose",
66
86
  "type": "boolean",
67
- "required": false
87
+ "required": false,
88
+ "description": "Blocks backdrop and Escape close behavior.",
89
+ "label": "Disable close"
68
90
  },
69
91
  {
70
92
  "name": "hasBackdrop",
71
93
  "type": "boolean",
72
- "required": false
94
+ "required": false,
95
+ "description": "Controls whether the dialog renders a backdrop.",
96
+ "label": "Backdrop"
73
97
  },
74
98
  {
75
99
  "name": "closeOnBackdropClick",
76
100
  "type": "boolean",
77
- "required": false
101
+ "required": false,
102
+ "description": "Controls backdrop click close policy.",
103
+ "label": "Close on backdrop click"
78
104
  },
79
105
  {
80
106
  "name": "panelClass",
81
107
  "type": "string | string[] | Record<string, boolean>",
82
- "required": false
108
+ "required": false,
109
+ "description": "Additional CSS class for the dialog panel.",
110
+ "label": "Panel class"
83
111
  },
84
112
  {
85
113
  "name": "backdropClass",
86
114
  "type": "string | string[] | Record<string, boolean>",
87
- "required": false
115
+ "required": false,
116
+ "description": "Additional CSS class for the backdrop.",
117
+ "label": "Backdrop class"
88
118
  },
89
119
  {
90
120
  "name": "position",
91
121
  "type": "PraxisDialogPosition",
92
- "required": false
122
+ "required": false,
123
+ "description": "Dialog position offsets.",
124
+ "label": "Position"
93
125
  },
94
126
  {
95
127
  "name": "ariaRole",
96
128
  "type": "'dialog' | 'alertdialog'",
97
- "required": false
129
+ "required": false,
130
+ "description": "Accessible dialog role.",
131
+ "label": "ARIA role"
98
132
  },
99
133
  {
100
134
  "name": "ariaLabel",
101
135
  "type": "string",
102
- "required": false
136
+ "required": false,
137
+ "description": "Accessible label when no visible title is present.",
138
+ "label": "ARIA label"
103
139
  },
104
140
  {
105
141
  "name": "ariaLabelledBy",
106
142
  "type": "string",
107
- "required": false
143
+ "required": false,
144
+ "description": "External accessible label id.",
145
+ "label": "ARIA labelled by"
108
146
  },
109
147
  {
110
148
  "name": "ariaDescribedBy",
111
149
  "type": "string",
112
- "required": false
150
+ "required": false,
151
+ "description": "External accessible description id.",
152
+ "label": "ARIA described by"
113
153
  }
114
154
  ],
115
155
  "outputs": [
116
156
  {
117
157
  "name": "action",
118
158
  "type": "DialogAction",
119
- "required": false
159
+ "required": false,
160
+ "label": "Action"
120
161
  },
121
162
  {
122
163
  "name": "close",
123
164
  "type": "unknown",
124
- "required": false
165
+ "required": false,
166
+ "label": "Close"
125
167
  },
126
168
  {
127
169
  "name": "opened",
128
170
  "type": "void",
129
- "required": false
171
+ "required": false,
172
+ "label": "Opened"
130
173
  },
131
174
  {
132
175
  "name": "afterClosed",
133
176
  "type": "void",
134
- "required": false
177
+ "required": false,
178
+ "label": "After closed"
135
179
  }
136
180
  ],
137
181
  "configSchemaId": null,
@@ -145,6 +189,75 @@
145
189
  "authoring"
146
190
  ],
147
191
  "lib": "@praxisui/dialog",
192
+ "actions": [
193
+ {
194
+ "id": "dialog-open",
195
+ "label": "Open dialog",
196
+ "icon": "open_in_new",
197
+ "description": "Opens a dialog shell with governed config.",
198
+ "scope": "any"
199
+ },
200
+ {
201
+ "id": "dialog-close",
202
+ "label": "Close dialog",
203
+ "icon": "close",
204
+ "description": "Closes the dialog with an optional payload.",
205
+ "emit": "close",
206
+ "scope": "any"
207
+ }
208
+ ],
209
+ "ports": [
210
+ {
211
+ "id": "config",
212
+ "label": "Dialog config",
213
+ "direction": "input",
214
+ "semanticKind": "config-fragment",
215
+ "schema": {
216
+ "id": "PraxisDialogConfig",
217
+ "kind": "ts-type",
218
+ "ref": "PraxisDialogConfig"
219
+ },
220
+ "description": "Dialog shell configuration for title, actions, dimensions, backdrop, close policy and accessibility.",
221
+ "exposure": {
222
+ "public": true,
223
+ "group": "config"
224
+ }
225
+ },
226
+ {
227
+ "id": "close",
228
+ "label": "Close",
229
+ "direction": "output",
230
+ "semanticKind": "event",
231
+ "schema": {
232
+ "id": "unknown",
233
+ "kind": "ts-type",
234
+ "ref": "unknown"
235
+ },
236
+ "cardinality": "stream",
237
+ "description": "Emitted when the dialog shell requests close with an optional result payload.",
238
+ "exposure": {
239
+ "public": true,
240
+ "group": "events"
241
+ }
242
+ },
243
+ {
244
+ "id": "action",
245
+ "label": "Action",
246
+ "direction": "output",
247
+ "semanticKind": "event",
248
+ "schema": {
249
+ "id": "DialogAction",
250
+ "kind": "ts-type",
251
+ "ref": "DialogAction"
252
+ },
253
+ "cardinality": "stream",
254
+ "description": "Emitted when a configured dialog action is triggered.",
255
+ "exposure": {
256
+ "public": true,
257
+ "group": "events"
258
+ }
259
+ }
260
+ ],
148
261
  "source": "projects/praxis-dialog/src/lib/praxis-dialog.metadata.ts",
149
262
  "exportName": "PRAXIS_DIALOG_COMPONENT_METADATA",
150
263
  "authoringManifest": {
@@ -1134,7 +1247,7 @@
1134
1247
  "chunkIndex": 0,
1135
1248
  "chunkKind": "summary",
1136
1249
  "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",
1250
+ "sourcePointer": "projects/praxis-dialog/src/lib/praxis-dialog.metadata.ts",
1138
1251
  "contentHash": "31805c5f46dec3934066a5cc7fabeaefe3c437478999140b23b94524447df209",
1139
1252
  "sourceKind": "component_definition",
1140
1253
  "sourceId": "praxis-dialog",
@@ -1144,7 +1257,7 @@
1144
1257
  "chunkIndex": 1,
1145
1258
  "chunkKind": "authoring_manifest",
1146
1259
  "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",
1260
+ "sourcePointer": "projects/praxis-dialog/src/lib/ai/praxis-dialog-authoring-manifest.ts",
1148
1261
  "contentHash": "bfc079b8ab2cc757b80f178d0aaeeffd9199e87c8397ce98a987fe3f22f35a8b",
1149
1262
  "sourceKind": "component_definition",
1150
1263
  "sourceId": "praxis-dialog",
@@ -491,11 +491,11 @@ class PraxisDialogComponent {
491
491
  }
492
492
  }
493
493
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
494
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisDialogComponent, isStandalone: true, selector: "praxis-dialog", inputs: { title: "title", actions: "actions", actionsLayout: "actionsLayout", animation: "animation", open: "open", width: "width", height: "height", minWidth: "minWidth", maxWidth: "maxWidth", minHeight: "minHeight", maxHeight: "maxHeight", themeColor: "themeColor", disableClose: "disableClose", hasBackdrop: "hasBackdrop", closeOnBackdropClick: "closeOnBackdropClick", overlayMode: "overlayMode", zIndex: "zIndex", panelClass: "panelClass", backdropClass: "backdropClass", position: "position", autoFocusedElement: "autoFocusedElement", autoFocus: "autoFocus", restoreFocus: "restoreFocus", id: "id", ariaRole: "ariaRole", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaDescribedBy: "ariaDescribedBy", styles: "styles", titleIcon: "titleIcon" }, outputs: { action: "action", close: "close", opened: "opened", afterClosed: "afterClosed" }, host: { properties: { "class": "this.hostClass", "attr.tabindex": "this.tabindex" } }, queries: [{ propertyName: "titleTpl", first: true, predicate: PraxisDialogTitleDirective, descendants: true, read: PraxisDialogTitleDirective }, { propertyName: "actionsTpl", first: true, predicate: PraxisDialogActionsDirective, descendants: true, read: PraxisDialogActionsDirective }, { propertyName: "contentTpl", first: true, predicate: PraxisDialogContentDirective, descendants: true, read: PraxisDialogContentDirective }], viewQueries: [{ propertyName: "contentHost", first: true, predicate: CdkPortalOutlet, descendants: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@let _titleId = (id ?? 'praxis-dialog') + '-title';\n\n<ng-template #panelHeader>\n @if (titleTpl?.templateRef || title || titleIcon) {\n <div class=\"pdx-dialog__title\">\n @if (titleTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"titleTpl!.templateRef\"></ng-container>\n } @else {\n <div class=\"pdx-dialog__title-row\">\n @if (titleIcon) {\n <mat-icon class=\"pdx-dialog__title-icon\" [praxisIcon]=\"titleIcon\" aria-hidden=\"true\"></mat-icon>\n }\n <h2 class=\"pdx-dialog__title-text\" [attr.id]=\"_titleId\">{{ title }}</h2>\n </div>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #panelActions>\n <div class=\"pdx-dialog__actions\" [class.is-stretched]=\"actionsLayout==='stretched'\">\n @if (actionsTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"actionsTpl!.templateRef\"></ng-container>\n } @else {\n @for (a of actions; track a?.id ?? a) {\n <button\n type=\"button\"\n class=\"pdx-dialog__action-btn\"\n [attr.data-testid]=\"a.id || null\"\n [attr.data-role]=\"a.role || null\"\n [attr.data-theme]=\"a.themeColor || null\"\n [attr.data-fill]=\"a.fillMode || null\"\n [ngClass]=\"a.cssClass\"\n (click)=\"onActionClick(a)\"\n [attr.cdkFocusInitial]=\"a.role==='primary' && ariaRole==='alertdialog' ? '' : null\"\n >\n @if (a.icon) {\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n } @else if (a.svgIcon) {\n <mat-icon [svgIcon]=\"a.svgIcon\"></mat-icon>\n }\n {{ a.text }}\n </button>\n }\n }\n </div>\n</ng-template>\n\n@if (overlayMode) {\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n} @else {\n <div class=\"pdx-dialog-overlay\" [class.has-backdrop]=\"hasBackdrop\" [hidden]=\"!isDisplayed\" (click)=\"onBackdrop($event)\" [ngClass]=\"backdropClass\" [style.z-index]=\"zIndex\">\n <div class=\"pdx-dialog-shell\" (click)=\"$event.stopPropagation()\">\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [style.top]=\"position?.top || null\"\n [style.bottom]=\"position?.bottom || null\"\n [style.left]=\"position?.left || null\"\n [style.right]=\"position?.right || null\"\n [class.pdx-has-position]=\"position\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.pdx-dialog-host{--pdx-dialog-bg: var(--md-sys-color-surface);--pdx-dialog-surface: var(--md-sys-color-surface-container-high);--pdx-dialog-border: var(--md-sys-color-outline-variant);--pdx-dialog-title-fg: var(--md-sys-color-on-surface);--pdx-dialog-elevation: var(--mat-elevation-level4)}.pdx-dialog-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-dialog, 1300);background:transparent}.pdx-dialog-overlay.has-backdrop{background:var(--pdx-dialog-backdrop, rgba(0, 0, 0, .6))}.pdx-dialog-shell{display:contents}.pdx-dialog.pdx-has-position{position:absolute}.pdx-dialog{background:var(--pdx-dialog-container-color, var(--pdx-dialog-surface));color:var(--md-sys-color-on-surface, #111);border:1px solid var(--pdx-dialog-border);border-radius:var(--pdx-dialog-shape, 16px);box-shadow:var(--pdx-dialog-elevation-shadow, var(--pdx-dialog-elevation));max-width:var(--pdx-dialog-max-width, 90vw);max-height:var(--pdx-dialog-max-height, 80vh);display:flex;flex-direction:column;min-width:var(--pdx-dialog-min-width, 280px);outline:0}.pdx-dialog__title{padding:var(--pdx-dialog-headline-padding, 12px 24px 10px);border-bottom:1px solid var(--pdx-dialog-border);color:var(--pdx-dialog-subhead-color, var(--pdx-dialog-title-fg));background:var(--pdx-dialog-title-bg, transparent);flex:0 0 auto}.pdx-dialog__title-row{display:flex;gap:10px}.pdx-dialog__title-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:0 0 24px;font-size:20px;line-height:1;opacity:.87}.pdx-dialog__title-text{margin:0;font-family:var(--pdx-dialog-subhead-font, inherit);font-size:var(--pdx-dialog-subhead-size, 16px);letter-spacing:var(--pdx-dialog-subhead-tracking, normal);font-weight:var(--pdx-dialog-subhead-weight, 600);line-height:1.2}.pdx-dialog__content{padding:var(--pdx-dialog-content-padding, 16px);overflow:auto;flex:1 1 auto;min-height:0;color:var(--pdx-dialog-supporting-text-color, inherit);font-family:var(--pdx-dialog-supporting-text-font, inherit);line-height:var(--pdx-dialog-supporting-text-line-height, 1.4);font-size:var(--pdx-dialog-supporting-text-size, 14px);letter-spacing:var(--pdx-dialog-supporting-text-tracking, normal);font-weight:var(--pdx-dialog-supporting-text-weight, 400)}.pdx-dialog.has-actions .pdx-dialog__content{padding-bottom:var(--pdx-dialog-with-actions-content-padding, var(--pdx-dialog-content-padding, 16px))}.pdx-dialog__actions{display:flex;gap:8px;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);border-top:1px solid var(--pdx-dialog-border);justify-content:flex-end;align-items:center;background:var(--pdx-dialog-actions-bg, transparent);flex:0 0 auto}.pdx-dialog__actions.is-stretched{justify-content:stretch}.pdx-dialog__actions.is-stretched .pdx-dialog__action-btn{flex:1 1 0;justify-content:center}.pdx-dialog__action-btn{appearance:none;border:1px solid var(--pdx-dialog-border);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);border-radius:var(--pdx-dialog-action-radius, 8px);padding:var(--pdx-dialog-action-padding, 0 14px);min-height:var(--pdx-dialog-action-min-height, 36px);cursor:pointer;display:inline-flex;align-items:center;gap:8px;line-height:1;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.pdx-dialog__action-btn:hover{background:var(--md-sys-color-surface-container)}.pdx-dialog__action-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-dialog__action-btn:disabled{opacity:.6;cursor:not-allowed}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid]{background:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid]:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-color:var(--md-sys-color-primary-container)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid][data-theme=warn],.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]{background:var(--md-sys-color-error);border-color:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid][data-theme=warn]:hover,.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]:hover{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error-container)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent],.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]{background:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent]:hover,.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]:hover{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container);border-color:var(--md-sys-color-secondary-container)}.pdx-dialog__action-btn[data-fill=outline]{background:transparent;color:var(--md-sys-color-on-surface)}.pdx-dialog__action-btn[data-fill=outline][data-theme=primary],.pdx-dialog__action-btn[data-fill=flat][data-theme=primary]{color:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=accent],.pdx-dialog__action-btn[data-fill=flat][data-theme=accent]{color:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=warn],.pdx-dialog__action-btn[data-fill=flat][data-theme=warn]{color:var(--md-sys-color-error);border-color:var(--md-sys-color-error)}.pdx-dialog__action-btn[data-fill=flat]{background:transparent;border-color:transparent;color:var(--md-sys-color-primary)}.pdx-dialog__action-btn .mat-icon{font-size:20px;width:20px;height:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.pdx-dialog--primary .pdx-dialog__title{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-bottom-color:var(--md-sys-color-outline-variant)}.pdx-dialog--dark{background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.pdx-dialog{transform-origin:center;transition-property:transform,opacity;transition-duration:var(--pdx-dialog-anim-duration, .3s);transition-timing-function:var(--pdx-dialog-anim-ease, cubic-bezier(.2, 0, 0, 1))}.pdx-dialog.pdx-anim-fade{opacity:1}.pdx-dialog.pdx-anim-zoom{transform:scale(1)}.pdx-dialog.pdx-anim-translate-up,.pdx-dialog.pdx-anim-translate-down{transform:translateY(0)}.pdx-dialog.pdx-anim-translate-left,.pdx-dialog.pdx-anim-translate-right{transform:translate(0)}.pdx-dialog.pdx-state-opening.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-right{transform:translate(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-right{transform:translate(16px);opacity:0}@media(prefers-reduced-motion:reduce){.pdx-dialog{transition:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
494
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.14", type: PraxisDialogComponent, isStandalone: true, selector: "praxis-dialog", inputs: { title: "title", actions: "actions", actionsLayout: "actionsLayout", animation: "animation", open: "open", width: "width", height: "height", minWidth: "minWidth", maxWidth: "maxWidth", minHeight: "minHeight", maxHeight: "maxHeight", themeColor: "themeColor", disableClose: "disableClose", hasBackdrop: "hasBackdrop", closeOnBackdropClick: "closeOnBackdropClick", overlayMode: "overlayMode", zIndex: "zIndex", panelClass: "panelClass", backdropClass: "backdropClass", position: "position", autoFocusedElement: "autoFocusedElement", autoFocus: "autoFocus", restoreFocus: "restoreFocus", id: "id", ariaRole: "ariaRole", ariaLabel: "ariaLabel", ariaLabelledBy: "ariaLabelledBy", ariaDescribedBy: "ariaDescribedBy", styles: "styles", titleIcon: "titleIcon" }, outputs: { action: "action", close: "close", opened: "opened", afterClosed: "afterClosed" }, host: { properties: { "class": "this.hostClass", "attr.tabindex": "this.tabindex" } }, queries: [{ propertyName: "titleTpl", first: true, predicate: PraxisDialogTitleDirective, descendants: true, read: PraxisDialogTitleDirective }, { propertyName: "actionsTpl", first: true, predicate: PraxisDialogActionsDirective, descendants: true, read: PraxisDialogActionsDirective }, { propertyName: "contentTpl", first: true, predicate: PraxisDialogContentDirective, descendants: true, read: PraxisDialogContentDirective }], viewQueries: [{ propertyName: "contentHost", first: true, predicate: CdkPortalOutlet, descendants: true }, { propertyName: "panelEl", first: true, predicate: ["panel"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "@let _titleId = (id ?? 'praxis-dialog') + '-title';\n\n<ng-template #panelHeader>\n @if (titleTpl?.templateRef || title || titleIcon) {\n <div class=\"pdx-dialog__title\">\n @if (titleTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"titleTpl!.templateRef\"></ng-container>\n } @else {\n <div class=\"pdx-dialog__title-row\">\n @if (titleIcon) {\n <mat-icon class=\"pdx-dialog__title-icon\" [praxisIcon]=\"titleIcon\" aria-hidden=\"true\"></mat-icon>\n }\n <h2 class=\"pdx-dialog__title-text\" [attr.id]=\"_titleId\">{{ title }}</h2>\n </div>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #panelActions>\n <div class=\"pdx-dialog__actions\" [class.is-stretched]=\"actionsLayout==='stretched'\">\n @if (actionsTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"actionsTpl!.templateRef\"></ng-container>\n } @else {\n @for (a of actions; track a?.id ?? a) {\n <button\n type=\"button\"\n class=\"pdx-dialog__action-btn\"\n [attr.data-testid]=\"a.id || null\"\n [attr.data-role]=\"a.role || null\"\n [attr.data-theme]=\"a.themeColor || null\"\n [attr.data-fill]=\"a.fillMode || null\"\n [ngClass]=\"a.cssClass\"\n (click)=\"onActionClick(a)\"\n [attr.cdkFocusInitial]=\"a.role==='primary' && ariaRole==='alertdialog' ? '' : null\"\n >\n @if (a.icon) {\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n } @else if (a.svgIcon) {\n <mat-icon [svgIcon]=\"a.svgIcon\"></mat-icon>\n }\n {{ a.text }}\n </button>\n }\n }\n </div>\n</ng-template>\n\n@if (overlayMode) {\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n} @else {\n <div class=\"pdx-dialog-overlay\" [class.has-backdrop]=\"hasBackdrop\" [hidden]=\"!isDisplayed\" (click)=\"onBackdrop($event)\" [ngClass]=\"backdropClass\" [style.z-index]=\"zIndex\">\n <div class=\"pdx-dialog-shell\" (click)=\"$event.stopPropagation()\">\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [style.top]=\"position?.top || null\"\n [style.bottom]=\"position?.bottom || null\"\n [style.left]=\"position?.left || null\"\n [style.right]=\"position?.right || null\"\n [class.pdx-has-position]=\"position\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.pdx-dialog-host{--pdx-dialog-bg: var(--praxis-theme-surface, var(--md-sys-color-surface));--pdx-dialog-surface: var(--praxis-theme-surface-overlay, var(--md-sys-color-surface-container-high));--pdx-dialog-border: var(--praxis-theme-outline, var(--md-sys-color-outline-variant));--pdx-dialog-title-fg: var(--praxis-theme-on-surface, var(--md-sys-color-on-surface));--pdx-dialog-elevation: var(--praxis-theme-elevation, var(--mat-elevation-level4))}.pdx-dialog-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-dialog, 1300);background:transparent}.pdx-dialog-overlay.has-backdrop{background:var(--pdx-dialog-backdrop, rgba(0, 0, 0, .6))}.pdx-dialog-shell{display:contents}.pdx-dialog.pdx-has-position{position:absolute}.pdx-dialog{background:var(--pdx-dialog-container-color, var(--pdx-dialog-surface));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface, #111));border:1px solid var(--pdx-dialog-border);border-radius:var(--pdx-dialog-shape, 16px);box-shadow:var(--pdx-dialog-elevation-shadow, var(--pdx-dialog-elevation));max-width:var(--pdx-dialog-max-width, 90vw);max-height:var(--pdx-dialog-max-height, 80vh);display:flex;flex-direction:column;min-width:var(--pdx-dialog-min-width, 280px);outline:0}.pdx-dialog__title{padding:var(--pdx-dialog-headline-padding, 12px 24px 10px);border-bottom:1px solid var(--pdx-dialog-border);color:var(--pdx-dialog-subhead-color, var(--pdx-dialog-title-fg));background:var(--pdx-dialog-title-bg, transparent);flex:0 0 auto}.pdx-dialog__title-row{display:flex;gap:10px}.pdx-dialog__title-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:0 0 24px;font-size:20px;line-height:1;opacity:.87}.pdx-dialog__title-text{margin:0;font-family:var(--pdx-dialog-subhead-font, inherit);font-size:var(--pdx-dialog-subhead-size, 16px);letter-spacing:var(--pdx-dialog-subhead-tracking, normal);font-weight:var(--pdx-dialog-subhead-weight, 600);line-height:1.2}.pdx-dialog__content{padding:var(--pdx-dialog-content-padding, 16px);overflow:auto;flex:1 1 auto;min-height:0;color:var(--pdx-dialog-supporting-text-color, inherit);font-family:var(--pdx-dialog-supporting-text-font, inherit);line-height:var(--pdx-dialog-supporting-text-line-height, 1.4);font-size:var(--pdx-dialog-supporting-text-size, 14px);letter-spacing:var(--pdx-dialog-supporting-text-tracking, normal);font-weight:var(--pdx-dialog-supporting-text-weight, 400)}.pdx-dialog.has-actions .pdx-dialog__content{padding-bottom:var(--pdx-dialog-with-actions-content-padding, var(--pdx-dialog-content-padding, 16px))}.pdx-dialog__actions{display:flex;gap:8px;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);border-top:1px solid var(--pdx-dialog-border);justify-content:flex-end;align-items:center;background:var(--pdx-dialog-actions-bg, transparent);flex:0 0 auto}.pdx-dialog__actions.is-stretched{justify-content:stretch}.pdx-dialog__actions.is-stretched .pdx-dialog__action-btn{flex:1 1 0;justify-content:center}.pdx-dialog__action-btn{appearance:none;border:1px solid var(--pdx-dialog-border);background:var(--praxis-theme-surface, var(--md-sys-color-surface-container-low));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface));border-radius:var(--pdx-dialog-action-radius, 8px);padding:var(--pdx-dialog-action-padding, 0 14px);min-height:var(--pdx-dialog-action-min-height, 36px);cursor:pointer;display:inline-flex;align-items:center;gap:8px;line-height:1;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.pdx-dialog__action-btn:hover{background:var(--praxis-theme-surface-raised, var(--md-sys-color-surface-container))}.pdx-dialog__action-btn:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:2px}.pdx-dialog__action-btn:disabled{opacity:.6;cursor:not-allowed}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid]{background:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid]:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-color:var(--md-sys-color-primary-container)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid][data-theme=warn],.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]{background:var(--md-sys-color-error);border-color:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid][data-theme=warn]:hover,.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]:hover{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error-container)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent],.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]{background:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent]:hover,.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]:hover{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container);border-color:var(--md-sys-color-secondary-container)}.pdx-dialog__action-btn[data-fill=outline]{background:transparent;color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface))}.pdx-dialog__action-btn[data-fill=outline][data-theme=primary],.pdx-dialog__action-btn[data-fill=flat][data-theme=primary]{color:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=accent],.pdx-dialog__action-btn[data-fill=flat][data-theme=accent]{color:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=warn],.pdx-dialog__action-btn[data-fill=flat][data-theme=warn]{color:var(--md-sys-color-error);border-color:var(--md-sys-color-error)}.pdx-dialog__action-btn[data-fill=flat]{background:transparent;border-color:transparent;color:var(--md-sys-color-primary)}.pdx-dialog__action-btn .mat-icon{font-size:20px;width:20px;height:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.pdx-dialog--primary .pdx-dialog__title{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-bottom-color:var(--praxis-theme-outline, var(--md-sys-color-outline-variant))}.pdx-dialog--dark{background:var(--praxis-theme-surface-raised, var(--md-sys-color-surface-container));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface))}.pdx-dialog{transform-origin:center;transition-property:transform,opacity;transition-duration:var(--pdx-dialog-anim-duration, .3s);transition-timing-function:var(--pdx-dialog-anim-ease, cubic-bezier(.2, 0, 0, 1))}.pdx-dialog.pdx-anim-fade{opacity:1}.pdx-dialog.pdx-anim-zoom{transform:scale(1)}.pdx-dialog.pdx-anim-translate-up,.pdx-dialog.pdx-anim-translate-down{transform:translateY(0)}.pdx-dialog.pdx-anim-translate-left,.pdx-dialog.pdx-anim-translate-right{transform:translate(0)}.pdx-dialog.pdx-state-opening.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-right{transform:translate(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-right{transform:translate(16px);opacity:0}@media(prefers-reduced-motion:reduce){.pdx-dialog{transition:none!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: PortalModule }, { kind: "directive", type: i2.CdkPortalOutlet, selector: "[cdkPortalOutlet]", inputs: ["cdkPortalOutlet"], outputs: ["attached"], exportAs: ["cdkPortalOutlet"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i3.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
495
495
  }
496
496
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisDialogComponent, decorators: [{
497
497
  type: Component,
498
- args: [{ selector: 'praxis-dialog', standalone: true, imports: [CommonModule, PortalModule, A11yModule, MatIconModule, PraxisIconDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@let _titleId = (id ?? 'praxis-dialog') + '-title';\n\n<ng-template #panelHeader>\n @if (titleTpl?.templateRef || title || titleIcon) {\n <div class=\"pdx-dialog__title\">\n @if (titleTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"titleTpl!.templateRef\"></ng-container>\n } @else {\n <div class=\"pdx-dialog__title-row\">\n @if (titleIcon) {\n <mat-icon class=\"pdx-dialog__title-icon\" [praxisIcon]=\"titleIcon\" aria-hidden=\"true\"></mat-icon>\n }\n <h2 class=\"pdx-dialog__title-text\" [attr.id]=\"_titleId\">{{ title }}</h2>\n </div>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #panelActions>\n <div class=\"pdx-dialog__actions\" [class.is-stretched]=\"actionsLayout==='stretched'\">\n @if (actionsTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"actionsTpl!.templateRef\"></ng-container>\n } @else {\n @for (a of actions; track a?.id ?? a) {\n <button\n type=\"button\"\n class=\"pdx-dialog__action-btn\"\n [attr.data-testid]=\"a.id || null\"\n [attr.data-role]=\"a.role || null\"\n [attr.data-theme]=\"a.themeColor || null\"\n [attr.data-fill]=\"a.fillMode || null\"\n [ngClass]=\"a.cssClass\"\n (click)=\"onActionClick(a)\"\n [attr.cdkFocusInitial]=\"a.role==='primary' && ariaRole==='alertdialog' ? '' : null\"\n >\n @if (a.icon) {\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n } @else if (a.svgIcon) {\n <mat-icon [svgIcon]=\"a.svgIcon\"></mat-icon>\n }\n {{ a.text }}\n </button>\n }\n }\n </div>\n</ng-template>\n\n@if (overlayMode) {\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n} @else {\n <div class=\"pdx-dialog-overlay\" [class.has-backdrop]=\"hasBackdrop\" [hidden]=\"!isDisplayed\" (click)=\"onBackdrop($event)\" [ngClass]=\"backdropClass\" [style.z-index]=\"zIndex\">\n <div class=\"pdx-dialog-shell\" (click)=\"$event.stopPropagation()\">\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [style.top]=\"position?.top || null\"\n [style.bottom]=\"position?.bottom || null\"\n [style.left]=\"position?.left || null\"\n [style.right]=\"position?.right || null\"\n [class.pdx-has-position]=\"position\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.pdx-dialog-host{--pdx-dialog-bg: var(--md-sys-color-surface);--pdx-dialog-surface: var(--md-sys-color-surface-container-high);--pdx-dialog-border: var(--md-sys-color-outline-variant);--pdx-dialog-title-fg: var(--md-sys-color-on-surface);--pdx-dialog-elevation: var(--mat-elevation-level4)}.pdx-dialog-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-dialog, 1300);background:transparent}.pdx-dialog-overlay.has-backdrop{background:var(--pdx-dialog-backdrop, rgba(0, 0, 0, .6))}.pdx-dialog-shell{display:contents}.pdx-dialog.pdx-has-position{position:absolute}.pdx-dialog{background:var(--pdx-dialog-container-color, var(--pdx-dialog-surface));color:var(--md-sys-color-on-surface, #111);border:1px solid var(--pdx-dialog-border);border-radius:var(--pdx-dialog-shape, 16px);box-shadow:var(--pdx-dialog-elevation-shadow, var(--pdx-dialog-elevation));max-width:var(--pdx-dialog-max-width, 90vw);max-height:var(--pdx-dialog-max-height, 80vh);display:flex;flex-direction:column;min-width:var(--pdx-dialog-min-width, 280px);outline:0}.pdx-dialog__title{padding:var(--pdx-dialog-headline-padding, 12px 24px 10px);border-bottom:1px solid var(--pdx-dialog-border);color:var(--pdx-dialog-subhead-color, var(--pdx-dialog-title-fg));background:var(--pdx-dialog-title-bg, transparent);flex:0 0 auto}.pdx-dialog__title-row{display:flex;gap:10px}.pdx-dialog__title-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:0 0 24px;font-size:20px;line-height:1;opacity:.87}.pdx-dialog__title-text{margin:0;font-family:var(--pdx-dialog-subhead-font, inherit);font-size:var(--pdx-dialog-subhead-size, 16px);letter-spacing:var(--pdx-dialog-subhead-tracking, normal);font-weight:var(--pdx-dialog-subhead-weight, 600);line-height:1.2}.pdx-dialog__content{padding:var(--pdx-dialog-content-padding, 16px);overflow:auto;flex:1 1 auto;min-height:0;color:var(--pdx-dialog-supporting-text-color, inherit);font-family:var(--pdx-dialog-supporting-text-font, inherit);line-height:var(--pdx-dialog-supporting-text-line-height, 1.4);font-size:var(--pdx-dialog-supporting-text-size, 14px);letter-spacing:var(--pdx-dialog-supporting-text-tracking, normal);font-weight:var(--pdx-dialog-supporting-text-weight, 400)}.pdx-dialog.has-actions .pdx-dialog__content{padding-bottom:var(--pdx-dialog-with-actions-content-padding, var(--pdx-dialog-content-padding, 16px))}.pdx-dialog__actions{display:flex;gap:8px;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);border-top:1px solid var(--pdx-dialog-border);justify-content:flex-end;align-items:center;background:var(--pdx-dialog-actions-bg, transparent);flex:0 0 auto}.pdx-dialog__actions.is-stretched{justify-content:stretch}.pdx-dialog__actions.is-stretched .pdx-dialog__action-btn{flex:1 1 0;justify-content:center}.pdx-dialog__action-btn{appearance:none;border:1px solid var(--pdx-dialog-border);background:var(--md-sys-color-surface-container-low);color:var(--md-sys-color-on-surface);border-radius:var(--pdx-dialog-action-radius, 8px);padding:var(--pdx-dialog-action-padding, 0 14px);min-height:var(--pdx-dialog-action-min-height, 36px);cursor:pointer;display:inline-flex;align-items:center;gap:8px;line-height:1;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.pdx-dialog__action-btn:hover{background:var(--md-sys-color-surface-container)}.pdx-dialog__action-btn:focus-visible{outline:2px solid var(--md-sys-color-primary);outline-offset:2px}.pdx-dialog__action-btn:disabled{opacity:.6;cursor:not-allowed}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid]{background:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid]:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-color:var(--md-sys-color-primary-container)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid][data-theme=warn],.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]{background:var(--md-sys-color-error);border-color:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid][data-theme=warn]:hover,.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]:hover{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error-container)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent],.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]{background:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent]:hover,.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]:hover{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container);border-color:var(--md-sys-color-secondary-container)}.pdx-dialog__action-btn[data-fill=outline]{background:transparent;color:var(--md-sys-color-on-surface)}.pdx-dialog__action-btn[data-fill=outline][data-theme=primary],.pdx-dialog__action-btn[data-fill=flat][data-theme=primary]{color:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=accent],.pdx-dialog__action-btn[data-fill=flat][data-theme=accent]{color:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=warn],.pdx-dialog__action-btn[data-fill=flat][data-theme=warn]{color:var(--md-sys-color-error);border-color:var(--md-sys-color-error)}.pdx-dialog__action-btn[data-fill=flat]{background:transparent;border-color:transparent;color:var(--md-sys-color-primary)}.pdx-dialog__action-btn .mat-icon{font-size:20px;width:20px;height:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.pdx-dialog--primary .pdx-dialog__title{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-bottom-color:var(--md-sys-color-outline-variant)}.pdx-dialog--dark{background:var(--md-sys-color-surface-container);color:var(--md-sys-color-on-surface)}.pdx-dialog{transform-origin:center;transition-property:transform,opacity;transition-duration:var(--pdx-dialog-anim-duration, .3s);transition-timing-function:var(--pdx-dialog-anim-ease, cubic-bezier(.2, 0, 0, 1))}.pdx-dialog.pdx-anim-fade{opacity:1}.pdx-dialog.pdx-anim-zoom{transform:scale(1)}.pdx-dialog.pdx-anim-translate-up,.pdx-dialog.pdx-anim-translate-down{transform:translateY(0)}.pdx-dialog.pdx-anim-translate-left,.pdx-dialog.pdx-anim-translate-right{transform:translate(0)}.pdx-dialog.pdx-state-opening.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-right{transform:translate(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-right{transform:translate(16px);opacity:0}@media(prefers-reduced-motion:reduce){.pdx-dialog{transition:none!important}}\n"] }]
498
+ args: [{ selector: 'praxis-dialog', standalone: true, imports: [CommonModule, PortalModule, A11yModule, MatIconModule, PraxisIconDirective], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "@let _titleId = (id ?? 'praxis-dialog') + '-title';\n\n<ng-template #panelHeader>\n @if (titleTpl?.templateRef || title || titleIcon) {\n <div class=\"pdx-dialog__title\">\n @if (titleTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"titleTpl!.templateRef\"></ng-container>\n } @else {\n <div class=\"pdx-dialog__title-row\">\n @if (titleIcon) {\n <mat-icon class=\"pdx-dialog__title-icon\" [praxisIcon]=\"titleIcon\" aria-hidden=\"true\"></mat-icon>\n }\n <h2 class=\"pdx-dialog__title-text\" [attr.id]=\"_titleId\">{{ title }}</h2>\n </div>\n }\n </div>\n }\n</ng-template>\n\n<ng-template #panelActions>\n <div class=\"pdx-dialog__actions\" [class.is-stretched]=\"actionsLayout==='stretched'\">\n @if (actionsTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"actionsTpl!.templateRef\"></ng-container>\n } @else {\n @for (a of actions; track a?.id ?? a) {\n <button\n type=\"button\"\n class=\"pdx-dialog__action-btn\"\n [attr.data-testid]=\"a.id || null\"\n [attr.data-role]=\"a.role || null\"\n [attr.data-theme]=\"a.themeColor || null\"\n [attr.data-fill]=\"a.fillMode || null\"\n [ngClass]=\"a.cssClass\"\n (click)=\"onActionClick(a)\"\n [attr.cdkFocusInitial]=\"a.role==='primary' && ariaRole==='alertdialog' ? '' : null\"\n >\n @if (a.icon) {\n <mat-icon [praxisIcon]=\"a.icon\"></mat-icon>\n } @else if (a.svgIcon) {\n <mat-icon [svgIcon]=\"a.svgIcon\"></mat-icon>\n }\n {{ a.text }}\n </button>\n }\n }\n </div>\n</ng-template>\n\n@if (overlayMode) {\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n} @else {\n <div class=\"pdx-dialog-overlay\" [class.has-backdrop]=\"hasBackdrop\" [hidden]=\"!isDisplayed\" (click)=\"onBackdrop($event)\" [ngClass]=\"backdropClass\" [style.z-index]=\"zIndex\">\n <div class=\"pdx-dialog-shell\" (click)=\"$event.stopPropagation()\">\n <div\n #panel\n class=\"pdx-dialog pdx-dialog--{{ themeColor }} pdx-dialog--layout-{{ actionsLayout }}\"\n [attr.role]=\"ariaRole\"\n [attr.id]=\"id || null\"\n [attr.aria-modal]=\"true\"\n [attr.aria-label]=\"ariaLabel || null\"\n [attr.aria-labelledby]=\"(ariaLabelledBy || (title ? _titleId : null))\"\n [attr.aria-describedby]=\"ariaDescribedBy || null\"\n (keydown)=\"onKeydown($event)\"\n cdkTrapFocus\n [ngClass]=\"panelNgClass\"\n [style.width]=\"width\"\n [style.height]=\"height\"\n [style.min-width]=\"minWidth\"\n [style.max-width]=\"maxWidth\"\n [style.min-height]=\"minHeight\"\n [style.max-height]=\"maxHeight\"\n [style.top]=\"position?.top || null\"\n [style.bottom]=\"position?.bottom || null\"\n [style.left]=\"position?.left || null\"\n [style.right]=\"position?.right || null\"\n [class.pdx-has-position]=\"position\"\n [class.has-actions]=\"(actions.length||0)>0 || !!actionsTpl?.templateRef\"\n >\n <ng-container [ngTemplateOutlet]=\"panelHeader\"></ng-container>\n <div class=\"pdx-dialog__content\">\n @if (contentTpl?.templateRef) {\n <ng-container [ngTemplateOutlet]=\"contentTpl!.templateRef\"></ng-container>\n } @else {\n <ng-template cdkPortalOutlet></ng-template>\n }\n </div>\n <ng-container [ngTemplateOutlet]=\"panelActions\"></ng-container>\n </div>\n </div>\n </div>\n}\n", styles: ["@charset \"UTF-8\";.pdx-dialog-host{--pdx-dialog-bg: var(--praxis-theme-surface, var(--md-sys-color-surface));--pdx-dialog-surface: var(--praxis-theme-surface-overlay, var(--md-sys-color-surface-container-high));--pdx-dialog-border: var(--praxis-theme-outline, var(--md-sys-color-outline-variant));--pdx-dialog-title-fg: var(--praxis-theme-on-surface, var(--md-sys-color-on-surface));--pdx-dialog-elevation: var(--praxis-theme-elevation, var(--mat-elevation-level4))}.pdx-dialog-overlay{position:fixed;inset:0;display:flex;align-items:center;justify-content:center;z-index:var(--praxis-layer-dialog, 1300);background:transparent}.pdx-dialog-overlay.has-backdrop{background:var(--pdx-dialog-backdrop, rgba(0, 0, 0, .6))}.pdx-dialog-shell{display:contents}.pdx-dialog.pdx-has-position{position:absolute}.pdx-dialog{background:var(--pdx-dialog-container-color, var(--pdx-dialog-surface));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface, #111));border:1px solid var(--pdx-dialog-border);border-radius:var(--pdx-dialog-shape, 16px);box-shadow:var(--pdx-dialog-elevation-shadow, var(--pdx-dialog-elevation));max-width:var(--pdx-dialog-max-width, 90vw);max-height:var(--pdx-dialog-max-height, 80vh);display:flex;flex-direction:column;min-width:var(--pdx-dialog-min-width, 280px);outline:0}.pdx-dialog__title{padding:var(--pdx-dialog-headline-padding, 12px 24px 10px);border-bottom:1px solid var(--pdx-dialog-border);color:var(--pdx-dialog-subhead-color, var(--pdx-dialog-title-fg));background:var(--pdx-dialog-title-bg, transparent);flex:0 0 auto}.pdx-dialog__title-row{display:flex;gap:10px}.pdx-dialog__title-icon{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;flex:0 0 24px;font-size:20px;line-height:1;opacity:.87}.pdx-dialog__title-text{margin:0;font-family:var(--pdx-dialog-subhead-font, inherit);font-size:var(--pdx-dialog-subhead-size, 16px);letter-spacing:var(--pdx-dialog-subhead-tracking, normal);font-weight:var(--pdx-dialog-subhead-weight, 600);line-height:1.2}.pdx-dialog__content{padding:var(--pdx-dialog-content-padding, 16px);overflow:auto;flex:1 1 auto;min-height:0;color:var(--pdx-dialog-supporting-text-color, inherit);font-family:var(--pdx-dialog-supporting-text-font, inherit);line-height:var(--pdx-dialog-supporting-text-line-height, 1.4);font-size:var(--pdx-dialog-supporting-text-size, 14px);letter-spacing:var(--pdx-dialog-supporting-text-tracking, normal);font-weight:var(--pdx-dialog-supporting-text-weight, 400)}.pdx-dialog.has-actions .pdx-dialog__content{padding-bottom:var(--pdx-dialog-with-actions-content-padding, var(--pdx-dialog-content-padding, 16px))}.pdx-dialog__actions{display:flex;gap:8px;padding:var(--pdx-dialog-actions-padding, 12px 24px 16px);border-top:1px solid var(--pdx-dialog-border);justify-content:flex-end;align-items:center;background:var(--pdx-dialog-actions-bg, transparent);flex:0 0 auto}.pdx-dialog__actions.is-stretched{justify-content:stretch}.pdx-dialog__actions.is-stretched .pdx-dialog__action-btn{flex:1 1 0;justify-content:center}.pdx-dialog__action-btn{appearance:none;border:1px solid var(--pdx-dialog-border);background:var(--praxis-theme-surface, var(--md-sys-color-surface-container-low));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface));border-radius:var(--pdx-dialog-action-radius, 8px);padding:var(--pdx-dialog-action-padding, 0 14px);min-height:var(--pdx-dialog-action-min-height, 36px);cursor:pointer;display:inline-flex;align-items:center;gap:8px;line-height:1;transition:background-color .18s ease,border-color .18s ease,color .18s ease}.pdx-dialog__action-btn:hover{background:var(--praxis-theme-surface-raised, var(--md-sys-color-surface-container))}.pdx-dialog__action-btn:focus-visible{outline:2px solid var(--praxis-theme-focus-outline, var(--md-sys-color-primary));outline-offset:2px}.pdx-dialog__action-btn:disabled{opacity:.6;cursor:not-allowed}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid]{background:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary);color:var(--md-sys-color-on-primary)}.pdx-dialog__action-btn[data-role=primary]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid]:hover{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-color:var(--md-sys-color-primary-container)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]),.pdx-dialog__action-btn[data-fill=solid][data-theme=warn],.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]{background:var(--md-sys-color-error);border-color:var(--md-sys-color-error);color:var(--md-sys-color-on-error)}.pdx-dialog__action-btn[data-role=danger]:not([data-fill]):hover,.pdx-dialog__action-btn[data-fill=solid][data-theme=warn]:hover,.pdx-dialog__action-btn[data-theme=warn][data-fill=solid]:hover{background:var(--md-sys-color-error-container);color:var(--md-sys-color-on-error-container);border-color:var(--md-sys-color-error-container)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent],.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]{background:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary);color:var(--md-sys-color-on-secondary)}.pdx-dialog__action-btn[data-fill=solid][data-theme=accent]:hover,.pdx-dialog__action-btn[data-theme=accent][data-fill=solid]:hover{background:var(--md-sys-color-secondary-container);color:var(--md-sys-color-on-secondary-container);border-color:var(--md-sys-color-secondary-container)}.pdx-dialog__action-btn[data-fill=outline]{background:transparent;color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface))}.pdx-dialog__action-btn[data-fill=outline][data-theme=primary],.pdx-dialog__action-btn[data-fill=flat][data-theme=primary]{color:var(--md-sys-color-primary);border-color:var(--md-sys-color-primary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=accent],.pdx-dialog__action-btn[data-fill=flat][data-theme=accent]{color:var(--md-sys-color-secondary);border-color:var(--md-sys-color-secondary)}.pdx-dialog__action-btn[data-fill=outline][data-theme=warn],.pdx-dialog__action-btn[data-fill=flat][data-theme=warn]{color:var(--md-sys-color-error);border-color:var(--md-sys-color-error)}.pdx-dialog__action-btn[data-fill=flat]{background:transparent;border-color:transparent;color:var(--md-sys-color-primary)}.pdx-dialog__action-btn .mat-icon{font-size:20px;width:20px;height:20px;line-height:1;display:inline-flex;align-items:center;justify-content:center}.pdx-dialog--primary .pdx-dialog__title{background:var(--md-sys-color-primary-container);color:var(--md-sys-color-on-primary-container);border-bottom-color:var(--praxis-theme-outline, var(--md-sys-color-outline-variant))}.pdx-dialog--dark{background:var(--praxis-theme-surface-raised, var(--md-sys-color-surface-container));color:var(--praxis-theme-on-surface, var(--md-sys-color-on-surface))}.pdx-dialog{transform-origin:center;transition-property:transform,opacity;transition-duration:var(--pdx-dialog-anim-duration, .3s);transition-timing-function:var(--pdx-dialog-anim-ease, cubic-bezier(.2, 0, 0, 1))}.pdx-dialog.pdx-anim-fade{opacity:1}.pdx-dialog.pdx-anim-zoom{transform:scale(1)}.pdx-dialog.pdx-anim-translate-up,.pdx-dialog.pdx-anim-translate-down{transform:translateY(0)}.pdx-dialog.pdx-anim-translate-left,.pdx-dialog.pdx-anim-translate-right{transform:translate(0)}.pdx-dialog.pdx-state-opening.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-opening.pdx-anim-translate-right{transform:translate(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-fade{opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-zoom{transform:scale(.96);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-up{transform:translateY(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-down{transform:translateY(16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-left{transform:translate(-16px);opacity:0}.pdx-dialog.pdx-state-closing.pdx-anim-translate-right{transform:translate(16px);opacity:0}@media(prefers-reduced-motion:reduce){.pdx-dialog{transition:none!important}}\n"] }]
499
499
  }], propDecorators: { title: [{
500
500
  type: Input
501
501
  }], actions: [{
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@praxisui/dialog",
3
- "version": "9.0.0-beta.71",
3
+ "version": "9.0.0-beta.73",
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.71",
10
+ "@praxisui/core": "^9.0.0-beta.73",
11
11
  "@angular/material": "^21.0.0",
12
12
  "@angular/platform-browser": "^21.0.0",
13
13
  "rxjs": "~7.8.0"