@praxisui/rich-content 9.0.0-beta.6 → 9.0.0-beta.60

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -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,6 +63,12 @@ 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',
@@ -86,21 +112,33 @@ const PRAXIS_RICH_CONTENT_EN_US = {
86
112
  'praxis.richContent.editor.field.icon': 'Icon',
87
113
  'praxis.richContent.editor.field.ariaLabel': 'Accessible label',
88
114
  'praxis.richContent.editor.field.src': 'Image URL',
115
+ 'praxis.richContent.editor.field.srcExpr': 'Image URL binding',
89
116
  'praxis.richContent.editor.field.href': 'Link URL',
90
117
  'praxis.richContent.editor.field.target': 'Target',
91
118
  'praxis.richContent.editor.field.rel': 'Rel',
92
119
  'praxis.richContent.editor.field.alt': 'Alternative text',
120
+ 'praxis.richContent.editor.field.altExpr': 'Alt text binding',
93
121
  'praxis.richContent.editor.field.testId': 'Test id',
94
122
  'praxis.richContent.editor.field.className': 'CSS class',
95
123
  'praxis.richContent.editor.field.visibleWhenPath': 'Context path',
96
124
  'praxis.richContent.editor.field.visibleWhenValue': 'Expected value',
97
125
  'praxis.richContent.editor.field.styleName': 'CSS property',
98
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',
99
135
  'praxis.richContent.editor.field.valueExpr': 'Value binding',
100
136
  'praxis.richContent.editor.field.captionExpr': 'Caption binding',
101
137
  'praxis.richContent.editor.field.max': 'Maximum',
138
+ 'praxis.richContent.editor.field.showPercent': 'Show percent',
102
139
  'praxis.richContent.editor.field.direction': 'Direction',
103
140
  'praxis.richContent.editor.field.gap': 'Gap',
141
+ 'praxis.richContent.editor.field.wrap': 'Wrap items',
104
142
  'praxis.richContent.editor.field.avatarName': 'Avatar name',
105
143
  'praxis.richContent.editor.field.avatarImage': 'Avatar image',
106
144
  'praxis.richContent.editor.field.nameExpr': 'Name binding',
@@ -112,6 +150,7 @@ const PRAXIS_RICH_CONTENT_EN_US = {
112
150
  'praxis.richContent.editor.field.meta': 'Meta',
113
151
  'praxis.richContent.editor.field.opposite': 'Opposite content',
114
152
  'praxis.richContent.editor.field.badge': 'Badge',
153
+ 'praxis.richContent.editor.field.badgeExpr': 'Badge binding',
115
154
  'praxis.richContent.editor.field.preset': 'Preset',
116
155
  'praxis.richContent.editor.field.title': 'Title',
117
156
  'praxis.richContent.editor.field.subtitle': 'Subtitle',
@@ -168,11 +207,29 @@ const PRAXIS_RICH_CONTENT_EN_US = {
168
207
  'praxis.richContent.editor.field.ctaLabel': 'CTA label',
169
208
  'praxis.richContent.editor.field.ctaIcon': 'CTA icon',
170
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',
171
215
  'praxis.richContent.editor.field.mediaKind': 'Media',
172
216
  'praxis.richContent.editor.field.mediaSrc': 'Media source',
217
+ 'praxis.richContent.editor.field.mediaSrcExpr': 'Media source binding',
173
218
  'praxis.richContent.editor.field.mediaAlt': 'Media alt text',
219
+ 'praxis.richContent.editor.field.mediaAltExpr': 'Media alt binding',
174
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',
175
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',
176
233
  'praxis.richContent.editor.decisionGovernance': 'Decision governance',
177
234
  'praxis.richContent.editor.decisionEvidence': 'Evidence',
178
235
  'praxis.richContent.editor.decisionPrimaryAction': 'Primary action',
@@ -210,6 +267,20 @@ const PRAXIS_RICH_CONTENT_EN_US = {
210
267
  'praxis.richContent.editor.placeholder.supersedesExpr': '${decision.supersedes}',
211
268
  'praxis.richContent.editor.placeholder.evidenceLabelExpr': '${evidence.label}',
212
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',
213
284
  'praxis.richContent.editor.cardVariant.outlined': 'Outlined',
214
285
  'praxis.richContent.editor.cardVariant.elevated': 'Elevated',
215
286
  'praxis.richContent.editor.cardVariant.filled': 'Filled',
@@ -218,8 +289,18 @@ const PRAXIS_RICH_CONTENT_EN_US = {
218
289
  'praxis.richContent.editor.size.sm': 'Small',
219
290
  'praxis.richContent.editor.size.md': 'Medium',
220
291
  'praxis.richContent.editor.size.lg': 'Large',
292
+ 'praxis.richContent.editor.density.compact': 'Compact',
293
+ 'praxis.richContent.editor.density.comfortable': 'Comfortable',
221
294
  'praxis.richContent.editor.orientation.vertical': 'Vertical',
222
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',
223
304
  'praxis.richContent.editor.mediaKind.image': 'Image',
224
305
  'praxis.richContent.editor.mediaKind.video': 'Video',
225
306
  'praxis.richContent.editor.mediaKind.icon': 'Icon',
@@ -366,6 +447,8 @@ const PRAXIS_RICH_CONTENT_EN_US = {
366
447
  'praxis.richContent.editor.nodeTypes': 'Types',
367
448
  'praxis.richContent.editor.none': 'None',
368
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.',
369
452
  'praxis.richContent.editor.restore': 'Restore',
370
453
  'praxis.richContent.editor.emptyDocument': 'Empty document',
371
454
  'praxis.richContent.editor.validation.documentShape': 'The document must be a valid RichContentDocument.',
@@ -400,6 +483,12 @@ const PRAXIS_RICH_CONTENT_EN_US = {
400
483
  'praxis.richContent.editor.validation.numberField': 'This field must be a number.',
401
484
  'praxis.richContent.editor.validation.booleanField': 'This field must be a boolean.',
402
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.',
403
492
  };
404
493
 
405
494
  const PRAXIS_RICH_CONTENT_PT_BR = {
@@ -408,15 +497,35 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
408
497
  'praxis.richContent.editor.subtitle': 'Edite o documento canônico consumido pelo renderer. O payload salvo preserva os demais inputs do widget.',
409
498
  'praxis.richContent.editor.valid': 'Documento válido',
410
499
  'praxis.richContent.editor.invalid': 'JSON inválido',
500
+ 'praxis.richContent.editor.invalidBadge': 'Inválido',
411
501
  'praxis.richContent.editor.layout': 'Layout',
412
502
  'praxis.richContent.editor.layout.block': 'Bloco',
413
503
  'praxis.richContent.editor.layout.inline': 'Inline',
414
504
  'praxis.richContent.editor.rootClass': 'Classe raiz',
415
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',
416
511
  'praxis.richContent.editor.document': 'JSON avançado',
512
+ 'praxis.richContent.editor.documentJson': 'JSON do documento canônico',
417
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.',
418
515
  'praxis.richContent.editor.blocks': 'Blocos',
419
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',
420
529
  'praxis.richContent.editor.block': 'Bloco',
421
530
  'praxis.richContent.editor.blockType': 'Tipo de bloco',
422
531
  'praxis.richContent.editor.addBlock': 'Adicionar bloco',
@@ -438,6 +547,12 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
438
547
  'praxis.richContent.editor.cardContentHelp': 'O conteúdo do card é preservado no JSON. Use o JSON avançado para nodes aninhados do card.',
439
548
  'praxis.richContent.editor.nodeId': 'Id estável',
440
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.',
441
556
  'praxis.richContent.editor.visibilityRule': 'Regra de visibilidade',
442
557
  'praxis.richContent.editor.safeStyle': 'Estilo seguro',
443
558
  'praxis.richContent.editor.nodeType.text': 'Texto',
@@ -460,21 +575,33 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
460
575
  'praxis.richContent.editor.field.icon': 'Ícone',
461
576
  'praxis.richContent.editor.field.ariaLabel': 'Label acessível',
462
577
  'praxis.richContent.editor.field.src': 'URL da imagem',
578
+ 'praxis.richContent.editor.field.srcExpr': 'Vínculo da URL da imagem',
463
579
  'praxis.richContent.editor.field.href': 'URL do link',
464
580
  'praxis.richContent.editor.field.target': 'Destino',
465
581
  'praxis.richContent.editor.field.rel': 'Rel',
466
582
  'praxis.richContent.editor.field.alt': 'Texto alternativo',
583
+ 'praxis.richContent.editor.field.altExpr': 'Vínculo do texto alternativo',
467
584
  'praxis.richContent.editor.field.testId': 'Id de teste',
468
585
  'praxis.richContent.editor.field.className': 'Classe CSS',
469
586
  'praxis.richContent.editor.field.visibleWhenPath': 'Path de contexto',
470
587
  'praxis.richContent.editor.field.visibleWhenValue': 'Valor esperado',
471
588
  'praxis.richContent.editor.field.styleName': 'Propriedade CSS',
472
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',
473
598
  'praxis.richContent.editor.field.valueExpr': 'Binding do valor',
474
599
  'praxis.richContent.editor.field.captionExpr': 'Binding da legenda',
475
600
  'praxis.richContent.editor.field.max': 'Máximo',
601
+ 'praxis.richContent.editor.field.showPercent': 'Mostrar percentual',
476
602
  'praxis.richContent.editor.field.direction': 'Direção',
477
603
  'praxis.richContent.editor.field.gap': 'Espaçamento',
604
+ 'praxis.richContent.editor.field.wrap': 'Quebrar itens',
478
605
  'praxis.richContent.editor.field.avatarName': 'Nome do avatar',
479
606
  'praxis.richContent.editor.field.avatarImage': 'Imagem do avatar',
480
607
  'praxis.richContent.editor.field.nameExpr': 'Vínculo do nome',
@@ -486,16 +613,35 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
486
613
  'praxis.richContent.editor.field.meta': 'Meta',
487
614
  'praxis.richContent.editor.field.opposite': 'Conteúdo oposto',
488
615
  'praxis.richContent.editor.field.badge': 'Badge',
616
+ 'praxis.richContent.editor.field.badgeExpr': 'Vínculo do badge',
489
617
  'praxis.richContent.editor.field.preset': 'Preset',
490
618
  'praxis.richContent.editor.field.title': 'Título',
491
619
  'praxis.richContent.editor.field.subtitle': 'Subtítulo',
492
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',
493
626
  'praxis.richContent.editor.field.orientation': 'Orientação',
494
627
  'praxis.richContent.editor.field.mediaKind': 'Mídia',
495
628
  'praxis.richContent.editor.field.mediaSrc': 'Origem da mídia',
629
+ 'praxis.richContent.editor.field.mediaSrcExpr': 'Vínculo da origem da mídia',
496
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',
497
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',
498
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',
499
645
  'praxis.richContent.editor.cardVariant.outlined': 'Com contorno',
500
646
  'praxis.richContent.editor.cardVariant.elevated': 'Elevado',
501
647
  'praxis.richContent.editor.cardVariant.filled': 'Preenchido',
@@ -504,8 +650,18 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
504
650
  'praxis.richContent.editor.size.sm': 'Pequeno',
505
651
  'praxis.richContent.editor.size.md': 'Médio',
506
652
  'praxis.richContent.editor.size.lg': 'Grande',
653
+ 'praxis.richContent.editor.density.compact': 'Compacta',
654
+ 'praxis.richContent.editor.density.comfortable': 'Confortável',
507
655
  'praxis.richContent.editor.orientation.vertical': 'Vertical',
508
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',
509
665
  'praxis.richContent.editor.mediaKind.image': 'Imagem',
510
666
  'praxis.richContent.editor.mediaKind.video': 'Vídeo',
511
667
  'praxis.richContent.editor.mediaKind.icon': 'Ícone',
@@ -528,6 +684,20 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
528
684
  'praxis.richContent.editor.placeholder.valueExpr': 'row.total',
529
685
  'praxis.richContent.editor.placeholder.captionExpr': 'row.caption',
530
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',
531
701
  'praxis.richContent.editor.placeholder.nameExpr': 'row.name',
532
702
  'praxis.richContent.editor.placeholder.imageSrcExpr': 'row.avatarUrl',
533
703
  'praxis.richContent.editor.placeholder.initialsExpr': 'row.initials',
@@ -554,6 +724,8 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
554
724
  'praxis.richContent.editor.nodeTypes': 'Tipos',
555
725
  'praxis.richContent.editor.none': 'Nenhum',
556
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.',
557
729
  'praxis.richContent.editor.restore': 'Restaurar',
558
730
  'praxis.richContent.editor.emptyDocument': 'Documento vazio',
559
731
  'praxis.richContent.editor.validation.documentShape': 'O documento deve ser um RichContentDocument válido.',
@@ -788,6 +960,12 @@ const PRAXIS_RICH_CONTENT_PT_BR = {
788
960
  'praxis.richContent.editor.defaultTabsSubtitle': 'Agrupe visões portáveis sem inventar markup de abas no host.',
789
961
  'praxis.richContent.editor.defaultTabLabel': 'Visão geral',
790
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.',
791
969
  };
792
970
 
793
971
  function createPraxisRichContentI18nConfig(options = {}) {
@@ -1032,6 +1210,15 @@ class PraxisRichContent {
1032
1210
  const value = this.resolveValue(node.valueExpr);
1033
1211
  return typeof value === 'number' ? value : Number(value ?? 0);
1034
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
+ }
1035
1222
  resolveProgressLabel(node) {
1036
1223
  return this.resolveValue(node.labelExpr) ?? node.label ?? null;
1037
1224
  }
@@ -2007,18 +2194,32 @@ class PraxisRichContent {
2007
2194
  </div>
2008
2195
  }
2009
2196
  @case ('metric') {
2010
- <div class="prx-rich-metric">
2011
- <div class="prx-rich-metric-label">{{ node.label }}</div>
2012
- <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
2013
- @if (resolveMetricCaption(node); as caption) {
2014
- <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>
2015
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>
2016
2210
  </div>
2017
2211
  }
2018
2212
  @case ('progress') {
2019
2213
  <div class="prx-rich-progress">
2020
- @if (resolveProgressLabel(node); as progressLabel) {
2021
- <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>
2022
2223
  }
2023
2224
  <progress
2024
2225
  class="prx-rich-progress-bar"
@@ -3088,7 +3289,7 @@ class PraxisRichContent {
3088
3289
  </span>
3089
3290
  }
3090
3291
  </ng-template>
3091
- `, 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 });
3092
3293
  }
3093
3294
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRichContent, decorators: [{
3094
3295
  type: Component,
@@ -3159,18 +3360,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
3159
3360
  </div>
3160
3361
  }
3161
3362
  @case ('metric') {
3162
- <div class="prx-rich-metric">
3163
- <div class="prx-rich-metric-label">{{ node.label }}</div>
3164
- <div class="prx-rich-metric-value">{{ resolveMetricValue(node) }}</div>
3165
- @if (resolveMetricCaption(node); as caption) {
3166
- <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>
3167
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>
3168
3376
  </div>
3169
3377
  }
3170
3378
  @case ('progress') {
3171
3379
  <div class="prx-rich-progress">
3172
- @if (resolveProgressLabel(node); as progressLabel) {
3173
- <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>
3174
3389
  }
3175
3390
  <progress
3176
3391
  class="prx-rich-progress-bar"
@@ -4240,7 +4455,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
4240
4455
  </span>
4241
4456
  }
4242
4457
  </ng-template>
4243
- `, 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"] }]
4244
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: [{
4245
4460
  type: Input
4246
4461
  }] } });
@@ -4282,6 +4497,14 @@ const SUPPORTED_NODE_TYPES = new Set([
4282
4497
  'timeline',
4283
4498
  'preset',
4284
4499
  ]);
4500
+ const SUPPORTED_CONTEXT_SCOPES = new Set([
4501
+ 'row',
4502
+ 'computed',
4503
+ 'detail',
4504
+ 'meta',
4505
+ 'user',
4506
+ 'tenant',
4507
+ ]);
4285
4508
  const STYLE_NAME_PATTERN = /^--[a-zA-Z0-9-_]+$|^[a-z][a-zA-Z0-9-]*$/;
4286
4509
  const CLASS_NAME_PATTERN = /^[a-zA-Z_][a-zA-Z0-9_-]*(\s+[a-zA-Z_][a-zA-Z0-9_-]*)*$/;
4287
4510
  const UNSAFE_STYLE_VALUE_PATTERN = /(?:javascript\s*:|vbscript\s*:|data\s*:|expression\s*\(|@import|-moz-binding|behavior\s*:)/i;
@@ -4298,6 +4521,7 @@ function validateRichContentDocument(value) {
4298
4521
  if (value['version'] !== SUPPORTED_DOCUMENT_VERSION) {
4299
4522
  addIssue(issues, '$.version', 'editor.validation.documentVersion', 'The document version must be "1.0.0".');
4300
4523
  }
4524
+ validateContextConfig(value['context'], '$.context', issues);
4301
4525
  if (!Array.isArray(value['nodes'])) {
4302
4526
  addIssue(issues, '$.nodes', 'editor.validation.documentNodes', 'The document must include a nodes array.');
4303
4527
  }
@@ -4675,6 +4899,7 @@ function validateBaseNode(node, path, issues) {
4675
4899
  validateOptionalClassName(node, 'className', path, issues);
4676
4900
  validateOptionalStringArray(node, 'requiresCapabilities', path, issues);
4677
4901
  validateEnum(node, 'capabilityMode', ['all', 'any'], path, issues, false);
4902
+ validateContextConfig(node['bindings'], `${path}.bindings`, issues);
4678
4903
  validateStyleObject(node['style'], `${path}.style`, issues);
4679
4904
  validateRuleExpression(node['visibleWhen'], `${path}.visibleWhen`, issues);
4680
4905
  validateRuleExpression(node['disabledWhen'], `${path}.disabledWhen`, issues);
@@ -4682,6 +4907,39 @@ function validateBaseNode(node, path, issues) {
4682
4907
  validateClassWhen(node['classWhen'], `${path}.classWhen`, issues);
4683
4908
  validateStyleWhen(node['styleWhen'], `${path}.styleWhen`, issues);
4684
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
+ }
4685
4943
  function validateActionRef(value, path, issues) {
4686
4944
  if (!isRecord(value)) {
4687
4945
  addIssue(issues, path, 'editor.validation.objectField', 'Action configuration must be an object.');
@@ -5733,6 +5991,21 @@ function stringifyScalar(value) {
5733
5991
  return '';
5734
5992
  }
5735
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
+ ];
5736
6009
  const EMPTY_DOCUMENT = {
5737
6010
  kind: 'praxis.rich-content',
5738
6011
  version: '1.0.0',
@@ -5752,6 +6025,7 @@ class PraxisRichContentConfigEditor {
5752
6025
  editableNodeTypes = EDITABLE_TOP_LEVEL_NODE_TYPES;
5753
6026
  presenterNodeTypes = EDITABLE_PRESENTER_NODE_TYPES;
5754
6027
  cardContentNodeTypes = EDITABLE_CARD_CONTENT_NODE_TYPES;
6028
+ advancedJsonOnlyNodeFields = ADVANCED_JSON_ONLY_NODE_FIELDS;
5755
6029
  presetOptions = this.presetRegistry.list();
5756
6030
  documentJson = '';
5757
6031
  layout = 'block';
@@ -5763,8 +6037,13 @@ class PraxisRichContentConfigEditor {
5763
6037
  validationIssues = [];
5764
6038
  nodeCount = 0;
5765
6039
  nodeTypeSummary = '';
6040
+ selectedNodeIndex = 0;
6041
+ activeEditorPanel = 'guided';
6042
+ advancedRulesOpen = false;
6043
+ advancedJsonFieldErrors = {};
5766
6044
  initialInputs = this.normalizeInputs(this.inputs);
5767
6045
  pendingRemoval = null;
6046
+ advancedJsonFieldDrafts = {};
5768
6047
  ngOnChanges(changes) {
5769
6048
  if (changes['inputs']) {
5770
6049
  this.load(this.normalizeInputs(this.inputs), false);
@@ -5777,7 +6056,7 @@ class PraxisRichContentConfigEditor {
5777
6056
  }
5778
6057
  getSettingsValue() {
5779
6058
  const document = this.parseDocument();
5780
- if (!document)
6059
+ if (!document || this.hasAdvancedJsonFieldErrors())
5781
6060
  return null;
5782
6061
  return {
5783
6062
  inputs: {
@@ -5804,6 +6083,7 @@ class PraxisRichContentConfigEditor {
5804
6083
  this.isDirty$.next(!this.matchesInitialState());
5805
6084
  }
5806
6085
  onDocumentJsonChange() {
6086
+ this.clearAdvancedJsonFieldState();
5807
6087
  this.parseDocument();
5808
6088
  this.markDirty();
5809
6089
  }
@@ -5815,14 +6095,32 @@ class PraxisRichContentConfigEditor {
5815
6095
  this.parseDocument();
5816
6096
  this.markDirty();
5817
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
+ }
5818
6114
  addTopLevelNode() {
5819
6115
  const document = this.ensureEditableDocument();
5820
6116
  document.nodes.push(this.createDefaultNode(this.newNodeType));
6117
+ this.selectedNodeIndex = document.nodes.length - 1;
5821
6118
  this.syncStructuredDocumentChange();
5822
6119
  }
5823
6120
  removeTopLevelNode(index) {
5824
6121
  const document = this.ensureEditableDocument();
5825
6122
  document.nodes.splice(index, 1);
6123
+ this.reconcileSelectedNodeIndex(document);
5826
6124
  this.syncStructuredDocumentChange();
5827
6125
  }
5828
6126
  moveTopLevelNode(index, delta) {
@@ -5833,6 +6131,17 @@ class PraxisRichContentConfigEditor {
5833
6131
  }
5834
6132
  const [node] = document.nodes.splice(index, 1);
5835
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
+ }
5836
6145
  this.syncStructuredDocumentChange();
5837
6146
  }
5838
6147
  changeTopLevelNodeType(index, nextType) {
@@ -5945,6 +6254,93 @@ class PraxisRichContentConfigEditor {
5945
6254
  }
5946
6255
  this.syncStructuredDocumentChange();
5947
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
+ }
5948
6344
  addCardSlotNode(index, slot) {
5949
6345
  this.ensureCardSlotNodes(index, slot).push(createDefaultPresenterNode('text', this.tx.bind(this)));
5950
6346
  this.syncStructuredDocumentChange();
@@ -6244,6 +6640,65 @@ class PraxisRichContentConfigEditor {
6244
6640
  };
6245
6641
  this.syncStructuredDocumentChange();
6246
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
+ }
6247
6702
  getActionCardSecondaryActions(index) {
6248
6703
  return this.ensureActionCardSecondaryActions(index);
6249
6704
  }
@@ -6463,6 +6918,203 @@ class PraxisRichContentConfigEditor {
6463
6918
  setStyleEntry(node, this.getFirstStyleName(node), propertyValue);
6464
6919
  this.syncStructuredDocumentChange();
6465
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
+ }
6466
7118
  requestTopLevelNodeRemoval(index) {
6467
7119
  this.pendingRemoval = { scope: 'nodes', index };
6468
7120
  }
@@ -6610,6 +7262,12 @@ class PraxisRichContentConfigEditor {
6610
7262
  .filter((issue) => issue.path === path || issue.path.startsWith(`${path}.`))
6611
7263
  .map((issue) => this.tx(issue.messageKey, issue.fallback));
6612
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
+ }
6613
7271
  isEditableNodeType(type) {
6614
7272
  return EDITABLE_TOP_LEVEL_NODE_TYPES.includes(type);
6615
7273
  }
@@ -6617,6 +7275,7 @@ class PraxisRichContentConfigEditor {
6617
7275
  return EDITABLE_PRESENTER_NODE_TYPES.includes(type);
6618
7276
  }
6619
7277
  load(inputs, dirty) {
7278
+ this.clearAdvancedJsonFieldState();
6620
7279
  const document = inputs.document ?? EMPTY_DOCUMENT;
6621
7280
  const layout = inputs.layout === 'inline' ? 'inline' : 'block';
6622
7281
  const rootClassName = typeof inputs.rootClassName === 'string' ? inputs.rootClassName : '';
@@ -6667,6 +7326,16 @@ class PraxisRichContentConfigEditor {
6667
7326
  }
6668
7327
  return node;
6669
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
+ }
6670
7339
  ensureCardSlotNodes(index, slot) {
6671
7340
  const card = this.ensureCardNode(index);
6672
7341
  if (!Array.isArray(card[slot])) {
@@ -6968,11 +7637,18 @@ class PraxisRichContentConfigEditor {
6968
7637
  return null;
6969
7638
  }
6970
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
+ }
6971
7649
  this.valid = true;
6972
7650
  this.errorMessage = '';
6973
7651
  this.isValid$.next(true);
6974
- this.parsedDocument = document;
6975
- this.updateDocumentOverview(document);
6976
7652
  return document;
6977
7653
  }
6978
7654
  catch (error) {
@@ -6991,6 +7667,20 @@ class PraxisRichContentConfigEditor {
6991
7667
  this.nodeCount = 0;
6992
7668
  this.nodeTypeSummary = '';
6993
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
+ }
6994
7684
  updateDocumentOverview(document) {
6995
7685
  const typeCounts = new Map();
6996
7686
  let count = 0;
@@ -7131,6 +7821,54 @@ class PraxisRichContentConfigEditor {
7131
7821
  </label>
7132
7822
  </div>
7133
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
+
7134
7872
  <ng-template
7135
7873
  #presenterFields
7136
7874
  let-node="node"
@@ -7218,6 +7956,13 @@ class PraxisRichContentConfigEditor {
7218
7956
  (ngModelChange)="setString('src', $event)"
7219
7957
  />
7220
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>
7221
7966
  <label>
7222
7967
  <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
7223
7968
  <input
@@ -7225,6 +7970,13 @@ class PraxisRichContentConfigEditor {
7225
7970
  (ngModelChange)="setString('alt', $event)"
7226
7971
  />
7227
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>
7228
7980
  }
7229
7981
  @case ('link') {
7230
7982
  <label>
@@ -7234,6 +7986,13 @@ class PraxisRichContentConfigEditor {
7234
7986
  (ngModelChange)="setString('label', $event)"
7235
7987
  />
7236
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>
7237
7996
  <label>
7238
7997
  <span>{{ tx('editor.field.href', 'Link URL') }}</span>
7239
7998
  <input
@@ -7283,6 +8042,20 @@ class PraxisRichContentConfigEditor {
7283
8042
  (ngModelChange)="setString('label', $event)"
7284
8043
  />
7285
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>
7286
8059
  <label>
7287
8060
  <span>{{ tx('editor.field.max', 'Maximum') }}</span>
7288
8061
  <input
@@ -7536,16 +8309,68 @@ class PraxisRichContentConfigEditor {
7536
8309
  </div>
7537
8310
  </ng-template>
7538
8311
 
7539
- <section class="prx-rich-editor__blocks">
7540
- <header class="prx-rich-editor__section-header">
7541
- <div>
7542
- <h3>{{ tx('editor.blocks', 'Blocks') }}</h3>
7543
- <p>
7544
- {{
7545
- tx(
7546
- 'editor.blocksHelp',
7547
- 'Create and edit common top-level rich-content blocks. Use JSON for advanced nested structures.'
7548
- )
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
+ >
8365
+ <header class="prx-rich-editor__section-header">
8366
+ <div>
8367
+ <h3>{{ tx('editor.blocks', 'Blocks') }}</h3>
8368
+ <p>
8369
+ {{
8370
+ tx(
8371
+ 'editor.blocksHelp',
8372
+ 'Create and edit common top-level rich-content blocks. Use JSON for advanced nested structures.'
8373
+ )
7549
8374
  }}
7550
8375
  </p>
7551
8376
  </div>
@@ -7573,8 +8398,83 @@ class PraxisRichContentConfigEditor {
7573
8398
  </header>
7574
8399
 
7575
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>
7576
8475
  <div class="prx-rich-editor__node-list">
7577
8476
  @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
8477
+ @if (selectedNodeIndex === nodeIndex) {
7578
8478
  <article
7579
8479
  class="prx-rich-editor__node-card"
7580
8480
  [attr.data-rich-editor-node-type]="node.type"
@@ -7760,22 +8660,38 @@ class PraxisRichContentConfigEditor {
7760
8660
  />
7761
8661
  </label>
7762
8662
  }
7763
- @case ('image') {
7764
- <label>
7765
- <span>{{ tx('editor.field.src', 'Image URL') }}</span>
7766
- <input
7767
- [ngModel]="getStringField(node, 'src')"
7768
- (ngModelChange)="setStringField($index, 'src', $event)"
7769
- />
7770
- </label>
7771
- <label>
7772
- <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
7773
- <input
7774
- [ngModel]="getStringField(node, 'alt')"
7775
- (ngModelChange)="setStringField($index, 'alt', $event)"
7776
- />
7777
- </label>
7778
- }
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
+ }
7779
8695
  @case ('link') {
7780
8696
  <label>
7781
8697
  <span>{{ tx('editor.field.label', 'Label') }}</span>
@@ -7826,6 +8742,14 @@ class PraxisRichContentConfigEditor {
7826
8742
  (ngModelChange)="setStringField($index, 'label', $event)"
7827
8743
  />
7828
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>
7829
8753
  <label>
7830
8754
  <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
7831
8755
  <input
@@ -7867,6 +8791,14 @@ class PraxisRichContentConfigEditor {
7867
8791
  (ngModelChange)="setNumberField($index, 'max', $event)"
7868
8792
  />
7869
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>
7870
8802
  }
7871
8803
  @case ('actionButton') {
7872
8804
  <label>
@@ -7962,6 +8894,14 @@ class PraxisRichContentConfigEditor {
7962
8894
  <option value="xl">xl</option>
7963
8895
  </select>
7964
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>
7965
8905
  <div class="prx-rich-editor__nested-editor">
7966
8906
  <header class="prx-rich-editor__nested-header">
7967
8907
  <h5>{{ tx('editor.composeItems', 'Compose items') }}</h5>
@@ -8019,6 +8959,14 @@ class PraxisRichContentConfigEditor {
8019
8959
  (ngModelChange)="setStringField($index, 'title', $event)"
8020
8960
  />
8021
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>
8022
8970
  <label>
8023
8971
  <span>{{ tx('editor.field.subtitle', 'Subtitle') }}</span>
8024
8972
  <input
@@ -8026,6 +8974,14 @@ class PraxisRichContentConfigEditor {
8026
8974
  (ngModelChange)="setStringField($index, 'subtitle', $event)"
8027
8975
  />
8028
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>
8029
8985
  <label>
8030
8986
  <span>{{ tx('editor.field.variant', 'Variant') }}</span>
8031
8987
  <select
@@ -8063,6 +9019,16 @@ class PraxisRichContentConfigEditor {
8063
9019
  <option value="lg">{{ tx('editor.size.lg', 'Large') }}</option>
8064
9020
  </select>
8065
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>
8066
9032
  <label>
8067
9033
  <span>{{ tx('editor.field.orientation', 'Orientation') }}</span>
8068
9034
  <select
@@ -8073,6 +9039,38 @@ class PraxisRichContentConfigEditor {
8073
9039
  <option value="horizontal">{{ tx('editor.orientation.horizontal', 'Horizontal') }}</option>
8074
9040
  </select>
8075
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>
8076
9074
  <label>
8077
9075
  <span>{{ tx('editor.field.mediaKind', 'Media') }}</span>
8078
9076
  <select
@@ -8094,6 +9092,14 @@ class PraxisRichContentConfigEditor {
8094
9092
  (ngModelChange)="setCardMediaField(nodeIndex, 'src', $event)"
8095
9093
  />
8096
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>
8097
9103
  <label>
8098
9104
  <span>{{ tx('editor.field.mediaAlt', 'Media alt text') }}</span>
8099
9105
  <input
@@ -8101,6 +9107,14 @@ class PraxisRichContentConfigEditor {
8101
9107
  (ngModelChange)="setCardMediaField(nodeIndex, 'alt', $event)"
8102
9108
  />
8103
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>
8104
9118
  <label>
8105
9119
  <span>{{ tx('editor.field.mediaIcon', 'Media icon') }}</span>
8106
9120
  <input
@@ -8108,6 +9122,29 @@ class PraxisRichContentConfigEditor {
8108
9122
  (ngModelChange)="setCardMediaField(nodeIndex, 'icon', $event)"
8109
9123
  />
8110
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>
8111
9148
  <label>
8112
9149
  <span>{{ tx('editor.field.mediaPlacement', 'Media placement') }}</span>
8113
9150
  <select
@@ -8121,6 +9158,76 @@ class PraxisRichContentConfigEditor {
8121
9158
  </select>
8122
9159
  </label>
8123
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>
8124
9231
  <div class="prx-rich-editor__nested-editor">
8125
9232
  <header class="prx-rich-editor__nested-header">
8126
9233
  <h5>{{ tx('editor.cardContent', 'Card body') }}</h5>
@@ -8566,6 +9673,14 @@ class PraxisRichContentConfigEditor {
8566
9673
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'label', $event)"
8567
9674
  />
8568
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>
8569
9684
  <label>
8570
9685
  <span>{{ tx('editor.field.icon', 'Icon') }}</span>
8571
9686
  <input
@@ -8580,6 +9695,48 @@ class PraxisRichContentConfigEditor {
8580
9695
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badge', $event)"
8581
9696
  />
8582
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>
8583
9740
  </div>
8584
9741
  }
8585
9742
  </div>
@@ -9970,97 +11127,216 @@ class PraxisRichContentConfigEditor {
9970
11127
  </p>
9971
11128
  }
9972
11129
  }
9973
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
9974
- <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
9975
- <label>
9976
- <span>{{ tx('editor.field.testId', 'Test id') }}</span>
9977
- <input
9978
- [ngModel]="getStringField(node, 'testId')"
9979
- (ngModelChange)="setStringField($index, 'testId', $event)"
9980
- [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
9981
- />
9982
- </label>
9983
- <label>
9984
- <span>{{ tx('editor.field.className', 'CSS class') }}</span>
9985
- <input
9986
- [ngModel]="getStringField(node, 'className')"
9987
- (ngModelChange)="setStringField($index, 'className', $event)"
9988
- [placeholder]="tx('editor.placeholder.className', 'hero-title')"
9989
- />
9990
- </label>
9991
- <label>
9992
- <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
9993
- <input
9994
- [ngModel]="getCapabilityList(node)"
9995
- (ngModelChange)="setCapabilityList($index, $event)"
9996
- [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
9997
- />
9998
- </label>
9999
- <label>
10000
- <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
10001
- <select
10002
- [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
10003
- (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
10004
- >
10005
- <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
10006
- <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
10007
- </select>
10008
- </label>
10009
- </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>
10010
11146
 
10011
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
10012
- <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
10013
- <label>
10014
- <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
10015
- <input
10016
- [ngModel]="getVisibleWhenPath(node)"
10017
- (ngModelChange)="setVisibleWhenPath($index, $event)"
10018
- [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
10019
- />
10020
- </label>
10021
- <label>
10022
- <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
10023
- <input
10024
- [ngModel]="getVisibleWhenValue(node)"
10025
- (ngModelChange)="setVisibleWhenValue($index, $event)"
10026
- [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
10027
- />
10028
- </label>
10029
- </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>
10030
11184
 
10031
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
10032
- <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
10033
- <label>
10034
- <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
10035
- <input
10036
- [ngModel]="getFirstStyleName(node)"
10037
- (ngModelChange)="setFirstStyleName($index, $event)"
10038
- [placeholder]="tx('editor.placeholder.styleName', 'color')"
10039
- />
10040
- </label>
10041
- <label>
10042
- <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
10043
- <input
10044
- [ngModel]="getFirstStyleValue(node)"
10045
- (ngModelChange)="setFirstStyleValue($index, $event)"
10046
- [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
10047
- />
10048
- </label>
10049
- </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>
10050
11272
  </div>
10051
11273
  </article>
11274
+ }
10052
11275
  }
10053
11276
  </div>
11277
+ </div>
11278
+ </div>
10054
11279
  } @else {
10055
11280
  <p class="prx-rich-editor__empty">
10056
11281
  {{ tx('editor.noBlocks', 'No blocks yet. Add a block to start authoring this document.') }}
10057
11282
  </p>
10058
11283
  }
10059
11284
  </section>
11285
+ }
10060
11286
 
10061
- <label class="prx-rich-editor__document">
10062
- <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>
10063
11337
  <div class="prx-rich-editor__workbench">
11338
+ <label class="prx-rich-editor__document">
11339
+ <span>{{ tx('editor.documentJson', 'Canonical document JSON') }}</span>
10064
11340
  <textarea
10065
11341
  name="rich-content-document"
10066
11342
  [(ngModel)]="documentJson"
@@ -10074,6 +11350,7 @@ class PraxisRichContentConfigEditor {
10074
11350
  spellcheck="false"
10075
11351
  data-testid="rich-content-document-input"
10076
11352
  ></textarea>
11353
+ </label>
10077
11354
 
10078
11355
  <aside
10079
11356
  class="prx-rich-editor__inspector"
@@ -10093,21 +11370,9 @@ class PraxisRichContentConfigEditor {
10093
11370
  </dl>
10094
11371
  </section>
10095
11372
 
10096
- @if (parsedDocument) {
10097
- <section>
10098
- <h3>{{ tx('editor.preview', 'Preview') }}</h3>
10099
- <div class="prx-rich-editor__preview">
10100
- <praxis-rich-content
10101
- [document]="parsedDocument"
10102
- [layout]="layout"
10103
- [rootClassName]="rootClassName"
10104
- ></praxis-rich-content>
10105
- </div>
10106
- </section>
10107
- }
10108
11373
  </aside>
10109
11374
  </div>
10110
- </label>
11375
+ </section>
10111
11376
 
10112
11377
  @if (errorMessage) {
10113
11378
  <div
@@ -10137,6 +11402,7 @@ class PraxisRichContentConfigEditor {
10137
11402
  }}
10138
11403
  </p>
10139
11404
  }
11405
+ }
10140
11406
 
10141
11407
  <div class="prx-rich-editor__actions">
10142
11408
  <button type="button" (click)="reset()">
@@ -10147,7 +11413,7 @@ class PraxisRichContentConfigEditor {
10147
11413
  </button>
10148
11414
  </div>
10149
11415
  </section>
10150
- `, 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 });
10151
11417
  }
10152
11418
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImport: i0, type: PraxisRichContentConfigEditor, decorators: [{
10153
11419
  type: Component,
@@ -10213,6 +11479,54 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10213
11479
  </label>
10214
11480
  </div>
10215
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
+
10216
11530
  <ng-template
10217
11531
  #presenterFields
10218
11532
  let-node="node"
@@ -10300,6 +11614,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10300
11614
  (ngModelChange)="setString('src', $event)"
10301
11615
  />
10302
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>
10303
11624
  <label>
10304
11625
  <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
10305
11626
  <input
@@ -10307,6 +11628,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10307
11628
  (ngModelChange)="setString('alt', $event)"
10308
11629
  />
10309
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>
10310
11638
  }
10311
11639
  @case ('link') {
10312
11640
  <label>
@@ -10316,6 +11644,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10316
11644
  (ngModelChange)="setString('label', $event)"
10317
11645
  />
10318
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>
10319
11654
  <label>
10320
11655
  <span>{{ tx('editor.field.href', 'Link URL') }}</span>
10321
11656
  <input
@@ -10365,6 +11700,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10365
11700
  (ngModelChange)="setString('label', $event)"
10366
11701
  />
10367
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>
10368
11717
  <label>
10369
11718
  <span>{{ tx('editor.field.max', 'Maximum') }}</span>
10370
11719
  <input
@@ -10618,7 +11967,59 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10618
11967
  </div>
10619
11968
  </ng-template>
10620
11969
 
10621
- <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
+ >
10622
12023
  <header class="prx-rich-editor__section-header">
10623
12024
  <div>
10624
12025
  <h3>{{ tx('editor.blocks', 'Blocks') }}</h3>
@@ -10655,8 +12056,83 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10655
12056
  </header>
10656
12057
 
10657
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>
10658
12133
  <div class="prx-rich-editor__node-list">
10659
12134
  @for (node of parsedDocument?.nodes ?? []; track node.id ?? $index; let nodeIndex = $index) {
12135
+ @if (selectedNodeIndex === nodeIndex) {
10660
12136
  <article
10661
12137
  class="prx-rich-editor__node-card"
10662
12138
  [attr.data-rich-editor-node-type]="node.type"
@@ -10842,22 +12318,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10842
12318
  />
10843
12319
  </label>
10844
12320
  }
10845
- @case ('image') {
10846
- <label>
10847
- <span>{{ tx('editor.field.src', 'Image URL') }}</span>
10848
- <input
10849
- [ngModel]="getStringField(node, 'src')"
10850
- (ngModelChange)="setStringField($index, 'src', $event)"
10851
- />
10852
- </label>
10853
- <label>
10854
- <span>{{ tx('editor.field.alt', 'Alternative text') }}</span>
10855
- <input
10856
- [ngModel]="getStringField(node, 'alt')"
10857
- (ngModelChange)="setStringField($index, 'alt', $event)"
10858
- />
10859
- </label>
10860
- }
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
+ }
10861
12353
  @case ('link') {
10862
12354
  <label>
10863
12355
  <span>{{ tx('editor.field.label', 'Label') }}</span>
@@ -10908,6 +12400,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10908
12400
  (ngModelChange)="setStringField($index, 'label', $event)"
10909
12401
  />
10910
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>
10911
12411
  <label>
10912
12412
  <span>{{ tx('editor.field.valueExpr', 'Value binding') }}</span>
10913
12413
  <input
@@ -10949,6 +12449,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
10949
12449
  (ngModelChange)="setNumberField($index, 'max', $event)"
10950
12450
  />
10951
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>
10952
12460
  }
10953
12461
  @case ('actionButton') {
10954
12462
  <label>
@@ -11044,6 +12552,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11044
12552
  <option value="xl">xl</option>
11045
12553
  </select>
11046
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>
11047
12563
  <div class="prx-rich-editor__nested-editor">
11048
12564
  <header class="prx-rich-editor__nested-header">
11049
12565
  <h5>{{ tx('editor.composeItems', 'Compose items') }}</h5>
@@ -11101,6 +12617,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11101
12617
  (ngModelChange)="setStringField($index, 'title', $event)"
11102
12618
  />
11103
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>
11104
12628
  <label>
11105
12629
  <span>{{ tx('editor.field.subtitle', 'Subtitle') }}</span>
11106
12630
  <input
@@ -11108,6 +12632,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11108
12632
  (ngModelChange)="setStringField($index, 'subtitle', $event)"
11109
12633
  />
11110
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>
11111
12643
  <label>
11112
12644
  <span>{{ tx('editor.field.variant', 'Variant') }}</span>
11113
12645
  <select
@@ -11145,6 +12677,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11145
12677
  <option value="lg">{{ tx('editor.size.lg', 'Large') }}</option>
11146
12678
  </select>
11147
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>
11148
12690
  <label>
11149
12691
  <span>{{ tx('editor.field.orientation', 'Orientation') }}</span>
11150
12692
  <select
@@ -11155,6 +12697,38 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11155
12697
  <option value="horizontal">{{ tx('editor.orientation.horizontal', 'Horizontal') }}</option>
11156
12698
  </select>
11157
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>
11158
12732
  <label>
11159
12733
  <span>{{ tx('editor.field.mediaKind', 'Media') }}</span>
11160
12734
  <select
@@ -11176,6 +12750,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11176
12750
  (ngModelChange)="setCardMediaField(nodeIndex, 'src', $event)"
11177
12751
  />
11178
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>
11179
12761
  <label>
11180
12762
  <span>{{ tx('editor.field.mediaAlt', 'Media alt text') }}</span>
11181
12763
  <input
@@ -11183,6 +12765,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11183
12765
  (ngModelChange)="setCardMediaField(nodeIndex, 'alt', $event)"
11184
12766
  />
11185
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>
11186
12776
  <label>
11187
12777
  <span>{{ tx('editor.field.mediaIcon', 'Media icon') }}</span>
11188
12778
  <input
@@ -11190,6 +12780,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11190
12780
  (ngModelChange)="setCardMediaField(nodeIndex, 'icon', $event)"
11191
12781
  />
11192
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>
11193
12806
  <label>
11194
12807
  <span>{{ tx('editor.field.mediaPlacement', 'Media placement') }}</span>
11195
12808
  <select
@@ -11203,6 +12816,76 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11203
12816
  </select>
11204
12817
  </label>
11205
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>
11206
12889
  <div class="prx-rich-editor__nested-editor">
11207
12890
  <header class="prx-rich-editor__nested-header">
11208
12891
  <h5>{{ tx('editor.cardContent', 'Card body') }}</h5>
@@ -11648,6 +13331,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11648
13331
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'label', $event)"
11649
13332
  />
11650
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>
11651
13342
  <label>
11652
13343
  <span>{{ tx('editor.field.icon', 'Icon') }}</span>
11653
13344
  <input
@@ -11662,6 +13353,48 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
11662
13353
  (ngModelChange)="setTabsItemField(nodeIndex, $index, 'badge', $event)"
11663
13354
  />
11664
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>
11665
13398
  </div>
11666
13399
  }
11667
13400
  </div>
@@ -13052,97 +14785,216 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13052
14785
  </p>
13053
14786
  }
13054
14787
  }
13055
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
13056
- <legend>{{ tx('editor.commonMetadata', 'Common metadata') }}</legend>
13057
- <label>
13058
- <span>{{ tx('editor.field.testId', 'Test id') }}</span>
13059
- <input
13060
- [ngModel]="getStringField(node, 'testId')"
13061
- (ngModelChange)="setStringField($index, 'testId', $event)"
13062
- [placeholder]="tx('editor.placeholder.testId', 'rich-hero-title')"
13063
- />
13064
- </label>
13065
- <label>
13066
- <span>{{ tx('editor.field.className', 'CSS class') }}</span>
13067
- <input
13068
- [ngModel]="getStringField(node, 'className')"
13069
- (ngModelChange)="setStringField($index, 'className', $event)"
13070
- [placeholder]="tx('editor.placeholder.className', 'hero-title')"
13071
- />
13072
- </label>
13073
- <label>
13074
- <span>{{ tx('editor.field.requiresCapabilities', 'Capabilities') }}</span>
13075
- <input
13076
- [ngModel]="getCapabilityList(node)"
13077
- (ngModelChange)="setCapabilityList($index, $event)"
13078
- [placeholder]="tx('editor.placeholder.requiresCapabilities', 'form.mode.edit, employee.open')"
13079
- />
13080
- </label>
13081
- <label>
13082
- <span>{{ tx('editor.field.capabilityMode', 'Capability mode') }}</span>
13083
- <select
13084
- [ngModel]="getStringField(node, 'capabilityMode') || 'all'"
13085
- (ngModelChange)="setStringField($index, 'capabilityMode', $event)"
13086
- >
13087
- <option value="all">{{ tx('editor.capabilityMode.all', 'All') }}</option>
13088
- <option value="any">{{ tx('editor.capabilityMode.any', 'Any') }}</option>
13089
- </select>
13090
- </label>
13091
- </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>
13092
14804
 
13093
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
13094
- <legend>{{ tx('editor.visibilityRule', 'Visibility rule') }}</legend>
13095
- <label>
13096
- <span>{{ tx('editor.field.visibleWhenPath', 'Context path') }}</span>
13097
- <input
13098
- [ngModel]="getVisibleWhenPath(node)"
13099
- (ngModelChange)="setVisibleWhenPath($index, $event)"
13100
- [placeholder]="tx('editor.placeholder.visibleWhenPath', 'row.active')"
13101
- />
13102
- </label>
13103
- <label>
13104
- <span>{{ tx('editor.field.visibleWhenValue', 'Expected value') }}</span>
13105
- <input
13106
- [ngModel]="getVisibleWhenValue(node)"
13107
- (ngModelChange)="setVisibleWhenValue($index, $event)"
13108
- [placeholder]="tx('editor.placeholder.visibleWhenValue', 'true')"
13109
- />
13110
- </label>
13111
- </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>
13112
14842
 
13113
- <fieldset class="prx-rich-editor__wide-field prx-rich-editor__field-group">
13114
- <legend>{{ tx('editor.safeStyle', 'Safe style') }}</legend>
13115
- <label>
13116
- <span>{{ tx('editor.field.styleName', 'CSS property') }}</span>
13117
- <input
13118
- [ngModel]="getFirstStyleName(node)"
13119
- (ngModelChange)="setFirstStyleName($index, $event)"
13120
- [placeholder]="tx('editor.placeholder.styleName', 'color')"
13121
- />
13122
- </label>
13123
- <label>
13124
- <span>{{ tx('editor.field.styleValue', 'CSS value') }}</span>
13125
- <input
13126
- [ngModel]="getFirstStyleValue(node)"
13127
- (ngModelChange)="setFirstStyleValue($index, $event)"
13128
- [placeholder]="tx('editor.placeholder.styleValue', 'var(--md-sys-color-primary)')"
13129
- />
13130
- </label>
13131
- </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>
13132
14930
  </div>
13133
14931
  </article>
14932
+ }
13134
14933
  }
13135
14934
  </div>
14935
+ </div>
14936
+ </div>
13136
14937
  } @else {
13137
14938
  <p class="prx-rich-editor__empty">
13138
14939
  {{ tx('editor.noBlocks', 'No blocks yet. Add a block to start authoring this document.') }}
13139
14940
  </p>
13140
14941
  }
13141
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
+ }
13142
14979
 
13143
- <label class="prx-rich-editor__document">
13144
- <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>
13145
14995
  <div class="prx-rich-editor__workbench">
14996
+ <label class="prx-rich-editor__document">
14997
+ <span>{{ tx('editor.documentJson', 'Canonical document JSON') }}</span>
13146
14998
  <textarea
13147
14999
  name="rich-content-document"
13148
15000
  [(ngModel)]="documentJson"
@@ -13156,6 +15008,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13156
15008
  spellcheck="false"
13157
15009
  data-testid="rich-content-document-input"
13158
15010
  ></textarea>
15011
+ </label>
13159
15012
 
13160
15013
  <aside
13161
15014
  class="prx-rich-editor__inspector"
@@ -13175,21 +15028,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13175
15028
  </dl>
13176
15029
  </section>
13177
15030
 
13178
- @if (parsedDocument) {
13179
- <section>
13180
- <h3>{{ tx('editor.preview', 'Preview') }}</h3>
13181
- <div class="prx-rich-editor__preview">
13182
- <praxis-rich-content
13183
- [document]="parsedDocument"
13184
- [layout]="layout"
13185
- [rootClassName]="rootClassName"
13186
- ></praxis-rich-content>
13187
- </div>
13188
- </section>
13189
- }
13190
15031
  </aside>
13191
15032
  </div>
13192
- </label>
15033
+ </section>
13193
15034
 
13194
15035
  @if (errorMessage) {
13195
15036
  <div
@@ -13219,6 +15060,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13219
15060
  }}
13220
15061
  </p>
13221
15062
  }
15063
+ }
13222
15064
 
13223
15065
  <div class="prx-rich-editor__actions">
13224
15066
  <button type="button" (click)="reset()">
@@ -13229,10 +15071,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.14", ngImpo
13229
15071
  </button>
13230
15072
  </div>
13231
15073
  </section>
13232
- `, 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"] }]
13233
15075
  }], propDecorators: { inputs: [{
13234
15076
  type: Input
13235
15077
  }] } });
15078
+ function isPlainRecord(value) {
15079
+ return !!value && typeof value === 'object' && !Array.isArray(value);
15080
+ }
13236
15081
 
13237
15082
  const DEFAULT_RICH_CONTENT_DOCUMENT = {
13238
15083
  kind: 'praxis.rich-content',
@@ -16373,6 +18218,188 @@ const RICH_CONTENT_INSERTION_PRESETS = [
16373
18218
  },
16374
18219
  },
16375
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
+ },
16376
18403
  {
16377
18404
  id: 'stat-group',
16378
18405
  label: 'Stat group',