@praxisui/rich-content 9.0.0-beta.5 → 9.0.0-beta.50

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.
@@ -13,15 +13,35 @@ const PRAXIS_RICH_CONTENT_EN_US = {
13
13
  'praxis.richContent.editor.subtitle': 'Edit the canonical document consumed by the renderer. The saved payload preserves the remaining widget inputs.',
14
14
  'praxis.richContent.editor.valid': 'Valid document',
15
15
  'praxis.richContent.editor.invalid': 'Invalid JSON',
16
+ 'praxis.richContent.editor.invalidBadge': 'Invalid',
16
17
  'praxis.richContent.editor.layout': 'Layout',
17
18
  'praxis.richContent.editor.layout.block': 'Block',
18
19
  'praxis.richContent.editor.layout.inline': 'Inline',
19
20
  'praxis.richContent.editor.rootClass': 'Root class',
20
21
  'praxis.richContent.editor.rootClassPlaceholder': 'Example: employee-expansion-rich',
22
+ 'praxis.richContent.editor.documentContext': 'Document context',
23
+ 'praxis.richContent.editor.documentContextHelp': 'Canonical data scopes and aliases available to rich-content bindings.',
24
+ 'praxis.richContent.editor.documentContextFields': 'Context contract',
25
+ 'praxis.richContent.editor.workbenchTabs': 'Editor sections',
26
+ 'praxis.richContent.editor.guidedEditing': 'Guided editing',
21
27
  'praxis.richContent.editor.document': 'Advanced JSON',
28
+ 'praxis.richContent.editor.documentJson': 'Canonical document JSON',
22
29
  'praxis.richContent.editor.documentHelp': 'Edit the canonical RichContentDocument. The inspector validates the shape and renders a preview before apply or save.',
30
+ 'praxis.richContent.editor.documentAdvancedHelp': 'Use JSON for diagnostics, migration and advanced fields that are not yet surfaced by guided controls.',
23
31
  'praxis.richContent.editor.blocks': 'Blocks',
24
32
  'praxis.richContent.editor.blocksHelp': 'Create and edit common top-level rich-content blocks. Use JSON for advanced nested structures.',
33
+ 'praxis.richContent.editor.structure': 'Document structure',
34
+ 'praxis.richContent.editor.structureHelp': 'Select a block to edit its properties.',
35
+ 'praxis.richContent.editor.properties': 'Properties',
36
+ 'praxis.richContent.editor.propertiesHelp': 'Edit the selected block without leaving the document structure.',
37
+ 'praxis.richContent.editor.intentNavigation': 'Property sections',
38
+ 'praxis.richContent.editor.intent.content': 'Content',
39
+ 'praxis.richContent.editor.intent.contentHelp': 'Primary block fields',
40
+ 'praxis.richContent.editor.intent.presentation': 'Presentation',
41
+ 'praxis.richContent.editor.intent.presentationHelp': 'Visual affordances',
42
+ 'praxis.richContent.editor.intent.dataRules': 'Data and rules',
43
+ 'praxis.richContent.editor.intent.dataRulesHelp': 'Metadata and gates',
44
+ 'praxis.richContent.editor.hasIssues': 'Needs attention',
25
45
  'praxis.richContent.editor.block': 'Block',
26
46
  'praxis.richContent.editor.blockType': 'Block type',
27
47
  'praxis.richContent.editor.addBlock': 'Add block',
@@ -43,11 +63,18 @@ const PRAXIS_RICH_CONTENT_EN_US = {
43
63
  'praxis.richContent.editor.cardContentHelp': 'Card content is preserved in JSON. Use advanced JSON for nested card nodes.',
44
64
  'praxis.richContent.editor.nodeId': 'Stable id',
45
65
  'praxis.richContent.editor.nodeIdPlaceholder': 'Example: hero-title',
66
+ 'praxis.richContent.editor.advancedDataRules': 'Advanced data and rules',
67
+ 'praxis.richContent.editor.advancedDataRulesHelp': 'Metadata, capability gates, visibility and safe style.',
68
+ 'praxis.richContent.editor.advancedJsonFields': 'Advanced JSON fields present',
69
+ 'praxis.richContent.editor.advancedJsonFieldsHelp': 'These canonical fields are preserved by guided edits and remain editable in the Advanced JSON tab.',
70
+ 'praxis.richContent.editor.advancedJsonEditor': 'Advanced JSON editor',
71
+ 'praxis.richContent.editor.advancedJsonEditorHelp': 'Edit canonical data bindings and JsonLogic rule fields without leaving guided editing.',
46
72
  'praxis.richContent.editor.visibilityRule': 'Visibility rule',
47
73
  'praxis.richContent.editor.safeStyle': 'Safe style',
48
74
  'praxis.richContent.editor.nodeType.text': 'Text',
49
75
  'praxis.richContent.editor.nodeType.badge': 'Badge',
50
76
  'praxis.richContent.editor.nodeType.icon': 'Icon',
77
+ 'praxis.richContent.editor.nodeType.avatar': 'Avatar',
51
78
  'praxis.richContent.editor.nodeType.image': 'Image',
52
79
  'praxis.richContent.editor.nodeType.link': 'Link',
53
80
  'praxis.richContent.editor.nodeType.metric': 'Metric',
@@ -85,27 +112,45 @@ const PRAXIS_RICH_CONTENT_EN_US = {
85
112
  'praxis.richContent.editor.field.icon': 'Icon',
86
113
  'praxis.richContent.editor.field.ariaLabel': 'Accessible label',
87
114
  'praxis.richContent.editor.field.src': 'Image URL',
115
+ 'praxis.richContent.editor.field.srcExpr': 'Image URL binding',
88
116
  'praxis.richContent.editor.field.href': 'Link URL',
89
117
  'praxis.richContent.editor.field.target': 'Target',
118
+ 'praxis.richContent.editor.field.rel': 'Rel',
90
119
  'praxis.richContent.editor.field.alt': 'Alternative text',
120
+ 'praxis.richContent.editor.field.altExpr': 'Alt text binding',
91
121
  'praxis.richContent.editor.field.testId': 'Test id',
92
122
  'praxis.richContent.editor.field.className': 'CSS class',
93
123
  'praxis.richContent.editor.field.visibleWhenPath': 'Context path',
94
124
  'praxis.richContent.editor.field.visibleWhenValue': 'Expected value',
95
125
  'praxis.richContent.editor.field.styleName': 'CSS property',
96
126
  'praxis.richContent.editor.field.styleValue': 'CSS value',
127
+ 'praxis.richContent.editor.field.bindings': 'Data bindings',
128
+ 'praxis.richContent.editor.field.disabledWhen': 'Disabled rule',
129
+ 'praxis.richContent.editor.field.loadWhen': 'Load rule',
130
+ 'praxis.richContent.editor.field.classWhen': 'Conditional classes',
131
+ 'praxis.richContent.editor.field.styleWhen': 'Conditional styles',
132
+ 'praxis.richContent.editor.field.contextScopes': 'Context scopes',
133
+ 'praxis.richContent.editor.field.contextAliases': 'Context aliases',
134
+ 'praxis.richContent.editor.placeholder.contextScopes': 'row, user, tenant',
97
135
  'praxis.richContent.editor.field.valueExpr': 'Value binding',
98
136
  'praxis.richContent.editor.field.captionExpr': 'Caption binding',
99
137
  'praxis.richContent.editor.field.max': 'Maximum',
138
+ 'praxis.richContent.editor.field.showPercent': 'Show percent',
100
139
  'praxis.richContent.editor.field.direction': 'Direction',
101
140
  'praxis.richContent.editor.field.gap': 'Gap',
141
+ 'praxis.richContent.editor.field.wrap': 'Wrap items',
102
142
  'praxis.richContent.editor.field.avatarName': 'Avatar name',
103
143
  'praxis.richContent.editor.field.avatarImage': 'Avatar image',
144
+ 'praxis.richContent.editor.field.nameExpr': 'Name binding',
145
+ 'praxis.richContent.editor.field.imageSrcExpr': 'Image binding',
146
+ 'praxis.richContent.editor.field.initials': 'Initials',
147
+ 'praxis.richContent.editor.field.initialsExpr': 'Initials binding',
104
148
  'praxis.richContent.editor.field.emptyText': 'Empty text',
105
149
  'praxis.richContent.editor.field.errorText': 'Error text',
106
150
  'praxis.richContent.editor.field.meta': 'Meta',
107
151
  'praxis.richContent.editor.field.opposite': 'Opposite content',
108
152
  'praxis.richContent.editor.field.badge': 'Badge',
153
+ 'praxis.richContent.editor.field.badgeExpr': 'Badge binding',
109
154
  'praxis.richContent.editor.field.preset': 'Preset',
110
155
  'praxis.richContent.editor.field.title': 'Title',
111
156
  'praxis.richContent.editor.field.subtitle': 'Subtitle',
@@ -162,15 +207,37 @@ const PRAXIS_RICH_CONTENT_EN_US = {
162
207
  'praxis.richContent.editor.field.ctaLabel': 'CTA label',
163
208
  'praxis.richContent.editor.field.ctaIcon': 'CTA icon',
164
209
  'praxis.richContent.editor.field.size': 'Size',
210
+ 'praxis.richContent.editor.field.density': 'Density',
211
+ 'praxis.richContent.editor.field.loading': 'Loading',
212
+ 'praxis.richContent.editor.field.loadingExpr': 'Loading binding',
213
+ 'praxis.richContent.editor.field.active': 'Active',
214
+ 'praxis.richContent.editor.field.activeExpr': 'Active binding',
165
215
  'praxis.richContent.editor.field.mediaKind': 'Media',
166
216
  'praxis.richContent.editor.field.mediaSrc': 'Media source',
217
+ 'praxis.richContent.editor.field.mediaSrcExpr': 'Media source binding',
167
218
  'praxis.richContent.editor.field.mediaAlt': 'Media alt text',
219
+ 'praxis.richContent.editor.field.mediaAltExpr': 'Media alt binding',
168
220
  'praxis.richContent.editor.field.mediaIcon': 'Media icon',
221
+ 'praxis.richContent.editor.field.mediaLabel': 'Media label',
222
+ 'praxis.richContent.editor.field.mediaLabelExpr': 'Media label binding',
223
+ 'praxis.richContent.editor.field.aspectRatio': 'Aspect ratio',
169
224
  'praxis.richContent.editor.field.mediaPlacement': 'Media placement',
225
+ 'praxis.richContent.editor.field.interactionMode': 'Interaction mode',
226
+ 'praxis.richContent.editor.field.selected': 'Selected',
227
+ 'praxis.richContent.editor.field.selectedExpr': 'Selected binding',
228
+ 'praxis.richContent.editor.field.interactionActionId': 'Interaction action ID',
229
+ 'praxis.richContent.editor.field.accessibilityRole': 'Accessibility role',
230
+ 'praxis.richContent.editor.field.ariaLabelExpr': 'Accessible label binding',
231
+ 'praxis.richContent.editor.field.requiresCapabilities': 'Capabilities',
232
+ 'praxis.richContent.editor.field.capabilityMode': 'Capability mode',
170
233
  'praxis.richContent.editor.decisionGovernance': 'Decision governance',
171
234
  'praxis.richContent.editor.decisionEvidence': 'Evidence',
172
235
  'praxis.richContent.editor.decisionPrimaryAction': 'Primary action',
173
236
  'praxis.richContent.editor.decisionSecondaryActions': 'Secondary actions',
237
+ 'praxis.richContent.editor.addPrimaryAction': 'Add primary action',
238
+ 'praxis.richContent.editor.addSecondaryAction': 'Add secondary action',
239
+ 'praxis.richContent.editor.addAction': 'Add action',
240
+ 'praxis.richContent.editor.action': 'Action',
174
241
  'praxis.richContent.editor.addEvidence': 'Add evidence',
175
242
  'praxis.richContent.editor.evidence': 'Evidence',
176
243
  'praxis.richContent.editor.defaultEvidenceLabel': 'Evidence',
@@ -200,6 +267,20 @@ const PRAXIS_RICH_CONTENT_EN_US = {
200
267
  'praxis.richContent.editor.placeholder.supersedesExpr': '${decision.supersedes}',
201
268
  'praxis.richContent.editor.placeholder.evidenceLabelExpr': '${evidence.label}',
202
269
  'praxis.richContent.editor.placeholder.evidenceSourceExpr': '${evidence.source}',
270
+ 'praxis.richContent.editor.placeholder.tabLabelExpr': 'row.tabLabel',
271
+ 'praxis.richContent.editor.placeholder.badgeExpr': 'row.badge',
272
+ 'praxis.richContent.editor.placeholder.requiresCapabilities': 'form.mode.edit, employee.open',
273
+ 'praxis.richContent.editor.placeholder.srcExpr': 'row.imageUrl',
274
+ 'praxis.richContent.editor.placeholder.altExpr': 'row.imageAlt',
275
+ 'praxis.richContent.editor.placeholder.loadingExpr': 'row.loading',
276
+ 'praxis.richContent.editor.placeholder.activeExpr': 'row.active',
277
+ 'praxis.richContent.editor.placeholder.mediaSrcExpr': 'row.mediaUrl',
278
+ 'praxis.richContent.editor.placeholder.mediaAltExpr': 'row.mediaAlt',
279
+ 'praxis.richContent.editor.placeholder.mediaLabelExpr': 'row.mediaLabel',
280
+ 'praxis.richContent.editor.placeholder.aspectRatio': '16 / 9',
281
+ 'praxis.richContent.editor.placeholder.selectedExpr': 'row.selected',
282
+ 'praxis.richContent.editor.placeholder.actionId': 'host.action.open',
283
+ 'praxis.richContent.editor.placeholder.ariaLabelExpr': 'row.ariaLabel',
203
284
  'praxis.richContent.editor.cardVariant.outlined': 'Outlined',
204
285
  'praxis.richContent.editor.cardVariant.elevated': 'Elevated',
205
286
  'praxis.richContent.editor.cardVariant.filled': 'Filled',
@@ -208,8 +289,18 @@ const PRAXIS_RICH_CONTENT_EN_US = {
208
289
  'praxis.richContent.editor.size.sm': 'Small',
209
290
  'praxis.richContent.editor.size.md': 'Medium',
210
291
  'praxis.richContent.editor.size.lg': 'Large',
292
+ 'praxis.richContent.editor.density.compact': 'Compact',
293
+ 'praxis.richContent.editor.density.comfortable': 'Comfortable',
211
294
  'praxis.richContent.editor.orientation.vertical': 'Vertical',
212
295
  'praxis.richContent.editor.orientation.horizontal': 'Horizontal',
296
+ 'praxis.richContent.editor.interaction.none': 'None',
297
+ 'praxis.richContent.editor.interaction.action': 'Action',
298
+ 'praxis.richContent.editor.interaction.selectable': 'Selectable',
299
+ 'praxis.richContent.editor.accessibilityRole.article': 'Article',
300
+ 'praxis.richContent.editor.accessibilityRole.group': 'Group',
301
+ 'praxis.richContent.editor.accessibilityRole.button': 'Button',
302
+ 'praxis.richContent.editor.capabilityMode.all': 'All',
303
+ 'praxis.richContent.editor.capabilityMode.any': 'Any',
213
304
  'praxis.richContent.editor.mediaKind.image': 'Image',
214
305
  'praxis.richContent.editor.mediaKind.video': 'Video',
215
306
  'praxis.richContent.editor.mediaKind.icon': 'Icon',
@@ -287,6 +378,12 @@ const PRAXIS_RICH_CONTENT_EN_US = {
287
378
  'praxis.richContent.editor.placeholder.valueExpr': 'row.total',
288
379
  'praxis.richContent.editor.placeholder.captionExpr': 'row.caption',
289
380
  'praxis.richContent.editor.placeholder.progressExpr': 'row.progress',
381
+ 'praxis.richContent.editor.placeholder.nameExpr': 'row.name',
382
+ 'praxis.richContent.editor.placeholder.imageSrcExpr': 'row.avatarUrl',
383
+ 'praxis.richContent.editor.placeholder.initialsExpr': 'row.initials',
384
+ 'praxis.richContent.editor.placeholder.rel': 'noopener noreferrer',
385
+ 'praxis.richContent.editor.target.self': 'Same tab',
386
+ 'praxis.richContent.editor.target.blank': 'New tab',
290
387
  'praxis.richContent.editor.defaultText': 'Text',
291
388
  'praxis.richContent.editor.defaultBadge': 'Badge',
292
389
  'praxis.richContent.editor.defaultLink': 'Link',
@@ -327,13 +424,18 @@ const PRAXIS_RICH_CONTENT_EN_US = {
327
424
  'praxis.richContent.editor.defaultActionCardAction': 'Run action',
328
425
  'praxis.richContent.editor.defaultCollapsibleCardTitle': 'Advanced details',
329
426
  'praxis.richContent.editor.defaultCollapsibleCardText': 'Collapsible card content',
427
+ 'praxis.richContent.editor.cardActions': 'Card actions',
428
+ 'praxis.richContent.editor.calloutActions': 'Callout actions',
330
429
  'praxis.richContent.editor.ctaGroupActions': 'CTA actions',
430
+ 'praxis.richContent.editor.emptyStateActions': 'Empty state actions',
431
+ 'praxis.richContent.editor.recordSummaryActions': 'Summary actions',
331
432
  'praxis.richContent.editor.tabsItems': 'Tab items',
332
433
  'praxis.richContent.editor.lookupResultActions': 'Lookup actions',
333
434
  'praxis.richContent.editor.lookupCardSecondaryActions': 'Secondary actions',
334
435
  'praxis.richContent.editor.relatedRecordSecondaryActions': 'Secondary actions',
335
436
  'praxis.richContent.editor.actionCardSecondaryActions': 'Secondary actions',
336
437
  'praxis.richContent.editor.collapsibleCardActions': 'Card actions',
438
+ 'praxis.richContent.editor.accordionItemActions': 'Item actions',
337
439
  'praxis.richContent.editor.status.idle': 'Idle',
338
440
  'praxis.richContent.editor.status.resolved': 'Resolved',
339
441
  'praxis.richContent.editor.status.empty': 'Empty',
@@ -345,6 +447,8 @@ const PRAXIS_RICH_CONTENT_EN_US = {
345
447
  'praxis.richContent.editor.nodeTypes': 'Types',
346
448
  'praxis.richContent.editor.none': 'None',
347
449
  'praxis.richContent.editor.preview': 'Preview',
450
+ 'praxis.richContent.editor.previewHelp': 'Inspect the materialized document without mixing preview with authoring fields.',
451
+ 'praxis.richContent.editor.previewUnavailable': 'Preview is unavailable until the document is valid.',
348
452
  'praxis.richContent.editor.restore': 'Restore',
349
453
  'praxis.richContent.editor.emptyDocument': 'Empty document',
350
454
  'praxis.richContent.editor.validation.documentShape': 'The document must be a valid RichContentDocument.',
@@ -379,6 +483,12 @@ const PRAXIS_RICH_CONTENT_EN_US = {
379
483
  'praxis.richContent.editor.validation.numberField': 'This field must be a number.',
380
484
  'praxis.richContent.editor.validation.booleanField': 'This field must be a boolean.',
381
485
  'praxis.richContent.editor.validation.enumField': 'This field must use one of the supported values.',
486
+ 'praxis.richContent.editor.validation.invalidFieldJson': 'Enter valid JSON.',
487
+ 'praxis.richContent.editor.validation.invalidCanonicalField': 'The JSON is valid but does not match the rich-content contract.',
488
+ 'praxis.richContent.editor.validation.advancedArrayField': 'This field must be a JSON array.',
489
+ 'praxis.richContent.editor.validation.advancedObjectField': 'This field must be a JSON object.',
490
+ 'praxis.richContent.editor.validation.contextScopes': 'Use supported context scopes only: row, computed, detail, meta, user, tenant.',
491
+ 'praxis.richContent.editor.validation.contextAliases': 'Context aliases must be a JSON object with string values.',
382
492
  };
383
493
 
384
494
  const PRAXIS_RICH_CONTENT_PT_BR = {
@@ -387,15 +497,35 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
387
497
  'praxis.richContent.editor.subtitle': 'Edite o documento canônico consumido pelo renderer. O payload salvo preserva os demais inputs do widget.',
388
498
  'praxis.richContent.editor.valid': 'Documento válido',
389
499
  'praxis.richContent.editor.invalid': 'JSON inválido',
500
+ 'praxis.richContent.editor.invalidBadge': 'Inválido',
390
501
  'praxis.richContent.editor.layout': 'Layout',
391
502
  'praxis.richContent.editor.layout.block': 'Bloco',
392
503
  'praxis.richContent.editor.layout.inline': 'Inline',
393
504
  'praxis.richContent.editor.rootClass': 'Classe raiz',
394
505
  'praxis.richContent.editor.rootClassPlaceholder': 'Exemplo: employee-expansion-rich',
506
+ 'praxis.richContent.editor.documentContext': 'Contexto do documento',
507
+ 'praxis.richContent.editor.documentContextHelp': 'Escopos e aliases de dados canônicos disponíveis para os bindings de rich-content.',
508
+ 'praxis.richContent.editor.documentContextFields': 'Contrato de contexto',
509
+ 'praxis.richContent.editor.workbenchTabs': 'Seções do editor',
510
+ 'praxis.richContent.editor.guidedEditing': 'Edição guiada',
395
511
  'praxis.richContent.editor.document': 'JSON avançado',
512
+ 'praxis.richContent.editor.documentJson': 'JSON do documento canônico',
396
513
  'praxis.richContent.editor.documentHelp': 'Edite o RichContentDocument canônico. O inspetor valida o formato e renderiza uma prévia antes de aplicar ou salvar.',
514
+ 'praxis.richContent.editor.documentAdvancedHelp': 'Use JSON para diagnóstico, migração e campos avançados que ainda não estão materializados nos controles guiados.',
397
515
  'praxis.richContent.editor.blocks': 'Blocos',
398
516
  'praxis.richContent.editor.blocksHelp': 'Crie e edite blocos comuns de nível superior de rich-content. Use JSON para estruturas aninhadas avançadas.',
517
+ 'praxis.richContent.editor.structure': 'Estrutura do documento',
518
+ 'praxis.richContent.editor.structureHelp': 'Selecione um bloco para editar suas propriedades.',
519
+ 'praxis.richContent.editor.properties': 'Propriedades',
520
+ 'praxis.richContent.editor.propertiesHelp': 'Edite o bloco selecionado sem sair da estrutura do documento.',
521
+ 'praxis.richContent.editor.intentNavigation': 'Seções de propriedades',
522
+ 'praxis.richContent.editor.intent.content': 'Conteúdo',
523
+ 'praxis.richContent.editor.intent.contentHelp': 'Campos principais do bloco',
524
+ 'praxis.richContent.editor.intent.presentation': 'Apresentação',
525
+ 'praxis.richContent.editor.intent.presentationHelp': 'Affordances visuais',
526
+ 'praxis.richContent.editor.intent.dataRules': 'Dados e regras',
527
+ 'praxis.richContent.editor.intent.dataRulesHelp': 'Metadados e gates',
528
+ 'praxis.richContent.editor.hasIssues': 'Requer atenção',
399
529
  'praxis.richContent.editor.block': 'Bloco',
400
530
  'praxis.richContent.editor.blockType': 'Tipo de bloco',
401
531
  'praxis.richContent.editor.addBlock': 'Adicionar bloco',
@@ -417,11 +547,18 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
417
547
  'praxis.richContent.editor.cardContentHelp': 'O conteúdo do card é preservado no JSON. Use o JSON avançado para nodes aninhados do card.',
418
548
  'praxis.richContent.editor.nodeId': 'Id estável',
419
549
  'praxis.richContent.editor.nodeIdPlaceholder': 'Exemplo: hero-title',
550
+ 'praxis.richContent.editor.advancedDataRules': 'Dados e regras avançados',
551
+ 'praxis.richContent.editor.advancedDataRulesHelp': 'Metadados, capability gates, visibilidade e estilo seguro.',
552
+ 'praxis.richContent.editor.advancedJsonFields': 'Campos avançados presentes no JSON',
553
+ 'praxis.richContent.editor.advancedJsonFieldsHelp': 'Estes campos canônicos são preservados pelas edições guiadas e continuam editáveis na aba JSON avançado.',
554
+ 'praxis.richContent.editor.advancedJsonEditor': 'Editor JSON avançado',
555
+ 'praxis.richContent.editor.advancedJsonEditorHelp': 'Edite bindings de dados e campos de regra JsonLogic canônicos sem sair da edição guiada.',
420
556
  'praxis.richContent.editor.visibilityRule': 'Regra de visibilidade',
421
557
  'praxis.richContent.editor.safeStyle': 'Estilo seguro',
422
558
  'praxis.richContent.editor.nodeType.text': 'Texto',
423
559
  'praxis.richContent.editor.nodeType.badge': 'Badge',
424
560
  'praxis.richContent.editor.nodeType.icon': 'Ícone',
561
+ 'praxis.richContent.editor.nodeType.avatar': 'Avatar',
425
562
  'praxis.richContent.editor.nodeType.image': 'Imagem',
426
563
  'praxis.richContent.editor.nodeType.link': 'Link',
427
564
  'praxis.richContent.editor.nodeType.metric': 'Métrica',
@@ -438,37 +575,73 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
438
575
  'praxis.richContent.editor.field.icon': 'Ícone',
439
576
  'praxis.richContent.editor.field.ariaLabel': 'Label acessível',
440
577
  'praxis.richContent.editor.field.src': 'URL da imagem',
578
+ 'praxis.richContent.editor.field.srcExpr': 'Vínculo da URL da imagem',
441
579
  'praxis.richContent.editor.field.href': 'URL do link',
442
580
  'praxis.richContent.editor.field.target': 'Destino',
581
+ 'praxis.richContent.editor.field.rel': 'Rel',
443
582
  'praxis.richContent.editor.field.alt': 'Texto alternativo',
583
+ 'praxis.richContent.editor.field.altExpr': 'Vínculo do texto alternativo',
444
584
  'praxis.richContent.editor.field.testId': 'Id de teste',
445
585
  'praxis.richContent.editor.field.className': 'Classe CSS',
446
586
  'praxis.richContent.editor.field.visibleWhenPath': 'Path de contexto',
447
587
  'praxis.richContent.editor.field.visibleWhenValue': 'Valor esperado',
448
588
  'praxis.richContent.editor.field.styleName': 'Propriedade CSS',
449
589
  'praxis.richContent.editor.field.styleValue': 'Valor CSS',
590
+ 'praxis.richContent.editor.field.bindings': 'Bindings de dados',
591
+ 'praxis.richContent.editor.field.disabledWhen': 'Regra de desabilitação',
592
+ 'praxis.richContent.editor.field.loadWhen': 'Regra de carregamento',
593
+ 'praxis.richContent.editor.field.classWhen': 'Classes condicionais',
594
+ 'praxis.richContent.editor.field.styleWhen': 'Estilos condicionais',
595
+ 'praxis.richContent.editor.field.contextScopes': 'Escopos de contexto',
596
+ 'praxis.richContent.editor.field.contextAliases': 'Aliases de contexto',
597
+ 'praxis.richContent.editor.placeholder.contextScopes': 'row, user, tenant',
450
598
  'praxis.richContent.editor.field.valueExpr': 'Binding do valor',
451
599
  'praxis.richContent.editor.field.captionExpr': 'Binding da legenda',
452
600
  'praxis.richContent.editor.field.max': 'Máximo',
601
+ 'praxis.richContent.editor.field.showPercent': 'Mostrar percentual',
453
602
  'praxis.richContent.editor.field.direction': 'Direção',
454
603
  'praxis.richContent.editor.field.gap': 'Espaçamento',
604
+ 'praxis.richContent.editor.field.wrap': 'Quebrar itens',
455
605
  'praxis.richContent.editor.field.avatarName': 'Nome do avatar',
456
606
  'praxis.richContent.editor.field.avatarImage': 'Imagem do avatar',
607
+ 'praxis.richContent.editor.field.nameExpr': 'Vínculo do nome',
608
+ 'praxis.richContent.editor.field.imageSrcExpr': 'Vínculo da imagem',
609
+ 'praxis.richContent.editor.field.initials': 'Iniciais',
610
+ 'praxis.richContent.editor.field.initialsExpr': 'Vínculo das iniciais',
457
611
  'praxis.richContent.editor.field.emptyText': 'Texto vazio',
458
612
  'praxis.richContent.editor.field.errorText': 'Texto de erro',
459
613
  'praxis.richContent.editor.field.meta': 'Meta',
460
614
  'praxis.richContent.editor.field.opposite': 'Conteúdo oposto',
461
615
  'praxis.richContent.editor.field.badge': 'Badge',
616
+ 'praxis.richContent.editor.field.badgeExpr': 'Vínculo do badge',
462
617
  'praxis.richContent.editor.field.preset': 'Preset',
463
618
  'praxis.richContent.editor.field.title': 'Título',
464
619
  'praxis.richContent.editor.field.subtitle': 'Subtítulo',
465
620
  'praxis.richContent.editor.field.size': 'Tamanho',
621
+ 'praxis.richContent.editor.field.density': 'Densidade',
622
+ 'praxis.richContent.editor.field.loading': 'Carregando',
623
+ 'praxis.richContent.editor.field.loadingExpr': 'Vínculo de carregamento',
624
+ 'praxis.richContent.editor.field.active': 'Ativo',
625
+ 'praxis.richContent.editor.field.activeExpr': 'Vínculo de ativo',
466
626
  'praxis.richContent.editor.field.orientation': 'Orientação',
467
627
  'praxis.richContent.editor.field.mediaKind': 'Mídia',
468
628
  'praxis.richContent.editor.field.mediaSrc': 'Origem da mídia',
629
+ 'praxis.richContent.editor.field.mediaSrcExpr': 'Vínculo da origem da mídia',
469
630
  'praxis.richContent.editor.field.mediaAlt': 'Texto alternativo da mídia',
631
+ 'praxis.richContent.editor.field.mediaAltExpr': 'Vínculo do texto alternativo da mídia',
470
632
  'praxis.richContent.editor.field.mediaIcon': 'Ícone da mídia',
633
+ 'praxis.richContent.editor.field.mediaLabel': 'Label da mídia',
634
+ 'praxis.richContent.editor.field.mediaLabelExpr': 'Vínculo do label da mídia',
635
+ 'praxis.richContent.editor.field.aspectRatio': 'Proporção',
471
636
  'praxis.richContent.editor.field.mediaPlacement': 'Posição da mídia',
637
+ 'praxis.richContent.editor.field.interactionMode': 'Modo de interação',
638
+ 'praxis.richContent.editor.field.selected': 'Selecionado',
639
+ 'praxis.richContent.editor.field.selectedExpr': 'Vínculo de seleção',
640
+ 'praxis.richContent.editor.field.interactionActionId': 'Action ID da interação',
641
+ 'praxis.richContent.editor.field.accessibilityRole': 'Papel de acessibilidade',
642
+ 'praxis.richContent.editor.field.ariaLabelExpr': 'Vínculo do label acessível',
643
+ 'praxis.richContent.editor.field.requiresCapabilities': 'Capabilities',
644
+ 'praxis.richContent.editor.field.capabilityMode': 'Modo de capability',
472
645
  'praxis.richContent.editor.cardVariant.outlined': 'Com contorno',
473
646
  'praxis.richContent.editor.cardVariant.elevated': 'Elevado',
474
647
  'praxis.richContent.editor.cardVariant.filled': 'Preenchido',
@@ -477,8 +650,18 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
477
650
  'praxis.richContent.editor.size.sm': 'Pequeno',
478
651
  'praxis.richContent.editor.size.md': 'Médio',
479
652
  'praxis.richContent.editor.size.lg': 'Grande',
653
+ 'praxis.richContent.editor.density.compact': 'Compacta',
654
+ 'praxis.richContent.editor.density.comfortable': 'Confortável',
480
655
  'praxis.richContent.editor.orientation.vertical': 'Vertical',
481
656
  'praxis.richContent.editor.orientation.horizontal': 'Horizontal',
657
+ 'praxis.richContent.editor.interaction.none': 'Nenhuma',
658
+ 'praxis.richContent.editor.interaction.action': 'Ação',
659
+ 'praxis.richContent.editor.interaction.selectable': 'Selecionável',
660
+ 'praxis.richContent.editor.accessibilityRole.article': 'Artigo',
661
+ 'praxis.richContent.editor.accessibilityRole.group': 'Grupo',
662
+ 'praxis.richContent.editor.accessibilityRole.button': 'Botão',
663
+ 'praxis.richContent.editor.capabilityMode.all': 'Todas',
664
+ 'praxis.richContent.editor.capabilityMode.any': 'Qualquer',
482
665
  'praxis.richContent.editor.mediaKind.image': 'Imagem',
483
666
  'praxis.richContent.editor.mediaKind.video': 'Vídeo',
484
667
  'praxis.richContent.editor.mediaKind.icon': 'Ícone',
@@ -501,6 +684,26 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
501
684
  'praxis.richContent.editor.placeholder.valueExpr': 'row.total',
502
685
  'praxis.richContent.editor.placeholder.captionExpr': 'row.caption',
503
686
  'praxis.richContent.editor.placeholder.progressExpr': 'row.progress',
687
+ 'praxis.richContent.editor.placeholder.tabLabelExpr': 'row.tabLabel',
688
+ 'praxis.richContent.editor.placeholder.badgeExpr': 'row.badge',
689
+ 'praxis.richContent.editor.placeholder.requiresCapabilities': 'form.mode.edit, employee.open',
690
+ 'praxis.richContent.editor.placeholder.srcExpr': 'row.imageUrl',
691
+ 'praxis.richContent.editor.placeholder.altExpr': 'row.imageAlt',
692
+ 'praxis.richContent.editor.placeholder.loadingExpr': 'row.loading',
693
+ 'praxis.richContent.editor.placeholder.activeExpr': 'row.active',
694
+ 'praxis.richContent.editor.placeholder.mediaSrcExpr': 'row.mediaUrl',
695
+ 'praxis.richContent.editor.placeholder.mediaAltExpr': 'row.mediaAlt',
696
+ 'praxis.richContent.editor.placeholder.mediaLabelExpr': 'row.mediaLabel',
697
+ 'praxis.richContent.editor.placeholder.aspectRatio': '16 / 9',
698
+ 'praxis.richContent.editor.placeholder.selectedExpr': 'row.selected',
699
+ 'praxis.richContent.editor.placeholder.actionId': 'host.action.open',
700
+ 'praxis.richContent.editor.placeholder.ariaLabelExpr': 'row.ariaLabel',
701
+ 'praxis.richContent.editor.placeholder.nameExpr': 'row.name',
702
+ 'praxis.richContent.editor.placeholder.imageSrcExpr': 'row.avatarUrl',
703
+ 'praxis.richContent.editor.placeholder.initialsExpr': 'row.initials',
704
+ 'praxis.richContent.editor.placeholder.rel': 'noopener noreferrer',
705
+ 'praxis.richContent.editor.target.self': 'Mesma aba',
706
+ 'praxis.richContent.editor.target.blank': 'Nova aba',
504
707
  'praxis.richContent.editor.defaultText': 'Texto',
505
708
  'praxis.richContent.editor.defaultBadge': 'Badge',
506
709
  'praxis.richContent.editor.defaultLink': 'Link',
@@ -521,6 +724,8 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
521
724
  'praxis.richContent.editor.nodeTypes': 'Tipos',
522
725
  'praxis.richContent.editor.none': 'Nenhum',
523
726
  'praxis.richContent.editor.preview': 'Prévia',
727
+ 'praxis.richContent.editor.previewHelp': 'Inspecione o documento materializado sem misturar prévia com campos de autoria.',
728
+ 'praxis.richContent.editor.previewUnavailable': 'A prévia fica indisponível até que o documento seja válido.',
524
729
  'praxis.richContent.editor.restore': 'Restaurar',
525
730
  'praxis.richContent.editor.emptyDocument': 'Documento vazio',
526
731
  'praxis.richContent.editor.validation.documentShape': 'O documento deve ser um RichContentDocument válido.',
@@ -572,9 +777,9 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
572
777
  'praxis.richContent.editor.nodeType.collapsibleCard': 'Card colapsável',
573
778
  'praxis.richContent.editor.nodeType.disclosure': 'Disclosure',
574
779
  'praxis.richContent.editor.nodeType.accordion': 'Accordion',
575
- 'praxis.richContent.editor.nodeType.formLauncher': 'Lançador de formulário',
780
+ 'praxis.richContent.editor.nodeType.formLauncher': 'Lançador de formulário',
576
781
  'praxis.richContent.editor.field.message': 'Mensagem',
577
- 'praxis.richContent.editor.field.description': 'Descrição',
782
+ 'praxis.richContent.editor.field.description': 'Descrição',
578
783
  'praxis.richContent.editor.field.status': 'Status',
579
784
  'praxis.richContent.editor.field.titleExpr': 'Vínculo do título',
580
785
  'praxis.richContent.editor.field.subtitleExpr': 'Vínculo do subtítulo',
@@ -617,11 +822,15 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
617
822
  'praxis.richContent.editor.field.actionId': 'Action ID',
618
823
  'praxis.richContent.editor.field.payloadExpr': 'Binding do payload',
619
824
  'praxis.richContent.editor.field.availabilityExpr': 'Binding de disponibilidade',
620
- 'praxis.richContent.editor.field.confirmMessage': 'Mensagem de confirmação',
825
+ 'praxis.richContent.editor.field.confirmMessage': 'Mensagem de confirmação',
621
826
  'praxis.richContent.editor.decisionGovernance': 'Governança da decisão',
622
827
  'praxis.richContent.editor.decisionEvidence': 'Evidências',
623
828
  'praxis.richContent.editor.decisionPrimaryAction': 'Ação primária',
624
829
  'praxis.richContent.editor.decisionSecondaryActions': 'Ações secundárias',
830
+ 'praxis.richContent.editor.addPrimaryAction': 'Adicionar ação primária',
831
+ 'praxis.richContent.editor.addSecondaryAction': 'Adicionar ação secundária',
832
+ 'praxis.richContent.editor.addAction': 'Adicionar ação',
833
+ 'praxis.richContent.editor.action': 'Ação',
625
834
  'praxis.richContent.editor.addEvidence': 'Adicionar evidência',
626
835
  'praxis.richContent.editor.evidence': 'Evidência',
627
836
  'praxis.richContent.editor.defaultEvidenceLabel': 'Evidência',
@@ -653,7 +862,7 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
653
862
  'praxis.richContent.editor.placeholder.evidenceSourceExpr': '${evidence.source}',
654
863
  'praxis.richContent.editor.field.formId': 'Form ID',
655
864
  'praxis.richContent.editor.field.ctaLabel': 'Label do CTA',
656
- 'praxis.richContent.editor.field.ctaIcon': 'Ícone do CTA',
865
+ 'praxis.richContent.editor.field.ctaIcon': 'Ícone do CTA',
657
866
  'praxis.richContent.editor.layout.stacked': 'Empilhado',
658
867
  'praxis.richContent.editor.layout.inlineShort': 'Inline',
659
868
  'praxis.richContent.editor.layout.split': 'Dividido',
@@ -695,25 +904,31 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
695
904
  'praxis.richContent.editor.timeline.textAppearance.label': 'Rótulo',
696
905
  'praxis.richContent.editor.appearance.underline': 'Sublinhado',
697
906
  'praxis.richContent.editor.appearance.pills': 'Pílulas',
698
- 'praxis.richContent.editor.variant.basic': 'Básico',
907
+ 'praxis.richContent.editor.variant.basic': 'Básico',
699
908
  'praxis.richContent.editor.variant.raised': 'Elevado',
700
909
  'praxis.richContent.editor.variant.stroked': 'Contornado',
701
910
  'praxis.richContent.editor.variant.flat': 'Flat',
702
- 'praxis.richContent.editor.color.basic': 'Básica',
703
- 'praxis.richContent.editor.color.primary': 'Primária',
911
+ 'praxis.richContent.editor.color.basic': 'Básica',
912
+ 'praxis.richContent.editor.color.primary': 'Primária',
704
913
  'praxis.richContent.editor.color.accent': 'Accent',
705
914
  'praxis.richContent.editor.color.warn': 'Warn',
706
- 'praxis.richContent.editor.ctaGroupActions': 'Ações do CTA',
915
+ 'praxis.richContent.editor.cardActions': 'Ações do card',
916
+ 'praxis.richContent.editor.calloutActions': 'Ações do callout',
917
+ 'praxis.richContent.editor.ctaGroupActions': 'Ações do CTA',
918
+ 'praxis.richContent.editor.emptyStateActions': 'Ações do estado vazio',
919
+ 'praxis.richContent.editor.recordSummaryActions': 'Ações do resumo',
707
920
  'praxis.richContent.editor.tabsItems': 'Itens de aba',
708
- 'praxis.richContent.editor.lookupResultActions': 'Ações da consulta',
709
- 'praxis.richContent.editor.lookupCardSecondaryActions': 'Ações secundárias',
921
+ 'praxis.richContent.editor.lookupResultActions': 'Ações da consulta',
922
+ 'praxis.richContent.editor.lookupCardSecondaryActions': 'Ações secundárias',
923
+ 'praxis.richContent.editor.relatedRecordSecondaryActions': 'Ações secundárias',
710
924
  'praxis.richContent.editor.actionCardSecondaryActions': 'Ações secundárias',
711
- 'praxis.richContent.editor.collapsibleCardActions': 'Ações do card',
925
+ 'praxis.richContent.editor.collapsibleCardActions': 'Ações do card',
926
+ 'praxis.richContent.editor.accordionItemActions': 'Ações do item',
712
927
  'praxis.richContent.editor.status.idle': 'Aguardando',
713
928
  'praxis.richContent.editor.status.resolved': 'Resolvido',
714
929
  'praxis.richContent.editor.status.empty': 'Vazio',
715
930
  'praxis.richContent.editor.status.error': 'Erro',
716
- 'praxis.richContent.editor.formLauncherSecondaryActions': 'Ações secundárias',
931
+ 'praxis.richContent.editor.formLauncherSecondaryActions': 'Ações secundárias',
717
932
  'praxis.richContent.editor.defaultLookupResultTitle': 'Resultado de consulta',
718
933
  'praxis.richContent.editor.defaultLookupResultField': 'Departamento',
719
934
  'praxis.richContent.editor.defaultLookupResultHint': 'Resolvido a partir do registro selecionado',
@@ -745,6 +960,12 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
745
960
  'praxis.richContent.editor.defaultTabsSubtitle': 'Agrupe visões portáveis sem inventar markup de abas no host.',
746
961
  'praxis.richContent.editor.defaultTabLabel': 'Visão geral',
747
962
  'praxis.richContent.editor.defaultTabText': 'Conteúdo da aba',
963
+ 'praxis.richContent.editor.validation.invalidFieldJson': 'Informe um JSON válido.',
964
+ 'praxis.richContent.editor.validation.invalidCanonicalField': 'O JSON é válido, mas não corresponde ao contrato rich-content.',
965
+ 'praxis.richContent.editor.validation.advancedArrayField': 'Este campo deve ser um array JSON.',
966
+ 'praxis.richContent.editor.validation.advancedObjectField': 'Este campo deve ser um objeto JSON.',
967
+ 'praxis.richContent.editor.validation.contextScopes': 'Use apenas escopos de contexto suportados: row, computed, detail, meta, user, tenant.',
968
+ 'praxis.richContent.editor.validation.contextAliases': 'Aliases de contexto devem ser um objeto JSON com valores string.',
748
969
  };
749
970
 
750
971
  function createPraxisRichContentI18nConfig(options = {}) {
@@ -989,6 +1210,15 @@ class PraxisRichContent {
989
1210
  const value = this.resolveValue(node.valueExpr);
990
1211
  return typeof value === 'number' ? value : Number(value ?? 0);
991
1212
  }
1213
+ resolveProgressPercent(node) {
1214
+ const max = Number(node.max ?? 100);
1215
+ const value = this.resolveProgressValue(node);
1216
+ if (!Number.isFinite(value) || !Number.isFinite(max) || max <= 0) {
1217
+ return '0%';
1218
+ }
1219
+ const percent = Math.round(Math.min(Math.max((value / max) * 100, 0), 100));
1220
+ return `${percent}%`;
1221
+ }
992
1222
  resolveProgressLabel(node) {
993
1223
  return this.resolveValue(node.labelExpr) ?? node.label ?? null;
994
1224
  }
@@ -1964,18 +2194,32 @@ class PraxisRichContent {
1964
2194
  </div>
1965
2195
  }
1966
2196
  @case ('metric') {
1967
- <div class="prx-rich-metric">
1968
- <div class="prx-rich-metric-label">{{ node.label }}</div>
1969
- <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
1970
- @if (resolveMetricCaption(node); as caption) {
1971
- <div class="prx-rich-metric-caption">{{ caption }}</div>
2197
+ <div class="prx-rich-metric" [class.prx-rich-metric--with-icon]="node.icon">
2198
+ @if (node.icon) {
2199
+ <span class="material-symbols-outlined prx-rich-metric-icon" aria-hidden="true">
2200
+ {{ node.icon }}
2201
+ </span>
1972
2202
  }
2203
+ <div class="prx-rich-metric-content">
2204
+ <div class="prx-rich-metric-label">{{ node.label }}</div>
2205
+ <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
2206
+ @if (resolveMetricCaption(node); as caption) {
2207
+ <div class="prx-rich-metric-caption">{{ caption }}</div>
2208
+ }
2209
+ </div>
1973
2210
  </div>
1974
2211
  }
1975
2212
  @case ('progress') {
1976
2213
  <div class="prx-rich-progress">
1977
- @if (resolveProgressLabel(node); as progressLabel) {
1978
- <div class="prx-rich-progress-label">{{ progressLabel }}</div>
2214
+ @if (resolveProgressLabel(node) || node.showPercent) {
2215
+ <div class="prx-rich-progress-header">
2216
+ @if (resolveProgressLabel(node); as progressLabel) {
2217
+ <div class="prx-rich-progress-label">{{ progressLabel }}</div>
2218
+ }
2219
+ @if (node.showPercent) {
2220
+ <div class="prx-rich-progress-percent">{{ resolveProgressPercent(node) }}</div>
2221
+ }
2222
+ </div>
1979
2223
  }
1980
2224
  <progress
1981
2225
  class="prx-rich-progress-bar"
@@ -3045,7 +3289,7 @@ class PraxisRichContent {
3045
3289
  </span>
3046
3290
  }
3047
3291
  </ng-template>
3048
- `, isInline: true, styles: [".prx-rich-content-root{display:block;min-width:0;max-width:100%}.prx-rich-content-root:not(.prx-rich-content-root--inline){display:grid;gap:var(--prx-rich-content-block-gap, 12px)}.prx-rich-content-root--inline{display:inline-flex;align-items:var(--prx-rich-content-inline-align-items, center);flex-wrap:var(--prx-rich-content-inline-flex-wrap, nowrap);gap:var(--prx-rich-content-inline-gap, 6px);min-width:0;max-width:100%;vertical-align:middle}.prx-rich-node{min-width:0;max-width:100%}.prx-rich-node--inline{display:inline-flex;align-items:center;min-width:0;max-width:100%}.prx-rich-compose{display:flex;align-items:center;gap:8px;min-width:0;max-width:100%}.prx-rich-compose.direction-column{flex-direction:column;align-items:stretch}.prx-rich-compose.wrap{flex-wrap:wrap}.prx-rich-badge{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;background:var(--md-sys-color-primary-container, #e8def8);color:var(--md-sys-color-on-primary-container, #21005d);font-size:12px;line-height:20px}.prx-rich-link{color:var(--md-sys-color-primary, #6750a4);text-decoration:underline;text-underline-offset:2px}.prx-rich-text,.prx-rich-link,.prx-rich-badge,.prx-rich-card-title,.prx-rich-card-subtitle,.prx-rich-card-body,.prx-rich-card-footer,.prx-rich-cta-group__title,.prx-rich-cta-group__subtitle,.prx-rich-cta-group__message,.prx-rich-key-value-list__title,.prx-rich-key-value-list__label,.prx-rich-key-value-list__value,.prx-rich-stat-group__title,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__label,.prx-rich-stat-group__value,.prx-rich-stat-group__caption,.prx-rich-tabs__title,.prx-rich-tabs__subtitle,.prx-rich-record-summary__title,.prx-rich-record-summary__subtitle,.prx-rich-record-summary__meta,.prx-rich-record-summary__field-label,.prx-rich-record-summary__field-value,.prx-rich-lookup-result__title,.prx-rich-lookup-result__subtitle,.prx-rich-lookup-result__meta,.prx-rich-lookup-result__message,.prx-rich-lookup-card__title,.prx-rich-lookup-card__subtitle,.prx-rich-lookup-card__meta,.prx-rich-lookup-card__message,.prx-rich-related-record__title,.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__relation,.prx-rich-timeline__title,.prx-rich-timeline__subtitle,.prx-rich-timeline__item-title,.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta{min-width:0;max-width:100%;overflow-wrap:anywhere}.prx-rich-text,.prx-rich-link{display:inline-block}.prx-rich-node[data-rich-node-type=avatar]{display:inline-flex;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #ece6f0);color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-avatar{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:inherit;background:inherit;color:inherit;overflow:hidden}.prx-rich-avatar-image{width:100%;height:100%;object-fit:cover}.prx-rich-avatar-fallback{font-weight:600}.prx-rich-card{--prx-rich-card-tone-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-card-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-card-tone-on-bg: var(--md-sys-color-on-surface, #1d1b20);display:flex;flex-direction:column;position:relative;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;background:var(--prx-rich-card-tone-bg);color:var(--prx-rich-card-tone-on-bg);overflow:hidden;min-width:0;max-width:100%}.prx-rich-card[data-size=sm],.prx-rich-card[data-density=compact]{gap:8px;padding:12px;border-radius:12px}.prx-rich-content-root.prx-rich-content-root--widget-card{--prx-rich-content-block-gap: 8px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card{gap:8px;padding:12px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 82%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=elevated],.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=filled]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 88%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-heading,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-body,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-actions,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-footer{gap:6px}.prx-rich-card[data-size=lg]{gap:16px;padding:20px}.prx-rich-card[data-orientation=horizontal]{display:grid;grid-template-columns:minmax(0,1fr);align-items:stretch}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(120px,.38fr) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-avatar{grid-template-columns:minmax(72px,148px) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(0,1fr) minmax(120px,.38fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-avatar{grid-template-columns:minmax(0,1fr) minmax(72px,148px)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>:not(.prx-rich-card-media){grid-column:2}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>.prx-rich-card-media[data-placement=leading]{grid-column:1;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>.prx-rich-card-media[data-placement=trailing]{grid-column:2;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-top>.prx-rich-card-media[data-placement=top],.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-background>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-variant=plain]{border-color:transparent;background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 64%,transparent)}.prx-rich-card[data-variant=elevated]{border-color:transparent;box-shadow:0 4px 18px color-mix(in srgb,var(--md-sys-color-shadow, #000) 16%,transparent)}.prx-rich-card[data-variant=filled]{background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,var(--md-sys-color-surface-container, #f3edf7))}.prx-rich-card[data-variant=transparent]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,transparent)}.prx-rich-card[data-tone=info]{--prx-rich-card-tone-color: var(--praxis-info, #0b5cad);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 42%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=success]{--prx-rich-card-tone-color: var(--praxis-success, #2e7d32);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 48%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=warning]{--prx-rich-card-tone-color: var(--praxis-warning, #ed6c02);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-card-tone-color) 14%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 56%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=danger]{--prx-rich-card-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-card-tone-color) 16%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 62%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card--interactive{cursor:pointer}.prx-rich-card--interactive:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 72%,transparent);outline-offset:2px}.prx-rich-card--selected,.prx-rich-card--active{border-color:var(--md-sys-color-primary, #6750a4);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary, #6750a4)}.prx-rich-card--disabled:not(.prx-rich-card--loading){opacity:.62;cursor:default}.prx-rich-card--loading{cursor:progress}.prx-rich-card-media{display:flex;align-items:center;justify-content:center;min-width:0;border-radius:12px;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 18%,var(--md-sys-color-surface-container-high, #ece6f0));overflow:hidden;aspect-ratio:16 / 9}.prx-rich-card-media[data-kind=icon],.prx-rich-card-media[data-kind=avatar]{aspect-ratio:auto;min-height:64px;padding:12px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar]{min-height:48px;padding:8px}.prx-rich-card-media[data-placement=leading],.prx-rich-card-media[data-placement=trailing]{aspect-ratio:auto;min-height:100%}.prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card-media[data-kind=avatar][data-placement=trailing]{align-self:start;min-height:64px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=trailing]{min-height:48px}.prx-rich-card-media--background{position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:.18}.prx-rich-card-media--background~*{position:relative;z-index:1}.prx-rich-card-media__asset{width:100%;height:100%;object-fit:cover}.prx-rich-card-media__icon{font-size:40px;color:var(--prx-rich-card-tone-color)}.prx-rich-card-media__avatar{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 22%,var(--md-sys-color-primary-container, #e8def8));color:var(--prx-rich-card-tone-on-bg);font-weight:700}.prx-rich-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0}.prx-rich-card-header__content{min-width:0}.prx-rich-card-header__action{flex:0 0 auto}.prx-rich-card-heading{display:grid;gap:4px;min-width:0}.prx-rich-card-title{font-weight:600}.prx-rich-card-subtitle,.prx-rich-metric-caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-metric{display:flex;flex-direction:column;gap:4px}.prx-rich-metric-value{font-size:20px;font-weight:700}.prx-rich-progress{display:flex;flex-direction:column;gap:4px}.prx-rich-progress-bar{width:100%}.prx-rich-action-button,.prx-rich-card-actions,.prx-rich-callout__actions,.prx-rich-empty-state__actions,.prx-rich-record-summary__actions,.prx-rich-disclosure__actions,.prx-rich-accordion__actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-action-button{appearance:none;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1d1b20);padding:8px 12px;cursor:pointer}.prx-rich-action-button:disabled{opacity:.56;cursor:default}.prx-rich-action-button--raised,.prx-rich-action-button--primary{background:var(--md-sys-color-primary, #6750a4);color:var(--md-sys-color-on-primary, #fff)}.prx-rich-callout,.prx-rich-empty-state,.prx-rich-record-summary,.prx-rich-decision-package,.prx-rich-disclosure,.prx-rich-accordion{border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;padding:16px;background:var(--md-sys-color-surface, #fff)}.prx-rich-callout[data-tone=warning]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#ffb300 12%)}.prx-rich-callout[data-tone=danger]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#d32f2f 12%)}.prx-rich-callout__title,.prx-rich-empty-state__title,.prx-rich-record-summary__title,.prx-rich-decision-package__title,.prx-rich-stat-group__title,.prx-rich-accordion__title,.prx-rich-key-value-list__title{font-weight:700;margin-bottom:4px}.prx-rich-decision-package{--prx-rich-decision-package-accent: var(--md-sys-color-primary, #6750a4);display:grid;grid-template-columns:minmax(0,1fr) minmax(136px,auto);gap:16px;border-color:color-mix(in srgb,var(--prx-rich-decision-package-accent) 42%,var(--md-sys-color-outline-variant, #cac4d0));background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,var(--prx-rich-decision-package-accent) 12%)}.prx-rich-decision-package[data-status=approved],.prx-rich-decision-package[data-status=published]{--prx-rich-decision-package-accent: var(--praxis-success, #2e7d32)}.prx-rich-decision-package[data-status=draft],.prx-rich-decision-package[data-status=simulated],.prx-rich-decision-package[data-risk=medium],.prx-rich-decision-package[data-risk=high]{--prx-rich-decision-package-accent: var(--praxis-warning, #ed6c02)}.prx-rich-decision-package[data-status=reverted],.prx-rich-decision-package[data-risk=critical]{--prx-rich-decision-package-accent: var(--md-sys-color-error, #d32f2f)}.prx-rich-decision-package__main{display:grid;gap:8px;min-width:0}.prx-rich-decision-package__eyebrow,.prx-rich-decision-package__evidence,.prx-rich-decision-package__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.prx-rich-decision-package__title{font-size:20px;line-height:1.15}.prx-rich-decision-package__subtitle,.prx-rich-decision-package__summary,.prx-rich-decision-package__meta,.prx-rich-decision-package__property dt,.prx-rich-decision-package__evidence-item small{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-decision-package__properties{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0}.prx-rich-decision-package__property{min-width:0}.prx-rich-decision-package__property dt,.prx-rich-decision-package__property dd{margin:0;overflow-wrap:anywhere}.prx-rich-decision-package__property dd{font-weight:700}.prx-rich-decision-package__evidence-item{display:inline-flex;flex-direction:column;gap:1px;border:1px solid color-mix(in srgb,var(--prx-rich-decision-package-accent) 24%,var(--md-sys-color-outline-variant, #cac4d0));border-radius:12px;padding:6px 8px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 76%,transparent);font-size:12px}.prx-rich-decision-package__aside{display:grid;align-content:start;justify-items:end;gap:10px;min-width:0}.prx-rich-decision-package__confidence{display:grid;justify-items:center;min-width:96px;border-radius:16px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 72%,transparent)}.prx-rich-decision-package__confidence span{font-size:28px;font-weight:800;line-height:1}.prx-rich-decision-package__confidence small{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;font-weight:700;text-transform:uppercase}@media(max-width:640px){.prx-rich-decision-package{grid-template-columns:minmax(0,1fr)}.prx-rich-decision-package__aside{justify-items:start}}.prx-rich-empty-state{align-items:center;text-align:center}.prx-rich-key-value-list__items,.prx-rich-stat-group__items,.prx-rich-record-summary__fields{display:grid;gap:8px;margin:0}.prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr))}.prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(180px,100%),1fr))}.prx-rich-stat-group__item{--prx-rich-stat-tone-color: var(--md-sys-color-outline, #79747e);--prx-rich-stat-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-stat-tone-border: var(--md-sys-color-outline-variant, #cac4d0);display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:10px;row-gap:2px;align-items:start;min-width:0;padding:12px;border:1px solid var(--prx-rich-stat-tone-border);border-radius:12px;background:var(--prx-rich-stat-tone-bg)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__items{gap:6px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(148px,100%),1fr))}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__item{column-gap:8px;padding:8px 10px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-stat-tone-bg) 78%,transparent)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__icon,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__value{font-size:20px}.prx-rich-stat-group__item[data-tone=info]{--prx-rich-stat-tone-color: var(--praxis-info, #0b5cad);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 34%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=success]{--prx-rich-stat-tone-color: var(--praxis-success, #2e7d32);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 38%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=warning]{--prx-rich-stat-tone-color: var(--praxis-warning, #b26a00);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-stat-tone-color) 14%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 46%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=danger]{--prx-rich-stat-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-stat-tone-color) 16%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 54%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item-header{display:flex;gap:8px;align-items:center;min-width:0}.prx-rich-stat-group__item-content{display:grid;gap:4px;min-width:0}.prx-rich-stat-group__icon{color:var(--prx-rich-stat-tone-color);font-size:24px;line-height:1;margin-top:1px}.prx-rich-stat-group__item:not(.prx-rich-stat-group__item--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-stat-group__label,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-stat-group__value{color:var(--md-sys-color-on-surface, #1d1b20);font-size:24px;font-weight:700;line-height:1.2}.prx-rich-tabs{display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-tabs__title,.prx-rich-tabs__tab--active{font-weight:700}.prx-rich-tabs__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;margin-top:-8px}.prx-rich-tabs__tablist{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--md-sys-color-outline-variant, #cac4d0);padding-bottom:8px}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tablist{border-bottom:0;padding-bottom:0}.prx-rich-tabs__tab{display:inline-flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:0;border-radius:999px;background:transparent;color:var(--md-sys-color-on-surface, #1d1b20);cursor:pointer}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab{border-radius:0;border-bottom:2px solid transparent;padding-inline:0;padding-top:0;padding-bottom:8px}.prx-rich-tabs__tab--active{color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab--active{border-bottom-color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tab--active{background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 14%,#fff)}.prx-rich-tabs__tab:disabled{cursor:not-allowed;opacity:.55}.prx-rich-tabs__panel{display:block;min-width:0}.prx-rich-key-value-list__item,.prx-rich-record-summary__field{display:grid;grid-template-columns:minmax(0,160px) minmax(0,1fr);gap:12px;margin:0}.prx-rich-key-value-list[data-layout=stacked] .prx-rich-key-value-list__item{grid-template-columns:minmax(0,1fr);gap:4px}.prx-rich-key-value-list__item dt,.prx-rich-record-summary__field dt{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-key-value-list__item dd,.prx-rich-record-summary__field dd{margin:0;display:inline-flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-related-record{display:grid;gap:14px;min-width:0;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 94%,transparent)}.prx-rich-related-record__copy{display:grid;gap:10px;min-width:0}.prx-rich-related-record__relation{color:var(--md-sys-color-primary, #6750a4);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0}.prx-rich-related-record__title-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center;min-width:0}.prx-rich-related-record__title-row:not(.prx-rich-related-record__title-row--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-related-record__icon{color:var(--md-sys-color-primary, #6750a4);font-size:24px;line-height:1}.prx-rich-related-record__title{font-size:18px;font-weight:700;line-height:1.25;min-width:0}.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__hint{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px;line-height:1.45}.prx-rich-related-record__fields{display:grid;gap:8px;margin:0;padding:0}.prx-rich-related-record__field{display:grid;grid-template-columns:minmax(0,140px) minmax(0,1fr);gap:8px 12px;align-items:start;min-width:0;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 52%,transparent)}.prx-rich-related-record__field dt{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-related-record__field dd{margin:0;font-weight:600;min-width:0}.prx-rich-related-record__hint{grid-column:2}.prx-rich-related-record__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prx-rich-disclosure__summary,.prx-rich-accordion__summary{cursor:pointer;display:flex;gap:8px;align-items:center;list-style:none}.prx-rich-disclosure__content,.prx-rich-accordion__content{margin-top:12px}.prx-rich-media-block{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;min-width:0}.prx-rich-media-block__avatar,.prx-rich-media-block__body,.prx-rich-media-block__trailing{min-width:0}.prx-rich-media-block__body{display:flex;flex-direction:column;gap:6px}.prx-rich-media-block__title{font-weight:700}.prx-rich-media-block__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-media-block__meta{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-media-block__trailing{display:flex;align-items:center;justify-content:flex-end}.prx-rich-timeline{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff);--prx-rich-timeline-connector-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-timeline-item-gap: 16px;--prx-rich-timeline-title-color: currentColor;--prx-rich-timeline-title-font-size: inherit;--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: currentColor;--prx-rich-timeline-item-title-font-size: inherit;--prx-rich-timeline-item-title-font-weight: 600;--prx-rich-timeline-item-subtitle-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-subtitle-font-size: 12px;--prx-rich-timeline-item-meta-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-meta-font-size: 12px;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 400;--prx-rich-timeline-item-body-background: transparent;--prx-rich-timeline-item-body-border: 0;--prx-rich-timeline-item-body-border-radius: 6px;--prx-rich-timeline-item-body-padding: 12px;display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-timeline__title{color:var(--prx-rich-timeline-title-color);font-size:var(--prx-rich-timeline-title-font-size);font-weight:var(--prx-rich-timeline-title-font-weight)}.prx-rich-timeline__items{display:flex;flex-direction:column;gap:0;list-style:none;margin:0;padding:0}.prx-rich-timeline__item{display:grid;grid-template-columns:minmax(0,1fr) 32px minmax(0,1fr);grid-template-areas:\". marker body\";column-gap:16px;align-items:flex-start;min-height:64px;min-width:0;position:relative}.prx-rich-timeline--vertical .prx-rich-timeline__item{padding-block-end:var(--prx-rich-timeline-item-gap)}.prx-rich-timeline--vertical .prx-rich-timeline__item:last-child{padding-block-end:0}.prx-rich-timeline--marker-color-primary,.prx-rich-timeline__item--marker-color-primary{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff)}.prx-rich-timeline--marker-color-secondary,.prx-rich-timeline__item--marker-color-secondary{--prx-rich-timeline-marker-color: var(--md-sys-color-secondary, #625b71);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-secondary, #fff)}.prx-rich-timeline--marker-color-tertiary,.prx-rich-timeline__item--marker-color-tertiary{--prx-rich-timeline-marker-color: var(--md-sys-color-tertiary, #7d5260);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-tertiary, #fff)}.prx-rich-timeline--marker-color-success,.prx-rich-timeline__item--marker-color-success{--prx-rich-timeline-marker-color: var(--praxis-success, #146c43);--prx-rich-timeline-on-marker-color: var(--praxis-on-success, #fff)}.prx-rich-timeline--marker-color-warning,.prx-rich-timeline__item--marker-color-warning{--prx-rich-timeline-marker-color: var(--praxis-warning, #b26a00);--prx-rich-timeline-on-marker-color: var(--praxis-on-warning, #1d1b20)}.prx-rich-timeline--marker-color-error,.prx-rich-timeline__item--marker-color-error{--prx-rich-timeline-marker-color: var(--md-sys-color-error, #ba1a1a);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-error, #fff)}.prx-rich-timeline--marker-color-info,.prx-rich-timeline__item--marker-color-info{--prx-rich-timeline-marker-color: var(--praxis-info, #0b5cad);--prx-rich-timeline-on-marker-color: var(--praxis-on-info, #fff)}.prx-rich-timeline--marker-color-neutral,.prx-rich-timeline__item--marker-color-neutral{--prx-rich-timeline-marker-color: var(--md-sys-color-outline, #79747e);--prx-rich-timeline-on-marker-color: var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline--connector-color-primary,.prx-rich-timeline__item--connector-color-primary{--prx-rich-timeline-connector-color: var(--md-sys-color-primary, #6750a4)}.prx-rich-timeline--connector-color-secondary,.prx-rich-timeline__item--connector-color-secondary{--prx-rich-timeline-connector-color: var(--md-sys-color-secondary, #625b71)}.prx-rich-timeline--connector-color-tertiary,.prx-rich-timeline__item--connector-color-tertiary{--prx-rich-timeline-connector-color: var(--md-sys-color-tertiary, #7d5260)}.prx-rich-timeline--connector-color-success,.prx-rich-timeline__item--connector-color-success{--prx-rich-timeline-connector-color: var(--praxis-success, #146c43)}.prx-rich-timeline--connector-color-warning,.prx-rich-timeline__item--connector-color-warning{--prx-rich-timeline-connector-color: var(--praxis-warning, #b26a00)}.prx-rich-timeline--connector-color-error,.prx-rich-timeline__item--connector-color-error{--prx-rich-timeline-connector-color: var(--md-sys-color-error, #ba1a1a)}.prx-rich-timeline--connector-color-info,.prx-rich-timeline__item--connector-color-info{--prx-rich-timeline-connector-color: var(--praxis-info, #0b5cad)}.prx-rich-timeline--connector-color-neutral,.prx-rich-timeline__item--connector-color-neutral{--prx-rich-timeline-connector-color: var(--md-sys-color-outline, #79747e)}.prx-rich-timeline__item--has-opposite{grid-template-areas:\"opposite marker body\"}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker opposite\"}.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker .\"}.prx-rich-timeline__item-opposite{grid-area:opposite;color:var(--prx-rich-timeline-opposite-color);font-size:var(--prx-rich-timeline-opposite-font-size);font-weight:var(--prx-rich-timeline-opposite-font-weight);line-height:1.35;min-width:0;overflow-wrap:anywhere;padding-top:1px;text-align:end}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite{text-align:start}.prx-rich-timeline__item-body{background:var(--prx-rich-timeline-item-body-background);border:var(--prx-rich-timeline-item-body-border);border-radius:var(--prx-rich-timeline-item-body-border-radius);padding:var(--prx-rich-timeline-item-body-padding)}.prx-rich-timeline__item-subtitle{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 20px;display:inline-flex;align-items:flex-start;align-self:stretch;grid-area:marker;justify-content:center;justify-self:center;min-height:64px;position:relative;width:32px}.prx-rich-timeline--marker-dot .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 10px}.prx-rich-timeline--marker-icon .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 18px}.prx-rich-timeline__item-marker>*{position:relative;z-index:1}.prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);bottom:0;content:\"\";left:50%;position:absolute;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline__item:last-child .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed}.prx-rich-timeline--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:row;gap:0;overflow-x:auto;padding-bottom:2px;scroll-snap-type:x proximity}.prx-rich-timeline__items:focus-visible{border-radius:4px;outline:2px solid var(--md-sys-color-primary, #6750a4);outline-offset:2px}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{grid-template-columns:minmax(176px,1fr);grid-template-areas:\"opposite\" \"marker\" \"body\";grid-template-rows:auto 32px 1fr;min-height:0;min-width:min(240px,80vw);padding-inline-end:calc(var(--prx-rich-timeline-item-gap) * .75);scroll-snap-align:start}.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite){grid-template-areas:\"marker\" \"body\";grid-template-rows:32px 1fr}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:center;align-self:center;justify-content:flex-start;justify-self:stretch;min-height:32px;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:0;border-top:1px solid var(--prx-rich-timeline-connector-color);bottom:auto;left:var(--prx-rich-timeline-marker-size);right:0;top:50%;transform:translateY(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}.prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:dashed}.prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:solid}.prx-rich-timeline__item--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline__item-icon{align-items:center;border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-marker-color);display:inline-flex;font-size:18px;height:20px;justify-content:center;line-height:18px;width:20px}.prx-rich-timeline__item-dot{width:10px;height:10px;border-radius:50%;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;box-sizing:border-box;display:inline-block}.prx-rich-timeline__item-number{align-items:center;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-on-marker-color);display:inline-flex;font-size:11px;font-weight:700;height:20px;justify-content:center;line-height:20px;min-width:20px;padding:0 5px}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-marker>*,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-marker>*{background:transparent;border-color:var(--prx-rich-timeline-marker-color);color:var(--prx-rich-timeline-marker-color)}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-dot{background:var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-number,.prx-rich-timeline--marker-style-filled .prx-rich-timeline__item-icon,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-icon{background:var(--prx-rich-timeline-marker-color);border-color:transparent;color:var(--prx-rich-timeline-on-marker-color)}.prx-rich-timeline__item-body{display:flex;flex-direction:column;gap:4px;grid-area:body;min-width:0}.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-end;text-align:end}.prx-rich-timeline__item-title{color:var(--prx-rich-timeline-item-title-color);font-size:var(--prx-rich-timeline-item-title-font-size);font-weight:var(--prx-rich-timeline-item-title-font-weight)}.prx-rich-timeline--emphasis-subtle{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-font-weight: 500;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-timeline--density-compact{--prx-rich-timeline-item-gap: 10px;--prx-rich-timeline-item-body-padding: 10px}.prx-rich-timeline--density-spacious{--prx-rich-timeline-item-gap: 24px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--emphasis-strong{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-weight: 700;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-opposite-font-weight: 700}.prx-rich-timeline--emphasis-hero{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-size: 20px;--prx-rich-timeline-title-font-weight: 800;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-size: 17px;--prx-rich-timeline-item-title-font-weight: 800;--prx-rich-timeline-opposite-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 800;--prx-rich-timeline-item-body-background: color-mix( in srgb, var(--md-sys-color-primary, #6750a4) 8%, transparent );--prx-rich-timeline-item-body-border-radius: 8px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--text-prominent{--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 15px;--prx-rich-timeline-item-title-font-weight: 700}.prx-rich-timeline--text-eyebrow{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 800}.prx-rich-timeline--text-eyebrow .prx-rich-timeline__item-opposite{letter-spacing:0;text-transform:uppercase}.prx-rich-timeline--text-label{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 14px;--prx-rich-timeline-item-title-font-weight: 600}.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta,.prx-rich-timeline__empty{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-meta{color:var(--prx-rich-timeline-item-meta-color);font-size:var(--prx-rich-timeline-item-meta-font-size)}.prx-rich-timeline__item-badge{display:inline-flex;align-items:flex-start;margin-top:2px}@media(max-width:640px){.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:column;overflow-x:visible;padding-bottom:0;scroll-snap-type:none}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{min-width:0;padding-inline-end:0;scroll-snap-align:none;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:flex-start;align-self:stretch;justify-content:center;justify-self:center;min-height:64px;width:32px}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);border-top:0;bottom:0;left:50%;right:auto;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after,.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline__item--has-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker opposite\" \"marker body\";grid-template-rows:auto 1fr;column-gap:12px}.prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker body\";grid-template-rows:1fr;column-gap:12px}.prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}}\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: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3292
+ `, isInline: true, styles: [".prx-rich-content-root{display:block;min-width:0;max-width:100%}.prx-rich-content-root:not(.prx-rich-content-root--inline){display:grid;gap:var(--prx-rich-content-block-gap, 12px)}.prx-rich-content-root--inline{display:inline-flex;align-items:var(--prx-rich-content-inline-align-items, center);flex-wrap:var(--prx-rich-content-inline-flex-wrap, nowrap);gap:var(--prx-rich-content-inline-gap, 6px);min-width:0;max-width:100%;vertical-align:middle}.prx-rich-node{min-width:0;max-width:100%}.prx-rich-node--inline{display:inline-flex;align-items:center;min-width:0;max-width:100%}.prx-rich-compose{display:flex;align-items:center;gap:8px;min-width:0;max-width:100%}.prx-rich-compose.direction-column{flex-direction:column;align-items:stretch}.prx-rich-compose.wrap{flex-wrap:wrap}.prx-rich-badge{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;background:var(--md-sys-color-primary-container, #e8def8);color:var(--md-sys-color-on-primary-container, #21005d);font-size:12px;line-height:20px}.prx-rich-link{color:var(--md-sys-color-primary, #6750a4);text-decoration:underline;text-underline-offset:2px}.prx-rich-text,.prx-rich-link,.prx-rich-badge,.prx-rich-card-title,.prx-rich-card-subtitle,.prx-rich-card-body,.prx-rich-card-footer,.prx-rich-cta-group__title,.prx-rich-cta-group__subtitle,.prx-rich-cta-group__message,.prx-rich-key-value-list__title,.prx-rich-key-value-list__label,.prx-rich-key-value-list__value,.prx-rich-stat-group__title,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__label,.prx-rich-stat-group__value,.prx-rich-stat-group__caption,.prx-rich-tabs__title,.prx-rich-tabs__subtitle,.prx-rich-record-summary__title,.prx-rich-record-summary__subtitle,.prx-rich-record-summary__meta,.prx-rich-record-summary__field-label,.prx-rich-record-summary__field-value,.prx-rich-lookup-result__title,.prx-rich-lookup-result__subtitle,.prx-rich-lookup-result__meta,.prx-rich-lookup-result__message,.prx-rich-lookup-card__title,.prx-rich-lookup-card__subtitle,.prx-rich-lookup-card__meta,.prx-rich-lookup-card__message,.prx-rich-related-record__title,.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__relation,.prx-rich-timeline__title,.prx-rich-timeline__subtitle,.prx-rich-timeline__item-title,.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta{min-width:0;max-width:100%;overflow-wrap:anywhere}.prx-rich-text,.prx-rich-link{display:inline-block}.prx-rich-node[data-rich-node-type=avatar]{display:inline-flex;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #ece6f0);color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-avatar{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:inherit;background:inherit;color:inherit;overflow:hidden}.prx-rich-avatar-image{width:100%;height:100%;object-fit:cover}.prx-rich-avatar-fallback{font-weight:600}.prx-rich-card{--prx-rich-card-tone-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-card-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-card-tone-on-bg: var(--md-sys-color-on-surface, #1d1b20);display:flex;flex-direction:column;position:relative;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;background:var(--prx-rich-card-tone-bg);color:var(--prx-rich-card-tone-on-bg);overflow:hidden;min-width:0;max-width:100%}.prx-rich-card[data-size=sm],.prx-rich-card[data-density=compact]{gap:8px;padding:12px;border-radius:12px}.prx-rich-content-root.prx-rich-content-root--widget-card{--prx-rich-content-block-gap: 8px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card{gap:8px;padding:12px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 82%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=elevated],.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=filled]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 88%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-heading,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-body,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-actions,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-footer{gap:6px}.prx-rich-card[data-size=lg]{gap:16px;padding:20px}.prx-rich-card[data-orientation=horizontal]{display:grid;grid-template-columns:minmax(0,1fr);align-items:stretch}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(120px,.38fr) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-avatar{grid-template-columns:minmax(72px,148px) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(0,1fr) minmax(120px,.38fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-avatar{grid-template-columns:minmax(0,1fr) minmax(72px,148px)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>:not(.prx-rich-card-media){grid-column:2}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>.prx-rich-card-media[data-placement=leading]{grid-column:1;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>.prx-rich-card-media[data-placement=trailing]{grid-column:2;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-top>.prx-rich-card-media[data-placement=top],.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-background>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-variant=plain]{border-color:transparent;background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 64%,transparent)}.prx-rich-card[data-variant=elevated]{border-color:transparent;box-shadow:0 4px 18px color-mix(in srgb,var(--md-sys-color-shadow, #000) 16%,transparent)}.prx-rich-card[data-variant=filled]{background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,var(--md-sys-color-surface-container, #f3edf7))}.prx-rich-card[data-variant=transparent]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,transparent)}.prx-rich-card[data-tone=info]{--prx-rich-card-tone-color: var(--praxis-info, #0b5cad);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 42%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=success]{--prx-rich-card-tone-color: var(--praxis-success, #2e7d32);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 48%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=warning]{--prx-rich-card-tone-color: var(--praxis-warning, #ed6c02);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-card-tone-color) 14%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 56%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=danger]{--prx-rich-card-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-card-tone-color) 16%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 62%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card--interactive{cursor:pointer}.prx-rich-card--interactive:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 72%,transparent);outline-offset:2px}.prx-rich-card--selected,.prx-rich-card--active{border-color:var(--md-sys-color-primary, #6750a4);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary, #6750a4)}.prx-rich-card--disabled:not(.prx-rich-card--loading){opacity:.62;cursor:default}.prx-rich-card--loading{cursor:progress}.prx-rich-card-media{display:flex;align-items:center;justify-content:center;min-width:0;border-radius:12px;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 18%,var(--md-sys-color-surface-container-high, #ece6f0));overflow:hidden;aspect-ratio:16 / 9}.prx-rich-card-media[data-kind=icon],.prx-rich-card-media[data-kind=avatar]{aspect-ratio:auto;min-height:64px;padding:12px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar]{min-height:48px;padding:8px}.prx-rich-card-media[data-placement=leading],.prx-rich-card-media[data-placement=trailing]{aspect-ratio:auto;min-height:100%}.prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card-media[data-kind=avatar][data-placement=trailing]{align-self:start;min-height:64px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=trailing]{min-height:48px}.prx-rich-card-media--background{position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:.18}.prx-rich-card-media--background~*{position:relative;z-index:1}.prx-rich-card-media__asset{width:100%;height:100%;object-fit:cover}.prx-rich-card-media__icon{font-size:40px;color:var(--prx-rich-card-tone-color)}.prx-rich-card-media__avatar{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 22%,var(--md-sys-color-primary-container, #e8def8));color:var(--prx-rich-card-tone-on-bg);font-weight:700}.prx-rich-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0}.prx-rich-card-header__content{min-width:0}.prx-rich-card-header__action{flex:0 0 auto}.prx-rich-card-heading{display:grid;gap:4px;min-width:0}.prx-rich-card-title{font-weight:600}.prx-rich-card-subtitle,.prx-rich-metric-caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-metric{display:grid;gap:4px;min-width:0}.prx-rich-metric--with-icon{grid-template-columns:auto minmax(0,1fr);column-gap:8px;align-items:start}.prx-rich-metric-icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1.2;margin-top:2px}.prx-rich-metric-content{display:grid;gap:4px;min-width:0}.prx-rich-metric-value{font-size:20px;font-weight:700}.prx-rich-progress{display:flex;flex-direction:column;gap:4px}.prx-rich-progress-header{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-width:0}.prx-rich-progress-label,.prx-rich-progress-percent{min-width:0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;font-weight:600}.prx-rich-progress-percent{flex:0 0 auto;color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-progress-bar{width:100%}.prx-rich-action-button,.prx-rich-card-actions,.prx-rich-callout__actions,.prx-rich-empty-state__actions,.prx-rich-record-summary__actions,.prx-rich-disclosure__actions,.prx-rich-accordion__actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-action-button{appearance:none;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1d1b20);padding:8px 12px;cursor:pointer}.prx-rich-action-button:disabled{opacity:.56;cursor:default}.prx-rich-action-button--raised,.prx-rich-action-button--primary{background:var(--md-sys-color-primary, #6750a4);color:var(--md-sys-color-on-primary, #fff)}.prx-rich-callout,.prx-rich-empty-state,.prx-rich-record-summary,.prx-rich-decision-package,.prx-rich-disclosure,.prx-rich-accordion{border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;padding:16px;background:var(--md-sys-color-surface, #fff)}.prx-rich-callout[data-tone=warning]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#ffb300 12%)}.prx-rich-callout[data-tone=danger]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#d32f2f 12%)}.prx-rich-callout__title,.prx-rich-empty-state__title,.prx-rich-record-summary__title,.prx-rich-decision-package__title,.prx-rich-stat-group__title,.prx-rich-accordion__title,.prx-rich-key-value-list__title{font-weight:700;margin-bottom:4px}.prx-rich-decision-package{--prx-rich-decision-package-accent: var(--md-sys-color-primary, #6750a4);display:grid;grid-template-columns:minmax(0,1fr) minmax(136px,auto);gap:16px;border-color:color-mix(in srgb,var(--prx-rich-decision-package-accent) 42%,var(--md-sys-color-outline-variant, #cac4d0));background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,var(--prx-rich-decision-package-accent) 12%)}.prx-rich-decision-package[data-status=approved],.prx-rich-decision-package[data-status=published]{--prx-rich-decision-package-accent: var(--praxis-success, #2e7d32)}.prx-rich-decision-package[data-status=draft],.prx-rich-decision-package[data-status=simulated],.prx-rich-decision-package[data-risk=medium],.prx-rich-decision-package[data-risk=high]{--prx-rich-decision-package-accent: var(--praxis-warning, #ed6c02)}.prx-rich-decision-package[data-status=reverted],.prx-rich-decision-package[data-risk=critical]{--prx-rich-decision-package-accent: var(--md-sys-color-error, #d32f2f)}.prx-rich-decision-package__main{display:grid;gap:8px;min-width:0}.prx-rich-decision-package__eyebrow,.prx-rich-decision-package__evidence,.prx-rich-decision-package__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.prx-rich-decision-package__title{font-size:20px;line-height:1.15}.prx-rich-decision-package__subtitle,.prx-rich-decision-package__summary,.prx-rich-decision-package__meta,.prx-rich-decision-package__property dt,.prx-rich-decision-package__evidence-item small{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-decision-package__properties{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0}.prx-rich-decision-package__property{min-width:0}.prx-rich-decision-package__property dt,.prx-rich-decision-package__property dd{margin:0;overflow-wrap:anywhere}.prx-rich-decision-package__property dd{font-weight:700}.prx-rich-decision-package__evidence-item{display:inline-flex;flex-direction:column;gap:1px;border:1px solid color-mix(in srgb,var(--prx-rich-decision-package-accent) 24%,var(--md-sys-color-outline-variant, #cac4d0));border-radius:12px;padding:6px 8px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 76%,transparent);font-size:12px}.prx-rich-decision-package__aside{display:grid;align-content:start;justify-items:end;gap:10px;min-width:0}.prx-rich-decision-package__confidence{display:grid;justify-items:center;min-width:96px;border-radius:16px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 72%,transparent)}.prx-rich-decision-package__confidence span{font-size:28px;font-weight:800;line-height:1}.prx-rich-decision-package__confidence small{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;font-weight:700;text-transform:uppercase}@media(max-width:640px){.prx-rich-decision-package{grid-template-columns:minmax(0,1fr)}.prx-rich-decision-package__aside{justify-items:start}}.prx-rich-empty-state{align-items:center;text-align:center}.prx-rich-key-value-list__items,.prx-rich-stat-group__items,.prx-rich-record-summary__fields{display:grid;gap:8px;margin:0}.prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr))}.prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(180px,100%),1fr))}.prx-rich-stat-group__item{--prx-rich-stat-tone-color: var(--md-sys-color-outline, #79747e);--prx-rich-stat-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-stat-tone-border: var(--md-sys-color-outline-variant, #cac4d0);display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:10px;row-gap:2px;align-items:start;min-width:0;padding:12px;border:1px solid var(--prx-rich-stat-tone-border);border-radius:12px;background:var(--prx-rich-stat-tone-bg)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__items{gap:6px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(148px,100%),1fr))}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__item{column-gap:8px;padding:8px 10px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-stat-tone-bg) 78%,transparent)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__icon,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__value{font-size:20px}.prx-rich-stat-group__item[data-tone=info]{--prx-rich-stat-tone-color: var(--praxis-info, #0b5cad);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 34%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=success]{--prx-rich-stat-tone-color: var(--praxis-success, #2e7d32);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 38%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=warning]{--prx-rich-stat-tone-color: var(--praxis-warning, #b26a00);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-stat-tone-color) 14%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 46%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=danger]{--prx-rich-stat-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-stat-tone-color) 16%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 54%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item-header{display:flex;gap:8px;align-items:center;min-width:0}.prx-rich-stat-group__item-content{display:grid;gap:4px;min-width:0}.prx-rich-stat-group__icon{color:var(--prx-rich-stat-tone-color);font-size:24px;line-height:1;margin-top:1px}.prx-rich-stat-group__item:not(.prx-rich-stat-group__item--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-stat-group__label,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-stat-group__value{color:var(--md-sys-color-on-surface, #1d1b20);font-size:24px;font-weight:700;line-height:1.2}.prx-rich-tabs{display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-tabs__title,.prx-rich-tabs__tab--active{font-weight:700}.prx-rich-tabs__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;margin-top:-8px}.prx-rich-tabs__tablist{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--md-sys-color-outline-variant, #cac4d0);padding-bottom:8px}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tablist{border-bottom:0;padding-bottom:0}.prx-rich-tabs__tab{display:inline-flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:0;border-radius:999px;background:transparent;color:var(--md-sys-color-on-surface, #1d1b20);cursor:pointer}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab{border-radius:0;border-bottom:2px solid transparent;padding-inline:0;padding-top:0;padding-bottom:8px}.prx-rich-tabs__tab--active{color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab--active{border-bottom-color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tab--active{background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 14%,#fff)}.prx-rich-tabs__tab:disabled{cursor:not-allowed;opacity:.55}.prx-rich-tabs__panel{display:block;min-width:0}.prx-rich-key-value-list__item,.prx-rich-record-summary__field{display:grid;grid-template-columns:minmax(0,160px) minmax(0,1fr);gap:12px;margin:0}.prx-rich-key-value-list[data-layout=stacked] .prx-rich-key-value-list__item{grid-template-columns:minmax(0,1fr);gap:4px}.prx-rich-key-value-list__item dt,.prx-rich-record-summary__field dt{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-key-value-list__item dd,.prx-rich-record-summary__field dd{margin:0;display:inline-flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-related-record{display:grid;gap:14px;min-width:0;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 94%,transparent)}.prx-rich-related-record__copy{display:grid;gap:10px;min-width:0}.prx-rich-related-record__relation{color:var(--md-sys-color-primary, #6750a4);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0}.prx-rich-related-record__title-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center;min-width:0}.prx-rich-related-record__title-row:not(.prx-rich-related-record__title-row--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-related-record__icon{color:var(--md-sys-color-primary, #6750a4);font-size:24px;line-height:1}.prx-rich-related-record__title{font-size:18px;font-weight:700;line-height:1.25;min-width:0}.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__hint{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px;line-height:1.45}.prx-rich-related-record__fields{display:grid;gap:8px;margin:0;padding:0}.prx-rich-related-record__field{display:grid;grid-template-columns:minmax(0,140px) minmax(0,1fr);gap:8px 12px;align-items:start;min-width:0;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 52%,transparent)}.prx-rich-related-record__field dt{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-related-record__field dd{margin:0;font-weight:600;min-width:0}.prx-rich-related-record__hint{grid-column:2}.prx-rich-related-record__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prx-rich-disclosure__summary,.prx-rich-accordion__summary{cursor:pointer;display:flex;gap:8px;align-items:center;list-style:none}.prx-rich-disclosure__content,.prx-rich-accordion__content{margin-top:12px}.prx-rich-media-block{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;min-width:0}.prx-rich-media-block__avatar,.prx-rich-media-block__body,.prx-rich-media-block__trailing{min-width:0}.prx-rich-media-block__body{display:flex;flex-direction:column;gap:6px}.prx-rich-media-block__title{font-weight:700}.prx-rich-media-block__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-media-block__meta{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-media-block__trailing{display:flex;align-items:center;justify-content:flex-end}.prx-rich-timeline{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff);--prx-rich-timeline-connector-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-timeline-item-gap: 16px;--prx-rich-timeline-title-color: currentColor;--prx-rich-timeline-title-font-size: inherit;--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: currentColor;--prx-rich-timeline-item-title-font-size: inherit;--prx-rich-timeline-item-title-font-weight: 600;--prx-rich-timeline-item-subtitle-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-subtitle-font-size: 12px;--prx-rich-timeline-item-meta-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-meta-font-size: 12px;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 400;--prx-rich-timeline-item-body-background: transparent;--prx-rich-timeline-item-body-border: 0;--prx-rich-timeline-item-body-border-radius: 6px;--prx-rich-timeline-item-body-padding: 12px;display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-timeline__title{color:var(--prx-rich-timeline-title-color);font-size:var(--prx-rich-timeline-title-font-size);font-weight:var(--prx-rich-timeline-title-font-weight)}.prx-rich-timeline__items{display:flex;flex-direction:column;gap:0;list-style:none;margin:0;padding:0}.prx-rich-timeline__item{display:grid;grid-template-columns:minmax(0,1fr) 32px minmax(0,1fr);grid-template-areas:\". marker body\";column-gap:16px;align-items:flex-start;min-height:64px;min-width:0;position:relative}.prx-rich-timeline--vertical .prx-rich-timeline__item{padding-block-end:var(--prx-rich-timeline-item-gap)}.prx-rich-timeline--vertical .prx-rich-timeline__item:last-child{padding-block-end:0}.prx-rich-timeline--marker-color-primary,.prx-rich-timeline__item--marker-color-primary{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff)}.prx-rich-timeline--marker-color-secondary,.prx-rich-timeline__item--marker-color-secondary{--prx-rich-timeline-marker-color: var(--md-sys-color-secondary, #625b71);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-secondary, #fff)}.prx-rich-timeline--marker-color-tertiary,.prx-rich-timeline__item--marker-color-tertiary{--prx-rich-timeline-marker-color: var(--md-sys-color-tertiary, #7d5260);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-tertiary, #fff)}.prx-rich-timeline--marker-color-success,.prx-rich-timeline__item--marker-color-success{--prx-rich-timeline-marker-color: var(--praxis-success, #146c43);--prx-rich-timeline-on-marker-color: var(--praxis-on-success, #fff)}.prx-rich-timeline--marker-color-warning,.prx-rich-timeline__item--marker-color-warning{--prx-rich-timeline-marker-color: var(--praxis-warning, #b26a00);--prx-rich-timeline-on-marker-color: var(--praxis-on-warning, #1d1b20)}.prx-rich-timeline--marker-color-error,.prx-rich-timeline__item--marker-color-error{--prx-rich-timeline-marker-color: var(--md-sys-color-error, #ba1a1a);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-error, #fff)}.prx-rich-timeline--marker-color-info,.prx-rich-timeline__item--marker-color-info{--prx-rich-timeline-marker-color: var(--praxis-info, #0b5cad);--prx-rich-timeline-on-marker-color: var(--praxis-on-info, #fff)}.prx-rich-timeline--marker-color-neutral,.prx-rich-timeline__item--marker-color-neutral{--prx-rich-timeline-marker-color: var(--md-sys-color-outline, #79747e);--prx-rich-timeline-on-marker-color: var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline--connector-color-primary,.prx-rich-timeline__item--connector-color-primary{--prx-rich-timeline-connector-color: var(--md-sys-color-primary, #6750a4)}.prx-rich-timeline--connector-color-secondary,.prx-rich-timeline__item--connector-color-secondary{--prx-rich-timeline-connector-color: var(--md-sys-color-secondary, #625b71)}.prx-rich-timeline--connector-color-tertiary,.prx-rich-timeline__item--connector-color-tertiary{--prx-rich-timeline-connector-color: var(--md-sys-color-tertiary, #7d5260)}.prx-rich-timeline--connector-color-success,.prx-rich-timeline__item--connector-color-success{--prx-rich-timeline-connector-color: var(--praxis-success, #146c43)}.prx-rich-timeline--connector-color-warning,.prx-rich-timeline__item--connector-color-warning{--prx-rich-timeline-connector-color: var(--praxis-warning, #b26a00)}.prx-rich-timeline--connector-color-error,.prx-rich-timeline__item--connector-color-error{--prx-rich-timeline-connector-color: var(--md-sys-color-error, #ba1a1a)}.prx-rich-timeline--connector-color-info,.prx-rich-timeline__item--connector-color-info{--prx-rich-timeline-connector-color: var(--praxis-info, #0b5cad)}.prx-rich-timeline--connector-color-neutral,.prx-rich-timeline__item--connector-color-neutral{--prx-rich-timeline-connector-color: var(--md-sys-color-outline, #79747e)}.prx-rich-timeline__item--has-opposite{grid-template-areas:\"opposite marker body\"}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker opposite\"}.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker .\"}.prx-rich-timeline__item-opposite{grid-area:opposite;color:var(--prx-rich-timeline-opposite-color);font-size:var(--prx-rich-timeline-opposite-font-size);font-weight:var(--prx-rich-timeline-opposite-font-weight);line-height:1.35;min-width:0;overflow-wrap:anywhere;padding-top:1px;text-align:end}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite{text-align:start}.prx-rich-timeline__item-body{background:var(--prx-rich-timeline-item-body-background);border:var(--prx-rich-timeline-item-body-border);border-radius:var(--prx-rich-timeline-item-body-border-radius);padding:var(--prx-rich-timeline-item-body-padding)}.prx-rich-timeline__item-subtitle{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 22px;display:inline-flex;align-items:flex-start;align-self:stretch;grid-area:marker;justify-content:center;justify-self:center;min-height:64px;position:relative;width:max(32px,var(--prx-rich-timeline-marker-size))}.prx-rich-timeline--marker-dot .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 10px}.prx-rich-timeline--marker-icon .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 24px}.prx-rich-timeline__item-marker>*{position:relative;z-index:1}.prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);bottom:0;content:\"\";left:50%;position:absolute;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline__item:last-child .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed}.prx-rich-timeline--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:row;gap:0;overflow-x:auto;padding-bottom:2px;scroll-snap-type:x proximity}.prx-rich-timeline__items:focus-visible{border-radius:4px;outline:2px solid var(--md-sys-color-primary, #6750a4);outline-offset:2px}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{grid-template-columns:minmax(176px,1fr);grid-template-areas:\"opposite\" \"marker\" \"body\";grid-template-rows:auto 32px 1fr;min-height:0;min-width:min(240px,80vw);padding-inline-end:calc(var(--prx-rich-timeline-item-gap) * .75);scroll-snap-align:start}.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite){grid-template-areas:\"marker\" \"body\";grid-template-rows:32px 1fr}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:center;align-self:center;justify-content:flex-start;justify-self:stretch;min-height:32px;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:0;border-top:1px solid var(--prx-rich-timeline-connector-color);bottom:auto;left:var(--prx-rich-timeline-marker-size);right:0;top:50%;transform:translateY(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}.prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:dashed}.prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:solid}.prx-rich-timeline__item--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline__item-icon{align-items:center;border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-marker-color);display:inline-flex;font-size:calc(var(--prx-rich-timeline-marker-size) - 8px);height:var(--prx-rich-timeline-marker-size);justify-content:center;line-height:1;width:var(--prx-rich-timeline-marker-size)}.prx-rich-timeline__item-dot{width:10px;height:10px;border-radius:50%;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;box-sizing:border-box;display:inline-block}.prx-rich-timeline__item-number{align-items:center;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-on-marker-color);display:inline-flex;font-size:11px;font-weight:700;height:var(--prx-rich-timeline-marker-size);justify-content:center;line-height:1;min-width:var(--prx-rich-timeline-marker-size);padding:0 5px}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-marker>*,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-marker>*{background:transparent;border-color:var(--prx-rich-timeline-marker-color);color:var(--prx-rich-timeline-marker-color)}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-dot{background:var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-number,.prx-rich-timeline--marker-style-filled .prx-rich-timeline__item-icon,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-icon{background:var(--prx-rich-timeline-marker-color);border-color:transparent;color:var(--prx-rich-timeline-on-marker-color)}.prx-rich-timeline__item-body{display:flex;flex-direction:column;gap:4px;grid-area:body;min-width:0}.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-end;text-align:end}.prx-rich-timeline__item-title{color:var(--prx-rich-timeline-item-title-color);font-size:var(--prx-rich-timeline-item-title-font-size);font-weight:var(--prx-rich-timeline-item-title-font-weight)}.prx-rich-timeline--emphasis-subtle{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-font-weight: 500;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-timeline--density-compact{--prx-rich-timeline-item-gap: 10px;--prx-rich-timeline-item-body-padding: 10px}.prx-rich-timeline--density-spacious{--prx-rich-timeline-item-gap: 24px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--emphasis-strong{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-weight: 700;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-opposite-font-weight: 700}.prx-rich-timeline--emphasis-hero{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-size: 20px;--prx-rich-timeline-title-font-weight: 800;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-size: 17px;--prx-rich-timeline-item-title-font-weight: 800;--prx-rich-timeline-opposite-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 800;--prx-rich-timeline-item-body-background: color-mix( in srgb, var(--md-sys-color-primary, #6750a4) 8%, transparent );--prx-rich-timeline-item-body-border-radius: 8px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--text-prominent{--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 15px;--prx-rich-timeline-item-title-font-weight: 700}.prx-rich-timeline--text-eyebrow{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 800}.prx-rich-timeline--text-eyebrow .prx-rich-timeline__item-opposite{letter-spacing:0;text-transform:uppercase}.prx-rich-timeline--text-label{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 14px;--prx-rich-timeline-item-title-font-weight: 600}.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta,.prx-rich-timeline__empty{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-meta{color:var(--prx-rich-timeline-item-meta-color);font-size:var(--prx-rich-timeline-item-meta-font-size)}.prx-rich-timeline__item-badge{display:inline-flex;align-items:flex-start;margin-top:2px}@media(max-width:640px){.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:column;overflow-x:visible;padding-bottom:0;scroll-snap-type:none}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{min-width:0;padding-inline-end:0;scroll-snap-align:none;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:flex-start;align-self:stretch;justify-content:center;justify-self:center;min-height:64px;width:32px}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);border-top:0;bottom:0;left:50%;right:auto;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after,.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline__item--has-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker opposite\" \"marker body\";grid-template-rows:auto 1fr;column-gap:12px}.prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker body\";grid-template-rows:1fr;column-gap:12px}.prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}}\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: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3049
3293
  }
3050
3294
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRichContent, decorators: [{
3051
3295
  type: Component,
@@ -3116,18 +3360,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
3116
3360
  </div>
3117
3361
  }
3118
3362
  @case ('metric') {
3119
- <div class="prx-rich-metric">
3120
- <div class="prx-rich-metric-label">{{ node.label }}</div>
3121
- <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
3122
- @if (resolveMetricCaption(node); as caption) {
3123
- <div class="prx-rich-metric-caption">{{ caption }}</div>
3363
+ <div class="prx-rich-metric" [class.prx-rich-metric--with-icon]="node.icon">
3364
+ @if (node.icon) {
3365
+ <span class="material-symbols-outlined prx-rich-metric-icon" aria-hidden="true">
3366
+ {{ node.icon }}
3367
+ </span>
3124
3368
  }
3369
+ <div class="prx-rich-metric-content">
3370
+ <div class="prx-rich-metric-label">{{ node.label }}</div>
3371
+ <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
3372
+ @if (resolveMetricCaption(node); as caption) {
3373
+ <div class="prx-rich-metric-caption">{{ caption }}</div>
3374
+ }
3375
+ </div>
3125
3376
  </div>
3126
3377
  }
3127
3378
  @case ('progress') {
3128
3379
  <div class="prx-rich-progress">
3129
- @if (resolveProgressLabel(node); as progressLabel) {
3130
- <div class="prx-rich-progress-label">{{ progressLabel }}</div>
3380
+ @if (resolveProgressLabel(node) || node.showPercent) {
3381
+ <div class="prx-rich-progress-header">
3382
+ @if (resolveProgressLabel(node); as progressLabel) {
3383
+ <div class="prx-rich-progress-label">{{ progressLabel }}</div>
3384
+ }
3385
+ @if (node.showPercent) {
3386
+ <div class="prx-rich-progress-percent">{{ resolveProgressPercent(node) }}</div>
3387
+ }
3388
+ </div>
3131
3389
  }
3132
3390
  <progress
3133
3391
  class="prx-rich-progress-bar"
@@ -4197,7 +4455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4197
4455
  </span>
4198
4456
  }
4199
4457
  </ng-template>
4200
- `, styles: [".prx-rich-content-root{display:block;min-width:0;max-width:100%}.prx-rich-content-root:not(.prx-rich-content-root--inline){display:grid;gap:var(--prx-rich-content-block-gap, 12px)}.prx-rich-content-root--inline{display:inline-flex;align-items:var(--prx-rich-content-inline-align-items, center);flex-wrap:var(--prx-rich-content-inline-flex-wrap, nowrap);gap:var(--prx-rich-content-inline-gap, 6px);min-width:0;max-width:100%;vertical-align:middle}.prx-rich-node{min-width:0;max-width:100%}.prx-rich-node--inline{display:inline-flex;align-items:center;min-width:0;max-width:100%}.prx-rich-compose{display:flex;align-items:center;gap:8px;min-width:0;max-width:100%}.prx-rich-compose.direction-column{flex-direction:column;align-items:stretch}.prx-rich-compose.wrap{flex-wrap:wrap}.prx-rich-badge{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;background:var(--md-sys-color-primary-container, #e8def8);color:var(--md-sys-color-on-primary-container, #21005d);font-size:12px;line-height:20px}.prx-rich-link{color:var(--md-sys-color-primary, #6750a4);text-decoration:underline;text-underline-offset:2px}.prx-rich-text,.prx-rich-link,.prx-rich-badge,.prx-rich-card-title,.prx-rich-card-subtitle,.prx-rich-card-body,.prx-rich-card-footer,.prx-rich-cta-group__title,.prx-rich-cta-group__subtitle,.prx-rich-cta-group__message,.prx-rich-key-value-list__title,.prx-rich-key-value-list__label,.prx-rich-key-value-list__value,.prx-rich-stat-group__title,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__label,.prx-rich-stat-group__value,.prx-rich-stat-group__caption,.prx-rich-tabs__title,.prx-rich-tabs__subtitle,.prx-rich-record-summary__title,.prx-rich-record-summary__subtitle,.prx-rich-record-summary__meta,.prx-rich-record-summary__field-label,.prx-rich-record-summary__field-value,.prx-rich-lookup-result__title,.prx-rich-lookup-result__subtitle,.prx-rich-lookup-result__meta,.prx-rich-lookup-result__message,.prx-rich-lookup-card__title,.prx-rich-lookup-card__subtitle,.prx-rich-lookup-card__meta,.prx-rich-lookup-card__message,.prx-rich-related-record__title,.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__relation,.prx-rich-timeline__title,.prx-rich-timeline__subtitle,.prx-rich-timeline__item-title,.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta{min-width:0;max-width:100%;overflow-wrap:anywhere}.prx-rich-text,.prx-rich-link{display:inline-block}.prx-rich-node[data-rich-node-type=avatar]{display:inline-flex;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #ece6f0);color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-avatar{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:inherit;background:inherit;color:inherit;overflow:hidden}.prx-rich-avatar-image{width:100%;height:100%;object-fit:cover}.prx-rich-avatar-fallback{font-weight:600}.prx-rich-card{--prx-rich-card-tone-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-card-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-card-tone-on-bg: var(--md-sys-color-on-surface, #1d1b20);display:flex;flex-direction:column;position:relative;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;background:var(--prx-rich-card-tone-bg);color:var(--prx-rich-card-tone-on-bg);overflow:hidden;min-width:0;max-width:100%}.prx-rich-card[data-size=sm],.prx-rich-card[data-density=compact]{gap:8px;padding:12px;border-radius:12px}.prx-rich-content-root.prx-rich-content-root--widget-card{--prx-rich-content-block-gap: 8px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card{gap:8px;padding:12px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 82%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=elevated],.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=filled]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 88%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-heading,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-body,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-actions,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-footer{gap:6px}.prx-rich-card[data-size=lg]{gap:16px;padding:20px}.prx-rich-card[data-orientation=horizontal]{display:grid;grid-template-columns:minmax(0,1fr);align-items:stretch}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(120px,.38fr) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-avatar{grid-template-columns:minmax(72px,148px) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(0,1fr) minmax(120px,.38fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-avatar{grid-template-columns:minmax(0,1fr) minmax(72px,148px)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>:not(.prx-rich-card-media){grid-column:2}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>.prx-rich-card-media[data-placement=leading]{grid-column:1;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>.prx-rich-card-media[data-placement=trailing]{grid-column:2;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-top>.prx-rich-card-media[data-placement=top],.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-background>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-variant=plain]{border-color:transparent;background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 64%,transparent)}.prx-rich-card[data-variant=elevated]{border-color:transparent;box-shadow:0 4px 18px color-mix(in srgb,var(--md-sys-color-shadow, #000) 16%,transparent)}.prx-rich-card[data-variant=filled]{background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,var(--md-sys-color-surface-container, #f3edf7))}.prx-rich-card[data-variant=transparent]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,transparent)}.prx-rich-card[data-tone=info]{--prx-rich-card-tone-color: var(--praxis-info, #0b5cad);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 42%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=success]{--prx-rich-card-tone-color: var(--praxis-success, #2e7d32);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 48%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=warning]{--prx-rich-card-tone-color: var(--praxis-warning, #ed6c02);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-card-tone-color) 14%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 56%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=danger]{--prx-rich-card-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-card-tone-color) 16%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 62%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card--interactive{cursor:pointer}.prx-rich-card--interactive:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 72%,transparent);outline-offset:2px}.prx-rich-card--selected,.prx-rich-card--active{border-color:var(--md-sys-color-primary, #6750a4);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary, #6750a4)}.prx-rich-card--disabled:not(.prx-rich-card--loading){opacity:.62;cursor:default}.prx-rich-card--loading{cursor:progress}.prx-rich-card-media{display:flex;align-items:center;justify-content:center;min-width:0;border-radius:12px;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 18%,var(--md-sys-color-surface-container-high, #ece6f0));overflow:hidden;aspect-ratio:16 / 9}.prx-rich-card-media[data-kind=icon],.prx-rich-card-media[data-kind=avatar]{aspect-ratio:auto;min-height:64px;padding:12px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar]{min-height:48px;padding:8px}.prx-rich-card-media[data-placement=leading],.prx-rich-card-media[data-placement=trailing]{aspect-ratio:auto;min-height:100%}.prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card-media[data-kind=avatar][data-placement=trailing]{align-self:start;min-height:64px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=trailing]{min-height:48px}.prx-rich-card-media--background{position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:.18}.prx-rich-card-media--background~*{position:relative;z-index:1}.prx-rich-card-media__asset{width:100%;height:100%;object-fit:cover}.prx-rich-card-media__icon{font-size:40px;color:var(--prx-rich-card-tone-color)}.prx-rich-card-media__avatar{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 22%,var(--md-sys-color-primary-container, #e8def8));color:var(--prx-rich-card-tone-on-bg);font-weight:700}.prx-rich-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0}.prx-rich-card-header__content{min-width:0}.prx-rich-card-header__action{flex:0 0 auto}.prx-rich-card-heading{display:grid;gap:4px;min-width:0}.prx-rich-card-title{font-weight:600}.prx-rich-card-subtitle,.prx-rich-metric-caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-metric{display:flex;flex-direction:column;gap:4px}.prx-rich-metric-value{font-size:20px;font-weight:700}.prx-rich-progress{display:flex;flex-direction:column;gap:4px}.prx-rich-progress-bar{width:100%}.prx-rich-action-button,.prx-rich-card-actions,.prx-rich-callout__actions,.prx-rich-empty-state__actions,.prx-rich-record-summary__actions,.prx-rich-disclosure__actions,.prx-rich-accordion__actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-action-button{appearance:none;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1d1b20);padding:8px 12px;cursor:pointer}.prx-rich-action-button:disabled{opacity:.56;cursor:default}.prx-rich-action-button--raised,.prx-rich-action-button--primary{background:var(--md-sys-color-primary, #6750a4);color:var(--md-sys-color-on-primary, #fff)}.prx-rich-callout,.prx-rich-empty-state,.prx-rich-record-summary,.prx-rich-decision-package,.prx-rich-disclosure,.prx-rich-accordion{border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;padding:16px;background:var(--md-sys-color-surface, #fff)}.prx-rich-callout[data-tone=warning]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#ffb300 12%)}.prx-rich-callout[data-tone=danger]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#d32f2f 12%)}.prx-rich-callout__title,.prx-rich-empty-state__title,.prx-rich-record-summary__title,.prx-rich-decision-package__title,.prx-rich-stat-group__title,.prx-rich-accordion__title,.prx-rich-key-value-list__title{font-weight:700;margin-bottom:4px}.prx-rich-decision-package{--prx-rich-decision-package-accent: var(--md-sys-color-primary, #6750a4);display:grid;grid-template-columns:minmax(0,1fr) minmax(136px,auto);gap:16px;border-color:color-mix(in srgb,var(--prx-rich-decision-package-accent) 42%,var(--md-sys-color-outline-variant, #cac4d0));background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,var(--prx-rich-decision-package-accent) 12%)}.prx-rich-decision-package[data-status=approved],.prx-rich-decision-package[data-status=published]{--prx-rich-decision-package-accent: var(--praxis-success, #2e7d32)}.prx-rich-decision-package[data-status=draft],.prx-rich-decision-package[data-status=simulated],.prx-rich-decision-package[data-risk=medium],.prx-rich-decision-package[data-risk=high]{--prx-rich-decision-package-accent: var(--praxis-warning, #ed6c02)}.prx-rich-decision-package[data-status=reverted],.prx-rich-decision-package[data-risk=critical]{--prx-rich-decision-package-accent: var(--md-sys-color-error, #d32f2f)}.prx-rich-decision-package__main{display:grid;gap:8px;min-width:0}.prx-rich-decision-package__eyebrow,.prx-rich-decision-package__evidence,.prx-rich-decision-package__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.prx-rich-decision-package__title{font-size:20px;line-height:1.15}.prx-rich-decision-package__subtitle,.prx-rich-decision-package__summary,.prx-rich-decision-package__meta,.prx-rich-decision-package__property dt,.prx-rich-decision-package__evidence-item small{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-decision-package__properties{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0}.prx-rich-decision-package__property{min-width:0}.prx-rich-decision-package__property dt,.prx-rich-decision-package__property dd{margin:0;overflow-wrap:anywhere}.prx-rich-decision-package__property dd{font-weight:700}.prx-rich-decision-package__evidence-item{display:inline-flex;flex-direction:column;gap:1px;border:1px solid color-mix(in srgb,var(--prx-rich-decision-package-accent) 24%,var(--md-sys-color-outline-variant, #cac4d0));border-radius:12px;padding:6px 8px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 76%,transparent);font-size:12px}.prx-rich-decision-package__aside{display:grid;align-content:start;justify-items:end;gap:10px;min-width:0}.prx-rich-decision-package__confidence{display:grid;justify-items:center;min-width:96px;border-radius:16px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 72%,transparent)}.prx-rich-decision-package__confidence span{font-size:28px;font-weight:800;line-height:1}.prx-rich-decision-package__confidence small{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;font-weight:700;text-transform:uppercase}@media(max-width:640px){.prx-rich-decision-package{grid-template-columns:minmax(0,1fr)}.prx-rich-decision-package__aside{justify-items:start}}.prx-rich-empty-state{align-items:center;text-align:center}.prx-rich-key-value-list__items,.prx-rich-stat-group__items,.prx-rich-record-summary__fields{display:grid;gap:8px;margin:0}.prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr))}.prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(180px,100%),1fr))}.prx-rich-stat-group__item{--prx-rich-stat-tone-color: var(--md-sys-color-outline, #79747e);--prx-rich-stat-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-stat-tone-border: var(--md-sys-color-outline-variant, #cac4d0);display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:10px;row-gap:2px;align-items:start;min-width:0;padding:12px;border:1px solid var(--prx-rich-stat-tone-border);border-radius:12px;background:var(--prx-rich-stat-tone-bg)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__items{gap:6px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(148px,100%),1fr))}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__item{column-gap:8px;padding:8px 10px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-stat-tone-bg) 78%,transparent)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__icon,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__value{font-size:20px}.prx-rich-stat-group__item[data-tone=info]{--prx-rich-stat-tone-color: var(--praxis-info, #0b5cad);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 34%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=success]{--prx-rich-stat-tone-color: var(--praxis-success, #2e7d32);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 38%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=warning]{--prx-rich-stat-tone-color: var(--praxis-warning, #b26a00);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-stat-tone-color) 14%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 46%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=danger]{--prx-rich-stat-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-stat-tone-color) 16%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 54%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item-header{display:flex;gap:8px;align-items:center;min-width:0}.prx-rich-stat-group__item-content{display:grid;gap:4px;min-width:0}.prx-rich-stat-group__icon{color:var(--prx-rich-stat-tone-color);font-size:24px;line-height:1;margin-top:1px}.prx-rich-stat-group__item:not(.prx-rich-stat-group__item--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-stat-group__label,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-stat-group__value{color:var(--md-sys-color-on-surface, #1d1b20);font-size:24px;font-weight:700;line-height:1.2}.prx-rich-tabs{display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-tabs__title,.prx-rich-tabs__tab--active{font-weight:700}.prx-rich-tabs__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;margin-top:-8px}.prx-rich-tabs__tablist{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--md-sys-color-outline-variant, #cac4d0);padding-bottom:8px}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tablist{border-bottom:0;padding-bottom:0}.prx-rich-tabs__tab{display:inline-flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:0;border-radius:999px;background:transparent;color:var(--md-sys-color-on-surface, #1d1b20);cursor:pointer}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab{border-radius:0;border-bottom:2px solid transparent;padding-inline:0;padding-top:0;padding-bottom:8px}.prx-rich-tabs__tab--active{color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab--active{border-bottom-color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tab--active{background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 14%,#fff)}.prx-rich-tabs__tab:disabled{cursor:not-allowed;opacity:.55}.prx-rich-tabs__panel{display:block;min-width:0}.prx-rich-key-value-list__item,.prx-rich-record-summary__field{display:grid;grid-template-columns:minmax(0,160px) minmax(0,1fr);gap:12px;margin:0}.prx-rich-key-value-list[data-layout=stacked] .prx-rich-key-value-list__item{grid-template-columns:minmax(0,1fr);gap:4px}.prx-rich-key-value-list__item dt,.prx-rich-record-summary__field dt{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-key-value-list__item dd,.prx-rich-record-summary__field dd{margin:0;display:inline-flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-related-record{display:grid;gap:14px;min-width:0;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 94%,transparent)}.prx-rich-related-record__copy{display:grid;gap:10px;min-width:0}.prx-rich-related-record__relation{color:var(--md-sys-color-primary, #6750a4);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0}.prx-rich-related-record__title-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center;min-width:0}.prx-rich-related-record__title-row:not(.prx-rich-related-record__title-row--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-related-record__icon{color:var(--md-sys-color-primary, #6750a4);font-size:24px;line-height:1}.prx-rich-related-record__title{font-size:18px;font-weight:700;line-height:1.25;min-width:0}.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__hint{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px;line-height:1.45}.prx-rich-related-record__fields{display:grid;gap:8px;margin:0;padding:0}.prx-rich-related-record__field{display:grid;grid-template-columns:minmax(0,140px) minmax(0,1fr);gap:8px 12px;align-items:start;min-width:0;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 52%,transparent)}.prx-rich-related-record__field dt{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-related-record__field dd{margin:0;font-weight:600;min-width:0}.prx-rich-related-record__hint{grid-column:2}.prx-rich-related-record__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prx-rich-disclosure__summary,.prx-rich-accordion__summary{cursor:pointer;display:flex;gap:8px;align-items:center;list-style:none}.prx-rich-disclosure__content,.prx-rich-accordion__content{margin-top:12px}.prx-rich-media-block{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;min-width:0}.prx-rich-media-block__avatar,.prx-rich-media-block__body,.prx-rich-media-block__trailing{min-width:0}.prx-rich-media-block__body{display:flex;flex-direction:column;gap:6px}.prx-rich-media-block__title{font-weight:700}.prx-rich-media-block__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-media-block__meta{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-media-block__trailing{display:flex;align-items:center;justify-content:flex-end}.prx-rich-timeline{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff);--prx-rich-timeline-connector-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-timeline-item-gap: 16px;--prx-rich-timeline-title-color: currentColor;--prx-rich-timeline-title-font-size: inherit;--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: currentColor;--prx-rich-timeline-item-title-font-size: inherit;--prx-rich-timeline-item-title-font-weight: 600;--prx-rich-timeline-item-subtitle-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-subtitle-font-size: 12px;--prx-rich-timeline-item-meta-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-meta-font-size: 12px;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 400;--prx-rich-timeline-item-body-background: transparent;--prx-rich-timeline-item-body-border: 0;--prx-rich-timeline-item-body-border-radius: 6px;--prx-rich-timeline-item-body-padding: 12px;display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-timeline__title{color:var(--prx-rich-timeline-title-color);font-size:var(--prx-rich-timeline-title-font-size);font-weight:var(--prx-rich-timeline-title-font-weight)}.prx-rich-timeline__items{display:flex;flex-direction:column;gap:0;list-style:none;margin:0;padding:0}.prx-rich-timeline__item{display:grid;grid-template-columns:minmax(0,1fr) 32px minmax(0,1fr);grid-template-areas:\". marker body\";column-gap:16px;align-items:flex-start;min-height:64px;min-width:0;position:relative}.prx-rich-timeline--vertical .prx-rich-timeline__item{padding-block-end:var(--prx-rich-timeline-item-gap)}.prx-rich-timeline--vertical .prx-rich-timeline__item:last-child{padding-block-end:0}.prx-rich-timeline--marker-color-primary,.prx-rich-timeline__item--marker-color-primary{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff)}.prx-rich-timeline--marker-color-secondary,.prx-rich-timeline__item--marker-color-secondary{--prx-rich-timeline-marker-color: var(--md-sys-color-secondary, #625b71);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-secondary, #fff)}.prx-rich-timeline--marker-color-tertiary,.prx-rich-timeline__item--marker-color-tertiary{--prx-rich-timeline-marker-color: var(--md-sys-color-tertiary, #7d5260);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-tertiary, #fff)}.prx-rich-timeline--marker-color-success,.prx-rich-timeline__item--marker-color-success{--prx-rich-timeline-marker-color: var(--praxis-success, #146c43);--prx-rich-timeline-on-marker-color: var(--praxis-on-success, #fff)}.prx-rich-timeline--marker-color-warning,.prx-rich-timeline__item--marker-color-warning{--prx-rich-timeline-marker-color: var(--praxis-warning, #b26a00);--prx-rich-timeline-on-marker-color: var(--praxis-on-warning, #1d1b20)}.prx-rich-timeline--marker-color-error,.prx-rich-timeline__item--marker-color-error{--prx-rich-timeline-marker-color: var(--md-sys-color-error, #ba1a1a);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-error, #fff)}.prx-rich-timeline--marker-color-info,.prx-rich-timeline__item--marker-color-info{--prx-rich-timeline-marker-color: var(--praxis-info, #0b5cad);--prx-rich-timeline-on-marker-color: var(--praxis-on-info, #fff)}.prx-rich-timeline--marker-color-neutral,.prx-rich-timeline__item--marker-color-neutral{--prx-rich-timeline-marker-color: var(--md-sys-color-outline, #79747e);--prx-rich-timeline-on-marker-color: var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline--connector-color-primary,.prx-rich-timeline__item--connector-color-primary{--prx-rich-timeline-connector-color: var(--md-sys-color-primary, #6750a4)}.prx-rich-timeline--connector-color-secondary,.prx-rich-timeline__item--connector-color-secondary{--prx-rich-timeline-connector-color: var(--md-sys-color-secondary, #625b71)}.prx-rich-timeline--connector-color-tertiary,.prx-rich-timeline__item--connector-color-tertiary{--prx-rich-timeline-connector-color: var(--md-sys-color-tertiary, #7d5260)}.prx-rich-timeline--connector-color-success,.prx-rich-timeline__item--connector-color-success{--prx-rich-timeline-connector-color: var(--praxis-success, #146c43)}.prx-rich-timeline--connector-color-warning,.prx-rich-timeline__item--connector-color-warning{--prx-rich-timeline-connector-color: var(--praxis-warning, #b26a00)}.prx-rich-timeline--connector-color-error,.prx-rich-timeline__item--connector-color-error{--prx-rich-timeline-connector-color: var(--md-sys-color-error, #ba1a1a)}.prx-rich-timeline--connector-color-info,.prx-rich-timeline__item--connector-color-info{--prx-rich-timeline-connector-color: var(--praxis-info, #0b5cad)}.prx-rich-timeline--connector-color-neutral,.prx-rich-timeline__item--connector-color-neutral{--prx-rich-timeline-connector-color: var(--md-sys-color-outline, #79747e)}.prx-rich-timeline__item--has-opposite{grid-template-areas:\"opposite marker body\"}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker opposite\"}.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker .\"}.prx-rich-timeline__item-opposite{grid-area:opposite;color:var(--prx-rich-timeline-opposite-color);font-size:var(--prx-rich-timeline-opposite-font-size);font-weight:var(--prx-rich-timeline-opposite-font-weight);line-height:1.35;min-width:0;overflow-wrap:anywhere;padding-top:1px;text-align:end}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite{text-align:start}.prx-rich-timeline__item-body{background:var(--prx-rich-timeline-item-body-background);border:var(--prx-rich-timeline-item-body-border);border-radius:var(--prx-rich-timeline-item-body-border-radius);padding:var(--prx-rich-timeline-item-body-padding)}.prx-rich-timeline__item-subtitle{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 20px;display:inline-flex;align-items:flex-start;align-self:stretch;grid-area:marker;justify-content:center;justify-self:center;min-height:64px;position:relative;width:32px}.prx-rich-timeline--marker-dot .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 10px}.prx-rich-timeline--marker-icon .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 18px}.prx-rich-timeline__item-marker>*{position:relative;z-index:1}.prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);bottom:0;content:\"\";left:50%;position:absolute;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline__item:last-child .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed}.prx-rich-timeline--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:row;gap:0;overflow-x:auto;padding-bottom:2px;scroll-snap-type:x proximity}.prx-rich-timeline__items:focus-visible{border-radius:4px;outline:2px solid var(--md-sys-color-primary, #6750a4);outline-offset:2px}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{grid-template-columns:minmax(176px,1fr);grid-template-areas:\"opposite\" \"marker\" \"body\";grid-template-rows:auto 32px 1fr;min-height:0;min-width:min(240px,80vw);padding-inline-end:calc(var(--prx-rich-timeline-item-gap) * .75);scroll-snap-align:start}.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite){grid-template-areas:\"marker\" \"body\";grid-template-rows:32px 1fr}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:center;align-self:center;justify-content:flex-start;justify-self:stretch;min-height:32px;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:0;border-top:1px solid var(--prx-rich-timeline-connector-color);bottom:auto;left:var(--prx-rich-timeline-marker-size);right:0;top:50%;transform:translateY(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}.prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:dashed}.prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:solid}.prx-rich-timeline__item--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline__item-icon{align-items:center;border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-marker-color);display:inline-flex;font-size:18px;height:20px;justify-content:center;line-height:18px;width:20px}.prx-rich-timeline__item-dot{width:10px;height:10px;border-radius:50%;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;box-sizing:border-box;display:inline-block}.prx-rich-timeline__item-number{align-items:center;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-on-marker-color);display:inline-flex;font-size:11px;font-weight:700;height:20px;justify-content:center;line-height:20px;min-width:20px;padding:0 5px}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-marker>*,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-marker>*{background:transparent;border-color:var(--prx-rich-timeline-marker-color);color:var(--prx-rich-timeline-marker-color)}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-dot{background:var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-number,.prx-rich-timeline--marker-style-filled .prx-rich-timeline__item-icon,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-icon{background:var(--prx-rich-timeline-marker-color);border-color:transparent;color:var(--prx-rich-timeline-on-marker-color)}.prx-rich-timeline__item-body{display:flex;flex-direction:column;gap:4px;grid-area:body;min-width:0}.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-end;text-align:end}.prx-rich-timeline__item-title{color:var(--prx-rich-timeline-item-title-color);font-size:var(--prx-rich-timeline-item-title-font-size);font-weight:var(--prx-rich-timeline-item-title-font-weight)}.prx-rich-timeline--emphasis-subtle{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-font-weight: 500;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-timeline--density-compact{--prx-rich-timeline-item-gap: 10px;--prx-rich-timeline-item-body-padding: 10px}.prx-rich-timeline--density-spacious{--prx-rich-timeline-item-gap: 24px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--emphasis-strong{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-weight: 700;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-opposite-font-weight: 700}.prx-rich-timeline--emphasis-hero{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-size: 20px;--prx-rich-timeline-title-font-weight: 800;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-size: 17px;--prx-rich-timeline-item-title-font-weight: 800;--prx-rich-timeline-opposite-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 800;--prx-rich-timeline-item-body-background: color-mix( in srgb, var(--md-sys-color-primary, #6750a4) 8%, transparent );--prx-rich-timeline-item-body-border-radius: 8px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--text-prominent{--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 15px;--prx-rich-timeline-item-title-font-weight: 700}.prx-rich-timeline--text-eyebrow{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 800}.prx-rich-timeline--text-eyebrow .prx-rich-timeline__item-opposite{letter-spacing:0;text-transform:uppercase}.prx-rich-timeline--text-label{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 14px;--prx-rich-timeline-item-title-font-weight: 600}.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta,.prx-rich-timeline__empty{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-meta{color:var(--prx-rich-timeline-item-meta-color);font-size:var(--prx-rich-timeline-item-meta-font-size)}.prx-rich-timeline__item-badge{display:inline-flex;align-items:flex-start;margin-top:2px}@media(max-width:640px){.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:column;overflow-x:visible;padding-bottom:0;scroll-snap-type:none}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{min-width:0;padding-inline-end:0;scroll-snap-align:none;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:flex-start;align-self:stretch;justify-content:center;justify-self:center;min-height:64px;width:32px}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);border-top:0;bottom:0;left:50%;right:auto;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after,.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline__item--has-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker opposite\" \"marker body\";grid-template-rows:auto 1fr;column-gap:12px}.prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker body\";grid-template-rows:1fr;column-gap:12px}.prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}}\n"] }]
4458
+ `, styles: [".prx-rich-content-root{display:block;min-width:0;max-width:100%}.prx-rich-content-root:not(.prx-rich-content-root--inline){display:grid;gap:var(--prx-rich-content-block-gap, 12px)}.prx-rich-content-root--inline{display:inline-flex;align-items:var(--prx-rich-content-inline-align-items, center);flex-wrap:var(--prx-rich-content-inline-flex-wrap, nowrap);gap:var(--prx-rich-content-inline-gap, 6px);min-width:0;max-width:100%;vertical-align:middle}.prx-rich-node{min-width:0;max-width:100%}.prx-rich-node--inline{display:inline-flex;align-items:center;min-width:0;max-width:100%}.prx-rich-compose{display:flex;align-items:center;gap:8px;min-width:0;max-width:100%}.prx-rich-compose.direction-column{flex-direction:column;align-items:stretch}.prx-rich-compose.wrap{flex-wrap:wrap}.prx-rich-badge{display:inline-flex;align-items:center;padding:2px 10px;border-radius:999px;background:var(--md-sys-color-primary-container, #e8def8);color:var(--md-sys-color-on-primary-container, #21005d);font-size:12px;line-height:20px}.prx-rich-link{color:var(--md-sys-color-primary, #6750a4);text-decoration:underline;text-underline-offset:2px}.prx-rich-text,.prx-rich-link,.prx-rich-badge,.prx-rich-card-title,.prx-rich-card-subtitle,.prx-rich-card-body,.prx-rich-card-footer,.prx-rich-cta-group__title,.prx-rich-cta-group__subtitle,.prx-rich-cta-group__message,.prx-rich-key-value-list__title,.prx-rich-key-value-list__label,.prx-rich-key-value-list__value,.prx-rich-stat-group__title,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__label,.prx-rich-stat-group__value,.prx-rich-stat-group__caption,.prx-rich-tabs__title,.prx-rich-tabs__subtitle,.prx-rich-record-summary__title,.prx-rich-record-summary__subtitle,.prx-rich-record-summary__meta,.prx-rich-record-summary__field-label,.prx-rich-record-summary__field-value,.prx-rich-lookup-result__title,.prx-rich-lookup-result__subtitle,.prx-rich-lookup-result__meta,.prx-rich-lookup-result__message,.prx-rich-lookup-card__title,.prx-rich-lookup-card__subtitle,.prx-rich-lookup-card__meta,.prx-rich-lookup-card__message,.prx-rich-related-record__title,.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__relation,.prx-rich-timeline__title,.prx-rich-timeline__subtitle,.prx-rich-timeline__item-title,.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta{min-width:0;max-width:100%;overflow-wrap:anywhere}.prx-rich-text,.prx-rich-link{display:inline-block}.prx-rich-node[data-rich-node-type=avatar]{display:inline-flex;width:40px;height:40px;border-radius:50%;background:var(--md-sys-color-surface-container-high, #ece6f0);color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-avatar{display:inline-flex;align-items:center;justify-content:center;width:100%;height:100%;border-radius:inherit;background:inherit;color:inherit;overflow:hidden}.prx-rich-avatar-image{width:100%;height:100%;object-fit:cover}.prx-rich-avatar-fallback{font-weight:600}.prx-rich-card{--prx-rich-card-tone-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-card-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-card-tone-on-bg: var(--md-sys-color-on-surface, #1d1b20);display:flex;flex-direction:column;position:relative;gap:12px;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;background:var(--prx-rich-card-tone-bg);color:var(--prx-rich-card-tone-on-bg);overflow:hidden;min-width:0;max-width:100%}.prx-rich-card[data-size=sm],.prx-rich-card[data-density=compact]{gap:8px;padding:12px;border-radius:12px}.prx-rich-content-root.prx-rich-content-root--widget-card{--prx-rich-content-block-gap: 8px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card{gap:8px;padding:12px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 82%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=elevated],.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card[data-variant=filled]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant) 72%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 88%,transparent);box-shadow:none}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-heading,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-body,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-actions,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-card-footer{gap:6px}.prx-rich-card[data-size=lg]{gap:16px;padding:20px}.prx-rich-card[data-orientation=horizontal]{display:grid;grid-template-columns:minmax(0,1fr);align-items:stretch}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(120px,.38fr) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-avatar{grid-template-columns:minmax(72px,148px) minmax(0,1fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing{grid-template-columns:minmax(0,1fr) minmax(120px,.38fr)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-icon,.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing.prx-rich-card--media-avatar{grid-template-columns:minmax(0,1fr) minmax(72px,148px)}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>:not(.prx-rich-card-media){grid-column:2}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-leading>.prx-rich-card-media[data-placement=leading]{grid-column:1;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-trailing>.prx-rich-card-media[data-placement=trailing]{grid-column:2;grid-row:1 / -1}.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-top>.prx-rich-card-media[data-placement=top],.prx-rich-card[data-orientation=horizontal].prx-rich-card--media-background>:not(.prx-rich-card-media){grid-column:1}.prx-rich-card[data-variant=plain]{border-color:transparent;background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 64%,transparent)}.prx-rich-card[data-variant=elevated]{border-color:transparent;box-shadow:0 4px 18px color-mix(in srgb,var(--md-sys-color-shadow, #000) 16%,transparent)}.prx-rich-card[data-variant=filled]{background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,var(--md-sys-color-surface-container, #f3edf7))}.prx-rich-card[data-variant=transparent]{border-color:color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 64%,transparent);background:color-mix(in srgb,var(--prx-rich-card-tone-bg) 72%,transparent)}.prx-rich-card[data-tone=info]{--prx-rich-card-tone-color: var(--praxis-info, #0b5cad);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 42%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=success]{--prx-rich-card-tone-color: var(--praxis-success, #2e7d32);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-card-tone-color) 12%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 48%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=warning]{--prx-rich-card-tone-color: var(--praxis-warning, #ed6c02);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-card-tone-color) 14%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 56%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card[data-tone=danger]{--prx-rich-card-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-card-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-card-tone-color) 16%);border-color:color-mix(in srgb,var(--prx-rich-card-tone-color) 62%,var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-card--interactive{cursor:pointer}.prx-rich-card--interactive:focus-visible{outline:3px solid color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 72%,transparent);outline-offset:2px}.prx-rich-card--selected,.prx-rich-card--active{border-color:var(--md-sys-color-primary, #6750a4);box-shadow:inset 0 0 0 1px var(--md-sys-color-primary, #6750a4)}.prx-rich-card--disabled:not(.prx-rich-card--loading){opacity:.62;cursor:default}.prx-rich-card--loading{cursor:progress}.prx-rich-card-media{display:flex;align-items:center;justify-content:center;min-width:0;border-radius:12px;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 18%,var(--md-sys-color-surface-container-high, #ece6f0));overflow:hidden;aspect-ratio:16 / 9}.prx-rich-card-media[data-kind=icon],.prx-rich-card-media[data-kind=avatar]{aspect-ratio:auto;min-height:64px;padding:12px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar]{min-height:48px;padding:8px}.prx-rich-card-media[data-placement=leading],.prx-rich-card-media[data-placement=trailing]{aspect-ratio:auto;min-height:100%}.prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card-media[data-kind=avatar][data-placement=trailing]{align-self:start;min-height:64px}.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-size=sm] .prx-rich-card-media[data-kind=avatar][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=icon][data-placement=trailing],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=leading],.prx-rich-card[data-density=compact] .prx-rich-card-media[data-kind=avatar][data-placement=trailing]{min-height:48px}.prx-rich-card-media--background{position:absolute;inset:0;z-index:0;border-radius:inherit;opacity:.18}.prx-rich-card-media--background~*{position:relative;z-index:1}.prx-rich-card-media__asset{width:100%;height:100%;object-fit:cover}.prx-rich-card-media__icon{font-size:40px;color:var(--prx-rich-card-tone-color)}.prx-rich-card-media__avatar{display:inline-flex;align-items:center;justify-content:center;width:56px;height:56px;border-radius:50%;background:color-mix(in srgb,var(--prx-rich-card-tone-color) 22%,var(--md-sys-color-primary-container, #e8def8));color:var(--prx-rich-card-tone-on-bg);font-weight:700}.prx-rich-card-header{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;min-width:0}.prx-rich-card-header__content{min-width:0}.prx-rich-card-header__action{flex:0 0 auto}.prx-rich-card-heading{display:grid;gap:4px;min-width:0}.prx-rich-card-title{font-weight:600}.prx-rich-card-subtitle,.prx-rich-metric-caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-metric{display:grid;gap:4px;min-width:0}.prx-rich-metric--with-icon{grid-template-columns:auto minmax(0,1fr);column-gap:8px;align-items:start}.prx-rich-metric-icon{color:var(--md-sys-color-primary, #6750a4);font-size:20px;line-height:1.2;margin-top:2px}.prx-rich-metric-content{display:grid;gap:4px;min-width:0}.prx-rich-metric-value{font-size:20px;font-weight:700}.prx-rich-progress{display:flex;flex-direction:column;gap:4px}.prx-rich-progress-header{display:flex;align-items:baseline;justify-content:space-between;gap:8px;min-width:0}.prx-rich-progress-label,.prx-rich-progress-percent{min-width:0;color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;font-weight:600}.prx-rich-progress-percent{flex:0 0 auto;color:var(--md-sys-color-on-surface, #1d1b20)}.prx-rich-progress-bar{width:100%}.prx-rich-action-button,.prx-rich-card-actions,.prx-rich-callout__actions,.prx-rich-empty-state__actions,.prx-rich-record-summary__actions,.prx-rich-disclosure__actions,.prx-rich-accordion__actions{display:flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-action-button{appearance:none;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:999px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-on-surface, #1d1b20);padding:8px 12px;cursor:pointer}.prx-rich-action-button:disabled{opacity:.56;cursor:default}.prx-rich-action-button--raised,.prx-rich-action-button--primary{background:var(--md-sys-color-primary, #6750a4);color:var(--md-sys-color-on-primary, #fff)}.prx-rich-callout,.prx-rich-empty-state,.prx-rich-record-summary,.prx-rich-decision-package,.prx-rich-disclosure,.prx-rich-accordion{border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:16px;padding:16px;background:var(--md-sys-color-surface, #fff)}.prx-rich-callout[data-tone=warning]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#ffb300 12%)}.prx-rich-callout[data-tone=danger]{background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,#d32f2f 12%)}.prx-rich-callout__title,.prx-rich-empty-state__title,.prx-rich-record-summary__title,.prx-rich-decision-package__title,.prx-rich-stat-group__title,.prx-rich-accordion__title,.prx-rich-key-value-list__title{font-weight:700;margin-bottom:4px}.prx-rich-decision-package{--prx-rich-decision-package-accent: var(--md-sys-color-primary, #6750a4);display:grid;grid-template-columns:minmax(0,1fr) minmax(136px,auto);gap:16px;border-color:color-mix(in srgb,var(--prx-rich-decision-package-accent) 42%,var(--md-sys-color-outline-variant, #cac4d0));background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 88%,var(--prx-rich-decision-package-accent) 12%)}.prx-rich-decision-package[data-status=approved],.prx-rich-decision-package[data-status=published]{--prx-rich-decision-package-accent: var(--praxis-success, #2e7d32)}.prx-rich-decision-package[data-status=draft],.prx-rich-decision-package[data-status=simulated],.prx-rich-decision-package[data-risk=medium],.prx-rich-decision-package[data-risk=high]{--prx-rich-decision-package-accent: var(--praxis-warning, #ed6c02)}.prx-rich-decision-package[data-status=reverted],.prx-rich-decision-package[data-risk=critical]{--prx-rich-decision-package-accent: var(--md-sys-color-error, #d32f2f)}.prx-rich-decision-package__main{display:grid;gap:8px;min-width:0}.prx-rich-decision-package__eyebrow,.prx-rich-decision-package__evidence,.prx-rich-decision-package__actions{display:flex;flex-wrap:wrap;align-items:center;gap:8px}.prx-rich-decision-package__title{font-size:20px;line-height:1.15}.prx-rich-decision-package__subtitle,.prx-rich-decision-package__summary,.prx-rich-decision-package__meta,.prx-rich-decision-package__property dt,.prx-rich-decision-package__evidence-item small{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-decision-package__properties{display:grid;grid-template-columns:repeat(auto-fit,minmax(140px,1fr));gap:8px;margin:0}.prx-rich-decision-package__property{min-width:0}.prx-rich-decision-package__property dt,.prx-rich-decision-package__property dd{margin:0;overflow-wrap:anywhere}.prx-rich-decision-package__property dd{font-weight:700}.prx-rich-decision-package__evidence-item{display:inline-flex;flex-direction:column;gap:1px;border:1px solid color-mix(in srgb,var(--prx-rich-decision-package-accent) 24%,var(--md-sys-color-outline-variant, #cac4d0));border-radius:12px;padding:6px 8px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 76%,transparent);font-size:12px}.prx-rich-decision-package__aside{display:grid;align-content:start;justify-items:end;gap:10px;min-width:0}.prx-rich-decision-package__confidence{display:grid;justify-items:center;min-width:96px;border-radius:16px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 72%,transparent)}.prx-rich-decision-package__confidence span{font-size:28px;font-weight:800;line-height:1}.prx-rich-decision-package__confidence small{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:11px;font-weight:700;text-transform:uppercase}@media(max-width:640px){.prx-rich-decision-package{grid-template-columns:minmax(0,1fr)}.prx-rich-decision-package__aside{justify-items:start}}.prx-rich-empty-state{align-items:center;text-align:center}.prx-rich-key-value-list__items,.prx-rich-stat-group__items,.prx-rich-record-summary__fields{display:grid;gap:8px;margin:0}.prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(160px,100%),1fr))}.prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(180px,100%),1fr))}.prx-rich-stat-group__item{--prx-rich-stat-tone-color: var(--md-sys-color-outline, #79747e);--prx-rich-stat-tone-bg: var(--md-sys-color-surface, #fff);--prx-rich-stat-tone-border: var(--md-sys-color-outline-variant, #cac4d0);display:grid;grid-template-columns:auto minmax(0,1fr);column-gap:10px;row-gap:2px;align-items:start;min-width:0;padding:12px;border:1px solid var(--prx-rich-stat-tone-border);border-radius:12px;background:var(--prx-rich-stat-tone-bg)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__items{gap:6px}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=inline] .prx-rich-stat-group__items,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group[data-layout=grid] .prx-rich-stat-group__items{grid-template-columns:repeat(auto-fit,minmax(min(148px,100%),1fr))}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__item{column-gap:8px;padding:8px 10px;border-radius:var(--pdx-page-card-radius, 10px);background:color-mix(in srgb,var(--prx-rich-stat-tone-bg) 78%,transparent)}.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__icon,.prx-rich-content-root.prx-rich-content-root--widget-card .prx-rich-stat-group__value{font-size:20px}.prx-rich-stat-group__item[data-tone=info]{--prx-rich-stat-tone-color: var(--praxis-info, #0b5cad);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 34%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=success]{--prx-rich-stat-tone-color: var(--praxis-success, #2e7d32);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 88%, var(--prx-rich-stat-tone-color) 12%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 38%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=warning]{--prx-rich-stat-tone-color: var(--praxis-warning, #b26a00);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 86%, var(--prx-rich-stat-tone-color) 14%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 46%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item[data-tone=danger]{--prx-rich-stat-tone-color: var(--md-sys-color-error, #d32f2f);--prx-rich-stat-tone-bg: color-mix(in srgb, var(--md-sys-color-surface, #fff) 84%, var(--prx-rich-stat-tone-color) 16%);--prx-rich-stat-tone-border: color-mix(in srgb, var(--prx-rich-stat-tone-color) 54%, var(--md-sys-color-outline-variant, #cac4d0))}.prx-rich-stat-group__item-header{display:flex;gap:8px;align-items:center;min-width:0}.prx-rich-stat-group__item-content{display:grid;gap:4px;min-width:0}.prx-rich-stat-group__icon{color:var(--prx-rich-stat-tone-color);font-size:24px;line-height:1;margin-top:1px}.prx-rich-stat-group__item:not(.prx-rich-stat-group__item--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-stat-group__label,.prx-rich-stat-group__subtitle,.prx-rich-stat-group__caption{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-stat-group__value{color:var(--md-sys-color-on-surface, #1d1b20);font-size:24px;font-weight:700;line-height:1.2}.prx-rich-tabs{display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-tabs__title,.prx-rich-tabs__tab--active{font-weight:700}.prx-rich-tabs__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px;margin-top:-8px}.prx-rich-tabs__tablist{display:flex;flex-wrap:wrap;gap:8px;border-bottom:1px solid var(--md-sys-color-outline-variant, #cac4d0);padding-bottom:8px}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tablist{border-bottom:0;padding-bottom:0}.prx-rich-tabs__tab{display:inline-flex;align-items:center;gap:8px;min-width:0;padding:8px 12px;border:0;border-radius:999px;background:transparent;color:var(--md-sys-color-on-surface, #1d1b20);cursor:pointer}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab{border-radius:0;border-bottom:2px solid transparent;padding-inline:0;padding-top:0;padding-bottom:8px}.prx-rich-tabs__tab--active{color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=underline] .prx-rich-tabs__tab--active{border-bottom-color:var(--md-sys-color-primary, #6750a4)}.prx-rich-tabs[data-appearance=pills] .prx-rich-tabs__tab--active{background:color-mix(in srgb,var(--md-sys-color-primary, #6750a4) 14%,#fff)}.prx-rich-tabs__tab:disabled{cursor:not-allowed;opacity:.55}.prx-rich-tabs__panel{display:block;min-width:0}.prx-rich-key-value-list__item,.prx-rich-record-summary__field{display:grid;grid-template-columns:minmax(0,160px) minmax(0,1fr);gap:12px;margin:0}.prx-rich-key-value-list[data-layout=stacked] .prx-rich-key-value-list__item{grid-template-columns:minmax(0,1fr);gap:4px}.prx-rich-key-value-list__item dt,.prx-rich-record-summary__field dt{color:var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-key-value-list__item dd,.prx-rich-record-summary__field dd{margin:0;display:inline-flex;gap:8px;flex-wrap:wrap;align-items:center}.prx-rich-related-record{display:grid;gap:14px;min-width:0;padding:16px;border:1px solid var(--md-sys-color-outline-variant, #cac4d0);border-radius:12px;background:color-mix(in srgb,var(--md-sys-color-surface, #fff) 94%,transparent)}.prx-rich-related-record__copy{display:grid;gap:10px;min-width:0}.prx-rich-related-record__relation{color:var(--md-sys-color-primary, #6750a4);font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:0}.prx-rich-related-record__title-row{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:center;min-width:0}.prx-rich-related-record__title-row:not(.prx-rich-related-record__title-row--with-icon){grid-template-columns:minmax(0,1fr)}.prx-rich-related-record__icon{color:var(--md-sys-color-primary, #6750a4);font-size:24px;line-height:1}.prx-rich-related-record__title{font-size:18px;font-weight:700;line-height:1.25;min-width:0}.prx-rich-related-record__subtitle,.prx-rich-related-record__meta,.prx-rich-related-record__hint{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px;line-height:1.45}.prx-rich-related-record__fields{display:grid;gap:8px;margin:0;padding:0}.prx-rich-related-record__field{display:grid;grid-template-columns:minmax(0,140px) minmax(0,1fr);gap:8px 12px;align-items:start;min-width:0;padding-top:8px;border-top:1px solid color-mix(in srgb,var(--md-sys-color-outline-variant, #cac4d0) 52%,transparent)}.prx-rich-related-record__field dt{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-related-record__field dd{margin:0;font-weight:600;min-width:0}.prx-rich-related-record__hint{grid-column:2}.prx-rich-related-record__actions{display:flex;flex-wrap:wrap;gap:8px;align-items:center}.prx-rich-disclosure__summary,.prx-rich-accordion__summary{cursor:pointer;display:flex;gap:8px;align-items:center;list-style:none}.prx-rich-disclosure__content,.prx-rich-accordion__content{margin-top:12px}.prx-rich-media-block{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:12px;align-items:center;min-width:0}.prx-rich-media-block__avatar,.prx-rich-media-block__body,.prx-rich-media-block__trailing{min-width:0}.prx-rich-media-block__body{display:flex;flex-direction:column;gap:6px}.prx-rich-media-block__title{font-weight:700}.prx-rich-media-block__subtitle{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:13px}.prx-rich-media-block__meta{color:var(--md-sys-color-on-surface-variant, #49454f);font-size:12px}.prx-rich-media-block__trailing{display:flex;align-items:center;justify-content:flex-end}.prx-rich-timeline{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff);--prx-rich-timeline-connector-color: var(--md-sys-color-outline-variant, #cac4d0);--prx-rich-timeline-item-gap: 16px;--prx-rich-timeline-title-color: currentColor;--prx-rich-timeline-title-font-size: inherit;--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: currentColor;--prx-rich-timeline-item-title-font-size: inherit;--prx-rich-timeline-item-title-font-weight: 600;--prx-rich-timeline-item-subtitle-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-subtitle-font-size: 12px;--prx-rich-timeline-item-meta-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-meta-font-size: 12px;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 400;--prx-rich-timeline-item-body-background: transparent;--prx-rich-timeline-item-body-border: 0;--prx-rich-timeline-item-body-border-radius: 6px;--prx-rich-timeline-item-body-padding: 12px;display:flex;flex-direction:column;gap:12px;min-width:0}.prx-rich-timeline__title{color:var(--prx-rich-timeline-title-color);font-size:var(--prx-rich-timeline-title-font-size);font-weight:var(--prx-rich-timeline-title-font-weight)}.prx-rich-timeline__items{display:flex;flex-direction:column;gap:0;list-style:none;margin:0;padding:0}.prx-rich-timeline__item{display:grid;grid-template-columns:minmax(0,1fr) 32px minmax(0,1fr);grid-template-areas:\". marker body\";column-gap:16px;align-items:flex-start;min-height:64px;min-width:0;position:relative}.prx-rich-timeline--vertical .prx-rich-timeline__item{padding-block-end:var(--prx-rich-timeline-item-gap)}.prx-rich-timeline--vertical .prx-rich-timeline__item:last-child{padding-block-end:0}.prx-rich-timeline--marker-color-primary,.prx-rich-timeline__item--marker-color-primary{--prx-rich-timeline-marker-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-primary, #fff)}.prx-rich-timeline--marker-color-secondary,.prx-rich-timeline__item--marker-color-secondary{--prx-rich-timeline-marker-color: var(--md-sys-color-secondary, #625b71);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-secondary, #fff)}.prx-rich-timeline--marker-color-tertiary,.prx-rich-timeline__item--marker-color-tertiary{--prx-rich-timeline-marker-color: var(--md-sys-color-tertiary, #7d5260);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-tertiary, #fff)}.prx-rich-timeline--marker-color-success,.prx-rich-timeline__item--marker-color-success{--prx-rich-timeline-marker-color: var(--praxis-success, #146c43);--prx-rich-timeline-on-marker-color: var(--praxis-on-success, #fff)}.prx-rich-timeline--marker-color-warning,.prx-rich-timeline__item--marker-color-warning{--prx-rich-timeline-marker-color: var(--praxis-warning, #b26a00);--prx-rich-timeline-on-marker-color: var(--praxis-on-warning, #1d1b20)}.prx-rich-timeline--marker-color-error,.prx-rich-timeline__item--marker-color-error{--prx-rich-timeline-marker-color: var(--md-sys-color-error, #ba1a1a);--prx-rich-timeline-on-marker-color: var(--md-sys-color-on-error, #fff)}.prx-rich-timeline--marker-color-info,.prx-rich-timeline__item--marker-color-info{--prx-rich-timeline-marker-color: var(--praxis-info, #0b5cad);--prx-rich-timeline-on-marker-color: var(--praxis-on-info, #fff)}.prx-rich-timeline--marker-color-neutral,.prx-rich-timeline__item--marker-color-neutral{--prx-rich-timeline-marker-color: var(--md-sys-color-outline, #79747e);--prx-rich-timeline-on-marker-color: var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline--connector-color-primary,.prx-rich-timeline__item--connector-color-primary{--prx-rich-timeline-connector-color: var(--md-sys-color-primary, #6750a4)}.prx-rich-timeline--connector-color-secondary,.prx-rich-timeline__item--connector-color-secondary{--prx-rich-timeline-connector-color: var(--md-sys-color-secondary, #625b71)}.prx-rich-timeline--connector-color-tertiary,.prx-rich-timeline__item--connector-color-tertiary{--prx-rich-timeline-connector-color: var(--md-sys-color-tertiary, #7d5260)}.prx-rich-timeline--connector-color-success,.prx-rich-timeline__item--connector-color-success{--prx-rich-timeline-connector-color: var(--praxis-success, #146c43)}.prx-rich-timeline--connector-color-warning,.prx-rich-timeline__item--connector-color-warning{--prx-rich-timeline-connector-color: var(--praxis-warning, #b26a00)}.prx-rich-timeline--connector-color-error,.prx-rich-timeline__item--connector-color-error{--prx-rich-timeline-connector-color: var(--md-sys-color-error, #ba1a1a)}.prx-rich-timeline--connector-color-info,.prx-rich-timeline__item--connector-color-info{--prx-rich-timeline-connector-color: var(--praxis-info, #0b5cad)}.prx-rich-timeline--connector-color-neutral,.prx-rich-timeline__item--connector-color-neutral{--prx-rich-timeline-connector-color: var(--md-sys-color-outline, #79747e)}.prx-rich-timeline__item--has-opposite{grid-template-areas:\"opposite marker body\"}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker opposite\"}.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-areas:\"body marker .\"}.prx-rich-timeline__item-opposite{grid-area:opposite;color:var(--prx-rich-timeline-opposite-color);font-size:var(--prx-rich-timeline-opposite-font-size);font-weight:var(--prx-rich-timeline-opposite-font-weight);line-height:1.35;min-width:0;overflow-wrap:anywhere;padding-top:1px;text-align:end}.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite{text-align:start}.prx-rich-timeline__item-body{background:var(--prx-rich-timeline-item-body-background);border:var(--prx-rich-timeline-item-body-border);border-radius:var(--prx-rich-timeline-item-body-border-radius);padding:var(--prx-rich-timeline-item-body-padding)}.prx-rich-timeline__item-subtitle{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 22px;display:inline-flex;align-items:flex-start;align-self:stretch;grid-area:marker;justify-content:center;justify-self:center;min-height:64px;position:relative;width:max(32px,var(--prx-rich-timeline-marker-size))}.prx-rich-timeline--marker-dot .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 10px}.prx-rich-timeline--marker-icon .prx-rich-timeline__item-marker{--prx-rich-timeline-marker-size: 24px}.prx-rich-timeline__item-marker>*{position:relative;z-index:1}.prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);bottom:0;content:\"\";left:50%;position:absolute;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline__item:last-child .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed}.prx-rich-timeline--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:row;gap:0;overflow-x:auto;padding-bottom:2px;scroll-snap-type:x proximity}.prx-rich-timeline__items:focus-visible{border-radius:4px;outline:2px solid var(--md-sys-color-primary, #6750a4);outline-offset:2px}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{grid-template-columns:minmax(176px,1fr);grid-template-areas:\"opposite\" \"marker\" \"body\";grid-template-rows:auto 32px 1fr;min-height:0;min-width:min(240px,80vw);padding-inline-end:calc(var(--prx-rich-timeline-item-gap) * .75);scroll-snap-align:start}.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite){grid-template-areas:\"marker\" \"body\";grid-template-rows:32px 1fr}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:center;align-self:center;justify-content:flex-start;justify-self:stretch;min-height:32px;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:0;border-top:1px solid var(--prx-rich-timeline-connector-color);bottom:auto;left:var(--prx-rich-timeline-marker-size);right:0;top:50%;transform:translateY(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:dashed}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}.prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:dashed}.prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{content:\"\";border-left-style:solid}.prx-rich-timeline__item--connector-none .prx-rich-timeline__item-marker:after{content:none}.prx-rich-timeline__item-icon{align-items:center;border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-marker-color);display:inline-flex;font-size:calc(var(--prx-rich-timeline-marker-size) - 8px);height:var(--prx-rich-timeline-marker-size);justify-content:center;line-height:1;width:var(--prx-rich-timeline-marker-size)}.prx-rich-timeline__item-dot{width:10px;height:10px;border-radius:50%;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;box-sizing:border-box;display:inline-block}.prx-rich-timeline__item-number{align-items:center;background:var(--prx-rich-timeline-marker-color);border:2px solid transparent;border-radius:50%;box-sizing:border-box;color:var(--prx-rich-timeline-on-marker-color);display:inline-flex;font-size:11px;font-weight:700;height:var(--prx-rich-timeline-marker-size);justify-content:center;line-height:1;min-width:var(--prx-rich-timeline-marker-size);padding:0 5px}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-marker>*,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-marker>*{background:transparent;border-color:var(--prx-rich-timeline-marker-color);color:var(--prx-rich-timeline-marker-color)}.prx-rich-timeline--marker-style-outlined .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-outlined .prx-rich-timeline__item-dot{background:var(--md-sys-color-surface, #fffbfe)}.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-dot,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-number,.prx-rich-timeline--marker-style-filled .prx-rich-timeline__item-icon,.prx-rich-timeline__item--marker-style-filled .prx-rich-timeline__item-icon{background:var(--prx-rich-timeline-marker-color);border-color:transparent;color:var(--prx-rich-timeline-on-marker-color)}.prx-rich-timeline__item-body{display:flex;flex-direction:column;gap:4px;grid-area:body;min-width:0}.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-end;text-align:end}.prx-rich-timeline__item-title{color:var(--prx-rich-timeline-item-title-color);font-size:var(--prx-rich-timeline-item-title-font-size);font-weight:var(--prx-rich-timeline-item-title-font-weight)}.prx-rich-timeline--emphasis-subtle{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface-variant, #49454f);--prx-rich-timeline-item-title-font-weight: 500;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface-variant, #49454f)}.prx-rich-timeline--density-compact{--prx-rich-timeline-item-gap: 10px;--prx-rich-timeline-item-body-padding: 10px}.prx-rich-timeline--density-spacious{--prx-rich-timeline-item-gap: 24px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--emphasis-strong{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-weight: 700;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-weight: 700;--prx-rich-timeline-opposite-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-opposite-font-weight: 700}.prx-rich-timeline--emphasis-hero{--prx-rich-timeline-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-title-font-size: 20px;--prx-rich-timeline-title-font-weight: 800;--prx-rich-timeline-item-title-color: var(--md-sys-color-on-surface, #1d1b20);--prx-rich-timeline-item-title-font-size: 17px;--prx-rich-timeline-item-title-font-weight: 800;--prx-rich-timeline-opposite-color: var(--md-sys-color-primary, #6750a4);--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 800;--prx-rich-timeline-item-body-background: color-mix( in srgb, var(--md-sys-color-primary, #6750a4) 8%, transparent );--prx-rich-timeline-item-body-border-radius: 8px;--prx-rich-timeline-item-body-padding: 14px}.prx-rich-timeline--text-prominent{--prx-rich-timeline-opposite-font-size: 14px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 15px;--prx-rich-timeline-item-title-font-weight: 700}.prx-rich-timeline--text-eyebrow{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 800}.prx-rich-timeline--text-eyebrow .prx-rich-timeline__item-opposite{letter-spacing:0;text-transform:uppercase}.prx-rich-timeline--text-label{--prx-rich-timeline-opposite-font-size: 12px;--prx-rich-timeline-opposite-font-weight: 700;--prx-rich-timeline-item-title-font-size: 14px;--prx-rich-timeline-item-title-font-weight: 600}.prx-rich-timeline__item-subtitle,.prx-rich-timeline__item-meta,.prx-rich-timeline__empty{color:var(--prx-rich-timeline-item-subtitle-color);font-size:var(--prx-rich-timeline-item-subtitle-font-size)}.prx-rich-timeline__item-meta{color:var(--prx-rich-timeline-item-meta-color);font-size:var(--prx-rich-timeline-item-meta-font-size)}.prx-rich-timeline__item-badge{display:inline-flex;align-items:flex-start;margin-top:2px}@media(max-width:640px){.prx-rich-timeline--horizontal .prx-rich-timeline__items{flex-direction:column;overflow-x:visible;padding-bottom:0;scroll-snap-type:none}.prx-rich-timeline--horizontal .prx-rich-timeline__item,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item{min-width:0;padding-inline-end:0;scroll-snap-align:none;width:100%}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker{align-items:flex-start;align-self:stretch;justify-content:center;justify-self:center;min-height:64px;width:32px}.prx-rich-timeline--horizontal .prx-rich-timeline__item-marker:after{border-left:1px solid var(--prx-rich-timeline-connector-color);border-top:0;bottom:0;left:50%;right:auto;top:var(--prx-rich-timeline-marker-size);transform:translate(-50%)}.prx-rich-timeline--horizontal.prx-rich-timeline--connector-dashed .prx-rich-timeline__item-marker:after,.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-dashed .prx-rich-timeline__item-marker:after{border-left-style:dashed;border-top-style:solid}.prx-rich-timeline--horizontal .prx-rich-timeline__item--connector-solid .prx-rich-timeline__item-marker:after{border-left-style:solid;border-top-style:solid}.prx-rich-timeline__item--has-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker opposite\" \"marker body\";grid-template-rows:auto 1fr;column-gap:12px}.prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--horizontal.prx-rich-timeline--left .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite),.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd),.prx-rich-timeline--horizontal.prx-rich-timeline--alternate .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite).prx-rich-timeline__item--odd,.prx-rich-timeline--horizontal.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--has-opposite):not(.prx-rich-timeline__item--odd){grid-template-columns:32px minmax(0,1fr);grid-template-areas:\"marker body\";grid-template-rows:1fr;column-gap:12px}.prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item--has-opposite .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate .prx-rich-timeline__item--has-opposite.prx-rich-timeline__item--odd .prx-rich-timeline__item-opposite,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item--has-opposite:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-opposite,.prx-rich-timeline--left .prx-rich-timeline__item-body,.prx-rich-timeline--alternate .prx-rich-timeline__item--odd .prx-rich-timeline__item-body,.prx-rich-timeline--alternate-reverse .prx-rich-timeline__item:not(.prx-rich-timeline__item--odd) .prx-rich-timeline__item-body{align-items:flex-start;text-align:start}}\n"] }]
4201
4459
  }], propDecorators: { document: [{ type: i0.Input, args: [{ isSignal: true, alias: "document", required: false }] }], nodes: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodes", required: false }] }], context: [{ type: i0.Input, args: [{ isSignal: true, alias: "context", required: false }] }], hostCapabilities: [{ type: i0.Input, args: [{ isSignal: true, alias: "hostCapabilities", required: false }] }], layout: [{ type: i0.Input, args: [{ isSignal: true, alias: "layout", required: false }] }], rootClassName: [{
4202
4460
  type: Input
4203
4461
  }] } });
@@ -4239,6 +4497,14 @@ const SUPPORTED_NODE_TYPES = new Set([
4239
4497
  'timeline',
4240
4498
  'preset',
4241
4499
  ]);
4500
+ const SUPPORTED_CONTEXT_SCOPES = new Set([
4501
+ 'row',
4502
+ 'computed',
4503
+ 'detail',
4504
+ 'meta',
4505
+ 'user',
4506
+ 'tenant',
4507
+ ]);
4242
4508
  const STYLE_NAME_PATTERN = /^--[a-zA-Z0-9-_]+$|^[a-z][a-zA-Z0-9-]*$/;
4243
4509
  const CLASS_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]*(\s+[a-zA-Z_][a-zA-Z0-9_-]*)*$/;
4244
4510
  const UNSAFE_STYLE_VALUE_PATTERN = /(?:javascript\s*:|vbscript\s*:|data\s*:|expression\s*\(|@import|-moz-binding|behavior\s*:)/i;
@@ -4255,6 +4521,7 @@ function validateRichContentDocument(value) {
4255
4521
  if (value['version'] !== SUPPORTED_DOCUMENT_VERSION) {
4256
4522
  addIssue(issues, '$.version', 'editor.validation.documentVersion', 'The document version must be "1.0.0".');
4257
4523
  }
4524
+ validateContextConfig(value['context'], '$.context', issues);
4258
4525
  if (!Array.isArray(value['nodes'])) {
4259
4526
  addIssue(issues, '$.nodes', 'editor.validation.documentNodes', 'The document must include a nodes array.');
4260
4527
  }
@@ -4632,6 +4899,7 @@ function validateBaseNode(node, path, issues) {
4632
4899
  validateOptionalClassName(node, 'className', path, issues);
4633
4900
  validateOptionalStringArray(node, 'requiresCapabilities', path, issues);
4634
4901
  validateEnum(node, 'capabilityMode', ['all', 'any'], path, issues, false);
4902
+ validateContextConfig(node['bindings'], `${path}.bindings`, issues);
4635
4903
  validateStyleObject(node['style'], `${path}.style`, issues);
4636
4904
  validateRuleExpression(node['visibleWhen'], `${path}.visibleWhen`, issues);
4637
4905
  validateRuleExpression(node['disabledWhen'], `${path}.disabledWhen`, issues);
@@ -4639,6 +4907,39 @@ function validateBaseNode(node, path, issues) {
4639
4907
  validateClassWhen(node['classWhen'], `${path}.classWhen`, issues);
4640
4908
  validateStyleWhen(node['styleWhen'], `${path}.styleWhen`, issues);
4641
4909
  }
4910
+ function validateContextConfig(value, path, issues) {
4911
+ if (value === undefined)
4912
+ return;
4913
+ if (!isRecord(value)) {
4914
+ addIssue(issues, path, 'editor.validation.objectField', 'Context configuration must be an object.');
4915
+ return;
4916
+ }
4917
+ if (value['scopes'] !== undefined) {
4918
+ if (!Array.isArray(value['scopes'])) {
4919
+ addIssue(issues, `${path}.scopes`, 'editor.validation.contextScopes', 'Context scopes must be an array of supported scope names.');
4920
+ }
4921
+ else {
4922
+ value['scopes'].forEach((scope, index) => {
4923
+ if (typeof scope !== 'string' ||
4924
+ !SUPPORTED_CONTEXT_SCOPES.has(scope)) {
4925
+ addIssue(issues, `${path}.scopes[${index}]`, 'editor.validation.contextScopes', 'Context scopes must use supported scope names.');
4926
+ }
4927
+ });
4928
+ }
4929
+ }
4930
+ if (value['aliases'] !== undefined) {
4931
+ if (!isRecord(value['aliases'])) {
4932
+ addIssue(issues, `${path}.aliases`, 'editor.validation.contextAliases', 'Context aliases must be an object with string values.');
4933
+ }
4934
+ else {
4935
+ Object.entries(value['aliases']).forEach(([alias, target]) => {
4936
+ if (typeof target !== 'string') {
4937
+ addIssue(issues, `${path}.aliases.${alias}`, 'editor.validation.contextAliases', 'Context aliases must be an object with string values.');
4938
+ }
4939
+ });
4940
+ }
4941
+ }
4942
+ }
4642
4943
  function validateActionRef(value, path, issues) {
4643
4944
  if (!isRecord(value)) {
4644
4945
  addIssue(issues, path, 'editor.validation.objectField', 'Action configuration must be an object.');
@@ -5136,6 +5437,7 @@ const EDITABLE_TOP_LEVEL_NODE_TYPES = [
5136
5437
  'text',
5137
5438
  'badge',
5138
5439
  'icon',
5440
+ 'avatar',
5139
5441
  'image',
5140
5442
  'link',
5141
5443
  'metric',
@@ -5168,6 +5470,7 @@ const EDITABLE_PRESENTER_NODE_TYPES = [
5168
5470
  'text',
5169
5471
  'badge',
5170
5472
  'icon',
5473
+ 'avatar',
5171
5474
  'image',
5172
5475
  'link',
5173
5476
  'metric',
@@ -5184,6 +5487,12 @@ function createDefaultRichContentNode(type, tx, presetRef) {
5184
5487
  return { type: 'badge', label: tx('editor.defaultBadge', 'Badge') };
5185
5488
  case 'icon':
5186
5489
  return { type: 'icon', icon: 'check_circle' };
5490
+ case 'avatar':
5491
+ return {
5492
+ type: 'avatar',
5493
+ name: tx('editor.defaultAvatarName', 'Person'),
5494
+ initials: 'P',
5495
+ };
5187
5496
  case 'image':
5188
5497
  return { type: 'image', src: '/assets/placeholder.png', alt: '' };
5189
5498
  case 'link':
@@ -5539,6 +5848,12 @@ function createDefaultPresenterNode(type, tx) {
5539
5848
  return { type: 'badge', label: tx('editor.defaultBadge', 'Badge') };
5540
5849
  case 'icon':
5541
5850
  return { type: 'icon', icon: 'check_circle' };
5851
+ case 'avatar':
5852
+ return {
5853
+ type: 'avatar',
5854
+ name: tx('editor.defaultAvatarName', 'Person'),
5855
+ initials: 'P',
5856
+ };
5542
5857
  case 'image':
5543
5858
  return { type: 'image', src: '/assets/placeholder.png', alt: '' };
5544
5859
  case 'link':
@@ -5676,6 +5991,21 @@ function stringifyScalar(value) {
5676
5991
  return '';
5677
5992
  }
5678
5993
 
5994
+ const ADVANCED_JSON_ONLY_NODE_FIELDS = [
5995
+ 'bindings',
5996
+ 'disabledWhen',
5997
+ 'loadWhen',
5998
+ 'classWhen',
5999
+ 'styleWhen',
6000
+ ];
6001
+ const RICH_BLOCK_CONTEXT_SCOPES = [
6002
+ 'row',
6003
+ 'computed',
6004
+ 'detail',
6005
+ 'meta',
6006
+ 'user',
6007
+ 'tenant',
6008
+ ];
5679
6009
  const EMPTY_DOCUMENT = {
5680
6010
  kind: 'praxis.rich-content',
5681
6011
  version: '1.0.0',
@@ -5695,6 +6025,7 @@ class PraxisRichContentConfigEditor {
5695
6025
  editableNodeTypes = EDITABLE_TOP_LEVEL_NODE_TYPES;
5696
6026
  presenterNodeTypes = EDITABLE_PRESENTER_NODE_TYPES;
5697
6027
  cardContentNodeTypes = EDITABLE_CARD_CONTENT_NODE_TYPES;
6028
+ advancedJsonOnlyNodeFields = ADVANCED_JSON_ONLY_NODE_FIELDS;
5698
6029
  presetOptions = this.presetRegistry.list();
5699
6030
  documentJson = '';
5700
6031
  layout = 'block';
@@ -5706,8 +6037,13 @@ class PraxisRichContentConfigEditor {
5706
6037
  validationIssues = [];
5707
6038
  nodeCount = 0;
5708
6039
  nodeTypeSummary = '';
6040
+ selectedNodeIndex = 0;
6041
+ activeEditorPanel = 'guided';
6042
+ advancedRulesOpen = false;
6043
+ advancedJsonFieldErrors = {};
5709
6044
  initialInputs = this.normalizeInputs(this.inputs);
5710
6045
  pendingRemoval = null;
6046
+ advancedJsonFieldDrafts = {};
5711
6047
  ngOnChanges(changes) {
5712
6048
  if (changes['inputs']) {
5713
6049
  this.load(this.normalizeInputs(this.inputs), false);
@@ -5720,7 +6056,7 @@ class PraxisRichContentConfigEditor {
5720
6056
  }
5721
6057
  getSettingsValue() {
5722
6058
  const document = this.parseDocument();
5723
- if (!document)
6059
+ if (!document || this.hasAdvancedJsonFieldErrors())
5724
6060
  return null;
5725
6061
  return {
5726
6062
  inputs: {
@@ -5747,6 +6083,7 @@ class PraxisRichContentConfigEditor {
5747
6083
  this.isDirty$.next(!this.matchesInitialState());
5748
6084
  }
5749
6085
  onDocumentJsonChange() {
6086
+ this.clearAdvancedJsonFieldState();
5750
6087
  this.parseDocument();
5751
6088
  this.markDirty();
5752
6089
  }
@@ -5758,14 +6095,32 @@ class PraxisRichContentConfigEditor {
5758
6095
  this.parseDocument();
5759
6096
  this.markDirty();
5760
6097
  }
6098
+ selectTopLevelNode(index) {
6099
+ this.selectedNodeIndex = index;
6100
+ this.advancedRulesOpen = false;
6101
+ }
6102
+ selectEditorPanel(panel) {
6103
+ this.activeEditorPanel = panel;
6104
+ this.cdr.markForCheck();
6105
+ }
6106
+ openAdvancedRules() {
6107
+ this.advancedRulesOpen = true;
6108
+ this.cdr.markForCheck();
6109
+ }
6110
+ onAdvancedRulesToggle(event) {
6111
+ const target = event.target;
6112
+ this.advancedRulesOpen = target?.open === true;
6113
+ }
5761
6114
  addTopLevelNode() {
5762
6115
  const document = this.ensureEditableDocument();
5763
6116
  document.nodes.push(this.createDefaultNode(this.newNodeType));
6117
+ this.selectedNodeIndex = document.nodes.length - 1;
5764
6118
  this.syncStructuredDocumentChange();
5765
6119
  }
5766
6120
  removeTopLevelNode(index) {
5767
6121
  const document = this.ensureEditableDocument();
5768
6122
  document.nodes.splice(index, 1);
6123
+ this.reconcileSelectedNodeIndex(document);
5769
6124
  this.syncStructuredDocumentChange();
5770
6125
  }
5771
6126
  moveTopLevelNode(index, delta) {
@@ -5776,6 +6131,17 @@ class PraxisRichContentConfigEditor {
5776
6131
  }
5777
6132
  const [node] = document.nodes.splice(index, 1);
5778
6133
  document.nodes.splice(nextIndex, 0, node);
6134
+ if (this.selectedNodeIndex === index) {
6135
+ this.selectedNodeIndex = nextIndex;
6136
+ }
6137
+ else if (delta < 0 &&
6138
+ this.selectedNodeIndex === nextIndex) {
6139
+ this.selectedNodeIndex = index;
6140
+ }
6141
+ else if (delta > 0 &&
6142
+ this.selectedNodeIndex === nextIndex) {
6143
+ this.selectedNodeIndex = index;
6144
+ }
5779
6145
  this.syncStructuredDocumentChange();
5780
6146
  }
5781
6147
  changeTopLevelNodeType(index, nextType) {
@@ -5888,6 +6254,93 @@ class PraxisRichContentConfigEditor {
5888
6254
  }
5889
6255
  this.syncStructuredDocumentChange();
5890
6256
  }
6257
+ getCardInteractionField(index, field) {
6258
+ const interaction = this.ensureCardNode(index).interaction;
6259
+ const value = interaction?.[field];
6260
+ return typeof value === 'string' ? value : '';
6261
+ }
6262
+ setCardInteractionField(index, field, value) {
6263
+ const card = this.ensureCardNode(index);
6264
+ const normalized = value.trim();
6265
+ if (field === 'mode' && (!normalized || normalized === 'none')) {
6266
+ if (card.interaction) {
6267
+ card.interaction.mode = 'none';
6268
+ }
6269
+ this.pruneEmptyCardInteraction(index);
6270
+ this.syncStructuredDocumentChange();
6271
+ return;
6272
+ }
6273
+ card.interaction ??= { mode: 'none' };
6274
+ const interaction = card.interaction;
6275
+ if (normalized) {
6276
+ interaction[field] = normalized;
6277
+ }
6278
+ else {
6279
+ delete interaction[field];
6280
+ }
6281
+ this.pruneEmptyCardInteraction(index);
6282
+ this.syncStructuredDocumentChange();
6283
+ }
6284
+ getCardInteractionBooleanField(index, field) {
6285
+ const interaction = this.ensureCardNode(index).interaction;
6286
+ return interaction?.[field] === true;
6287
+ }
6288
+ setCardInteractionBooleanField(index, field, value) {
6289
+ const card = this.ensureCardNode(index);
6290
+ card.interaction ??= { mode: 'none' };
6291
+ const interaction = card.interaction;
6292
+ if (value) {
6293
+ interaction[field] = true;
6294
+ }
6295
+ else {
6296
+ delete interaction[field];
6297
+ }
6298
+ this.pruneEmptyCardInteraction(index);
6299
+ this.syncStructuredDocumentChange();
6300
+ }
6301
+ getCardInteractionActionField(index, field) {
6302
+ const action = this.ensureCardNode(index).interaction?.action;
6303
+ return typeof action?.[field] === 'string' ? action[field] : '';
6304
+ }
6305
+ setCardInteractionActionField(index, field, value) {
6306
+ const card = this.ensureCardNode(index);
6307
+ card.interaction ??= { mode: 'action' };
6308
+ card.interaction.action ??= { actionId: '' };
6309
+ const action = card.interaction.action;
6310
+ const normalized = value.trim();
6311
+ if (normalized) {
6312
+ action[field] = value;
6313
+ }
6314
+ else {
6315
+ delete action[field];
6316
+ }
6317
+ if (!card.interaction.action.actionId) {
6318
+ delete card.interaction.action;
6319
+ }
6320
+ this.pruneEmptyCardInteraction(index);
6321
+ this.syncStructuredDocumentChange();
6322
+ }
6323
+ getCardAccessibilityField(index, field) {
6324
+ const accessibility = this.ensureCardNode(index).accessibility;
6325
+ const value = accessibility?.[field];
6326
+ return typeof value === 'string' ? value : '';
6327
+ }
6328
+ setCardAccessibilityField(index, field, value) {
6329
+ const card = this.ensureCardNode(index);
6330
+ const normalized = value.trim();
6331
+ card.accessibility ??= {};
6332
+ const accessibility = card.accessibility;
6333
+ if (normalized) {
6334
+ accessibility[field] = value;
6335
+ }
6336
+ else {
6337
+ delete accessibility[field];
6338
+ }
6339
+ if (!Object.keys(accessibility).length) {
6340
+ delete card.accessibility;
6341
+ }
6342
+ this.syncStructuredDocumentChange();
6343
+ }
5891
6344
  addCardSlotNode(index, slot) {
5892
6345
  this.ensureCardSlotNodes(index, slot).push(createDefaultPresenterNode('text', this.tx.bind(this)));
5893
6346
  this.syncStructuredDocumentChange();
@@ -6187,6 +6640,65 @@ class PraxisRichContentConfigEditor {
6187
6640
  };
6188
6641
  this.syncStructuredDocumentChange();
6189
6642
  }
6643
+ getTabsItemCapabilityList(index, itemIndex) {
6644
+ const item = this.ensureTabsNode(index).items[itemIndex];
6645
+ return Array.isArray(item?.requiresCapabilities)
6646
+ ? item.requiresCapabilities.join(', ')
6647
+ : '';
6648
+ }
6649
+ setTabsItemCapabilityList(index, itemIndex, value) {
6650
+ const node = this.ensureTabsNode(index);
6651
+ const current = node.items[itemIndex] ?? { content: [] };
6652
+ const capabilities = value
6653
+ .split(',')
6654
+ .map((item) => item.trim())
6655
+ .filter(Boolean);
6656
+ node.items[itemIndex] = {
6657
+ ...current,
6658
+ requiresCapabilities: capabilities.length ? capabilities : undefined,
6659
+ content: Array.isArray(current.content) && current.content.length
6660
+ ? current.content
6661
+ : [
6662
+ {
6663
+ type: 'text',
6664
+ text: this.tx('editor.defaultTabText', 'Tab content'),
6665
+ },
6666
+ ],
6667
+ };
6668
+ this.syncStructuredDocumentChange();
6669
+ }
6670
+ getTabsItemVisibleWhenPath(index, itemIndex) {
6671
+ const item = this.ensureTabsNode(index).items[itemIndex];
6672
+ return parseSimpleVisibleWhen(item?.visibleWhen)?.path ?? '';
6673
+ }
6674
+ getTabsItemVisibleWhenValue(index, itemIndex) {
6675
+ const item = this.ensureTabsNode(index).items[itemIndex];
6676
+ return parseSimpleVisibleWhen(item?.visibleWhen)?.value ?? '';
6677
+ }
6678
+ setTabsItemVisibleWhenPath(index, itemIndex, path) {
6679
+ const item = this.ensureTabsNode(index).items[itemIndex];
6680
+ if (!item)
6681
+ return;
6682
+ this.setTabsItemSimpleVisibleWhen(item, path, this.getTabsItemVisibleWhenValue(index, itemIndex));
6683
+ this.syncStructuredDocumentChange();
6684
+ }
6685
+ setTabsItemVisibleWhenValue(index, itemIndex, value) {
6686
+ const item = this.ensureTabsNode(index).items[itemIndex];
6687
+ if (!item)
6688
+ return;
6689
+ this.setTabsItemSimpleVisibleWhen(item, this.getTabsItemVisibleWhenPath(index, itemIndex), value);
6690
+ this.syncStructuredDocumentChange();
6691
+ }
6692
+ setTabsItemSimpleVisibleWhen(item, path, value) {
6693
+ const trimmedPath = path.trim();
6694
+ if (!trimmedPath) {
6695
+ delete item.visibleWhen;
6696
+ return;
6697
+ }
6698
+ item.visibleWhen = {
6699
+ '===': [{ var: trimmedPath }, parseScalar(value)],
6700
+ };
6701
+ }
6190
6702
  getActionCardSecondaryActions(index) {
6191
6703
  return this.ensureActionCardSecondaryActions(index);
6192
6704
  }
@@ -6406,6 +6918,203 @@ class PraxisRichContentConfigEditor {
6406
6918
  setStyleEntry(node, this.getFirstStyleName(node), propertyValue);
6407
6919
  this.syncStructuredDocumentChange();
6408
6920
  }
6921
+ hasDocumentContext() {
6922
+ return (!!this.parsedDocument?.context ||
6923
+ !!this.getDocumentContextFieldError('scopes') ||
6924
+ !!this.getDocumentContextFieldError('aliases'));
6925
+ }
6926
+ getDocumentContextScopes() {
6927
+ const key = this.getDocumentContextFieldKey('scopes');
6928
+ if (Object.prototype.hasOwnProperty.call(this.advancedJsonFieldDrafts, key)) {
6929
+ return this.advancedJsonFieldDrafts[key] ?? '';
6930
+ }
6931
+ return this.parsedDocument?.context?.scopes?.join(', ') ?? '';
6932
+ }
6933
+ setDocumentContextScopes(value) {
6934
+ const key = this.getDocumentContextFieldKey('scopes');
6935
+ this.advancedJsonFieldDrafts[key] = value;
6936
+ const scopes = value
6937
+ .split(',')
6938
+ .map((item) => item.trim())
6939
+ .filter(Boolean);
6940
+ const invalidScopes = scopes.filter((scope) => !RICH_BLOCK_CONTEXT_SCOPES.includes(scope));
6941
+ if (invalidScopes.length) {
6942
+ this.setAdvancedJsonFieldInvalid(key, this.tx('editor.validation.contextScopes', 'Use supported context scopes only.'));
6943
+ return;
6944
+ }
6945
+ delete this.advancedJsonFieldDrafts[key];
6946
+ delete this.advancedJsonFieldErrors[key];
6947
+ this.updateDocumentContext((context) => {
6948
+ if (scopes.length) {
6949
+ context.scopes = scopes;
6950
+ }
6951
+ else {
6952
+ delete context.scopes;
6953
+ }
6954
+ });
6955
+ }
6956
+ getDocumentContextAliasesValue() {
6957
+ const key = this.getDocumentContextFieldKey('aliases');
6958
+ if (Object.prototype.hasOwnProperty.call(this.advancedJsonFieldDrafts, key)) {
6959
+ return this.advancedJsonFieldDrafts[key] ?? '';
6960
+ }
6961
+ const aliases = this.parsedDocument?.context?.aliases;
6962
+ return aliases ? this.stringify(aliases) : '';
6963
+ }
6964
+ setDocumentContextAliases(value) {
6965
+ const key = this.getDocumentContextFieldKey('aliases');
6966
+ const trimmed = value.trim();
6967
+ this.advancedJsonFieldDrafts[key] = value;
6968
+ if (!trimmed) {
6969
+ delete this.advancedJsonFieldDrafts[key];
6970
+ delete this.advancedJsonFieldErrors[key];
6971
+ this.updateDocumentContext((context) => {
6972
+ delete context.aliases;
6973
+ });
6974
+ return;
6975
+ }
6976
+ let aliases;
6977
+ try {
6978
+ aliases = JSON.parse(trimmed);
6979
+ }
6980
+ catch {
6981
+ this.setAdvancedJsonFieldInvalid(key, this.tx('editor.validation.invalidFieldJson', 'Enter valid JSON.'));
6982
+ return;
6983
+ }
6984
+ if (!isPlainRecord(aliases) ||
6985
+ Object.values(aliases).some((alias) => typeof alias !== 'string')) {
6986
+ this.setAdvancedJsonFieldInvalid(key, this.tx('editor.validation.contextAliases', 'Context aliases must be a JSON object with string values.'));
6987
+ return;
6988
+ }
6989
+ delete this.advancedJsonFieldDrafts[key];
6990
+ delete this.advancedJsonFieldErrors[key];
6991
+ this.updateDocumentContext((context) => {
6992
+ context.aliases = aliases;
6993
+ });
6994
+ }
6995
+ getDocumentContextFieldError(field) {
6996
+ return this.advancedJsonFieldErrors[this.getDocumentContextFieldKey(field)] ?? '';
6997
+ }
6998
+ getDocumentContextAliasesPlaceholder() {
6999
+ return '{\n "owner": "decision.owner",\n "risk": "decision.risk"\n}';
7000
+ }
7001
+ getAdvancedJsonOnlyFields(node) {
7002
+ const source = node;
7003
+ return ADVANCED_JSON_ONLY_NODE_FIELDS.filter((field) => source[field] !== undefined);
7004
+ }
7005
+ getAdvancedJsonFieldValue(index, node, field) {
7006
+ const key = this.getAdvancedJsonFieldKey(index, field);
7007
+ if (Object.prototype.hasOwnProperty.call(this.advancedJsonFieldDrafts, key)) {
7008
+ return this.advancedJsonFieldDrafts[key] ?? '';
7009
+ }
7010
+ const value = node[field];
7011
+ return value === undefined ? '' : this.stringify(value);
7012
+ }
7013
+ setAdvancedJsonField(index, field, value) {
7014
+ const key = this.getAdvancedJsonFieldKey(index, field);
7015
+ const trimmed = value.trim();
7016
+ this.advancedJsonFieldDrafts[key] = value;
7017
+ if (!trimmed) {
7018
+ const node = this.ensureEditableDocument().nodes[index];
7019
+ delete node[field];
7020
+ delete this.advancedJsonFieldDrafts[key];
7021
+ delete this.advancedJsonFieldErrors[key];
7022
+ this.syncStructuredDocumentChange();
7023
+ return;
7024
+ }
7025
+ let parsed;
7026
+ try {
7027
+ parsed = JSON.parse(trimmed);
7028
+ }
7029
+ catch {
7030
+ this.setAdvancedJsonFieldInvalid(key, this.tx('editor.validation.invalidFieldJson', 'Enter valid JSON.'));
7031
+ return;
7032
+ }
7033
+ if (!this.isAdvancedJsonFieldShapeValid(field, parsed)) {
7034
+ this.setAdvancedJsonFieldInvalid(key, this.getAdvancedJsonFieldShapeError(field));
7035
+ return;
7036
+ }
7037
+ const nextDocument = this.cloneValue(this.ensureEditableDocument());
7038
+ const node = nextDocument.nodes[index];
7039
+ node[field] = parsed;
7040
+ const nextJson = this.stringify(nextDocument);
7041
+ const validation = validateRichContentDocument(nextDocument);
7042
+ if (!validation.valid) {
7043
+ this.setAdvancedJsonFieldInvalid(key, this.tx('editor.validation.invalidCanonicalField', 'The JSON is valid but does not match the rich-content contract.'));
7044
+ return;
7045
+ }
7046
+ this.parsedDocument = nextDocument;
7047
+ this.documentJson = nextJson;
7048
+ delete this.advancedJsonFieldDrafts[key];
7049
+ delete this.advancedJsonFieldErrors[key];
7050
+ this.parseDocument();
7051
+ this.markDirty();
7052
+ }
7053
+ getAdvancedJsonFieldError(index, field) {
7054
+ return this.advancedJsonFieldErrors[this.getAdvancedJsonFieldKey(index, field)] ?? '';
7055
+ }
7056
+ getAdvancedJsonFieldPlaceholder(field) {
7057
+ switch (field) {
7058
+ case 'bindings':
7059
+ return '{\n "scopes": ["row"],\n "aliases": {\n "risk": "decision.risk"\n }\n}';
7060
+ case 'classWhen':
7061
+ return '[\n {\n "className": "is-active",\n "expr": { "var": "row.active" }\n }\n]';
7062
+ case 'styleWhen':
7063
+ return '[\n {\n "style": { "color": "var(--md-sys-color-primary)" },\n "expr": { "var": "row.active" }\n }\n]';
7064
+ default:
7065
+ return '{\n "var": "row.active"\n}';
7066
+ }
7067
+ }
7068
+ getAdvancedJsonFieldKey(index, field) {
7069
+ return `${index}:${field}`;
7070
+ }
7071
+ getDocumentContextFieldKey(field) {
7072
+ return `document:context:${field}`;
7073
+ }
7074
+ updateDocumentContext(update) {
7075
+ const document = this.ensureEditableDocument();
7076
+ const context = {
7077
+ ...(document.context ?? {}),
7078
+ };
7079
+ update(context);
7080
+ if (context.scopes?.length || Object.keys(context.aliases ?? {}).length) {
7081
+ document.context = context;
7082
+ }
7083
+ else {
7084
+ delete document.context;
7085
+ }
7086
+ this.syncStructuredDocumentChange();
7087
+ }
7088
+ setAdvancedJsonFieldInvalid(key, message) {
7089
+ this.advancedJsonFieldErrors[key] = message;
7090
+ this.valid = false;
7091
+ this.errorMessage = message;
7092
+ this.isValid$.next(false);
7093
+ this.markDirty();
7094
+ this.cdr.markForCheck();
7095
+ }
7096
+ clearAdvancedJsonFieldState() {
7097
+ this.advancedJsonFieldDrafts = {};
7098
+ this.advancedJsonFieldErrors = {};
7099
+ }
7100
+ hasAdvancedJsonFieldErrors() {
7101
+ return Object.keys(this.advancedJsonFieldErrors).length > 0;
7102
+ }
7103
+ isAdvancedJsonFieldShapeValid(field, value) {
7104
+ if (field === 'classWhen' || field === 'styleWhen') {
7105
+ return Array.isArray(value);
7106
+ }
7107
+ if (field === 'bindings') {
7108
+ return isPlainRecord(value);
7109
+ }
7110
+ return value === null || isPlainRecord(value);
7111
+ }
7112
+ getAdvancedJsonFieldShapeError(field) {
7113
+ if (field === 'classWhen' || field === 'styleWhen') {
7114
+ return this.tx('editor.validation.advancedArrayField', 'This field must be a JSON array.');
7115
+ }
7116
+ return this.tx('editor.validation.advancedObjectField', 'This field must be a JSON object.');
7117
+ }
6409
7118
  requestTopLevelNodeRemoval(index) {
6410
7119
  this.pendingRemoval = { scope: 'nodes', index };
6411
7120
  }
@@ -6553,6 +7262,12 @@ class PraxisRichContentConfigEditor {
6553
7262
  .filter((issue) => issue.path === path || issue.path.startsWith(`${path}.`))
6554
7263
  .map((issue) => this.tx(issue.messageKey, issue.fallback));
6555
7264
  }
7265
+ getIssueCount(path) {
7266
+ return this.validationIssues.filter((issue) => issue.path === path || issue.path.startsWith(`${path}.`)).length;
7267
+ }
7268
+ getSelectedNodeIssueCount() {
7269
+ return this.getIssueCount(`$.nodes[${this.selectedNodeIndex}]`);
7270
+ }
6556
7271
  isEditableNodeType(type) {
6557
7272
  return EDITABLE_TOP_LEVEL_NODE_TYPES.includes(type);
6558
7273
  }
@@ -6560,6 +7275,7 @@ class PraxisRichContentConfigEditor {
6560
7275
  return EDITABLE_PRESENTER_NODE_TYPES.includes(type);
6561
7276
  }
6562
7277
  load(inputs, dirty) {
7278
+ this.clearAdvancedJsonFieldState();
6563
7279
  const document = inputs.document ?? EMPTY_DOCUMENT;
6564
7280
  const layout = inputs.layout === 'inline' ? 'inline' : 'block';
6565
7281
  const rootClassName = typeof inputs.rootClassName === 'string' ? inputs.rootClassName : '';
@@ -6610,6 +7326,16 @@ class PraxisRichContentConfigEditor {
6610
7326
  }
6611
7327
  return node;
6612
7328
  }
7329
+ pruneEmptyCardInteraction(index) {
7330
+ const card = this.ensureCardNode(index);
7331
+ const interaction = card.interaction;
7332
+ if (!interaction)
7333
+ return;
7334
+ const hasOnlyNoneMode = Object.keys(interaction).length === 1 && interaction['mode'] === 'none';
7335
+ if (!Object.keys(interaction).length || hasOnlyNoneMode) {
7336
+ delete card.interaction;
7337
+ }
7338
+ }
6613
7339
  ensureCardSlotNodes(index, slot) {
6614
7340
  const card = this.ensureCardNode(index);
6615
7341
  if (!Array.isArray(card[slot])) {
@@ -6911,11 +7637,18 @@ class PraxisRichContentConfigEditor {
6911
7637
  return null;
6912
7638
  }
6913
7639
  const document = parsed;
7640
+ this.parsedDocument = document;
7641
+ this.reconcileSelectedNodeIndex(document);
7642
+ this.updateDocumentOverview(document);
7643
+ if (this.hasAdvancedJsonFieldErrors()) {
7644
+ this.valid = false;
7645
+ this.errorMessage = this.tx('editor.validation.invalidFieldJson', 'Enter valid JSON.');
7646
+ this.isValid$.next(false);
7647
+ return document;
7648
+ }
6914
7649
  this.valid = true;
6915
7650
  this.errorMessage = '';
6916
7651
  this.isValid$.next(true);
6917
- this.parsedDocument = document;
6918
- this.updateDocumentOverview(document);
6919
7652
  return document;
6920
7653
  }
6921
7654
  catch (error) {
@@ -6934,6 +7667,20 @@ class PraxisRichContentConfigEditor {
6934
7667
  this.nodeCount = 0;
6935
7668
  this.nodeTypeSummary = '';
6936
7669
  }
7670
+ reconcileSelectedNodeIndex(document) {
7671
+ const nodeTotal = document.nodes.length;
7672
+ if (!nodeTotal) {
7673
+ this.selectedNodeIndex = 0;
7674
+ return;
7675
+ }
7676
+ if (this.selectedNodeIndex < 0) {
7677
+ this.selectedNodeIndex = 0;
7678
+ return;
7679
+ }
7680
+ if (this.selectedNodeIndex >= nodeTotal) {
7681
+ this.selectedNodeIndex = nodeTotal - 1;
7682
+ }
7683
+ }
6937
7684
  updateDocumentOverview(document) {
6938
7685
  const typeCounts = new Map();
6939
7686
  let count = 0;
@@ -7074,6 +7821,54 @@ class PraxisRichContentConfigEditor {
7074
7821
  </label>
7075
7822
  </div>
7076
7823
 
7824
+ <details
7825
+ class="prx-rich-editor__document-context"
7826
+ [open]="hasDocumentContext()"
7827
+ >
7828
+ <summary>
7829
+ <span>{{ tx('editor.documentContext', 'Document context') }}</span>
7830
+ <small>
7831
+ {{
7832
+ tx(
7833
+ 'editor.documentContextHelp',
7834
+ 'Canonical data scopes and aliases available to rich-content bindings.'
7835
+ )
7836
+ }}
7837
+ </small>
7838
+ </summary>
7839
+ <fieldset class="prx-rich-editor__field-group">
7840
+ <legend>{{ tx('editor.documentContextFields', 'Context contract') }}</legend>
7841
+ <label class="prx-rich-editor__wide-field">
7842
+ <span>{{ tx('editor.field.contextScopes', 'Context scopes') }}</span>
7843
+ <input
7844
+ [ngModel]="getDocumentContextScopes()"
7845
+ (ngModelChange)="setDocumentContextScopes($event)"
7846
+ [placeholder]="tx('editor.placeholder.contextScopes', 'row, user, tenant')"
7847
+ [class.invalid]="getDocumentContextFieldError('scopes')"
7848
+ />
7849
+ @if (getDocumentContextFieldError('scopes')) {
7850
+ <small class="prx-rich-editor__field-error">
7851
+ {{ getDocumentContextFieldError('scopes') }}
7852
+ </small>
7853
+ }
7854
+ </label>
7855
+ <label class="prx-rich-editor__wide-field prx-rich-editor__json-field">
7856
+ <span>{{ tx('editor.field.contextAliases', 'Context aliases') }}</span>
7857
+ <textarea
7858
+ [ngModel]="getDocumentContextAliasesValue()"
7859
+ (ngModelChange)="setDocumentContextAliases($event)"
7860
+ [placeholder]="getDocumentContextAliasesPlaceholder()"
7861
+ [class.invalid]="getDocumentContextFieldError('aliases')"
7862
+ ></textarea>
7863
+ @if (getDocumentContextFieldError('aliases')) {
7864
+ <small class="prx-rich-editor__field-error">
7865
+ {{ getDocumentContextFieldError('aliases') }}
7866
+ </small>
7867
+ }
7868
+ </label>
7869
+ </fieldset>
7870
+ </details>
7871
+
7077
7872
  <ng-template
7078
7873
  #presenterFields
7079
7874
  let-node="node"
@@ -7109,55 +7904,137 @@ class PraxisRichContentConfigEditor {
7109
7904
  />
7110
7905
  </label>
7111
7906
  }
7112
- @case ('image') {
7907
+ @case ('avatar') {
7113
7908
  <label>
7114
- <span>{{ tx('editor.field.src', 'Image URL') }}</span>
7909
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
7115
7910
  <input
7116
- [ngModel]="getStringField(node, 'src')"
7117
- (ngModelChange)="setString('src', $event)"
7911
+ [ngModel]="getStringField(node, 'name')"
7912
+ (ngModelChange)="setString('name', $event)"
7118
7913
  />
7119
7914
  </label>
7120
7915
  <label>
7121
- <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
7916
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
7122
7917
  <input
7123
- [ngModel]="getStringField(node, 'alt')"
7124
- (ngModelChange)="setString('alt', $event)"
7918
+ [ngModel]="getStringField(node, 'nameExpr')"
7919
+ (ngModelChange)="setString('nameExpr', $event)"
7125
7920
  />
7126
7921
  </label>
7127
- }
7128
- @case ('link') {
7129
7922
  <label>
7130
- <span>{{ tx('editor.field.label', 'Label') }}</span>
7923
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
7131
7924
  <input
7132
- [ngModel]="getStringField(node, 'label')"
7133
- (ngModelChange)="setString('label', $event)"
7925
+ [ngModel]="getStringField(node, 'imageSrc')"
7926
+ (ngModelChange)="setString('imageSrc', $event)"
7134
7927
  />
7135
7928
  </label>
7136
7929
  <label>
7137
- <span>{{ tx('editor.field.href', 'Link URL') }}</span>
7930
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
7138
7931
  <input
7139
- [ngModel]="getStringField(node, 'href')"
7140
- (ngModelChange)="setString('href', $event)"
7932
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
7933
+ (ngModelChange)="setString('imageSrcExpr', $event)"
7141
7934
  />
7142
7935
  </label>
7143
- }
7144
- @case ('metric') {
7145
7936
  <label>
7146
- <span>{{ tx('editor.field.label', 'Label') }}</span>
7937
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
7147
7938
  <input
7148
- [ngModel]="getStringField(node, 'label')"
7149
- (ngModelChange)="setString('label', $event)"
7939
+ [ngModel]="getStringField(node, 'initials')"
7940
+ (ngModelChange)="setString('initials', $event)"
7150
7941
  />
7151
7942
  </label>
7152
7943
  <label>
7153
- <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
7944
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
7154
7945
  <input
7155
- [ngModel]="getStringField(node, 'valueExpr')"
7156
- (ngModelChange)="setString('valueExpr', $event)"
7946
+ [ngModel]="getStringField(node, 'initialsExpr')"
7947
+ (ngModelChange)="setString('initialsExpr', $event)"
7157
7948
  />
7158
7949
  </label>
7159
7950
  }
7160
- @case ('progress') {
7951
+ @case ('image') {
7952
+ <label>
7953
+ <span>{{ tx('editor.field.src', 'Image URL') }}</span>
7954
+ <input
7955
+ [ngModel]="getStringField(node, 'src')"
7956
+ (ngModelChange)="setString('src', $event)"
7957
+ />
7958
+ </label>
7959
+ <label>
7960
+ <span>{{ tx('editor.field.srcExpr', 'Image URL binding') }}</span>
7961
+ <input
7962
+ [ngModel]="getStringField(node, 'srcExpr')"
7963
+ (ngModelChange)="setString('srcExpr', $event)"
7964
+ />
7965
+ </label>
7966
+ <label>
7967
+ <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
7968
+ <input
7969
+ [ngModel]="getStringField(node, 'alt')"
7970
+ (ngModelChange)="setString('alt', $event)"
7971
+ />
7972
+ </label>
7973
+ <label>
7974
+ <span>{{ tx('editor.field.altExpr', 'Alt text binding') }}</span>
7975
+ <input
7976
+ [ngModel]="getStringField(node, 'altExpr')"
7977
+ (ngModelChange)="setString('altExpr', $event)"
7978
+ />
7979
+ </label>
7980
+ }
7981
+ @case ('link') {
7982
+ <label>
7983
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
7984
+ <input
7985
+ [ngModel]="getStringField(node, 'label')"
7986
+ (ngModelChange)="setString('label', $event)"
7987
+ />
7988
+ </label>
7989
+ <label>
7990
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
7991
+ <input
7992
+ [ngModel]="getStringField(node, 'labelExpr')"
7993
+ (ngModelChange)="setString('labelExpr', $event)"
7994
+ />
7995
+ </label>
7996
+ <label>
7997
+ <span>{{ tx('editor.field.href', 'Link URL') }}</span>
7998
+ <input
7999
+ [ngModel]="getStringField(node, 'href')"
8000
+ (ngModelChange)="setString('href', $event)"
8001
+ />
8002
+ </label>
8003
+ <label>
8004
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
8005
+ <select
8006
+ [ngModel]="getStringField(node, 'target') || '_self'"
8007
+ (ngModelChange)="setString('target', $event)"
8008
+ >
8009
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
8010
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
8011
+ </select>
8012
+ </label>
8013
+ <label>
8014
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
8015
+ <input
8016
+ [ngModel]="getStringField(node, 'rel')"
8017
+ (ngModelChange)="setString('rel', $event)"
8018
+ />
8019
+ </label>
8020
+ }
8021
+ @case ('metric') {
8022
+ <label>
8023
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
8024
+ <input
8025
+ [ngModel]="getStringField(node, 'label')"
8026
+ (ngModelChange)="setString('label', $event)"
8027
+ />
8028
+ </label>
8029
+ <label>
8030
+ <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
8031
+ <input
8032
+ [ngModel]="getStringField(node, 'valueExpr')"
8033
+ (ngModelChange)="setString('valueExpr', $event)"
8034
+ />
8035
+ </label>
8036
+ }
8037
+ @case ('progress') {
7161
8038
  <label>
7162
8039
  <span>{{ tx('editor.field.label', 'Label') }}</span>
7163
8040
  <input
@@ -7165,6 +8042,20 @@ class PraxisRichContentConfigEditor {
7165
8042
  (ngModelChange)="setString('label', $event)"
7166
8043
  />
7167
8044
  </label>
8045
+ <label>
8046
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
8047
+ <input
8048
+ [ngModel]="getStringField(node, 'labelExpr')"
8049
+ (ngModelChange)="setString('labelExpr', $event)"
8050
+ />
8051
+ </label>
8052
+ <label>
8053
+ <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
8054
+ <input
8055
+ [ngModel]="getStringField(node, 'valueExpr')"
8056
+ (ngModelChange)="setString('valueExpr', $event)"
8057
+ />
8058
+ </label>
7168
8059
  <label>
7169
8060
  <span>{{ tx('editor.field.max', 'Maximum') }}</span>
7170
8061
  <input
@@ -7418,7 +8309,59 @@ class PraxisRichContentConfigEditor {
7418
8309
  </div>
7419
8310
  </ng-template>
7420
8311
 
7421
- <section class="prx-rich-editor__blocks">
8312
+ <nav
8313
+ class="prx-rich-editor__tabs"
8314
+ [attr.aria-label]="tx('editor.workbenchTabs', 'Editor sections')"
8315
+ role="tablist"
8316
+ >
8317
+ <button
8318
+ type="button"
8319
+ role="tab"
8320
+ class="prx-rich-editor__tab"
8321
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'guided'"
8322
+ [attr.aria-selected]="activeEditorPanel === 'guided'"
8323
+ (click)="selectEditorPanel('guided')"
8324
+ data-testid="rich-content-guided-tab"
8325
+ >
8326
+ {{ tx('editor.guidedEditing', 'Guided editing') }}
8327
+ </button>
8328
+ <button
8329
+ type="button"
8330
+ role="tab"
8331
+ class="prx-rich-editor__tab"
8332
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'preview'"
8333
+ [attr.aria-selected]="activeEditorPanel === 'preview'"
8334
+ (click)="selectEditorPanel('preview')"
8335
+ data-testid="rich-content-preview-tab"
8336
+ >
8337
+ {{ tx('editor.preview', 'Preview') }}
8338
+ </button>
8339
+ <button
8340
+ type="button"
8341
+ role="tab"
8342
+ class="prx-rich-editor__tab"
8343
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'json'"
8344
+ [attr.aria-selected]="activeEditorPanel === 'json'"
8345
+ (click)="selectEditorPanel('json')"
8346
+ data-testid="rich-content-json-tab"
8347
+ >
8348
+ {{ tx('editor.document', 'Advanced JSON') }}
8349
+ @if (!valid || validationIssues.length) {
8350
+ <span class="prx-rich-editor__tab-badge">
8351
+ {{
8352
+ validationIssues.length || tx('editor.invalidBadge', 'Invalid')
8353
+ }}
8354
+ </span>
8355
+ }
8356
+ </button>
8357
+ </nav>
8358
+
8359
+ @if (activeEditorPanel === 'guided') {
8360
+ <section
8361
+ class="prx-rich-editor__blocks"
8362
+ role="tabpanel"
8363
+ [attr.aria-label]="tx('editor.guidedEditing', 'Guided editing')"
8364
+ >
7422
8365
  <header class="prx-rich-editor__section-header">
7423
8366
  <div>
7424
8367
  <h3>{{ tx('editor.blocks', 'Blocks') }}</h3>
@@ -7455,8 +8398,83 @@ class PraxisRichContentConfigEditor {
7455
8398
  </header>
7456
8399
 
7457
8400
  @if (parsedDocument?.nodes?.length) {
8401
+ <div class="prx-rich-editor__authoring-shell">
8402
+ <aside
8403
+ class="prx-rich-editor__structure"
8404
+ [attr.aria-label]="tx('editor.structure', 'Document structure')"
8405
+ >
8406
+ <div class="prx-rich-editor__structure-summary">
8407
+ <strong>{{ tx('editor.structure', 'Document structure') }}</strong>
8408
+ <span>
8409
+ {{
8410
+ tx('editor.structureHelp', 'Select a block to edit its properties.')
8411
+ }}
8412
+ </span>
8413
+ </div>
8414
+ <div class="prx-rich-editor__structure-list">
8415
+ @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
8416
+ <button
8417
+ type="button"
8418
+ class="prx-rich-editor__structure-item"
8419
+ [class.prx-rich-editor__structure-item--selected]="selectedNodeIndex === nodeIndex"
8420
+ [attr.aria-current]="selectedNodeIndex === nodeIndex ? 'true' : null"
8421
+ (click)="selectTopLevelNode(nodeIndex)"
8422
+ [attr.data-testid]="'rich-content-node-selector-' + nodeIndex"
8423
+ >
8424
+ <span class="prx-rich-editor__node-eyebrow">
8425
+ {{ tx('editor.block', 'Block') }} {{ nodeIndex + 1 }}
8426
+ </span>
8427
+ <strong>{{ tx('editor.nodeType.' + node.type, node.type) }}</strong>
8428
+ @if (getIssueCount('$.nodes[' + nodeIndex + ']'); as issueCount) {
8429
+ <small>
8430
+ {{ tx('editor.hasIssues', 'Needs attention') }}
8431
+ <span class="prx-rich-editor__issue-count">{{ issueCount }}</span>
8432
+ </small>
8433
+ }
8434
+ </button>
8435
+ }
8436
+ </div>
8437
+ </aside>
8438
+
8439
+ <div class="prx-rich-editor__properties">
8440
+ <header class="prx-rich-editor__section-header">
8441
+ <div>
8442
+ <h3>{{ tx('editor.properties', 'Properties') }}</h3>
8443
+ <p>
8444
+ {{
8445
+ tx(
8446
+ 'editor.propertiesHelp',
8447
+ 'Edit the selected block without leaving the document structure.'
8448
+ )
8449
+ }}
8450
+ </p>
8451
+ </div>
8452
+ </header>
8453
+ <div
8454
+ class="prx-rich-editor__intent-strip"
8455
+ [attr.aria-label]="tx('editor.intentNavigation', 'Property sections')"
8456
+ >
8457
+ <span>
8458
+ <strong>{{ tx('editor.intent.content', 'Content') }}</strong>
8459
+ <small>{{ tx('editor.intent.contentHelp', 'Primary block fields') }}</small>
8460
+ </span>
8461
+ <span>
8462
+ <strong>{{ tx('editor.intent.presentation', 'Presentation') }}</strong>
8463
+ <small>{{ tx('editor.intent.presentationHelp', 'Visual affordances') }}</small>
8464
+ </span>
8465
+ <button type="button" (click)="openAdvancedRules()">
8466
+ <strong>{{ tx('editor.intent.dataRules', 'Data and rules') }}</strong>
8467
+ <small>{{ tx('editor.intent.dataRulesHelp', 'Metadata and gates') }}</small>
8468
+ @if (getSelectedNodeIssueCount(); as selectedIssueCount) {
8469
+ <span class="prx-rich-editor__issue-count">
8470
+ {{ selectedIssueCount }}
8471
+ </span>
8472
+ }
8473
+ </button>
8474
+ </div>
7458
8475
  <div class="prx-rich-editor__node-list">
7459
8476
  @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
8477
+ @if (selectedNodeIndex === nodeIndex) {
7460
8478
  <article
7461
8479
  class="prx-rich-editor__node-card"
7462
8480
  [attr.data-rich-editor-node-type]="node.type"
@@ -7595,19 +8613,124 @@ class PraxisRichContentConfigEditor {
7595
8613
  />
7596
8614
  </label>
7597
8615
  }
7598
- @case ('image') {
8616
+ @case ('avatar') {
8617
+ <label>
8618
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
8619
+ <input
8620
+ [ngModel]="getStringField(node, 'name')"
8621
+ (ngModelChange)="setStringField($index, 'name', $event)"
8622
+ />
8623
+ </label>
8624
+ <label>
8625
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
8626
+ <input
8627
+ [ngModel]="getStringField(node, 'nameExpr')"
8628
+ (ngModelChange)="setStringField($index, 'nameExpr', $event)"
8629
+ [placeholder]="tx('editor.placeholder.nameExpr', 'row.name')"
8630
+ />
8631
+ </label>
8632
+ <label>
8633
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
8634
+ <input
8635
+ [ngModel]="getStringField(node, 'imageSrc')"
8636
+ (ngModelChange)="setStringField($index, 'imageSrc', $event)"
8637
+ />
8638
+ </label>
8639
+ <label>
8640
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
8641
+ <input
8642
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
8643
+ (ngModelChange)="setStringField($index, 'imageSrcExpr', $event)"
8644
+ [placeholder]="tx('editor.placeholder.imageSrcExpr', 'row.avatarUrl')"
8645
+ />
8646
+ </label>
7599
8647
  <label>
7600
- <span>{{ tx('editor.field.src', 'Image URL') }}</span>
8648
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
7601
8649
  <input
7602
- [ngModel]="getStringField(node, 'src')"
7603
- (ngModelChange)="setStringField($index, 'src', $event)"
8650
+ [ngModel]="getStringField(node, 'initials')"
8651
+ (ngModelChange)="setStringField($index, 'initials', $event)"
7604
8652
  />
7605
8653
  </label>
7606
8654
  <label>
7607
- <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
8655
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
7608
8656
  <input
7609
- [ngModel]="getStringField(node, 'alt')"
7610
- (ngModelChange)="setStringField($index, 'alt', $event)"
8657
+ [ngModel]="getStringField(node, 'initialsExpr')"
8658
+ (ngModelChange)="setStringField($index, 'initialsExpr', $event)"
8659
+ [placeholder]="tx('editor.placeholder.initialsExpr', 'row.initials')"
8660
+ />
8661
+ </label>
8662
+ }
8663
+ @case ('image') {
8664
+ <label>
8665
+ <span>{{ tx('editor.field.src', 'Image URL') }}</span>
8666
+ <input
8667
+ [ngModel]="getStringField(node, 'src')"
8668
+ (ngModelChange)="setStringField($index, 'src', $event)"
8669
+ />
8670
+ </label>
8671
+ <label>
8672
+ <span>{{ tx('editor.field.srcExpr', 'Image URL binding') }}</span>
8673
+ <input
8674
+ [ngModel]="getStringField(node, 'srcExpr')"
8675
+ (ngModelChange)="setStringField($index, 'srcExpr', $event)"
8676
+ [placeholder]="tx('editor.placeholder.srcExpr', 'row.imageUrl')"
8677
+ />
8678
+ </label>
8679
+ <label>
8680
+ <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
8681
+ <input
8682
+ [ngModel]="getStringField(node, 'alt')"
8683
+ (ngModelChange)="setStringField($index, 'alt', $event)"
8684
+ />
8685
+ </label>
8686
+ <label>
8687
+ <span>{{ tx('editor.field.altExpr', 'Alt text binding') }}</span>
8688
+ <input
8689
+ [ngModel]="getStringField(node, 'altExpr')"
8690
+ (ngModelChange)="setStringField($index, 'altExpr', $event)"
8691
+ [placeholder]="tx('editor.placeholder.altExpr', 'row.imageAlt')"
8692
+ />
8693
+ </label>
8694
+ }
8695
+ @case ('link') {
8696
+ <label>
8697
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
8698
+ <input
8699
+ [ngModel]="getStringField(node, 'label')"
8700
+ (ngModelChange)="setStringField($index, 'label', $event)"
8701
+ />
8702
+ </label>
8703
+ <label>
8704
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
8705
+ <input
8706
+ [ngModel]="getStringField(node, 'labelExpr')"
8707
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
8708
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.linkLabel')"
8709
+ />
8710
+ </label>
8711
+ <label class="prx-rich-editor__wide-field">
8712
+ <span>{{ tx('editor.field.href', 'Link URL') }}</span>
8713
+ <input
8714
+ [ngModel]="getStringField(node, 'href')"
8715
+ (ngModelChange)="setStringField($index, 'href', $event)"
8716
+ />
8717
+ </label>
8718
+ <label>
8719
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
8720
+ <select
8721
+ [ngModel]="getStringField(node, 'target') || '_self'"
8722
+ (ngModelChange)="setStringField($index, 'target', $event)"
8723
+ >
8724
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
8725
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
8726
+ </select>
8727
+ </label>
8728
+ <label>
8729
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
8730
+ <input
8731
+ [ngModel]="getStringField(node, 'rel')"
8732
+ (ngModelChange)="setStringField($index, 'rel', $event)"
8733
+ [placeholder]="tx('editor.placeholder.rel', 'noopener noreferrer')"
7611
8734
  />
7612
8735
  </label>
7613
8736
  }
@@ -7619,6 +8742,14 @@ class PraxisRichContentConfigEditor {
7619
8742
  (ngModelChange)="setStringField($index, 'label', $event)"
7620
8743
  />
7621
8744
  </label>
8745
+ <label>
8746
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
8747
+ <input
8748
+ [ngModel]="getStringField(node, 'labelExpr')"
8749
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
8750
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.status')"
8751
+ />
8752
+ </label>
7622
8753
  <label>
7623
8754
  <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
7624
8755
  <input
@@ -7660,6 +8791,14 @@ class PraxisRichContentConfigEditor {
7660
8791
  (ngModelChange)="setNumberField($index, 'max', $event)"
7661
8792
  />
7662
8793
  </label>
8794
+ <label class="prx-rich-editor__checkbox-field">
8795
+ <input
8796
+ type="checkbox"
8797
+ [ngModel]="getBooleanField(node, 'showPercent')"
8798
+ (ngModelChange)="setBooleanField($index, 'showPercent', $event)"
8799
+ />
8800
+ <span>{{ tx('editor.field.showPercent', 'Show percent') }}</span>
8801
+ </label>
7663
8802
  }
7664
8803
  @case ('actionButton') {
7665
8804
  <label>
@@ -7755,6 +8894,14 @@ class PraxisRichContentConfigEditor {
7755
8894
  <option value="xl">xl</option>
7756
8895
  </select>
7757
8896
  </label>
8897
+ <label class="prx-rich-editor__checkbox-field">
8898
+ <input
8899
+ type="checkbox"
8900
+ [ngModel]="getBooleanField(node, 'wrap')"
8901
+ (ngModelChange)="setBooleanField($index, 'wrap', $event)"
8902
+ />
8903
+ <span>{{ tx('editor.field.wrap', 'Wrap items') }}</span>
8904
+ </label>
7758
8905
  <div class="prx-rich-editor__nested-editor">
7759
8906
  <header class="prx-rich-editor__nested-header">
7760
8907
  <h5>{{ tx('editor.composeItems', 'Compose items') }}</h5>
@@ -7812,6 +8959,14 @@ class PraxisRichContentConfigEditor {
7812
8959
  (ngModelChange)="setStringField($index, 'title', $event)"
7813
8960
  />
7814
8961
  </label>
8962
+ <label>
8963
+ <span>{{ tx('editor.field.titleExpr', 'Title binding') }}</span>
8964
+ <input
8965
+ [ngModel]="getStringField(node, 'titleExpr')"
8966
+ (ngModelChange)="setStringField($index, 'titleExpr', $event)"
8967
+ [placeholder]="tx('editor.placeholder.titleExpr', '\${decision.title}')"
8968
+ />
8969
+ </label>
7815
8970
  <label>
7816
8971
  <span>{{ tx('editor.field.subtitle', 'Subtitle') }}</span>
7817
8972
  <input
@@ -7819,6 +8974,14 @@ class PraxisRichContentConfigEditor {
7819
8974
  (ngModelChange)="setStringField($index, 'subtitle', $event)"
7820
8975
  />
7821
8976
  </label>
8977
+ <label>
8978
+ <span>{{ tx('editor.field.subtitleExpr', 'Subtitle binding') }}</span>
8979
+ <input
8980
+ [ngModel]="getStringField(node, 'subtitleExpr')"
8981
+ (ngModelChange)="setStringField($index, 'subtitleExpr', $event)"
8982
+ [placeholder]="tx('editor.placeholder.subtitleExpr', '\${decision.policySource}')"
8983
+ />
8984
+ </label>
7822
8985
  <label>
7823
8986
  <span>{{ tx('editor.field.variant', 'Variant') }}</span>
7824
8987
  <select
@@ -7856,6 +9019,16 @@ class PraxisRichContentConfigEditor {
7856
9019
  <option value="lg">{{ tx('editor.size.lg', 'Large') }}</option>
7857
9020
  </select>
7858
9021
  </label>
9022
+ <label>
9023
+ <span>{{ tx('editor.field.density', 'Density') }}</span>
9024
+ <select
9025
+ [ngModel]="getStringField(node, 'density') || 'comfortable'"
9026
+ (ngModelChange)="setStringField($index, 'density', $event)"
9027
+ >
9028
+ <option value="comfortable">{{ tx('editor.density.comfortable', 'Comfortable') }}</option>
9029
+ <option value="compact">{{ tx('editor.density.compact', 'Compact') }}</option>
9030
+ </select>
9031
+ </label>
7859
9032
  <label>
7860
9033
  <span>{{ tx('editor.field.orientation', 'Orientation') }}</span>
7861
9034
  <select
@@ -7866,6 +9039,38 @@ class PraxisRichContentConfigEditor {
7866
9039
  <option value="horizontal">{{ tx('editor.orientation.horizontal', 'Horizontal') }}</option>
7867
9040
  </select>
7868
9041
  </label>
9042
+ <label class="prx-rich-editor__checkbox-field">
9043
+ <input
9044
+ type="checkbox"
9045
+ [ngModel]="getBooleanField(node, 'loading')"
9046
+ (ngModelChange)="setBooleanField($index, 'loading', $event)"
9047
+ />
9048
+ <span>{{ tx('editor.field.loading', 'Loading') }}</span>
9049
+ </label>
9050
+ <label>
9051
+ <span>{{ tx('editor.field.loadingExpr', 'Loading binding') }}</span>
9052
+ <input
9053
+ [ngModel]="getStringField(node, 'loadingExpr')"
9054
+ (ngModelChange)="setStringField($index, 'loadingExpr', $event)"
9055
+ [placeholder]="tx('editor.placeholder.loadingExpr', 'row.loading')"
9056
+ />
9057
+ </label>
9058
+ <label class="prx-rich-editor__checkbox-field">
9059
+ <input
9060
+ type="checkbox"
9061
+ [ngModel]="getBooleanField(node, 'active')"
9062
+ (ngModelChange)="setBooleanField($index, 'active', $event)"
9063
+ />
9064
+ <span>{{ tx('editor.field.active', 'Active') }}</span>
9065
+ </label>
9066
+ <label>
9067
+ <span>{{ tx('editor.field.activeExpr', 'Active binding') }}</span>
9068
+ <input
9069
+ [ngModel]="getStringField(node, 'activeExpr')"
9070
+ (ngModelChange)="setStringField($index, 'activeExpr', $event)"
9071
+ [placeholder]="tx('editor.placeholder.activeExpr', 'row.active')"
9072
+ />
9073
+ </label>
7869
9074
  <label>
7870
9075
  <span>{{ tx('editor.field.mediaKind', 'Media') }}</span>
7871
9076
  <select
@@ -7887,6 +9092,14 @@ class PraxisRichContentConfigEditor {
7887
9092
  (ngModelChange)="setCardMediaField(nodeIndex, 'src', $event)"
7888
9093
  />
7889
9094
  </label>
9095
+ <label>
9096
+ <span>{{ tx('editor.field.mediaSrcExpr', 'Media source binding') }}</span>
9097
+ <input
9098
+ [ngModel]="getCardMediaField(nodeIndex, 'srcExpr')"
9099
+ (ngModelChange)="setCardMediaField(nodeIndex, 'srcExpr', $event)"
9100
+ [placeholder]="tx('editor.placeholder.mediaSrcExpr', 'row.mediaUrl')"
9101
+ />
9102
+ </label>
7890
9103
  <label>
7891
9104
  <span>{{ tx('editor.field.mediaAlt', 'Media alt text') }}</span>
7892
9105
  <input
@@ -7894,6 +9107,14 @@ class PraxisRichContentConfigEditor {
7894
9107
  (ngModelChange)="setCardMediaField(nodeIndex, 'alt', $event)"
7895
9108
  />
7896
9109
  </label>
9110
+ <label>
9111
+ <span>{{ tx('editor.field.mediaAltExpr', 'Media alt binding') }}</span>
9112
+ <input
9113
+ [ngModel]="getCardMediaField(nodeIndex, 'altExpr')"
9114
+ (ngModelChange)="setCardMediaField(nodeIndex, 'altExpr', $event)"
9115
+ [placeholder]="tx('editor.placeholder.mediaAltExpr', 'row.mediaAlt')"
9116
+ />
9117
+ </label>
7897
9118
  <label>
7898
9119
  <span>{{ tx('editor.field.mediaIcon', 'Media icon') }}</span>
7899
9120
  <input
@@ -7901,6 +9122,29 @@ class PraxisRichContentConfigEditor {
7901
9122
  (ngModelChange)="setCardMediaField(nodeIndex, 'icon', $event)"
7902
9123
  />
7903
9124
  </label>
9125
+ <label>
9126
+ <span>{{ tx('editor.field.mediaLabel', 'Media label') }}</span>
9127
+ <input
9128
+ [ngModel]="getCardMediaField(nodeIndex, 'label')"
9129
+ (ngModelChange)="setCardMediaField(nodeIndex, 'label', $event)"
9130
+ />
9131
+ </label>
9132
+ <label>
9133
+ <span>{{ tx('editor.field.mediaLabelExpr', 'Media label binding') }}</span>
9134
+ <input
9135
+ [ngModel]="getCardMediaField(nodeIndex, 'labelExpr')"
9136
+ (ngModelChange)="setCardMediaField(nodeIndex, 'labelExpr', $event)"
9137
+ [placeholder]="tx('editor.placeholder.mediaLabelExpr', 'row.mediaLabel')"
9138
+ />
9139
+ </label>
9140
+ <label>
9141
+ <span>{{ tx('editor.field.aspectRatio', 'Aspect ratio') }}</span>
9142
+ <input
9143
+ [ngModel]="getCardMediaField(nodeIndex, 'aspectRatio')"
9144
+ (ngModelChange)="setCardMediaField(nodeIndex, 'aspectRatio', $event)"
9145
+ [placeholder]="tx('editor.placeholder.aspectRatio', '16 / 9')"
9146
+ />
9147
+ </label>
7904
9148
  <label>
7905
9149
  <span>{{ tx('editor.field.mediaPlacement', 'Media placement') }}</span>
7906
9150
  <select
@@ -7914,6 +9158,76 @@ class PraxisRichContentConfigEditor {
7914
9158
  </select>
7915
9159
  </label>
7916
9160
  }
9161
+ <label>
9162
+ <span>{{ tx('editor.field.interactionMode', 'Interaction mode') }}</span>
9163
+ <select
9164
+ [ngModel]="getCardInteractionField(nodeIndex, 'mode') || 'none'"
9165
+ (ngModelChange)="setCardInteractionField(nodeIndex, 'mode', $event)"
9166
+ >
9167
+ <option value="none">{{ tx('editor.interaction.none', 'None') }}</option>
9168
+ <option value="action">{{ tx('editor.interaction.action', 'Action') }}</option>
9169
+ <option value="selectable">{{ tx('editor.interaction.selectable', 'Selectable') }}</option>
9170
+ </select>
9171
+ </label>
9172
+ <label class="prx-rich-editor__checkbox-field">
9173
+ <input
9174
+ type="checkbox"
9175
+ [ngModel]="getCardInteractionBooleanField(nodeIndex, 'selected')"
9176
+ (ngModelChange)="setCardInteractionBooleanField(nodeIndex, 'selected', $event)"
9177
+ />
9178
+ <span>{{ tx('editor.field.selected', 'Selected') }}</span>
9179
+ </label>
9180
+ <label>
9181
+ <span>{{ tx('editor.field.selectedExpr', 'Selected binding') }}</span>
9182
+ <input
9183
+ [ngModel]="getCardInteractionField(nodeIndex, 'selectedExpr')"
9184
+ (ngModelChange)="setCardInteractionField(nodeIndex, 'selectedExpr', $event)"
9185
+ [placeholder]="tx('editor.placeholder.selectedExpr', 'row.selected')"
9186
+ />
9187
+ </label>
9188
+ <label>
9189
+ <span>{{ tx('editor.field.interactionActionId', 'Interaction action ID') }}</span>
9190
+ <input
9191
+ [ngModel]="getCardInteractionActionField(nodeIndex, 'actionId')"
9192
+ (ngModelChange)="setCardInteractionActionField(nodeIndex, 'actionId', $event)"
9193
+ [placeholder]="tx('editor.placeholder.actionId', 'host.action.open')"
9194
+ />
9195
+ </label>
9196
+ <label>
9197
+ <span>{{ tx('editor.field.payloadExpr', 'Payload binding') }}</span>
9198
+ <input
9199
+ [ngModel]="getCardInteractionActionField(nodeIndex, 'payloadExpr')"
9200
+ (ngModelChange)="setCardInteractionActionField(nodeIndex, 'payloadExpr', $event)"
9201
+ [placeholder]="tx('editor.placeholder.payloadExpr', 'row')"
9202
+ />
9203
+ </label>
9204
+ <label>
9205
+ <span>{{ tx('editor.field.accessibilityRole', 'Accessibility role') }}</span>
9206
+ <select
9207
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'role')"
9208
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'role', $event)"
9209
+ >
9210
+ <option value="">{{ tx('editor.none', 'None') }}</option>
9211
+ <option value="article">{{ tx('editor.accessibilityRole.article', 'Article') }}</option>
9212
+ <option value="group">{{ tx('editor.accessibilityRole.group', 'Group') }}</option>
9213
+ <option value="button">{{ tx('editor.accessibilityRole.button', 'Button') }}</option>
9214
+ </select>
9215
+ </label>
9216
+ <label>
9217
+ <span>{{ tx('editor.field.ariaLabel', 'Accessible label') }}</span>
9218
+ <input
9219
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'ariaLabel')"
9220
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'ariaLabel', $event)"
9221
+ />
9222
+ </label>
9223
+ <label>
9224
+ <span>{{ tx('editor.field.ariaLabelExpr', 'Accessible label binding') }}</span>
9225
+ <input
9226
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'ariaLabelExpr')"
9227
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'ariaLabelExpr', $event)"
9228
+ [placeholder]="tx('editor.placeholder.ariaLabelExpr', 'row.ariaLabel')"
9229
+ />
9230
+ </label>
7917
9231
  <div class="prx-rich-editor__nested-editor">
7918
9232
  <header class="prx-rich-editor__nested-header">
7919
9233
  <h5>{{ tx('editor.cardContent', 'Card body') }}</h5>
@@ -8359,6 +9673,14 @@ class PraxisRichContentConfigEditor {
8359
9673
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'label', $event)"
8360
9674
  />
8361
9675
  </label>
9676
+ <label>
9677
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
9678
+ <input
9679
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'labelExpr')"
9680
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'labelExpr', $event)"
9681
+ [placeholder]="tx('editor.placeholder.tabLabelExpr', 'row.tabLabel')"
9682
+ />
9683
+ </label>
8362
9684
  <label>
8363
9685
  <span>{{ tx('editor.field.icon', 'Icon') }}</span>
8364
9686
  <input
@@ -8373,6 +9695,48 @@ class PraxisRichContentConfigEditor {
8373
9695
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badge', $event)"
8374
9696
  />
8375
9697
  </label>
9698
+ <label>
9699
+ <span>{{ tx('editor.field.badgeExpr', 'Badge binding') }}</span>
9700
+ <input
9701
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'badgeExpr')"
9702
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badgeExpr', $event)"
9703
+ [placeholder]="tx('editor.placeholder.badgeExpr', 'row.badge')"
9704
+ />
9705
+ </label>
9706
+ <label>
9707
+ <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
9708
+ <input
9709
+ [ngModel]="getTabsItemCapabilityList(nodeIndex, $index)"
9710
+ (ngModelChange)="setTabsItemCapabilityList(nodeIndex, $index, $event)"
9711
+ [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
9712
+ />
9713
+ </label>
9714
+ <label>
9715
+ <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
9716
+ <select
9717
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'capabilityMode') || 'all'"
9718
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'capabilityMode', $event)"
9719
+ >
9720
+ <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
9721
+ <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
9722
+ </select>
9723
+ </label>
9724
+ <label>
9725
+ <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
9726
+ <input
9727
+ [ngModel]="getTabsItemVisibleWhenPath(nodeIndex, $index)"
9728
+ (ngModelChange)="setTabsItemVisibleWhenPath(nodeIndex, $index, $event)"
9729
+ [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
9730
+ />
9731
+ </label>
9732
+ <label>
9733
+ <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
9734
+ <input
9735
+ [ngModel]="getTabsItemVisibleWhenValue(nodeIndex, $index)"
9736
+ (ngModelChange)="setTabsItemVisibleWhenValue(nodeIndex, $index, $event)"
9737
+ [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
9738
+ />
9739
+ </label>
8376
9740
  </div>
8377
9741
  }
8378
9742
  </div>
@@ -9035,24 +10399,24 @@ class PraxisRichContentConfigEditor {
9035
10399
  <header class="prx-rich-editor__nested-header">
9036
10400
  <h5>{{ tx('editor.decisionEvidence', 'Evidence') }}</h5>
9037
10401
  <div class="prx-rich-editor__quick-actions">
9038
- <button type="button" (click)="addDecisionPackageEvidence($index)">
10402
+ <button type="button" (click)="addDecisionPackageEvidence(nodeIndex)">
9039
10403
  {{ tx('editor.addEvidence', 'Add evidence') }}
9040
10404
  </button>
9041
10405
  </div>
9042
10406
  </header>
9043
- @for (evidence of getDecisionPackageEvidence($index); track evidence.id ?? $index; let evidenceIndex = $index) {
10407
+ @for (evidence of getDecisionPackageEvidence(nodeIndex); track evidence.id ?? $index; let evidenceIndex = $index) {
9044
10408
  <div class="prx-rich-editor__nested-node">
9045
10409
  <div class="prx-rich-editor__nested-actions">
9046
10410
  <strong>{{ tx('editor.evidence', 'Evidence') }} {{ evidenceIndex + 1 }}</strong>
9047
- @if (isRemovalPending('nodes.' + $index + '.evidence', evidenceIndex)) {
9048
- <button type="button" (click)="removeDecisionPackageEvidence($index, evidenceIndex)">
10411
+ @if (isRemovalPending('nodes.' + nodeIndex + '.evidence', evidenceIndex)) {
10412
+ <button type="button" (click)="removeDecisionPackageEvidence(nodeIndex, evidenceIndex)">
9049
10413
  {{ tx('editor.confirmRemove', 'Confirm remove') }}
9050
10414
  </button>
9051
10415
  <button type="button" (click)="cancelRemoval()">
9052
10416
  {{ tx('editor.cancelRemove', 'Cancel') }}
9053
10417
  </button>
9054
10418
  } @else {
9055
- <button type="button" (click)="requestNestedRemoval('nodes.' + $index + '.evidence', evidenceIndex)">
10419
+ <button type="button" (click)="requestNestedRemoval('nodes.' + nodeIndex + '.evidence', evidenceIndex)">
9056
10420
  {{ tx('editor.removeBlock', 'Remove') }}
9057
10421
  </button>
9058
10422
  }
@@ -9061,37 +10425,37 @@ class PraxisRichContentConfigEditor {
9061
10425
  <label>
9062
10426
  <span>{{ tx('editor.field.itemId', 'Item ID') }}</span>
9063
10427
  <input
9064
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'id')"
9065
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'id', $event)"
10428
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id')"
10429
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id', $event)"
9066
10430
  />
9067
10431
  </label>
9068
10432
  <label>
9069
10433
  <span>{{ tx('editor.field.label', 'Label') }}</span>
9070
10434
  <input
9071
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'label')"
9072
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'label', $event)"
10435
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label')"
10436
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label', $event)"
9073
10437
  />
9074
10438
  </label>
9075
10439
  <label>
9076
10440
  <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
9077
10441
  <input
9078
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr')"
9079
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr', $event)"
10442
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr')"
10443
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr', $event)"
9080
10444
  [placeholder]="tx('editor.placeholder.evidenceLabelExpr', '\${evidence.label}')"
9081
10445
  />
9082
10446
  </label>
9083
10447
  <label>
9084
10448
  <span>{{ tx('editor.field.source', 'Source') }}</span>
9085
10449
  <input
9086
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'source')"
9087
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'source', $event)"
10450
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source')"
10451
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source', $event)"
9088
10452
  />
9089
10453
  </label>
9090
10454
  <label>
9091
10455
  <span>{{ tx('editor.field.sourceExpr', 'Source binding') }}</span>
9092
10456
  <input
9093
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr')"
9094
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr', $event)"
10457
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr')"
10458
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr', $event)"
9095
10459
  [placeholder]="tx('editor.placeholder.evidenceSourceExpr', '\${evidence.source}')"
9096
10460
  />
9097
10461
  </label>
@@ -9104,27 +10468,27 @@ class PraxisRichContentConfigEditor {
9104
10468
  <header class="prx-rich-editor__nested-header">
9105
10469
  <h5>{{ tx('editor.decisionPrimaryAction', 'Primary action') }}</h5>
9106
10470
  <div class="prx-rich-editor__quick-actions">
9107
- @if (getDecisionPackagePrimaryAction($index)) {
9108
- <button type="button" (click)="removeDecisionPackagePrimaryAction($index)">
10471
+ @if (getDecisionPackagePrimaryAction(nodeIndex)) {
10472
+ <button type="button" (click)="removeDecisionPackagePrimaryAction(nodeIndex)">
9109
10473
  {{ tx('editor.removeBlock', 'Remove') }}
9110
10474
  </button>
9111
10475
  } @else {
9112
- <button type="button" (click)="addDecisionPackagePrimaryActionPreset($index, 'primary')">
10476
+ <button type="button" (click)="addDecisionPackagePrimaryActionPreset(nodeIndex, 'primary')">
9113
10477
  {{ tx('editor.addPrimaryAction', 'Add primary action') }}
9114
10478
  </button>
9115
- <button type="button" (click)="addDecisionPackagePrimaryAction($index)">
10479
+ <button type="button" (click)="addDecisionPackagePrimaryAction(nodeIndex)">
9116
10480
  {{ tx('editor.addAction', 'Add action') }}
9117
10481
  </button>
9118
10482
  }
9119
10483
  </div>
9120
10484
  </header>
9121
- @if (getDecisionPackagePrimaryAction($index); as primaryAction) {
10485
+ @if (getDecisionPackagePrimaryAction(nodeIndex); as primaryAction) {
9122
10486
  <div class="prx-rich-editor__node-grid">
9123
10487
  <ng-container
9124
10488
  *ngTemplateOutlet="actionFields; context: {
9125
10489
  action: primaryAction,
9126
- path: '$.nodes[' + $index + '].primaryAction',
9127
- setField: setDecisionPackagePrimaryActionField.bind(this, $index)
10490
+ path: '$.nodes[' + nodeIndex + '].primaryAction',
10491
+ setField: setDecisionPackagePrimaryActionField.bind(this, nodeIndex)
9128
10492
  }"
9129
10493
  ></ng-container>
9130
10494
  </div>
@@ -9763,97 +11127,216 @@ class PraxisRichContentConfigEditor {
9763
11127
  </p>
9764
11128
  }
9765
11129
  }
9766
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
9767
- <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
9768
- <label>
9769
- <span>{{ tx('editor.field.testId', 'Test id') }}</span>
9770
- <input
9771
- [ngModel]="getStringField(node, 'testId')"
9772
- (ngModelChange)="setStringField($index, 'testId', $event)"
9773
- [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
9774
- />
9775
- </label>
9776
- <label>
9777
- <span>{{ tx('editor.field.className', 'CSS class') }}</span>
9778
- <input
9779
- [ngModel]="getStringField(node, 'className')"
9780
- (ngModelChange)="setStringField($index, 'className', $event)"
9781
- [placeholder]="tx('editor.placeholder.className', 'hero-title')"
9782
- />
9783
- </label>
9784
- <label>
9785
- <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
9786
- <input
9787
- [ngModel]="getCapabilityList(node)"
9788
- (ngModelChange)="setCapabilityList($index, $event)"
9789
- [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
9790
- />
9791
- </label>
9792
- <label>
9793
- <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
9794
- <select
9795
- [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
9796
- (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
9797
- >
9798
- <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
9799
- <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
9800
- </select>
9801
- </label>
9802
- </fieldset>
11130
+ <details
11131
+ class="prx-rich-editor__advanced-group"
11132
+ [open]="advancedRulesOpen"
11133
+ (toggle)="onAdvancedRulesToggle($event)"
11134
+ >
11135
+ <summary>
11136
+ <span>{{ tx('editor.advancedDataRules', 'Advanced data and rules') }}</span>
11137
+ <small>
11138
+ {{
11139
+ tx(
11140
+ 'editor.advancedDataRulesHelp',
11141
+ 'Metadata, capability gates, visibility and safe style.'
11142
+ )
11143
+ }}
11144
+ </small>
11145
+ </summary>
9803
11146
 
9804
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
9805
- <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
9806
- <label>
9807
- <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
9808
- <input
9809
- [ngModel]="getVisibleWhenPath(node)"
9810
- (ngModelChange)="setVisibleWhenPath($index, $event)"
9811
- [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
9812
- />
9813
- </label>
9814
- <label>
9815
- <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
9816
- <input
9817
- [ngModel]="getVisibleWhenValue(node)"
9818
- (ngModelChange)="setVisibleWhenValue($index, $event)"
9819
- [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
9820
- />
9821
- </label>
9822
- </fieldset>
11147
+ <fieldset class="prx-rich-editor__field-group">
11148
+ <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
11149
+ <label>
11150
+ <span>{{ tx('editor.field.testId', 'Test id') }}</span>
11151
+ <input
11152
+ [ngModel]="getStringField(node, 'testId')"
11153
+ (ngModelChange)="setStringField($index, 'testId', $event)"
11154
+ [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
11155
+ />
11156
+ </label>
11157
+ <label>
11158
+ <span>{{ tx('editor.field.className', 'CSS class') }}</span>
11159
+ <input
11160
+ [ngModel]="getStringField(node, 'className')"
11161
+ (ngModelChange)="setStringField($index, 'className', $event)"
11162
+ [placeholder]="tx('editor.placeholder.className', 'hero-title')"
11163
+ />
11164
+ </label>
11165
+ <label>
11166
+ <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
11167
+ <input
11168
+ [ngModel]="getCapabilityList(node)"
11169
+ (ngModelChange)="setCapabilityList($index, $event)"
11170
+ [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
11171
+ />
11172
+ </label>
11173
+ <label>
11174
+ <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
11175
+ <select
11176
+ [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
11177
+ (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
11178
+ >
11179
+ <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
11180
+ <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
11181
+ </select>
11182
+ </label>
11183
+ </fieldset>
9823
11184
 
9824
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
9825
- <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
9826
- <label>
9827
- <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
9828
- <input
9829
- [ngModel]="getFirstStyleName(node)"
9830
- (ngModelChange)="setFirstStyleName($index, $event)"
9831
- [placeholder]="tx('editor.placeholder.styleName', 'color')"
9832
- />
9833
- </label>
9834
- <label>
9835
- <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
9836
- <input
9837
- [ngModel]="getFirstStyleValue(node)"
9838
- (ngModelChange)="setFirstStyleValue($index, $event)"
9839
- [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
9840
- />
9841
- </label>
9842
- </fieldset>
11185
+ <fieldset class="prx-rich-editor__field-group">
11186
+ <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
11187
+ <label>
11188
+ <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
11189
+ <input
11190
+ [ngModel]="getVisibleWhenPath(node)"
11191
+ (ngModelChange)="setVisibleWhenPath($index, $event)"
11192
+ [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
11193
+ />
11194
+ </label>
11195
+ <label>
11196
+ <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
11197
+ <input
11198
+ [ngModel]="getVisibleWhenValue(node)"
11199
+ (ngModelChange)="setVisibleWhenValue($index, $event)"
11200
+ [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
11201
+ />
11202
+ </label>
11203
+ </fieldset>
11204
+
11205
+ <fieldset class="prx-rich-editor__field-group">
11206
+ <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
11207
+ <label>
11208
+ <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
11209
+ <input
11210
+ [ngModel]="getFirstStyleName(node)"
11211
+ (ngModelChange)="setFirstStyleName($index, $event)"
11212
+ [placeholder]="tx('editor.placeholder.styleName', 'color')"
11213
+ />
11214
+ </label>
11215
+ <label>
11216
+ <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
11217
+ <input
11218
+ [ngModel]="getFirstStyleValue(node)"
11219
+ (ngModelChange)="setFirstStyleValue($index, $event)"
11220
+ [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
11221
+ />
11222
+ </label>
11223
+ </fieldset>
11224
+
11225
+ @if (getAdvancedJsonOnlyFields(node).length) {
11226
+ <aside class="prx-rich-editor__advanced-json-map">
11227
+ <strong>{{ tx('editor.advancedJsonFields', 'Advanced JSON fields present') }}</strong>
11228
+ <p>
11229
+ {{
11230
+ tx(
11231
+ 'editor.advancedJsonFieldsHelp',
11232
+ 'These canonical fields are preserved by guided edits and remain editable in the Advanced JSON tab.'
11233
+ )
11234
+ }}
11235
+ </p>
11236
+ <div class="prx-rich-editor__advanced-json-chips">
11237
+ @for (field of getAdvancedJsonOnlyFields(node); track field) {
11238
+ <code>{{ field }}</code>
11239
+ }
11240
+ </div>
11241
+ </aside>
11242
+ }
11243
+
11244
+ <fieldset class="prx-rich-editor__field-group prx-rich-editor__json-fieldset">
11245
+ <legend>{{ tx('editor.advancedJsonEditor', 'Advanced JSON editor') }}</legend>
11246
+ <p class="prx-rich-editor__field-help">
11247
+ {{
11248
+ tx(
11249
+ 'editor.advancedJsonEditorHelp',
11250
+ 'Edit canonical data bindings and JsonLogic rule fields without leaving guided editing.'
11251
+ )
11252
+ }}
11253
+ </p>
11254
+ @for (field of advancedJsonOnlyNodeFields; track field) {
11255
+ <label class="prx-rich-editor__wide-field prx-rich-editor__json-field">
11256
+ <span>{{ tx('editor.field.' + field, field) }}</span>
11257
+ <textarea
11258
+ [ngModel]="getAdvancedJsonFieldValue(nodeIndex, node, field)"
11259
+ (ngModelChange)="setAdvancedJsonField(nodeIndex, field, $event)"
11260
+ [placeholder]="getAdvancedJsonFieldPlaceholder(field)"
11261
+ [class.invalid]="getAdvancedJsonFieldError(nodeIndex, field)"
11262
+ ></textarea>
11263
+ @if (getAdvancedJsonFieldError(nodeIndex, field)) {
11264
+ <small class="prx-rich-editor__field-error">
11265
+ {{ getAdvancedJsonFieldError(nodeIndex, field) }}
11266
+ </small>
11267
+ }
11268
+ </label>
11269
+ }
11270
+ </fieldset>
11271
+ </details>
9843
11272
  </div>
9844
11273
  </article>
11274
+ }
9845
11275
  }
9846
11276
  </div>
11277
+ </div>
11278
+ </div>
9847
11279
  } @else {
9848
11280
  <p class="prx-rich-editor__empty">
9849
11281
  {{ tx('editor.noBlocks', 'No blocks yet. Add a block to start authoring this document.') }}
9850
11282
  </p>
9851
11283
  }
9852
11284
  </section>
11285
+ }
9853
11286
 
9854
- <label class="prx-rich-editor__document">
9855
- <span>{{ tx('editor.document', 'Advanced JSON') }}</span>
11287
+ @if (activeEditorPanel === 'preview') {
11288
+ <section
11289
+ class="prx-rich-editor__preview-panel"
11290
+ role="tabpanel"
11291
+ [attr.aria-label]="tx('editor.preview', 'Preview')"
11292
+ >
11293
+ <header class="prx-rich-editor__section-header">
11294
+ <div>
11295
+ <h3>{{ tx('editor.preview', 'Preview') }}</h3>
11296
+ <p>
11297
+ {{
11298
+ tx(
11299
+ 'editor.previewHelp',
11300
+ 'Inspect the materialized document without mixing preview with authoring fields.'
11301
+ )
11302
+ }}
11303
+ </p>
11304
+ </div>
11305
+ </header>
11306
+ @if (parsedDocument) {
11307
+ <div class="prx-rich-editor__preview prx-rich-editor__preview--large">
11308
+ <praxis-rich-content
11309
+ [document]="parsedDocument"
11310
+ [layout]="layout"
11311
+ [rootClassName]="rootClassName"
11312
+ ></praxis-rich-content>
11313
+ </div>
11314
+ } @else {
11315
+ <p class="prx-rich-editor__empty">
11316
+ {{ tx('editor.previewUnavailable', 'Preview is unavailable until the document is valid.') }}
11317
+ </p>
11318
+ }
11319
+ </section>
11320
+ }
11321
+
11322
+ @if (activeEditorPanel === 'json') {
11323
+ <section class="prx-rich-editor__document-panel">
11324
+ <header class="prx-rich-editor__section-header">
11325
+ <div>
11326
+ <h3>{{ tx('editor.document', 'Advanced JSON') }}</h3>
11327
+ <p>
11328
+ {{
11329
+ tx(
11330
+ 'editor.documentAdvancedHelp',
11331
+ 'Use JSON for diagnostics, migration and advanced fields that are not yet surfaced by guided controls.'
11332
+ )
11333
+ }}
11334
+ </p>
11335
+ </div>
11336
+ </header>
9856
11337
  <div class="prx-rich-editor__workbench">
11338
+ <label class="prx-rich-editor__document">
11339
+ <span>{{ tx('editor.documentJson', 'Canonical document JSON') }}</span>
9857
11340
  <textarea
9858
11341
  name="rich-content-document"
9859
11342
  [(ngModel)]="documentJson"
@@ -9867,6 +11350,7 @@ class PraxisRichContentConfigEditor {
9867
11350
  spellcheck="false"
9868
11351
  data-testid="rich-content-document-input"
9869
11352
  ></textarea>
11353
+ </label>
9870
11354
 
9871
11355
  <aside
9872
11356
  class="prx-rich-editor__inspector"
@@ -9886,21 +11370,9 @@ class PraxisRichContentConfigEditor {
9886
11370
  </dl>
9887
11371
  </section>
9888
11372
 
9889
- @if (parsedDocument) {
9890
- <section>
9891
- <h3>{{ tx('editor.preview', 'Preview') }}</h3>
9892
- <div class="prx-rich-editor__preview">
9893
- <praxis-rich-content
9894
- [document]="parsedDocument"
9895
- [layout]="layout"
9896
- [rootClassName]="rootClassName"
9897
- ></praxis-rich-content>
9898
- </div>
9899
- </section>
9900
- }
9901
11373
  </aside>
9902
11374
  </div>
9903
- </label>
11375
+ </section>
9904
11376
 
9905
11377
  @if (errorMessage) {
9906
11378
  <div
@@ -9930,6 +11402,7 @@ class PraxisRichContentConfigEditor {
9930
11402
  }}
9931
11403
  </p>
9932
11404
  }
11405
+ }
9933
11406
 
9934
11407
  <div class="prx-rich-editor__actions">
9935
11408
  <button type="button" (click)="reset()">
@@ -9940,7 +11413,7 @@ class PraxisRichContentConfigEditor {
9940
11413
  </button>
9941
11414
  </div>
9942
11415
  </section>
9943
- `, isInline: true, styles: [":host{display:block;min-width:0}.prx-rich-editor{display:grid;gap:18px;color:var(--md-sys-color-on-surface, #1f2937)}.prx-rich-editor__header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__header h2{margin:0;font-size:1.25rem}.prx-rich-editor__header p{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673)}.prx-rich-editor__eyebrow{margin:0 0 4px;text-transform:uppercase;letter-spacing:.08em;font-size:.72rem;color:var(--md-sys-color-primary, #3154e7)}.prx-rich-editor__status{flex:0 0 auto;padding:6px 10px;border-radius:999px;background:color-mix(in srgb,#16a34a 12%,transparent);color:#166534;font-size:.78rem;font-weight:700}.prx-rich-editor__status.invalid{background:color-mix(in srgb,#dc2626 12%,transparent);color:#991b1b}.prx-rich-editor__grid{display:grid;gap:14px;grid-template-columns:minmax(0,180px) minmax(0,1fr)}.prx-rich-editor__blocks{display:grid;gap:14px}.prx-rich-editor__section-header,.prx-rich-editor__node-header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__section-header h3,.prx-rich-editor__node-header h4{margin:0}.prx-rich-editor__section-header p,.prx-rich-editor__node-note,.prx-rich-editor__empty{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.88rem}.prx-rich-editor__add-block,.prx-rich-editor__node-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.prx-rich-editor__add-block label{min-width:180px}.prx-rich-editor__node-list{display:grid;gap:12px}.prx-rich-editor__node-card{display:grid;gap:14px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__node-eyebrow{margin:0 0 4px;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.75rem;font-weight:700;text-transform:uppercase}.prx-rich-editor__node-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__wide-field,.prx-rich-editor__node-note{grid-column:1 / -1}.prx-rich-editor__field-group,.prx-rich-editor__nested-editor,.prx-rich-editor__nested-node{grid-column:1 / -1;display:grid;gap:12px}.prx-rich-editor__field-group,.prx-rich-editor__nested-node{margin:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px}.prx-rich-editor__field-group{grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__field-group legend{padding:0 4px;font-weight:700}.prx-rich-editor__nested-header,.prx-rich-editor__nested-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between}.prx-rich-editor__quick-actions{display:flex;flex-wrap:wrap;gap:8px}.prx-rich-editor__node-grid textarea{min-height:96px;font-family:inherit}label,.prx-rich-editor__document{display:grid;gap:7px;font-weight:700}.prx-rich-editor__checkbox-field{display:flex;gap:10px;align-items:center;align-self:end}.prx-rich-editor__checkbox-field input[type=checkbox]{width:auto}input,select,textarea{box-sizing:border-box;width:100%;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:12px;padding:10px 12px;font:inherit;color:inherit;background:var(--md-sys-color-surface, #fff)}textarea{min-height:360px;resize:vertical;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.86rem;line-height:1.45}.prx-rich-editor__workbench{display:grid;gap:14px;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.prx-rich-editor__inspector{display:grid;align-content:start;gap:14px;min-width:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__inspector h3{margin:0 0 8px;font-size:.95rem}.prx-rich-editor__inspector dl{display:grid;gap:8px;margin:0}.prx-rich-editor__inspector dl div{display:grid;gap:2px}.prx-rich-editor__inspector dt{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:700}.prx-rich-editor__inspector dd{margin:0;overflow-wrap:anywhere;font-weight:600}.prx-rich-editor__preview{max-height:260px;overflow:auto;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__help{margin:-8px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.85rem}.prx-rich-editor__error{margin:0;padding:10px 12px;border-radius:8px;color:#991b1b;background:color-mix(in srgb,#dc2626 9%,transparent)}.prx-rich-editor__error p{margin:0}.prx-rich-editor__error ul{display:grid;gap:6px;margin:8px 0 0;padding-inline-start:18px}.prx-rich-editor__error code{margin-right:4px;font-family:Cascadia Code,Fira Code,Consolas,monospace}.prx-rich-editor__actions{display:flex;flex-wrap:wrap;gap:10px}button{border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:8px 14px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);font-weight:700;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}@media(max-width:760px){.prx-rich-editor__header,.prx-rich-editor__section-header,.prx-rich-editor__node-header,.prx-rich-editor__grid,.prx-rich-editor__field-group,.prx-rich-editor__node-grid,.prx-rich-editor__workbench{grid-template-columns:1fr;display:grid}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11416
+ `, isInline: true, styles: [":host{display:block;min-width:0;width:100%;max-width:100%;box-sizing:border-box}.prx-rich-editor{display:grid;gap:18px;min-width:0;color:var(--md-sys-color-on-surface, #1f2937)}.prx-rich-editor__header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__header h2{margin:0;font-size:1.25rem}.prx-rich-editor__header p{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673)}.prx-rich-editor__eyebrow{margin:0 0 4px;text-transform:uppercase;letter-spacing:.08em;font-size:.72rem;color:var(--md-sys-color-primary, #3154e7)}.prx-rich-editor__status{flex:0 0 auto;padding:6px 10px;border-radius:999px;background:color-mix(in srgb,#16a34a 12%,transparent);color:#166534;font-size:.78rem;font-weight:700}.prx-rich-editor__status.invalid{background:color-mix(in srgb,#dc2626 12%,transparent);color:#991b1b}.prx-rich-editor__grid{display:grid;gap:14px;grid-template-columns:minmax(0,180px) minmax(0,1fr)}.prx-rich-editor__tabs{display:flex;flex-wrap:wrap;gap:8px;align-items:center;border-bottom:1px solid var(--md-sys-color-outline-variant, #d7dce5)}.prx-rich-editor__tab{margin-block-end:-1px;border-radius:8px 8px 0 0;border-bottom-color:transparent;color:var(--md-sys-color-on-surface-variant, #5f6673);background:transparent}.prx-rich-editor__tab--active{border-color:var(--md-sys-color-outline-variant, #d7dce5);border-bottom-color:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__tab-badge,.prx-rich-editor__issue-count{display:inline-flex;min-width:1.35em;min-height:1.35em;padding:0 .38em;border-radius:999px;align-items:center;justify-content:center;background:color-mix(in srgb,#dc2626 14%,transparent);color:#991b1b;font-size:.72rem;font-weight:800;line-height:1}.prx-rich-editor__tab-badge{margin-inline-start:6px}.prx-rich-editor__blocks{display:grid;gap:14px}.prx-rich-editor__authoring-shell{display:grid;gap:14px;grid-template-columns:minmax(220px,.34fr) minmax(0,1fr);align-items:start}.prx-rich-editor__structure,.prx-rich-editor__properties,.prx-rich-editor__document-panel,.prx-rich-editor__preview-panel{min-width:0;display:grid;gap:12px}.prx-rich-editor__structure{position:sticky;top:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__structure-summary{display:grid;gap:4px}.prx-rich-editor__structure-summary span{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.82rem;font-weight:500}.prx-rich-editor__structure-list{display:grid;gap:8px}.prx-rich-editor__structure-item{display:grid;gap:3px;width:100%;padding:10px;text-align:left;color:var(--md-sys-color-on-surface, #1f2937);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__structure-item--selected{border-color:var(--md-sys-color-primary, #3154e7);background:color-mix(in srgb,var(--md-sys-color-primary, #3154e7) 8%,var(--md-sys-color-surface, #fff))}.prx-rich-editor__structure-item small{color:#991b1b;font-weight:700}.prx-rich-editor__intent-strip{display:grid;gap:8px;grid-template-columns:repeat(3,minmax(0,1fr))}.prx-rich-editor__intent-strip span,.prx-rich-editor__intent-strip button{min-width:0;display:grid;gap:3px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:10px 12px;text-align:left;color:var(--md-sys-color-on-surface, #1f2937);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__intent-strip button{position:relative}.prx-rich-editor__intent-strip small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__intent-strip .prx-rich-editor__issue-count{position:absolute;inset-block-start:8px;inset-inline-end:8px}.prx-rich-editor__section-header,.prx-rich-editor__node-header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__section-header h3,.prx-rich-editor__node-header h4{margin:0}.prx-rich-editor__section-header p,.prx-rich-editor__node-note,.prx-rich-editor__empty{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.88rem}.prx-rich-editor__add-block,.prx-rich-editor__node-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.prx-rich-editor__add-block label{min-width:180px}.prx-rich-editor__node-list{display:grid;gap:12px}.prx-rich-editor__node-card{display:grid;gap:14px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__node-eyebrow{margin:0 0 4px;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.75rem;font-weight:700;text-transform:uppercase}.prx-rich-editor__node-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__wide-field,.prx-rich-editor__node-note{grid-column:1 / -1}.prx-rich-editor__field-group,.prx-rich-editor__nested-editor,.prx-rich-editor__nested-node{grid-column:1 / -1;display:grid;gap:12px}.prx-rich-editor__field-group,.prx-rich-editor__nested-node{margin:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px}.prx-rich-editor__document-context{display:grid;gap:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__document-context summary{display:flex;gap:10px;align-items:center;justify-content:space-between;cursor:pointer;font-weight:800}.prx-rich-editor__document-context summary small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__document-context[open] summary{margin-block-end:12px}.prx-rich-editor__field-group{grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__field-group legend{padding:0 4px;font-weight:700}.prx-rich-editor__field-help{grid-column:1 / -1;margin:0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.84rem}.prx-rich-editor__json-fieldset{margin-block-start:12px}.prx-rich-editor__json-field{display:grid;gap:6px}.prx-rich-editor__json-field textarea{min-height:96px;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.8rem;line-height:1.45}.prx-rich-editor__field-error{color:var(--md-sys-color-error, #ba1a1a);font-size:.78rem;font-weight:700}.prx-rich-editor__advanced-group{grid-column:1 / -1;display:grid;gap:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 88%,var(--md-sys-color-primary, #3154e7) 4%)}.prx-rich-editor__advanced-group summary{display:flex;gap:10px;align-items:center;justify-content:space-between;cursor:pointer;font-weight:800}.prx-rich-editor__advanced-group summary small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__advanced-group[open]{padding-block-end:14px}.prx-rich-editor__advanced-group[open] summary{margin-block-end:12px}.prx-rich-editor__advanced-group .prx-rich-editor__field-group+.prx-rich-editor__field-group{margin-block-start:12px}.prx-rich-editor__advanced-json-map{display:grid;gap:8px;margin-block-start:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__advanced-json-map p{margin:0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.84rem}.prx-rich-editor__advanced-json-chips{display:flex;flex-wrap:wrap;gap:6px}.prx-rich-editor__advanced-json-chips code{border-radius:999px;padding:4px 8px;background:color-mix(in srgb,var(--md-sys-color-primary, #3154e7) 12%,transparent);color:var(--md-sys-color-primary, #3154e7);font-size:.76rem;font-weight:700}.prx-rich-editor__nested-header,.prx-rich-editor__nested-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between}.prx-rich-editor__quick-actions{display:flex;flex-wrap:wrap;gap:8px}.prx-rich-editor__node-grid textarea{min-height:96px;font-family:inherit}label,.prx-rich-editor__document{display:grid;gap:7px;font-weight:700}.prx-rich-editor__checkbox-field{display:flex;gap:10px;align-items:center;align-self:end}.prx-rich-editor__checkbox-field input[type=checkbox]{width:auto}input,select,textarea{box-sizing:border-box;width:100%;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:12px;padding:10px 12px;font:inherit;color:inherit;background:var(--md-sys-color-surface, #fff)}textarea{min-height:360px;resize:vertical;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.86rem;line-height:1.45}.prx-rich-editor__workbench{display:grid;gap:14px;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.prx-rich-editor__inspector{display:grid;align-content:start;gap:14px;min-width:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__inspector h3{margin:0 0 8px;font-size:.95rem}.prx-rich-editor__inspector dl{display:grid;gap:8px;margin:0}.prx-rich-editor__inspector dl div{display:grid;gap:2px}.prx-rich-editor__inspector dt{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:700}.prx-rich-editor__inspector dd{margin:0;overflow-wrap:anywhere;font-weight:600}.prx-rich-editor__preview{max-height:260px;overflow:auto;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__preview--large{max-height:min(68vh,760px)}.prx-rich-editor__help{margin:-8px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.85rem}.prx-rich-editor__error{margin:0;padding:10px 12px;border-radius:8px;color:#991b1b;background:color-mix(in srgb,#dc2626 9%,transparent)}.prx-rich-editor__error p{margin:0}.prx-rich-editor__error ul{display:grid;gap:6px;margin:8px 0 0;padding-inline-start:18px}.prx-rich-editor__error code{margin-right:4px;font-family:Cascadia Code,Fira Code,Consolas,monospace}.prx-rich-editor__actions{display:flex;flex-wrap:wrap;gap:10px}button{border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:8px 14px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);font-weight:700;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}@media(max-width:760px){.prx-rich-editor__header,.prx-rich-editor__section-header,.prx-rich-editor__node-header,.prx-rich-editor__authoring-shell,.prx-rich-editor__intent-strip,.prx-rich-editor__grid,.prx-rich-editor__document-context summary,.prx-rich-editor__field-group,.prx-rich-editor__node-grid,.prx-rich-editor__workbench{grid-template-columns:1fr;display:grid}.prx-rich-editor__structure{position:static}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i2.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: PraxisRichContent, selector: "praxis-rich-content", inputs: ["document", "nodes", "context", "hostCapabilities", "layout", "rootClassName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9944
11417
  }
9945
11418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRichContentConfigEditor, decorators: [{
9946
11419
  type: Component,
@@ -10006,6 +11479,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10006
11479
  </label>
10007
11480
  </div>
10008
11481
 
11482
+ <details
11483
+ class="prx-rich-editor__document-context"
11484
+ [open]="hasDocumentContext()"
11485
+ >
11486
+ <summary>
11487
+ <span>{{ tx('editor.documentContext', 'Document context') }}</span>
11488
+ <small>
11489
+ {{
11490
+ tx(
11491
+ 'editor.documentContextHelp',
11492
+ 'Canonical data scopes and aliases available to rich-content bindings.'
11493
+ )
11494
+ }}
11495
+ </small>
11496
+ </summary>
11497
+ <fieldset class="prx-rich-editor__field-group">
11498
+ <legend>{{ tx('editor.documentContextFields', 'Context contract') }}</legend>
11499
+ <label class="prx-rich-editor__wide-field">
11500
+ <span>{{ tx('editor.field.contextScopes', 'Context scopes') }}</span>
11501
+ <input
11502
+ [ngModel]="getDocumentContextScopes()"
11503
+ (ngModelChange)="setDocumentContextScopes($event)"
11504
+ [placeholder]="tx('editor.placeholder.contextScopes', 'row, user, tenant')"
11505
+ [class.invalid]="getDocumentContextFieldError('scopes')"
11506
+ />
11507
+ @if (getDocumentContextFieldError('scopes')) {
11508
+ <small class="prx-rich-editor__field-error">
11509
+ {{ getDocumentContextFieldError('scopes') }}
11510
+ </small>
11511
+ }
11512
+ </label>
11513
+ <label class="prx-rich-editor__wide-field prx-rich-editor__json-field">
11514
+ <span>{{ tx('editor.field.contextAliases', 'Context aliases') }}</span>
11515
+ <textarea
11516
+ [ngModel]="getDocumentContextAliasesValue()"
11517
+ (ngModelChange)="setDocumentContextAliases($event)"
11518
+ [placeholder]="getDocumentContextAliasesPlaceholder()"
11519
+ [class.invalid]="getDocumentContextFieldError('aliases')"
11520
+ ></textarea>
11521
+ @if (getDocumentContextFieldError('aliases')) {
11522
+ <small class="prx-rich-editor__field-error">
11523
+ {{ getDocumentContextFieldError('aliases') }}
11524
+ </small>
11525
+ }
11526
+ </label>
11527
+ </fieldset>
11528
+ </details>
11529
+
10009
11530
  <ng-template
10010
11531
  #presenterFields
10011
11532
  let-node="node"
@@ -10041,6 +11562,50 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10041
11562
  />
10042
11563
  </label>
10043
11564
  }
11565
+ @case ('avatar') {
11566
+ <label>
11567
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
11568
+ <input
11569
+ [ngModel]="getStringField(node, 'name')"
11570
+ (ngModelChange)="setString('name', $event)"
11571
+ />
11572
+ </label>
11573
+ <label>
11574
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
11575
+ <input
11576
+ [ngModel]="getStringField(node, 'nameExpr')"
11577
+ (ngModelChange)="setString('nameExpr', $event)"
11578
+ />
11579
+ </label>
11580
+ <label>
11581
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
11582
+ <input
11583
+ [ngModel]="getStringField(node, 'imageSrc')"
11584
+ (ngModelChange)="setString('imageSrc', $event)"
11585
+ />
11586
+ </label>
11587
+ <label>
11588
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
11589
+ <input
11590
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
11591
+ (ngModelChange)="setString('imageSrcExpr', $event)"
11592
+ />
11593
+ </label>
11594
+ <label>
11595
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
11596
+ <input
11597
+ [ngModel]="getStringField(node, 'initials')"
11598
+ (ngModelChange)="setString('initials', $event)"
11599
+ />
11600
+ </label>
11601
+ <label>
11602
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
11603
+ <input
11604
+ [ngModel]="getStringField(node, 'initialsExpr')"
11605
+ (ngModelChange)="setString('initialsExpr', $event)"
11606
+ />
11607
+ </label>
11608
+ }
10044
11609
  @case ('image') {
10045
11610
  <label>
10046
11611
  <span>{{ tx('editor.field.src', 'Image URL') }}</span>
@@ -10049,6 +11614,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10049
11614
  (ngModelChange)="setString('src', $event)"
10050
11615
  />
10051
11616
  </label>
11617
+ <label>
11618
+ <span>{{ tx('editor.field.srcExpr', 'Image URL binding') }}</span>
11619
+ <input
11620
+ [ngModel]="getStringField(node, 'srcExpr')"
11621
+ (ngModelChange)="setString('srcExpr', $event)"
11622
+ />
11623
+ </label>
10052
11624
  <label>
10053
11625
  <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
10054
11626
  <input
@@ -10056,6 +11628,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10056
11628
  (ngModelChange)="setString('alt', $event)"
10057
11629
  />
10058
11630
  </label>
11631
+ <label>
11632
+ <span>{{ tx('editor.field.altExpr', 'Alt text binding') }}</span>
11633
+ <input
11634
+ [ngModel]="getStringField(node, 'altExpr')"
11635
+ (ngModelChange)="setString('altExpr', $event)"
11636
+ />
11637
+ </label>
10059
11638
  }
10060
11639
  @case ('link') {
10061
11640
  <label>
@@ -10065,6 +11644,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10065
11644
  (ngModelChange)="setString('label', $event)"
10066
11645
  />
10067
11646
  </label>
11647
+ <label>
11648
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
11649
+ <input
11650
+ [ngModel]="getStringField(node, 'labelExpr')"
11651
+ (ngModelChange)="setString('labelExpr', $event)"
11652
+ />
11653
+ </label>
10068
11654
  <label>
10069
11655
  <span>{{ tx('editor.field.href', 'Link URL') }}</span>
10070
11656
  <input
@@ -10072,6 +11658,23 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10072
11658
  (ngModelChange)="setString('href', $event)"
10073
11659
  />
10074
11660
  </label>
11661
+ <label>
11662
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
11663
+ <select
11664
+ [ngModel]="getStringField(node, 'target') || '_self'"
11665
+ (ngModelChange)="setString('target', $event)"
11666
+ >
11667
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
11668
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
11669
+ </select>
11670
+ </label>
11671
+ <label>
11672
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
11673
+ <input
11674
+ [ngModel]="getStringField(node, 'rel')"
11675
+ (ngModelChange)="setString('rel', $event)"
11676
+ />
11677
+ </label>
10075
11678
  }
10076
11679
  @case ('metric') {
10077
11680
  <label>
@@ -10097,6 +11700,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10097
11700
  (ngModelChange)="setString('label', $event)"
10098
11701
  />
10099
11702
  </label>
11703
+ <label>
11704
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
11705
+ <input
11706
+ [ngModel]="getStringField(node, 'labelExpr')"
11707
+ (ngModelChange)="setString('labelExpr', $event)"
11708
+ />
11709
+ </label>
11710
+ <label>
11711
+ <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
11712
+ <input
11713
+ [ngModel]="getStringField(node, 'valueExpr')"
11714
+ (ngModelChange)="setString('valueExpr', $event)"
11715
+ />
11716
+ </label>
10100
11717
  <label>
10101
11718
  <span>{{ tx('editor.field.max', 'Maximum') }}</span>
10102
11719
  <input
@@ -10350,7 +11967,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10350
11967
  </div>
10351
11968
  </ng-template>
10352
11969
 
10353
- <section class="prx-rich-editor__blocks">
11970
+ <nav
11971
+ class="prx-rich-editor__tabs"
11972
+ [attr.aria-label]="tx('editor.workbenchTabs', 'Editor sections')"
11973
+ role="tablist"
11974
+ >
11975
+ <button
11976
+ type="button"
11977
+ role="tab"
11978
+ class="prx-rich-editor__tab"
11979
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'guided'"
11980
+ [attr.aria-selected]="activeEditorPanel === 'guided'"
11981
+ (click)="selectEditorPanel('guided')"
11982
+ data-testid="rich-content-guided-tab"
11983
+ >
11984
+ {{ tx('editor.guidedEditing', 'Guided editing') }}
11985
+ </button>
11986
+ <button
11987
+ type="button"
11988
+ role="tab"
11989
+ class="prx-rich-editor__tab"
11990
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'preview'"
11991
+ [attr.aria-selected]="activeEditorPanel === 'preview'"
11992
+ (click)="selectEditorPanel('preview')"
11993
+ data-testid="rich-content-preview-tab"
11994
+ >
11995
+ {{ tx('editor.preview', 'Preview') }}
11996
+ </button>
11997
+ <button
11998
+ type="button"
11999
+ role="tab"
12000
+ class="prx-rich-editor__tab"
12001
+ [class.prx-rich-editor__tab--active]="activeEditorPanel === 'json'"
12002
+ [attr.aria-selected]="activeEditorPanel === 'json'"
12003
+ (click)="selectEditorPanel('json')"
12004
+ data-testid="rich-content-json-tab"
12005
+ >
12006
+ {{ tx('editor.document', 'Advanced JSON') }}
12007
+ @if (!valid || validationIssues.length) {
12008
+ <span class="prx-rich-editor__tab-badge">
12009
+ {{
12010
+ validationIssues.length || tx('editor.invalidBadge', 'Invalid')
12011
+ }}
12012
+ </span>
12013
+ }
12014
+ </button>
12015
+ </nav>
12016
+
12017
+ @if (activeEditorPanel === 'guided') {
12018
+ <section
12019
+ class="prx-rich-editor__blocks"
12020
+ role="tabpanel"
12021
+ [attr.aria-label]="tx('editor.guidedEditing', 'Guided editing')"
12022
+ >
10354
12023
  <header class="prx-rich-editor__section-header">
10355
12024
  <div>
10356
12025
  <h3>{{ tx('editor.blocks', 'Blocks') }}</h3>
@@ -10387,8 +12056,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10387
12056
  </header>
10388
12057
 
10389
12058
  @if (parsedDocument?.nodes?.length) {
12059
+ <div class="prx-rich-editor__authoring-shell">
12060
+ <aside
12061
+ class="prx-rich-editor__structure"
12062
+ [attr.aria-label]="tx('editor.structure', 'Document structure')"
12063
+ >
12064
+ <div class="prx-rich-editor__structure-summary">
12065
+ <strong>{{ tx('editor.structure', 'Document structure') }}</strong>
12066
+ <span>
12067
+ {{
12068
+ tx('editor.structureHelp', 'Select a block to edit its properties.')
12069
+ }}
12070
+ </span>
12071
+ </div>
12072
+ <div class="prx-rich-editor__structure-list">
12073
+ @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
12074
+ <button
12075
+ type="button"
12076
+ class="prx-rich-editor__structure-item"
12077
+ [class.prx-rich-editor__structure-item--selected]="selectedNodeIndex === nodeIndex"
12078
+ [attr.aria-current]="selectedNodeIndex === nodeIndex ? 'true' : null"
12079
+ (click)="selectTopLevelNode(nodeIndex)"
12080
+ [attr.data-testid]="'rich-content-node-selector-' + nodeIndex"
12081
+ >
12082
+ <span class="prx-rich-editor__node-eyebrow">
12083
+ {{ tx('editor.block', 'Block') }} {{ nodeIndex + 1 }}
12084
+ </span>
12085
+ <strong>{{ tx('editor.nodeType.' + node.type, node.type) }}</strong>
12086
+ @if (getIssueCount('$.nodes[' + nodeIndex + ']'); as issueCount) {
12087
+ <small>
12088
+ {{ tx('editor.hasIssues', 'Needs attention') }}
12089
+ <span class="prx-rich-editor__issue-count">{{ issueCount }}</span>
12090
+ </small>
12091
+ }
12092
+ </button>
12093
+ }
12094
+ </div>
12095
+ </aside>
12096
+
12097
+ <div class="prx-rich-editor__properties">
12098
+ <header class="prx-rich-editor__section-header">
12099
+ <div>
12100
+ <h3>{{ tx('editor.properties', 'Properties') }}</h3>
12101
+ <p>
12102
+ {{
12103
+ tx(
12104
+ 'editor.propertiesHelp',
12105
+ 'Edit the selected block without leaving the document structure.'
12106
+ )
12107
+ }}
12108
+ </p>
12109
+ </div>
12110
+ </header>
12111
+ <div
12112
+ class="prx-rich-editor__intent-strip"
12113
+ [attr.aria-label]="tx('editor.intentNavigation', 'Property sections')"
12114
+ >
12115
+ <span>
12116
+ <strong>{{ tx('editor.intent.content', 'Content') }}</strong>
12117
+ <small>{{ tx('editor.intent.contentHelp', 'Primary block fields') }}</small>
12118
+ </span>
12119
+ <span>
12120
+ <strong>{{ tx('editor.intent.presentation', 'Presentation') }}</strong>
12121
+ <small>{{ tx('editor.intent.presentationHelp', 'Visual affordances') }}</small>
12122
+ </span>
12123
+ <button type="button" (click)="openAdvancedRules()">
12124
+ <strong>{{ tx('editor.intent.dataRules', 'Data and rules') }}</strong>
12125
+ <small>{{ tx('editor.intent.dataRulesHelp', 'Metadata and gates') }}</small>
12126
+ @if (getSelectedNodeIssueCount(); as selectedIssueCount) {
12127
+ <span class="prx-rich-editor__issue-count">
12128
+ {{ selectedIssueCount }}
12129
+ </span>
12130
+ }
12131
+ </button>
12132
+ </div>
10390
12133
  <div class="prx-rich-editor__node-list">
10391
12134
  @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
12135
+ @if (selectedNodeIndex === nodeIndex) {
10392
12136
  <article
10393
12137
  class="prx-rich-editor__node-card"
10394
12138
  [attr.data-rich-editor-node-type]="node.type"
@@ -10527,19 +12271,124 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10527
12271
  />
10528
12272
  </label>
10529
12273
  }
10530
- @case ('image') {
12274
+ @case ('avatar') {
12275
+ <label>
12276
+ <span>{{ tx('editor.field.avatarName', 'Avatar name') }}</span>
12277
+ <input
12278
+ [ngModel]="getStringField(node, 'name')"
12279
+ (ngModelChange)="setStringField($index, 'name', $event)"
12280
+ />
12281
+ </label>
12282
+ <label>
12283
+ <span>{{ tx('editor.field.nameExpr', 'Name binding') }}</span>
12284
+ <input
12285
+ [ngModel]="getStringField(node, 'nameExpr')"
12286
+ (ngModelChange)="setStringField($index, 'nameExpr', $event)"
12287
+ [placeholder]="tx('editor.placeholder.nameExpr', 'row.name')"
12288
+ />
12289
+ </label>
12290
+ <label>
12291
+ <span>{{ tx('editor.field.avatarImage', 'Avatar image') }}</span>
12292
+ <input
12293
+ [ngModel]="getStringField(node, 'imageSrc')"
12294
+ (ngModelChange)="setStringField($index, 'imageSrc', $event)"
12295
+ />
12296
+ </label>
12297
+ <label>
12298
+ <span>{{ tx('editor.field.imageSrcExpr', 'Image binding') }}</span>
12299
+ <input
12300
+ [ngModel]="getStringField(node, 'imageSrcExpr')"
12301
+ (ngModelChange)="setStringField($index, 'imageSrcExpr', $event)"
12302
+ [placeholder]="tx('editor.placeholder.imageSrcExpr', 'row.avatarUrl')"
12303
+ />
12304
+ </label>
12305
+ <label>
12306
+ <span>{{ tx('editor.field.initials', 'Initials') }}</span>
12307
+ <input
12308
+ [ngModel]="getStringField(node, 'initials')"
12309
+ (ngModelChange)="setStringField($index, 'initials', $event)"
12310
+ />
12311
+ </label>
12312
+ <label>
12313
+ <span>{{ tx('editor.field.initialsExpr', 'Initials binding') }}</span>
12314
+ <input
12315
+ [ngModel]="getStringField(node, 'initialsExpr')"
12316
+ (ngModelChange)="setStringField($index, 'initialsExpr', $event)"
12317
+ [placeholder]="tx('editor.placeholder.initialsExpr', 'row.initials')"
12318
+ />
12319
+ </label>
12320
+ }
12321
+ @case ('image') {
12322
+ <label>
12323
+ <span>{{ tx('editor.field.src', 'Image URL') }}</span>
12324
+ <input
12325
+ [ngModel]="getStringField(node, 'src')"
12326
+ (ngModelChange)="setStringField($index, 'src', $event)"
12327
+ />
12328
+ </label>
12329
+ <label>
12330
+ <span>{{ tx('editor.field.srcExpr', 'Image URL binding') }}</span>
12331
+ <input
12332
+ [ngModel]="getStringField(node, 'srcExpr')"
12333
+ (ngModelChange)="setStringField($index, 'srcExpr', $event)"
12334
+ [placeholder]="tx('editor.placeholder.srcExpr', 'row.imageUrl')"
12335
+ />
12336
+ </label>
12337
+ <label>
12338
+ <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
12339
+ <input
12340
+ [ngModel]="getStringField(node, 'alt')"
12341
+ (ngModelChange)="setStringField($index, 'alt', $event)"
12342
+ />
12343
+ </label>
12344
+ <label>
12345
+ <span>{{ tx('editor.field.altExpr', 'Alt text binding') }}</span>
12346
+ <input
12347
+ [ngModel]="getStringField(node, 'altExpr')"
12348
+ (ngModelChange)="setStringField($index, 'altExpr', $event)"
12349
+ [placeholder]="tx('editor.placeholder.altExpr', 'row.imageAlt')"
12350
+ />
12351
+ </label>
12352
+ }
12353
+ @case ('link') {
12354
+ <label>
12355
+ <span>{{ tx('editor.field.label', 'Label') }}</span>
12356
+ <input
12357
+ [ngModel]="getStringField(node, 'label')"
12358
+ (ngModelChange)="setStringField($index, 'label', $event)"
12359
+ />
12360
+ </label>
10531
12361
  <label>
10532
- <span>{{ tx('editor.field.src', 'Image URL') }}</span>
12362
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
12363
+ <input
12364
+ [ngModel]="getStringField(node, 'labelExpr')"
12365
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
12366
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.linkLabel')"
12367
+ />
12368
+ </label>
12369
+ <label class="prx-rich-editor__wide-field">
12370
+ <span>{{ tx('editor.field.href', 'Link URL') }}</span>
10533
12371
  <input
10534
- [ngModel]="getStringField(node, 'src')"
10535
- (ngModelChange)="setStringField($index, 'src', $event)"
12372
+ [ngModel]="getStringField(node, 'href')"
12373
+ (ngModelChange)="setStringField($index, 'href', $event)"
10536
12374
  />
10537
12375
  </label>
10538
12376
  <label>
10539
- <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
12377
+ <span>{{ tx('editor.field.target', 'Target') }}</span>
12378
+ <select
12379
+ [ngModel]="getStringField(node, 'target') || '_self'"
12380
+ (ngModelChange)="setStringField($index, 'target', $event)"
12381
+ >
12382
+ <option value="_self">{{ tx('editor.target.self', 'Same tab') }}</option>
12383
+ <option value="_blank">{{ tx('editor.target.blank', 'New tab') }}</option>
12384
+ </select>
12385
+ </label>
12386
+ <label>
12387
+ <span>{{ tx('editor.field.rel', 'Rel') }}</span>
10540
12388
  <input
10541
- [ngModel]="getStringField(node, 'alt')"
10542
- (ngModelChange)="setStringField($index, 'alt', $event)"
12389
+ [ngModel]="getStringField(node, 'rel')"
12390
+ (ngModelChange)="setStringField($index, 'rel', $event)"
12391
+ [placeholder]="tx('editor.placeholder.rel', 'noopener noreferrer')"
10543
12392
  />
10544
12393
  </label>
10545
12394
  }
@@ -10551,6 +12400,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10551
12400
  (ngModelChange)="setStringField($index, 'label', $event)"
10552
12401
  />
10553
12402
  </label>
12403
+ <label>
12404
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
12405
+ <input
12406
+ [ngModel]="getStringField(node, 'labelExpr')"
12407
+ (ngModelChange)="setStringField($index, 'labelExpr', $event)"
12408
+ [placeholder]="tx('editor.placeholder.labelExpr', 'row.status')"
12409
+ />
12410
+ </label>
10554
12411
  <label>
10555
12412
  <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
10556
12413
  <input
@@ -10592,6 +12449,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10592
12449
  (ngModelChange)="setNumberField($index, 'max', $event)"
10593
12450
  />
10594
12451
  </label>
12452
+ <label class="prx-rich-editor__checkbox-field">
12453
+ <input
12454
+ type="checkbox"
12455
+ [ngModel]="getBooleanField(node, 'showPercent')"
12456
+ (ngModelChange)="setBooleanField($index, 'showPercent', $event)"
12457
+ />
12458
+ <span>{{ tx('editor.field.showPercent', 'Show percent') }}</span>
12459
+ </label>
10595
12460
  }
10596
12461
  @case ('actionButton') {
10597
12462
  <label>
@@ -10687,6 +12552,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10687
12552
  <option value="xl">xl</option>
10688
12553
  </select>
10689
12554
  </label>
12555
+ <label class="prx-rich-editor__checkbox-field">
12556
+ <input
12557
+ type="checkbox"
12558
+ [ngModel]="getBooleanField(node, 'wrap')"
12559
+ (ngModelChange)="setBooleanField($index, 'wrap', $event)"
12560
+ />
12561
+ <span>{{ tx('editor.field.wrap', 'Wrap items') }}</span>
12562
+ </label>
10690
12563
  <div class="prx-rich-editor__nested-editor">
10691
12564
  <header class="prx-rich-editor__nested-header">
10692
12565
  <h5>{{ tx('editor.composeItems', 'Compose items') }}</h5>
@@ -10744,6 +12617,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10744
12617
  (ngModelChange)="setStringField($index, 'title', $event)"
10745
12618
  />
10746
12619
  </label>
12620
+ <label>
12621
+ <span>{{ tx('editor.field.titleExpr', 'Title binding') }}</span>
12622
+ <input
12623
+ [ngModel]="getStringField(node, 'titleExpr')"
12624
+ (ngModelChange)="setStringField($index, 'titleExpr', $event)"
12625
+ [placeholder]="tx('editor.placeholder.titleExpr', '\${decision.title}')"
12626
+ />
12627
+ </label>
10747
12628
  <label>
10748
12629
  <span>{{ tx('editor.field.subtitle', 'Subtitle') }}</span>
10749
12630
  <input
@@ -10751,6 +12632,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10751
12632
  (ngModelChange)="setStringField($index, 'subtitle', $event)"
10752
12633
  />
10753
12634
  </label>
12635
+ <label>
12636
+ <span>{{ tx('editor.field.subtitleExpr', 'Subtitle binding') }}</span>
12637
+ <input
12638
+ [ngModel]="getStringField(node, 'subtitleExpr')"
12639
+ (ngModelChange)="setStringField($index, 'subtitleExpr', $event)"
12640
+ [placeholder]="tx('editor.placeholder.subtitleExpr', '\${decision.policySource}')"
12641
+ />
12642
+ </label>
10754
12643
  <label>
10755
12644
  <span>{{ tx('editor.field.variant', 'Variant') }}</span>
10756
12645
  <select
@@ -10788,6 +12677,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10788
12677
  <option value="lg">{{ tx('editor.size.lg', 'Large') }}</option>
10789
12678
  </select>
10790
12679
  </label>
12680
+ <label>
12681
+ <span>{{ tx('editor.field.density', 'Density') }}</span>
12682
+ <select
12683
+ [ngModel]="getStringField(node, 'density') || 'comfortable'"
12684
+ (ngModelChange)="setStringField($index, 'density', $event)"
12685
+ >
12686
+ <option value="comfortable">{{ tx('editor.density.comfortable', 'Comfortable') }}</option>
12687
+ <option value="compact">{{ tx('editor.density.compact', 'Compact') }}</option>
12688
+ </select>
12689
+ </label>
10791
12690
  <label>
10792
12691
  <span>{{ tx('editor.field.orientation', 'Orientation') }}</span>
10793
12692
  <select
@@ -10798,6 +12697,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10798
12697
  <option value="horizontal">{{ tx('editor.orientation.horizontal', 'Horizontal') }}</option>
10799
12698
  </select>
10800
12699
  </label>
12700
+ <label class="prx-rich-editor__checkbox-field">
12701
+ <input
12702
+ type="checkbox"
12703
+ [ngModel]="getBooleanField(node, 'loading')"
12704
+ (ngModelChange)="setBooleanField($index, 'loading', $event)"
12705
+ />
12706
+ <span>{{ tx('editor.field.loading', 'Loading') }}</span>
12707
+ </label>
12708
+ <label>
12709
+ <span>{{ tx('editor.field.loadingExpr', 'Loading binding') }}</span>
12710
+ <input
12711
+ [ngModel]="getStringField(node, 'loadingExpr')"
12712
+ (ngModelChange)="setStringField($index, 'loadingExpr', $event)"
12713
+ [placeholder]="tx('editor.placeholder.loadingExpr', 'row.loading')"
12714
+ />
12715
+ </label>
12716
+ <label class="prx-rich-editor__checkbox-field">
12717
+ <input
12718
+ type="checkbox"
12719
+ [ngModel]="getBooleanField(node, 'active')"
12720
+ (ngModelChange)="setBooleanField($index, 'active', $event)"
12721
+ />
12722
+ <span>{{ tx('editor.field.active', 'Active') }}</span>
12723
+ </label>
12724
+ <label>
12725
+ <span>{{ tx('editor.field.activeExpr', 'Active binding') }}</span>
12726
+ <input
12727
+ [ngModel]="getStringField(node, 'activeExpr')"
12728
+ (ngModelChange)="setStringField($index, 'activeExpr', $event)"
12729
+ [placeholder]="tx('editor.placeholder.activeExpr', 'row.active')"
12730
+ />
12731
+ </label>
10801
12732
  <label>
10802
12733
  <span>{{ tx('editor.field.mediaKind', 'Media') }}</span>
10803
12734
  <select
@@ -10819,6 +12750,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10819
12750
  (ngModelChange)="setCardMediaField(nodeIndex, 'src', $event)"
10820
12751
  />
10821
12752
  </label>
12753
+ <label>
12754
+ <span>{{ tx('editor.field.mediaSrcExpr', 'Media source binding') }}</span>
12755
+ <input
12756
+ [ngModel]="getCardMediaField(nodeIndex, 'srcExpr')"
12757
+ (ngModelChange)="setCardMediaField(nodeIndex, 'srcExpr', $event)"
12758
+ [placeholder]="tx('editor.placeholder.mediaSrcExpr', 'row.mediaUrl')"
12759
+ />
12760
+ </label>
10822
12761
  <label>
10823
12762
  <span>{{ tx('editor.field.mediaAlt', 'Media alt text') }}</span>
10824
12763
  <input
@@ -10826,6 +12765,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10826
12765
  (ngModelChange)="setCardMediaField(nodeIndex, 'alt', $event)"
10827
12766
  />
10828
12767
  </label>
12768
+ <label>
12769
+ <span>{{ tx('editor.field.mediaAltExpr', 'Media alt binding') }}</span>
12770
+ <input
12771
+ [ngModel]="getCardMediaField(nodeIndex, 'altExpr')"
12772
+ (ngModelChange)="setCardMediaField(nodeIndex, 'altExpr', $event)"
12773
+ [placeholder]="tx('editor.placeholder.mediaAltExpr', 'row.mediaAlt')"
12774
+ />
12775
+ </label>
10829
12776
  <label>
10830
12777
  <span>{{ tx('editor.field.mediaIcon', 'Media icon') }}</span>
10831
12778
  <input
@@ -10833,6 +12780,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10833
12780
  (ngModelChange)="setCardMediaField(nodeIndex, 'icon', $event)"
10834
12781
  />
10835
12782
  </label>
12783
+ <label>
12784
+ <span>{{ tx('editor.field.mediaLabel', 'Media label') }}</span>
12785
+ <input
12786
+ [ngModel]="getCardMediaField(nodeIndex, 'label')"
12787
+ (ngModelChange)="setCardMediaField(nodeIndex, 'label', $event)"
12788
+ />
12789
+ </label>
12790
+ <label>
12791
+ <span>{{ tx('editor.field.mediaLabelExpr', 'Media label binding') }}</span>
12792
+ <input
12793
+ [ngModel]="getCardMediaField(nodeIndex, 'labelExpr')"
12794
+ (ngModelChange)="setCardMediaField(nodeIndex, 'labelExpr', $event)"
12795
+ [placeholder]="tx('editor.placeholder.mediaLabelExpr', 'row.mediaLabel')"
12796
+ />
12797
+ </label>
12798
+ <label>
12799
+ <span>{{ tx('editor.field.aspectRatio', 'Aspect ratio') }}</span>
12800
+ <input
12801
+ [ngModel]="getCardMediaField(nodeIndex, 'aspectRatio')"
12802
+ (ngModelChange)="setCardMediaField(nodeIndex, 'aspectRatio', $event)"
12803
+ [placeholder]="tx('editor.placeholder.aspectRatio', '16 / 9')"
12804
+ />
12805
+ </label>
10836
12806
  <label>
10837
12807
  <span>{{ tx('editor.field.mediaPlacement', 'Media placement') }}</span>
10838
12808
  <select
@@ -10846,6 +12816,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10846
12816
  </select>
10847
12817
  </label>
10848
12818
  }
12819
+ <label>
12820
+ <span>{{ tx('editor.field.interactionMode', 'Interaction mode') }}</span>
12821
+ <select
12822
+ [ngModel]="getCardInteractionField(nodeIndex, 'mode') || 'none'"
12823
+ (ngModelChange)="setCardInteractionField(nodeIndex, 'mode', $event)"
12824
+ >
12825
+ <option value="none">{{ tx('editor.interaction.none', 'None') }}</option>
12826
+ <option value="action">{{ tx('editor.interaction.action', 'Action') }}</option>
12827
+ <option value="selectable">{{ tx('editor.interaction.selectable', 'Selectable') }}</option>
12828
+ </select>
12829
+ </label>
12830
+ <label class="prx-rich-editor__checkbox-field">
12831
+ <input
12832
+ type="checkbox"
12833
+ [ngModel]="getCardInteractionBooleanField(nodeIndex, 'selected')"
12834
+ (ngModelChange)="setCardInteractionBooleanField(nodeIndex, 'selected', $event)"
12835
+ />
12836
+ <span>{{ tx('editor.field.selected', 'Selected') }}</span>
12837
+ </label>
12838
+ <label>
12839
+ <span>{{ tx('editor.field.selectedExpr', 'Selected binding') }}</span>
12840
+ <input
12841
+ [ngModel]="getCardInteractionField(nodeIndex, 'selectedExpr')"
12842
+ (ngModelChange)="setCardInteractionField(nodeIndex, 'selectedExpr', $event)"
12843
+ [placeholder]="tx('editor.placeholder.selectedExpr', 'row.selected')"
12844
+ />
12845
+ </label>
12846
+ <label>
12847
+ <span>{{ tx('editor.field.interactionActionId', 'Interaction action ID') }}</span>
12848
+ <input
12849
+ [ngModel]="getCardInteractionActionField(nodeIndex, 'actionId')"
12850
+ (ngModelChange)="setCardInteractionActionField(nodeIndex, 'actionId', $event)"
12851
+ [placeholder]="tx('editor.placeholder.actionId', 'host.action.open')"
12852
+ />
12853
+ </label>
12854
+ <label>
12855
+ <span>{{ tx('editor.field.payloadExpr', 'Payload binding') }}</span>
12856
+ <input
12857
+ [ngModel]="getCardInteractionActionField(nodeIndex, 'payloadExpr')"
12858
+ (ngModelChange)="setCardInteractionActionField(nodeIndex, 'payloadExpr', $event)"
12859
+ [placeholder]="tx('editor.placeholder.payloadExpr', 'row')"
12860
+ />
12861
+ </label>
12862
+ <label>
12863
+ <span>{{ tx('editor.field.accessibilityRole', 'Accessibility role') }}</span>
12864
+ <select
12865
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'role')"
12866
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'role', $event)"
12867
+ >
12868
+ <option value="">{{ tx('editor.none', 'None') }}</option>
12869
+ <option value="article">{{ tx('editor.accessibilityRole.article', 'Article') }}</option>
12870
+ <option value="group">{{ tx('editor.accessibilityRole.group', 'Group') }}</option>
12871
+ <option value="button">{{ tx('editor.accessibilityRole.button', 'Button') }}</option>
12872
+ </select>
12873
+ </label>
12874
+ <label>
12875
+ <span>{{ tx('editor.field.ariaLabel', 'Accessible label') }}</span>
12876
+ <input
12877
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'ariaLabel')"
12878
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'ariaLabel', $event)"
12879
+ />
12880
+ </label>
12881
+ <label>
12882
+ <span>{{ tx('editor.field.ariaLabelExpr', 'Accessible label binding') }}</span>
12883
+ <input
12884
+ [ngModel]="getCardAccessibilityField(nodeIndex, 'ariaLabelExpr')"
12885
+ (ngModelChange)="setCardAccessibilityField(nodeIndex, 'ariaLabelExpr', $event)"
12886
+ [placeholder]="tx('editor.placeholder.ariaLabelExpr', 'row.ariaLabel')"
12887
+ />
12888
+ </label>
10849
12889
  <div class="prx-rich-editor__nested-editor">
10850
12890
  <header class="prx-rich-editor__nested-header">
10851
12891
  <h5>{{ tx('editor.cardContent', 'Card body') }}</h5>
@@ -11291,6 +13331,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11291
13331
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'label', $event)"
11292
13332
  />
11293
13333
  </label>
13334
+ <label>
13335
+ <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
13336
+ <input
13337
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'labelExpr')"
13338
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'labelExpr', $event)"
13339
+ [placeholder]="tx('editor.placeholder.tabLabelExpr', 'row.tabLabel')"
13340
+ />
13341
+ </label>
11294
13342
  <label>
11295
13343
  <span>{{ tx('editor.field.icon', 'Icon') }}</span>
11296
13344
  <input
@@ -11305,6 +13353,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11305
13353
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badge', $event)"
11306
13354
  />
11307
13355
  </label>
13356
+ <label>
13357
+ <span>{{ tx('editor.field.badgeExpr', 'Badge binding') }}</span>
13358
+ <input
13359
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'badgeExpr')"
13360
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badgeExpr', $event)"
13361
+ [placeholder]="tx('editor.placeholder.badgeExpr', 'row.badge')"
13362
+ />
13363
+ </label>
13364
+ <label>
13365
+ <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
13366
+ <input
13367
+ [ngModel]="getTabsItemCapabilityList(nodeIndex, $index)"
13368
+ (ngModelChange)="setTabsItemCapabilityList(nodeIndex, $index, $event)"
13369
+ [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
13370
+ />
13371
+ </label>
13372
+ <label>
13373
+ <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
13374
+ <select
13375
+ [ngModel]="getTabsItemField(nodeIndex, $index, 'capabilityMode') || 'all'"
13376
+ (ngModelChange)="setTabsItemField(nodeIndex, $index, 'capabilityMode', $event)"
13377
+ >
13378
+ <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
13379
+ <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
13380
+ </select>
13381
+ </label>
13382
+ <label>
13383
+ <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
13384
+ <input
13385
+ [ngModel]="getTabsItemVisibleWhenPath(nodeIndex, $index)"
13386
+ (ngModelChange)="setTabsItemVisibleWhenPath(nodeIndex, $index, $event)"
13387
+ [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
13388
+ />
13389
+ </label>
13390
+ <label>
13391
+ <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
13392
+ <input
13393
+ [ngModel]="getTabsItemVisibleWhenValue(nodeIndex, $index)"
13394
+ (ngModelChange)="setTabsItemVisibleWhenValue(nodeIndex, $index, $event)"
13395
+ [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
13396
+ />
13397
+ </label>
11308
13398
  </div>
11309
13399
  }
11310
13400
  </div>
@@ -11967,24 +14057,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11967
14057
  <header class="prx-rich-editor__nested-header">
11968
14058
  <h5>{{ tx('editor.decisionEvidence', 'Evidence') }}</h5>
11969
14059
  <div class="prx-rich-editor__quick-actions">
11970
- <button type="button" (click)="addDecisionPackageEvidence($index)">
14060
+ <button type="button" (click)="addDecisionPackageEvidence(nodeIndex)">
11971
14061
  {{ tx('editor.addEvidence', 'Add evidence') }}
11972
14062
  </button>
11973
14063
  </div>
11974
14064
  </header>
11975
- @for (evidence of getDecisionPackageEvidence($index); track evidence.id ?? $index; let evidenceIndex = $index) {
14065
+ @for (evidence of getDecisionPackageEvidence(nodeIndex); track evidence.id ?? $index; let evidenceIndex = $index) {
11976
14066
  <div class="prx-rich-editor__nested-node">
11977
14067
  <div class="prx-rich-editor__nested-actions">
11978
14068
  <strong>{{ tx('editor.evidence', 'Evidence') }} {{ evidenceIndex + 1 }}</strong>
11979
- @if (isRemovalPending('nodes.' + $index + '.evidence', evidenceIndex)) {
11980
- <button type="button" (click)="removeDecisionPackageEvidence($index, evidenceIndex)">
14069
+ @if (isRemovalPending('nodes.' + nodeIndex + '.evidence', evidenceIndex)) {
14070
+ <button type="button" (click)="removeDecisionPackageEvidence(nodeIndex, evidenceIndex)">
11981
14071
  {{ tx('editor.confirmRemove', 'Confirm remove') }}
11982
14072
  </button>
11983
14073
  <button type="button" (click)="cancelRemoval()">
11984
14074
  {{ tx('editor.cancelRemove', 'Cancel') }}
11985
14075
  </button>
11986
14076
  } @else {
11987
- <button type="button" (click)="requestNestedRemoval('nodes.' + $index + '.evidence', evidenceIndex)">
14077
+ <button type="button" (click)="requestNestedRemoval('nodes.' + nodeIndex + '.evidence', evidenceIndex)">
11988
14078
  {{ tx('editor.removeBlock', 'Remove') }}
11989
14079
  </button>
11990
14080
  }
@@ -11993,37 +14083,37 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11993
14083
  <label>
11994
14084
  <span>{{ tx('editor.field.itemId', 'Item ID') }}</span>
11995
14085
  <input
11996
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'id')"
11997
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'id', $event)"
14086
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id')"
14087
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'id', $event)"
11998
14088
  />
11999
14089
  </label>
12000
14090
  <label>
12001
14091
  <span>{{ tx('editor.field.label', 'Label') }}</span>
12002
14092
  <input
12003
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'label')"
12004
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'label', $event)"
14093
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label')"
14094
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'label', $event)"
12005
14095
  />
12006
14096
  </label>
12007
14097
  <label>
12008
14098
  <span>{{ tx('editor.field.labelExpr', 'Label binding') }}</span>
12009
14099
  <input
12010
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr')"
12011
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'labelExpr', $event)"
14100
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr')"
14101
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'labelExpr', $event)"
12012
14102
  [placeholder]="tx('editor.placeholder.evidenceLabelExpr', '\${evidence.label}')"
12013
14103
  />
12014
14104
  </label>
12015
14105
  <label>
12016
14106
  <span>{{ tx('editor.field.source', 'Source') }}</span>
12017
14107
  <input
12018
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'source')"
12019
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'source', $event)"
14108
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source')"
14109
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'source', $event)"
12020
14110
  />
12021
14111
  </label>
12022
14112
  <label>
12023
14113
  <span>{{ tx('editor.field.sourceExpr', 'Source binding') }}</span>
12024
14114
  <input
12025
- [ngModel]="getDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr')"
12026
- (ngModelChange)="setDecisionPackageEvidenceField($index, evidenceIndex, 'sourceExpr', $event)"
14115
+ [ngModel]="getDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr')"
14116
+ (ngModelChange)="setDecisionPackageEvidenceField(nodeIndex, evidenceIndex, 'sourceExpr', $event)"
12027
14117
  [placeholder]="tx('editor.placeholder.evidenceSourceExpr', '\${evidence.source}')"
12028
14118
  />
12029
14119
  </label>
@@ -12036,27 +14126,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12036
14126
  <header class="prx-rich-editor__nested-header">
12037
14127
  <h5>{{ tx('editor.decisionPrimaryAction', 'Primary action') }}</h5>
12038
14128
  <div class="prx-rich-editor__quick-actions">
12039
- @if (getDecisionPackagePrimaryAction($index)) {
12040
- <button type="button" (click)="removeDecisionPackagePrimaryAction($index)">
14129
+ @if (getDecisionPackagePrimaryAction(nodeIndex)) {
14130
+ <button type="button" (click)="removeDecisionPackagePrimaryAction(nodeIndex)">
12041
14131
  {{ tx('editor.removeBlock', 'Remove') }}
12042
14132
  </button>
12043
14133
  } @else {
12044
- <button type="button" (click)="addDecisionPackagePrimaryActionPreset($index, 'primary')">
14134
+ <button type="button" (click)="addDecisionPackagePrimaryActionPreset(nodeIndex, 'primary')">
12045
14135
  {{ tx('editor.addPrimaryAction', 'Add primary action') }}
12046
14136
  </button>
12047
- <button type="button" (click)="addDecisionPackagePrimaryAction($index)">
14137
+ <button type="button" (click)="addDecisionPackagePrimaryAction(nodeIndex)">
12048
14138
  {{ tx('editor.addAction', 'Add action') }}
12049
14139
  </button>
12050
14140
  }
12051
14141
  </div>
12052
14142
  </header>
12053
- @if (getDecisionPackagePrimaryAction($index); as primaryAction) {
14143
+ @if (getDecisionPackagePrimaryAction(nodeIndex); as primaryAction) {
12054
14144
  <div class="prx-rich-editor__node-grid">
12055
14145
  <ng-container
12056
14146
  *ngTemplateOutlet="actionFields; context: {
12057
14147
  action: primaryAction,
12058
- path: '$.nodes[' + $index + '].primaryAction',
12059
- setField: setDecisionPackagePrimaryActionField.bind(this, $index)
14148
+ path: '$.nodes[' + nodeIndex + '].primaryAction',
14149
+ setField: setDecisionPackagePrimaryActionField.bind(this, nodeIndex)
12060
14150
  }"
12061
14151
  ></ng-container>
12062
14152
  </div>
@@ -12695,97 +14785,216 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12695
14785
  </p>
12696
14786
  }
12697
14787
  }
12698
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
12699
- <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
12700
- <label>
12701
- <span>{{ tx('editor.field.testId', 'Test id') }}</span>
12702
- <input
12703
- [ngModel]="getStringField(node, 'testId')"
12704
- (ngModelChange)="setStringField($index, 'testId', $event)"
12705
- [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
12706
- />
12707
- </label>
12708
- <label>
12709
- <span>{{ tx('editor.field.className', 'CSS class') }}</span>
12710
- <input
12711
- [ngModel]="getStringField(node, 'className')"
12712
- (ngModelChange)="setStringField($index, 'className', $event)"
12713
- [placeholder]="tx('editor.placeholder.className', 'hero-title')"
12714
- />
12715
- </label>
12716
- <label>
12717
- <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
12718
- <input
12719
- [ngModel]="getCapabilityList(node)"
12720
- (ngModelChange)="setCapabilityList($index, $event)"
12721
- [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
12722
- />
12723
- </label>
12724
- <label>
12725
- <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
12726
- <select
12727
- [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
12728
- (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
12729
- >
12730
- <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
12731
- <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
12732
- </select>
12733
- </label>
12734
- </fieldset>
14788
+ <details
14789
+ class="prx-rich-editor__advanced-group"
14790
+ [open]="advancedRulesOpen"
14791
+ (toggle)="onAdvancedRulesToggle($event)"
14792
+ >
14793
+ <summary>
14794
+ <span>{{ tx('editor.advancedDataRules', 'Advanced data and rules') }}</span>
14795
+ <small>
14796
+ {{
14797
+ tx(
14798
+ 'editor.advancedDataRulesHelp',
14799
+ 'Metadata, capability gates, visibility and safe style.'
14800
+ )
14801
+ }}
14802
+ </small>
14803
+ </summary>
12735
14804
 
12736
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
12737
- <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
12738
- <label>
12739
- <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
12740
- <input
12741
- [ngModel]="getVisibleWhenPath(node)"
12742
- (ngModelChange)="setVisibleWhenPath($index, $event)"
12743
- [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
12744
- />
12745
- </label>
12746
- <label>
12747
- <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
12748
- <input
12749
- [ngModel]="getVisibleWhenValue(node)"
12750
- (ngModelChange)="setVisibleWhenValue($index, $event)"
12751
- [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
12752
- />
12753
- </label>
12754
- </fieldset>
14805
+ <fieldset class="prx-rich-editor__field-group">
14806
+ <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
14807
+ <label>
14808
+ <span>{{ tx('editor.field.testId', 'Test id') }}</span>
14809
+ <input
14810
+ [ngModel]="getStringField(node, 'testId')"
14811
+ (ngModelChange)="setStringField($index, 'testId', $event)"
14812
+ [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
14813
+ />
14814
+ </label>
14815
+ <label>
14816
+ <span>{{ tx('editor.field.className', 'CSS class') }}</span>
14817
+ <input
14818
+ [ngModel]="getStringField(node, 'className')"
14819
+ (ngModelChange)="setStringField($index, 'className', $event)"
14820
+ [placeholder]="tx('editor.placeholder.className', 'hero-title')"
14821
+ />
14822
+ </label>
14823
+ <label>
14824
+ <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
14825
+ <input
14826
+ [ngModel]="getCapabilityList(node)"
14827
+ (ngModelChange)="setCapabilityList($index, $event)"
14828
+ [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
14829
+ />
14830
+ </label>
14831
+ <label>
14832
+ <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
14833
+ <select
14834
+ [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
14835
+ (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
14836
+ >
14837
+ <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
14838
+ <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
14839
+ </select>
14840
+ </label>
14841
+ </fieldset>
12755
14842
 
12756
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
12757
- <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
12758
- <label>
12759
- <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
12760
- <input
12761
- [ngModel]="getFirstStyleName(node)"
12762
- (ngModelChange)="setFirstStyleName($index, $event)"
12763
- [placeholder]="tx('editor.placeholder.styleName', 'color')"
12764
- />
12765
- </label>
12766
- <label>
12767
- <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
12768
- <input
12769
- [ngModel]="getFirstStyleValue(node)"
12770
- (ngModelChange)="setFirstStyleValue($index, $event)"
12771
- [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
12772
- />
12773
- </label>
12774
- </fieldset>
14843
+ <fieldset class="prx-rich-editor__field-group">
14844
+ <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
14845
+ <label>
14846
+ <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
14847
+ <input
14848
+ [ngModel]="getVisibleWhenPath(node)"
14849
+ (ngModelChange)="setVisibleWhenPath($index, $event)"
14850
+ [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
14851
+ />
14852
+ </label>
14853
+ <label>
14854
+ <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
14855
+ <input
14856
+ [ngModel]="getVisibleWhenValue(node)"
14857
+ (ngModelChange)="setVisibleWhenValue($index, $event)"
14858
+ [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
14859
+ />
14860
+ </label>
14861
+ </fieldset>
14862
+
14863
+ <fieldset class="prx-rich-editor__field-group">
14864
+ <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
14865
+ <label>
14866
+ <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
14867
+ <input
14868
+ [ngModel]="getFirstStyleName(node)"
14869
+ (ngModelChange)="setFirstStyleName($index, $event)"
14870
+ [placeholder]="tx('editor.placeholder.styleName', 'color')"
14871
+ />
14872
+ </label>
14873
+ <label>
14874
+ <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
14875
+ <input
14876
+ [ngModel]="getFirstStyleValue(node)"
14877
+ (ngModelChange)="setFirstStyleValue($index, $event)"
14878
+ [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
14879
+ />
14880
+ </label>
14881
+ </fieldset>
14882
+
14883
+ @if (getAdvancedJsonOnlyFields(node).length) {
14884
+ <aside class="prx-rich-editor__advanced-json-map">
14885
+ <strong>{{ tx('editor.advancedJsonFields', 'Advanced JSON fields present') }}</strong>
14886
+ <p>
14887
+ {{
14888
+ tx(
14889
+ 'editor.advancedJsonFieldsHelp',
14890
+ 'These canonical fields are preserved by guided edits and remain editable in the Advanced JSON tab.'
14891
+ )
14892
+ }}
14893
+ </p>
14894
+ <div class="prx-rich-editor__advanced-json-chips">
14895
+ @for (field of getAdvancedJsonOnlyFields(node); track field) {
14896
+ <code>{{ field }}</code>
14897
+ }
14898
+ </div>
14899
+ </aside>
14900
+ }
14901
+
14902
+ <fieldset class="prx-rich-editor__field-group prx-rich-editor__json-fieldset">
14903
+ <legend>{{ tx('editor.advancedJsonEditor', 'Advanced JSON editor') }}</legend>
14904
+ <p class="prx-rich-editor__field-help">
14905
+ {{
14906
+ tx(
14907
+ 'editor.advancedJsonEditorHelp',
14908
+ 'Edit canonical data bindings and JsonLogic rule fields without leaving guided editing.'
14909
+ )
14910
+ }}
14911
+ </p>
14912
+ @for (field of advancedJsonOnlyNodeFields; track field) {
14913
+ <label class="prx-rich-editor__wide-field prx-rich-editor__json-field">
14914
+ <span>{{ tx('editor.field.' + field, field) }}</span>
14915
+ <textarea
14916
+ [ngModel]="getAdvancedJsonFieldValue(nodeIndex, node, field)"
14917
+ (ngModelChange)="setAdvancedJsonField(nodeIndex, field, $event)"
14918
+ [placeholder]="getAdvancedJsonFieldPlaceholder(field)"
14919
+ [class.invalid]="getAdvancedJsonFieldError(nodeIndex, field)"
14920
+ ></textarea>
14921
+ @if (getAdvancedJsonFieldError(nodeIndex, field)) {
14922
+ <small class="prx-rich-editor__field-error">
14923
+ {{ getAdvancedJsonFieldError(nodeIndex, field) }}
14924
+ </small>
14925
+ }
14926
+ </label>
14927
+ }
14928
+ </fieldset>
14929
+ </details>
12775
14930
  </div>
12776
14931
  </article>
14932
+ }
12777
14933
  }
12778
14934
  </div>
14935
+ </div>
14936
+ </div>
12779
14937
  } @else {
12780
14938
  <p class="prx-rich-editor__empty">
12781
14939
  {{ tx('editor.noBlocks', 'No blocks yet. Add a block to start authoring this document.') }}
12782
14940
  </p>
12783
14941
  }
12784
14942
  </section>
14943
+ }
14944
+
14945
+ @if (activeEditorPanel === 'preview') {
14946
+ <section
14947
+ class="prx-rich-editor__preview-panel"
14948
+ role="tabpanel"
14949
+ [attr.aria-label]="tx('editor.preview', 'Preview')"
14950
+ >
14951
+ <header class="prx-rich-editor__section-header">
14952
+ <div>
14953
+ <h3>{{ tx('editor.preview', 'Preview') }}</h3>
14954
+ <p>
14955
+ {{
14956
+ tx(
14957
+ 'editor.previewHelp',
14958
+ 'Inspect the materialized document without mixing preview with authoring fields.'
14959
+ )
14960
+ }}
14961
+ </p>
14962
+ </div>
14963
+ </header>
14964
+ @if (parsedDocument) {
14965
+ <div class="prx-rich-editor__preview prx-rich-editor__preview--large">
14966
+ <praxis-rich-content
14967
+ [document]="parsedDocument"
14968
+ [layout]="layout"
14969
+ [rootClassName]="rootClassName"
14970
+ ></praxis-rich-content>
14971
+ </div>
14972
+ } @else {
14973
+ <p class="prx-rich-editor__empty">
14974
+ {{ tx('editor.previewUnavailable', 'Preview is unavailable until the document is valid.') }}
14975
+ </p>
14976
+ }
14977
+ </section>
14978
+ }
12785
14979
 
12786
- <label class="prx-rich-editor__document">
12787
- <span>{{ tx('editor.document', 'Advanced JSON') }}</span>
14980
+ @if (activeEditorPanel === 'json') {
14981
+ <section class="prx-rich-editor__document-panel">
14982
+ <header class="prx-rich-editor__section-header">
14983
+ <div>
14984
+ <h3>{{ tx('editor.document', 'Advanced JSON') }}</h3>
14985
+ <p>
14986
+ {{
14987
+ tx(
14988
+ 'editor.documentAdvancedHelp',
14989
+ 'Use JSON for diagnostics, migration and advanced fields that are not yet surfaced by guided controls.'
14990
+ )
14991
+ }}
14992
+ </p>
14993
+ </div>
14994
+ </header>
12788
14995
  <div class="prx-rich-editor__workbench">
14996
+ <label class="prx-rich-editor__document">
14997
+ <span>{{ tx('editor.documentJson', 'Canonical document JSON') }}</span>
12789
14998
  <textarea
12790
14999
  name="rich-content-document"
12791
15000
  [(ngModel)]="documentJson"
@@ -12799,6 +15008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12799
15008
  spellcheck="false"
12800
15009
  data-testid="rich-content-document-input"
12801
15010
  ></textarea>
15011
+ </label>
12802
15012
 
12803
15013
  <aside
12804
15014
  class="prx-rich-editor__inspector"
@@ -12818,21 +15028,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12818
15028
  </dl>
12819
15029
  </section>
12820
15030
 
12821
- @if (parsedDocument) {
12822
- <section>
12823
- <h3>{{ tx('editor.preview', 'Preview') }}</h3>
12824
- <div class="prx-rich-editor__preview">
12825
- <praxis-rich-content
12826
- [document]="parsedDocument"
12827
- [layout]="layout"
12828
- [rootClassName]="rootClassName"
12829
- ></praxis-rich-content>
12830
- </div>
12831
- </section>
12832
- }
12833
15031
  </aside>
12834
15032
  </div>
12835
- </label>
15033
+ </section>
12836
15034
 
12837
15035
  @if (errorMessage) {
12838
15036
  <div
@@ -12862,6 +15060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12862
15060
  }}
12863
15061
  </p>
12864
15062
  }
15063
+ }
12865
15064
 
12866
15065
  <div class="prx-rich-editor__actions">
12867
15066
  <button type="button" (click)="reset()">
@@ -12872,10 +15071,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
12872
15071
  </button>
12873
15072
  </div>
12874
15073
  </section>
12875
- `, styles: [":host{display:block;min-width:0}.prx-rich-editor{display:grid;gap:18px;color:var(--md-sys-color-on-surface, #1f2937)}.prx-rich-editor__header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__header h2{margin:0;font-size:1.25rem}.prx-rich-editor__header p{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673)}.prx-rich-editor__eyebrow{margin:0 0 4px;text-transform:uppercase;letter-spacing:.08em;font-size:.72rem;color:var(--md-sys-color-primary, #3154e7)}.prx-rich-editor__status{flex:0 0 auto;padding:6px 10px;border-radius:999px;background:color-mix(in srgb,#16a34a 12%,transparent);color:#166534;font-size:.78rem;font-weight:700}.prx-rich-editor__status.invalid{background:color-mix(in srgb,#dc2626 12%,transparent);color:#991b1b}.prx-rich-editor__grid{display:grid;gap:14px;grid-template-columns:minmax(0,180px) minmax(0,1fr)}.prx-rich-editor__blocks{display:grid;gap:14px}.prx-rich-editor__section-header,.prx-rich-editor__node-header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__section-header h3,.prx-rich-editor__node-header h4{margin:0}.prx-rich-editor__section-header p,.prx-rich-editor__node-note,.prx-rich-editor__empty{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.88rem}.prx-rich-editor__add-block,.prx-rich-editor__node-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.prx-rich-editor__add-block label{min-width:180px}.prx-rich-editor__node-list{display:grid;gap:12px}.prx-rich-editor__node-card{display:grid;gap:14px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__node-eyebrow{margin:0 0 4px;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.75rem;font-weight:700;text-transform:uppercase}.prx-rich-editor__node-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__wide-field,.prx-rich-editor__node-note{grid-column:1 / -1}.prx-rich-editor__field-group,.prx-rich-editor__nested-editor,.prx-rich-editor__nested-node{grid-column:1 / -1;display:grid;gap:12px}.prx-rich-editor__field-group,.prx-rich-editor__nested-node{margin:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px}.prx-rich-editor__field-group{grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__field-group legend{padding:0 4px;font-weight:700}.prx-rich-editor__nested-header,.prx-rich-editor__nested-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between}.prx-rich-editor__quick-actions{display:flex;flex-wrap:wrap;gap:8px}.prx-rich-editor__node-grid textarea{min-height:96px;font-family:inherit}label,.prx-rich-editor__document{display:grid;gap:7px;font-weight:700}.prx-rich-editor__checkbox-field{display:flex;gap:10px;align-items:center;align-self:end}.prx-rich-editor__checkbox-field input[type=checkbox]{width:auto}input,select,textarea{box-sizing:border-box;width:100%;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:12px;padding:10px 12px;font:inherit;color:inherit;background:var(--md-sys-color-surface, #fff)}textarea{min-height:360px;resize:vertical;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.86rem;line-height:1.45}.prx-rich-editor__workbench{display:grid;gap:14px;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.prx-rich-editor__inspector{display:grid;align-content:start;gap:14px;min-width:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__inspector h3{margin:0 0 8px;font-size:.95rem}.prx-rich-editor__inspector dl{display:grid;gap:8px;margin:0}.prx-rich-editor__inspector dl div{display:grid;gap:2px}.prx-rich-editor__inspector dt{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:700}.prx-rich-editor__inspector dd{margin:0;overflow-wrap:anywhere;font-weight:600}.prx-rich-editor__preview{max-height:260px;overflow:auto;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__help{margin:-8px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.85rem}.prx-rich-editor__error{margin:0;padding:10px 12px;border-radius:8px;color:#991b1b;background:color-mix(in srgb,#dc2626 9%,transparent)}.prx-rich-editor__error p{margin:0}.prx-rich-editor__error ul{display:grid;gap:6px;margin:8px 0 0;padding-inline-start:18px}.prx-rich-editor__error code{margin-right:4px;font-family:Cascadia Code,Fira Code,Consolas,monospace}.prx-rich-editor__actions{display:flex;flex-wrap:wrap;gap:10px}button{border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:8px 14px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);font-weight:700;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}@media(max-width:760px){.prx-rich-editor__header,.prx-rich-editor__section-header,.prx-rich-editor__node-header,.prx-rich-editor__grid,.prx-rich-editor__field-group,.prx-rich-editor__node-grid,.prx-rich-editor__workbench{grid-template-columns:1fr;display:grid}}\n"] }]
15074
+ `, styles: [":host{display:block;min-width:0;width:100%;max-width:100%;box-sizing:border-box}.prx-rich-editor{display:grid;gap:18px;min-width:0;color:var(--md-sys-color-on-surface, #1f2937)}.prx-rich-editor__header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__header h2{margin:0;font-size:1.25rem}.prx-rich-editor__header p{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673)}.prx-rich-editor__eyebrow{margin:0 0 4px;text-transform:uppercase;letter-spacing:.08em;font-size:.72rem;color:var(--md-sys-color-primary, #3154e7)}.prx-rich-editor__status{flex:0 0 auto;padding:6px 10px;border-radius:999px;background:color-mix(in srgb,#16a34a 12%,transparent);color:#166534;font-size:.78rem;font-weight:700}.prx-rich-editor__status.invalid{background:color-mix(in srgb,#dc2626 12%,transparent);color:#991b1b}.prx-rich-editor__grid{display:grid;gap:14px;grid-template-columns:minmax(0,180px) minmax(0,1fr)}.prx-rich-editor__tabs{display:flex;flex-wrap:wrap;gap:8px;align-items:center;border-bottom:1px solid var(--md-sys-color-outline-variant, #d7dce5)}.prx-rich-editor__tab{margin-block-end:-1px;border-radius:8px 8px 0 0;border-bottom-color:transparent;color:var(--md-sys-color-on-surface-variant, #5f6673);background:transparent}.prx-rich-editor__tab--active{border-color:var(--md-sys-color-outline-variant, #d7dce5);border-bottom-color:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__tab-badge,.prx-rich-editor__issue-count{display:inline-flex;min-width:1.35em;min-height:1.35em;padding:0 .38em;border-radius:999px;align-items:center;justify-content:center;background:color-mix(in srgb,#dc2626 14%,transparent);color:#991b1b;font-size:.72rem;font-weight:800;line-height:1}.prx-rich-editor__tab-badge{margin-inline-start:6px}.prx-rich-editor__blocks{display:grid;gap:14px}.prx-rich-editor__authoring-shell{display:grid;gap:14px;grid-template-columns:minmax(220px,.34fr) minmax(0,1fr);align-items:start}.prx-rich-editor__structure,.prx-rich-editor__properties,.prx-rich-editor__document-panel,.prx-rich-editor__preview-panel{min-width:0;display:grid;gap:12px}.prx-rich-editor__structure{position:sticky;top:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__structure-summary{display:grid;gap:4px}.prx-rich-editor__structure-summary span{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.82rem;font-weight:500}.prx-rich-editor__structure-list{display:grid;gap:8px}.prx-rich-editor__structure-item{display:grid;gap:3px;width:100%;padding:10px;text-align:left;color:var(--md-sys-color-on-surface, #1f2937);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__structure-item--selected{border-color:var(--md-sys-color-primary, #3154e7);background:color-mix(in srgb,var(--md-sys-color-primary, #3154e7) 8%,var(--md-sys-color-surface, #fff))}.prx-rich-editor__structure-item small{color:#991b1b;font-weight:700}.prx-rich-editor__intent-strip{display:grid;gap:8px;grid-template-columns:repeat(3,minmax(0,1fr))}.prx-rich-editor__intent-strip span,.prx-rich-editor__intent-strip button{min-width:0;display:grid;gap:3px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:10px 12px;text-align:left;color:var(--md-sys-color-on-surface, #1f2937);background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__intent-strip button{position:relative}.prx-rich-editor__intent-strip small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__intent-strip .prx-rich-editor__issue-count{position:absolute;inset-block-start:8px;inset-inline-end:8px}.prx-rich-editor__section-header,.prx-rich-editor__node-header{display:flex;gap:16px;align-items:flex-start;justify-content:space-between}.prx-rich-editor__section-header h3,.prx-rich-editor__node-header h4{margin:0}.prx-rich-editor__section-header p,.prx-rich-editor__node-note,.prx-rich-editor__empty{margin:6px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.88rem}.prx-rich-editor__add-block,.prx-rich-editor__node-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end}.prx-rich-editor__add-block label{min-width:180px}.prx-rich-editor__node-list{display:grid;gap:12px}.prx-rich-editor__node-card{display:grid;gap:14px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:14px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__node-eyebrow{margin:0 0 4px;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.75rem;font-weight:700;text-transform:uppercase}.prx-rich-editor__node-grid{display:grid;gap:12px;grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__wide-field,.prx-rich-editor__node-note{grid-column:1 / -1}.prx-rich-editor__field-group,.prx-rich-editor__nested-editor,.prx-rich-editor__nested-node{grid-column:1 / -1;display:grid;gap:12px}.prx-rich-editor__field-group,.prx-rich-editor__nested-node{margin:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px}.prx-rich-editor__document-context{display:grid;gap:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__document-context summary{display:flex;gap:10px;align-items:center;justify-content:space-between;cursor:pointer;font-weight:800}.prx-rich-editor__document-context summary small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__document-context[open] summary{margin-block-end:12px}.prx-rich-editor__field-group{grid-template-columns:repeat(2,minmax(0,1fr))}.prx-rich-editor__field-group legend{padding:0 4px;font-weight:700}.prx-rich-editor__field-help{grid-column:1 / -1;margin:0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.84rem}.prx-rich-editor__json-fieldset{margin-block-start:12px}.prx-rich-editor__json-field{display:grid;gap:6px}.prx-rich-editor__json-field textarea{min-height:96px;font-family:SFMono-Regular,Consolas,Liberation Mono,monospace;font-size:.8rem;line-height:1.45}.prx-rich-editor__field-error{color:var(--md-sys-color-error, #ba1a1a);font-size:.78rem;font-weight:700}.prx-rich-editor__advanced-group{grid-column:1 / -1;display:grid;gap:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:color-mix(in srgb,var(--md-sys-color-surface-container-lowest, #fff) 88%,var(--md-sys-color-primary, #3154e7) 4%)}.prx-rich-editor__advanced-group summary{display:flex;gap:10px;align-items:center;justify-content:space-between;cursor:pointer;font-weight:800}.prx-rich-editor__advanced-group summary small{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:600}.prx-rich-editor__advanced-group[open]{padding-block-end:14px}.prx-rich-editor__advanced-group[open] summary{margin-block-end:12px}.prx-rich-editor__advanced-group .prx-rich-editor__field-group+.prx-rich-editor__field-group{margin-block-start:12px}.prx-rich-editor__advanced-json-map{display:grid;gap:8px;margin-block-start:12px;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__advanced-json-map p{margin:0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.84rem}.prx-rich-editor__advanced-json-chips{display:flex;flex-wrap:wrap;gap:6px}.prx-rich-editor__advanced-json-chips code{border-radius:999px;padding:4px 8px;background:color-mix(in srgb,var(--md-sys-color-primary, #3154e7) 12%,transparent);color:var(--md-sys-color-primary, #3154e7);font-size:.76rem;font-weight:700}.prx-rich-editor__nested-header,.prx-rich-editor__nested-actions{display:flex;flex-wrap:wrap;gap:10px;align-items:center;justify-content:space-between}.prx-rich-editor__quick-actions{display:flex;flex-wrap:wrap;gap:8px}.prx-rich-editor__node-grid textarea{min-height:96px;font-family:inherit}label,.prx-rich-editor__document{display:grid;gap:7px;font-weight:700}.prx-rich-editor__checkbox-field{display:flex;gap:10px;align-items:center;align-self:end}.prx-rich-editor__checkbox-field input[type=checkbox]{width:auto}input,select,textarea{box-sizing:border-box;width:100%;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:12px;padding:10px 12px;font:inherit;color:inherit;background:var(--md-sys-color-surface, #fff)}textarea{min-height:360px;resize:vertical;font-family:Cascadia Code,Fira Code,Consolas,monospace;font-size:.86rem;line-height:1.45}.prx-rich-editor__workbench{display:grid;gap:14px;grid-template-columns:minmax(0,1.2fr) minmax(260px,.8fr)}.prx-rich-editor__inspector{display:grid;align-content:start;gap:14px;min-width:0;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface-container-lowest, #fff)}.prx-rich-editor__inspector h3{margin:0 0 8px;font-size:.95rem}.prx-rich-editor__inspector dl{display:grid;gap:8px;margin:0}.prx-rich-editor__inspector dl div{display:grid;gap:2px}.prx-rich-editor__inspector dt{color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.78rem;font-weight:700}.prx-rich-editor__inspector dd{margin:0;overflow-wrap:anywhere;font-weight:600}.prx-rich-editor__preview{max-height:260px;overflow:auto;border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:12px;background:var(--md-sys-color-surface, #fff)}.prx-rich-editor__preview--large{max-height:min(68vh,760px)}.prx-rich-editor__help{margin:-8px 0 0;color:var(--md-sys-color-on-surface-variant, #5f6673);font-size:.85rem}.prx-rich-editor__error{margin:0;padding:10px 12px;border-radius:8px;color:#991b1b;background:color-mix(in srgb,#dc2626 9%,transparent)}.prx-rich-editor__error p{margin:0}.prx-rich-editor__error ul{display:grid;gap:6px;margin:8px 0 0;padding-inline-start:18px}.prx-rich-editor__error code{margin-right:4px;font-family:Cascadia Code,Fira Code,Consolas,monospace}.prx-rich-editor__actions{display:flex;flex-wrap:wrap;gap:10px}button{border:1px solid var(--md-sys-color-outline-variant, #d7dce5);border-radius:8px;padding:8px 14px;background:var(--md-sys-color-surface, #fff);color:var(--md-sys-color-primary, #3154e7);font-weight:700;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.55}@media(max-width:760px){.prx-rich-editor__header,.prx-rich-editor__section-header,.prx-rich-editor__node-header,.prx-rich-editor__authoring-shell,.prx-rich-editor__intent-strip,.prx-rich-editor__grid,.prx-rich-editor__document-context summary,.prx-rich-editor__field-group,.prx-rich-editor__node-grid,.prx-rich-editor__workbench{grid-template-columns:1fr;display:grid}.prx-rich-editor__structure{position:static}}\n"] }]
12876
15075
  }], propDecorators: { inputs: [{
12877
15076
  type: Input
12878
15077
  }] } });
15078
+ function isPlainRecord(value) {
15079
+ return !!value && typeof value === 'object' && !Array.isArray(value);
15080
+ }
12879
15081
 
12880
15082
  const DEFAULT_RICH_CONTENT_DOCUMENT = {
12881
15083
  kind: 'praxis.rich-content',
@@ -16016,6 +18218,188 @@ const RICH_CONTENT_INSERTION_PRESETS = [
16016
18218
  },
16017
18219
  },
16018
18220
  },
18221
+ {
18222
+ id: 'corporate-information-surface',
18223
+ label: 'Corporate information surface',
18224
+ description: 'Enterprise starter for SAP-like record details with KPIs, dates, currency, notes, progress, timeline and governed decision context.',
18225
+ icon: 'business_center',
18226
+ inputs: {
18227
+ document: {
18228
+ kind: 'praxis.rich-content',
18229
+ version: '1.0.0',
18230
+ nodes: [
18231
+ {
18232
+ type: 'recordSummary',
18233
+ title: 'Purchase order OC-4500128391',
18234
+ subtitle: 'Companhia Global de Servicos S.A.',
18235
+ meta: 'Aguardando aprovacao fiscal',
18236
+ fields: [
18237
+ { label: 'CNPJ fornecedor', value: '12.345.678/0001-99' },
18238
+ { label: 'CPF solicitante', value: '990.000.000-47' },
18239
+ { label: 'Prioridade', value: 'Alta' },
18240
+ ],
18241
+ },
18242
+ {
18243
+ type: 'statGroup',
18244
+ title: 'Operational signals',
18245
+ subtitle: 'Dense indicators for enterprise work queues.',
18246
+ layout: 'grid',
18247
+ items: [
18248
+ {
18249
+ label: 'Valor liquido',
18250
+ value: 'R$ 1.268.114,52',
18251
+ caption: 'Apos impostos e estorno',
18252
+ icon: 'payments',
18253
+ tone: 'success',
18254
+ },
18255
+ {
18256
+ label: 'SLA restante',
18257
+ value: '18,5h',
18258
+ caption: 'Sem atraso',
18259
+ icon: 'schedule',
18260
+ tone: 'info',
18261
+ },
18262
+ {
18263
+ label: 'Risco',
18264
+ value: 'Medio',
18265
+ caption: 'Retencao fiscal pendente',
18266
+ icon: 'gpp_maybe',
18267
+ tone: 'warning',
18268
+ },
18269
+ ],
18270
+ },
18271
+ {
18272
+ type: 'propertySheet',
18273
+ title: 'Calendario e valores',
18274
+ columns: 2,
18275
+ items: [
18276
+ { label: 'Competencia', value: '04/2026' },
18277
+ { label: 'Emissao', value: '28/04/2026' },
18278
+ { label: 'Vencimento', value: '30 de maio de 2026' },
18279
+ { label: 'Ultima atualizacao', value: '02/05/2026 16:45' },
18280
+ { label: 'Valor bruto', value: 'R$ 1.389.420,75' },
18281
+ { label: 'Imposto retido', value: 'R$ 121.306,23' },
18282
+ ],
18283
+ },
18284
+ {
18285
+ type: 'keyValueList',
18286
+ title: 'Notas e listas corporativas',
18287
+ layout: 'stacked',
18288
+ items: [
18289
+ {
18290
+ label: 'Centros de custo',
18291
+ value: '1100 - Operacoes Brasil, 2200 - TI Corporativa, 3300 - Facilities',
18292
+ badge: 'rateio',
18293
+ },
18294
+ {
18295
+ label: 'Aprovadores',
18296
+ value: 'Gerencia financeira, Controladoria, Juridico tributario',
18297
+ badge: '3 niveis',
18298
+ },
18299
+ {
18300
+ label: 'Observacao',
18301
+ value: 'Contrato com retencao fiscal e aprovacao em multiplos niveis.',
18302
+ badge: 'nota',
18303
+ },
18304
+ ],
18305
+ },
18306
+ {
18307
+ type: 'progress',
18308
+ label: 'Completude de aprovacao',
18309
+ valueExpr: '${row.approvalProgress}',
18310
+ max: 100,
18311
+ showPercent: true,
18312
+ },
18313
+ {
18314
+ type: 'timeline',
18315
+ title: 'Historico operacional',
18316
+ orientation: 'horizontal',
18317
+ order: 'normal',
18318
+ position: 'alternate',
18319
+ connectorVariant: 'dashed',
18320
+ connectorColor: 'neutral',
18321
+ markerVariant: 'number',
18322
+ markerColor: 'primary',
18323
+ markerStyle: 'filled',
18324
+ emphasis: 'strong',
18325
+ density: 'comfortable',
18326
+ textAppearance: 'prominent',
18327
+ items: [
18328
+ {
18329
+ id: 'created',
18330
+ title: 'Documento criado',
18331
+ subtitle: 'Importado da NF-e e associado ao contrato.',
18332
+ opposite: '28/04/2026',
18333
+ badge: 'origem',
18334
+ markerColor: 'info',
18335
+ },
18336
+ {
18337
+ id: 'tax-review',
18338
+ title: 'Analise fiscal',
18339
+ subtitle: 'Retencao e rateio em validacao.',
18340
+ opposite: '02/05/2026',
18341
+ badge: 'pendente',
18342
+ markerColor: 'warning',
18343
+ },
18344
+ {
18345
+ id: 'approval',
18346
+ title: 'Aprovacao final',
18347
+ subtitle: 'Pronto para decisao governada.',
18348
+ opposite: 'SLA 18,5h',
18349
+ badge: 'proximo',
18350
+ markerColor: 'success',
18351
+ markerStyle: 'outlined',
18352
+ },
18353
+ ],
18354
+ },
18355
+ {
18356
+ type: 'decisionPackage',
18357
+ title: 'Decision package',
18358
+ subtitle: 'Fiscal approval',
18359
+ summary: 'Approve, request evidence or escalate from a governed host action.',
18360
+ status: 'simulated',
18361
+ owner: 'Controladoria',
18362
+ policySource: 'Fiscal retention policy',
18363
+ version: '2026.05',
18364
+ confidence: 82,
18365
+ risk: 'medium',
18366
+ lastReviewed: '2026-05-02',
18367
+ primaryAction: {
18368
+ type: 'actionButton',
18369
+ label: 'Approve package',
18370
+ variant: 'raised',
18371
+ color: 'primary',
18372
+ action: { actionId: 'purchaseOrder.approval.approve' },
18373
+ },
18374
+ secondaryActions: [
18375
+ {
18376
+ type: 'actionButton',
18377
+ label: 'Request evidence',
18378
+ variant: 'stroked',
18379
+ action: { actionId: 'purchaseOrder.approval.requestEvidence' },
18380
+ },
18381
+ ],
18382
+ },
18383
+ {
18384
+ type: 'actionCard',
18385
+ title: 'Open governed workflow',
18386
+ subtitle: 'Host-mediated operation',
18387
+ message: 'Use actionCard for SAP-like enterprise flows that need audit, permission checks and contextual dispatch.',
18388
+ meta: 'surface.open',
18389
+ ctaLabel: 'Open detail',
18390
+ variant: 'raised',
18391
+ color: 'primary',
18392
+ action: { actionId: 'purchaseOrder.detail.open' },
18393
+ },
18394
+ ],
18395
+ },
18396
+ context: {
18397
+ row: {
18398
+ approvalProgress: 58,
18399
+ },
18400
+ },
18401
+ },
18402
+ },
16019
18403
  {
16020
18404
  id: 'stat-group',
16021
18405
  label: 'Stat group',