@praxisui/dynamic-fields 3.0.0-beta.2 → 3.0.0-beta.4

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.
@@ -197,7 +197,18 @@ const PRAXIS_DYNAMIC_FIELDS_EN_US = {
197
197
  'praxis.dynamicFields.inlineCurrencyRange.ariaSelection': '{{label}}: {{value}}',
198
198
  'praxis.dynamicFields.inlineCurrencyRange.value.from': '>= {{value}}',
199
199
  'praxis.dynamicFields.inlineCurrencyRange.value.upto': '<= {{value}}',
200
- 'praxis.dynamicFields.inlineSelect.placeholder': 'Filter',
200
+ 'praxis.dynamicFields.inlineSelect.placeholder': 'Select',
201
+ 'praxis.dynamicFields.inlinePipelineStatus.placeholder': 'Pipeline',
202
+ 'praxis.dynamicFields.inlinePipelineStatus.panelSubtitle': 'Configurable panel for stages, statuses, or priorities',
203
+ 'praxis.dynamicFields.inlinePipelineStatus.searchPlaceholder': 'Search stages...',
204
+ 'praxis.dynamicFields.inlinePipelineStatus.selectionActionsAriaLabel': 'Selection actions',
205
+ 'praxis.dynamicFields.inlinePipelineStatus.clearActionLabel': 'Clear',
206
+ 'praxis.dynamicFields.inlinePipelineStatus.selectionPillsAriaLabel': 'Selected items',
207
+ 'praxis.dynamicFields.inlinePipelineStatus.barAriaEmpty': '{{label}} with no selected items',
208
+ 'praxis.dynamicFields.inlinePipelineStatus.barAriaSelected': '{{label}} with {{count}} selected items',
209
+ 'praxis.dynamicFields.inlinePipelineStatus.optionsGroupAriaLabelMultiple': 'Multiple selection options',
210
+ 'praxis.dynamicFields.inlinePipelineStatus.optionsGroupAriaLabelSingle': 'Single selection options',
211
+ 'praxis.dynamicFields.inlinePipelineStatus.emptyStateText': 'No options found',
201
212
  'praxis.dynamicFields.inlineSelect.searchPlaceholder': 'Search...',
202
213
  'praxis.dynamicFields.inlineTreeSelect.placeholder': 'Tree',
203
214
  'praxis.dynamicFields.inlineTreeSelect.searchPlaceholder': 'Search tree...',
@@ -354,7 +365,18 @@ const PRAXIS_DYNAMIC_FIELDS_PT_BR = {
354
365
  'praxis.dynamicFields.inlineCurrencyRange.ariaSelection': '{{label}}: {{value}}',
355
366
  'praxis.dynamicFields.inlineCurrencyRange.value.from': '>= {{value}}',
356
367
  'praxis.dynamicFields.inlineCurrencyRange.value.upto': '<= {{value}}',
357
- 'praxis.dynamicFields.inlineSelect.placeholder': 'Filtro',
368
+ 'praxis.dynamicFields.inlineSelect.placeholder': 'Selecionar',
369
+ 'praxis.dynamicFields.inlinePipelineStatus.placeholder': 'Pipeline',
370
+ 'praxis.dynamicFields.inlinePipelineStatus.panelSubtitle': 'Painel de seleção configurável para estágios, status ou prioridades',
371
+ 'praxis.dynamicFields.inlinePipelineStatus.searchPlaceholder': 'Pesquisar estágios...',
372
+ 'praxis.dynamicFields.inlinePipelineStatus.selectionActionsAriaLabel': 'Ações da seleção',
373
+ 'praxis.dynamicFields.inlinePipelineStatus.clearActionLabel': 'Limpar',
374
+ 'praxis.dynamicFields.inlinePipelineStatus.selectionPillsAriaLabel': 'Itens selecionados',
375
+ 'praxis.dynamicFields.inlinePipelineStatus.barAriaEmpty': '{{label}} sem itens selecionados',
376
+ 'praxis.dynamicFields.inlinePipelineStatus.barAriaSelected': '{{label}} com {{count}} itens selecionados',
377
+ 'praxis.dynamicFields.inlinePipelineStatus.optionsGroupAriaLabelMultiple': 'Opções de seleção múltipla',
378
+ 'praxis.dynamicFields.inlinePipelineStatus.optionsGroupAriaLabelSingle': 'Opções de seleção única',
379
+ 'praxis.dynamicFields.inlinePipelineStatus.emptyStateText': 'Nenhuma opção encontrada',
358
380
  'praxis.dynamicFields.inlineSelect.searchPlaceholder': 'Pesquisar...',
359
381
  'praxis.dynamicFields.inlineTreeSelect.placeholder': 'Árvore',
360
382
  'praxis.dynamicFields.inlineTreeSelect.searchPlaceholder': 'Buscar na árvore...',
@@ -557,7 +579,7 @@ class SimpleBaseInputComponent {
557
579
  const enabled = typeof cfg === 'boolean' ? cfg : cfg.enabled !== false;
558
580
  if (!enabled)
559
581
  return false;
560
- if (this.disabledMode || this.isReadonlyEffective?.() || this.presentationMode) {
582
+ if (this.isInteractionBlockedByState()) {
561
583
  return false;
562
584
  }
563
585
  if (cfg !== true && cfg?.showOnlyWhenFilled) {
@@ -737,13 +759,18 @@ class SimpleBaseInputComponent {
737
759
  /**
738
760
  * Tooltip usado pelos campos inline:
739
761
  * 1) prioriza erro quando validators.errorPosition = tooltip
740
- * 2) fallback para contexto "Campo: valor" quando houver valor preenchido
762
+ * 2) materializa help text explícito do metadata (tooltip/hint)
763
+ * 3) fallback para contexto "Campo: valor" quando houver valor preenchido
741
764
  */
742
765
  inlineTooltipText() {
743
766
  const validationTooltip = this.tooltipEnabled() ? String(this.errorMessage() || '').trim() : '';
744
767
  if (validationTooltip.length) {
745
768
  return validationTooltip;
746
769
  }
770
+ const explicitHelpTooltip = this.resolveInlineHelpTooltipText();
771
+ if (explicitHelpTooltip.length) {
772
+ return explicitHelpTooltip;
773
+ }
747
774
  if (!this.isInlineContextTooltipEnabled()) {
748
775
  return '';
749
776
  }
@@ -774,6 +801,28 @@ class SimpleBaseInputComponent {
774
801
  resolveInlineContextTooltipValue() {
775
802
  return this.stringifyInlineContextValue(this.control().value);
776
803
  }
804
+ resolveInlineHelpTooltipText() {
805
+ const meta = this.metadata();
806
+ const candidates = [
807
+ meta?.inlineTooltip,
808
+ meta?.tooltip,
809
+ meta?.hint,
810
+ ];
811
+ for (const candidate of candidates) {
812
+ const text = String(candidate ?? '').trim();
813
+ if (text.length) {
814
+ return this.truncateInlineTooltipText(text);
815
+ }
816
+ }
817
+ return '';
818
+ }
819
+ isInteractionBlockedByState(options) {
820
+ const includeReadonly = options?.includeReadonly !== false;
821
+ const includePresentation = options?.includePresentation !== false;
822
+ const readonlyBlocked = includeReadonly && !!this.isReadonlyEffective?.();
823
+ const presentationBlocked = includePresentation && !!this.presentationMode;
824
+ return !!this.disabledMode || this.control().disabled || readonlyBlocked || presentationBlocked;
825
+ }
777
826
  resolveInlineContextTooltipLabel() {
778
827
  const meta = this.metadata();
779
828
  const candidates = [
@@ -869,6 +918,11 @@ class SimpleBaseInputComponent {
869
918
  const componentState = this.componentState();
870
919
  const ngControl = this.getNgControl();
871
920
  const parentInvalid = !!ngControl?.invalid;
921
+ const parentTouched = !!ngControl?.touched;
922
+ const parentDirty = !!ngControl?.dirty;
923
+ const controlState = this.control();
924
+ const controlTouched = !!controlState.touched;
925
+ const controlDirty = !!controlState.dirty;
872
926
  const errors = ngControl?.errors ?? this.control().errors;
873
927
  const meta = this.metadata();
874
928
  const trig = meta?.validators?.validationTrigger;
@@ -883,13 +937,19 @@ class SimpleBaseInputComponent {
883
937
  case 'immediate':
884
938
  return true;
885
939
  case 'blur':
886
- return componentState.touched;
940
+ return componentState.touched || parentTouched || controlTouched;
887
941
  case 'submit':
888
942
  // Praxis onSubmit marca todos como touched; usamos esse sinal
889
- return componentState.touched;
943
+ return componentState.touched || parentTouched || controlTouched;
890
944
  case 'change':
891
945
  default:
892
- return (componentState.dirty || componentState.touched) && this.errorDisplayReady();
946
+ return (componentState.dirty
947
+ || componentState.touched
948
+ || parentDirty
949
+ || parentTouched
950
+ || controlDirty
951
+ || controlTouched)
952
+ && this.errorDisplayReady();
893
953
  }
894
954
  }, ...(ngDevMode ? [{ debugName: "hasValidationError" }] : []));
895
955
  /** CSS classes básicas do componente */
@@ -1365,6 +1425,9 @@ class SimpleBaseInputComponent {
1365
1425
  this.nativeElement.setAttribute('aria-label', meta.ariaLabel);
1366
1426
  if (meta.ariaDescribedby)
1367
1427
  this.nativeElement.setAttribute('aria-describedby', meta.ariaDescribedby);
1428
+ else if (meta.hint) {
1429
+ this.nativeElement.setAttribute('aria-description', String(meta.hint));
1430
+ }
1368
1431
  if (meta.ariaLabelledby)
1369
1432
  this.nativeElement.setAttribute('aria-labelledby', meta.ariaLabelledby);
1370
1433
  if (meta.required !== undefined) {
@@ -1492,10 +1555,12 @@ class SimpleBaseInputComponent {
1492
1555
  // =============================================================================
1493
1556
  setupFormControlIntegration() {
1494
1557
  const control = this.control();
1558
+ this.syncComponentStateFromControl(control);
1495
1559
  control.valueChanges
1496
1560
  .pipe(takeUntilDestroyed(this.destroyRef))
1497
1561
  .subscribe((value) => {
1498
1562
  this.fieldState.update((state) => ({ ...state, value }));
1563
+ this.syncComponentStateFromControl(control);
1499
1564
  });
1500
1565
  control.statusChanges
1501
1566
  .pipe(takeUntilDestroyed(this.destroyRef))
@@ -1505,6 +1570,7 @@ class SimpleBaseInputComponent {
1505
1570
  valid: status === 'VALID',
1506
1571
  errors: control.errors,
1507
1572
  }));
1573
+ this.syncComponentStateFromControl(control);
1508
1574
  this.refreshErrorTooltip();
1509
1575
  });
1510
1576
  // Sincronizar erros/estado do controle pai apenas quando usando controle interno
@@ -1520,35 +1586,51 @@ class SimpleBaseInputComponent {
1520
1586
  errors: errs,
1521
1587
  valid: !errs,
1522
1588
  }));
1589
+ this.syncComponentStateFromControl(control);
1523
1590
  this.refreshErrorTooltip();
1524
1591
  this.cdr.markForCheck();
1525
1592
  });
1526
1593
  }
1527
1594
  }
1595
+ syncComponentStateFromControl(control) {
1596
+ this.componentState.update((state) => ({
1597
+ ...state,
1598
+ touched: !!control.touched,
1599
+ dirty: !!control.dirty,
1600
+ disabled: !!control.disabled,
1601
+ }));
1602
+ }
1528
1603
  // Atualiza tooltip/atributos de erro quando erros mudam e quando inline errors estiverem desabilitados
1529
1604
  refreshErrorTooltip() {
1530
1605
  if (!this.nativeElement)
1531
1606
  return;
1532
- // Só aplica tooltip nativo quando errorPosition === 'tooltip' e não houver MatTooltip no template
1533
- // Força avaliação de tooltipPosition para evitar aviso de membro não utilizado
1534
- void this.tooltipPosition();
1535
- if (!this.tooltipEnabled()) {
1536
- this.nativeElement.removeAttribute('title');
1537
- this.nativeElement.removeAttribute('aria-invalid');
1538
- return;
1539
- }
1540
1607
  const hasErrors = !!(this.getNgControl()?.errors ?? this.control().errors);
1541
1608
  if (hasErrors) {
1542
- const msg = this.errorMessage();
1543
- if (msg)
1544
- this.nativeElement.setAttribute('title', msg);
1545
1609
  this.nativeElement.setAttribute('aria-invalid', 'true');
1610
+ if (this.tooltipEnabled()) {
1611
+ // Força avaliação de tooltipPosition para evitar aviso de membro não utilizado
1612
+ void this.tooltipPosition();
1613
+ const msg = this.errorMessage();
1614
+ if (msg) {
1615
+ this.nativeElement.setAttribute('title', msg);
1616
+ }
1617
+ else {
1618
+ this.nativeElement.removeAttribute('title');
1619
+ }
1620
+ }
1621
+ else {
1622
+ this.nativeElement.removeAttribute('title');
1623
+ }
1546
1624
  }
1547
1625
  else {
1548
1626
  this.nativeElement.removeAttribute('title');
1549
1627
  this.nativeElement.removeAttribute('aria-invalid');
1550
1628
  }
1551
1629
  }
1630
+ ariaInvalidAttribute() {
1631
+ const hasErrors = !!(this.getNgControl()?.errors ?? this.control().errors);
1632
+ return hasErrors ? 'true' : null;
1633
+ }
1552
1634
  tDynamicFields(keySuffix, fallback, params) {
1553
1635
  return this.i18n.t(`praxis.dynamicFields.${keySuffix}`, params, fallback, 'dynamicFields');
1554
1636
  }
@@ -3406,6 +3488,7 @@ class ComponentRegistryService {
3406
3488
  this.registry.forEach((registration) => {
3407
3489
  registration.cached = undefined;
3408
3490
  registration.cachedAt = undefined;
3491
+ registration.loadingPromise = undefined;
3409
3492
  registration.loadAttempts = 0;
3410
3493
  registration.lastError = undefined;
3411
3494
  });
@@ -3436,6 +3519,7 @@ class ComponentRegistryService {
3436
3519
  if (registration) {
3437
3520
  registration.cached = undefined;
3438
3521
  registration.cachedAt = undefined;
3522
+ registration.loadingPromise = undefined;
3439
3523
  registration.loadAttempts = 0;
3440
3524
  registration.lastError = undefined;
3441
3525
  this.logger.debug(`[ComponentRegistry] Cache limpo para ${type}`, this.buildLogOptions({ controlType: type }, {
@@ -3691,6 +3775,18 @@ class ComponentRegistryService {
3691
3775
  * Carrega componente com lógica de retry
3692
3776
  */
3693
3777
  async loadComponentWithRetry(registration, type) {
3778
+ if (registration.loadingPromise) {
3779
+ return registration.loadingPromise;
3780
+ }
3781
+ const loadPromise = this.performLoadWithRetry(registration, type).finally(() => {
3782
+ if (registration.loadingPromise === loadPromise) {
3783
+ registration.loadingPromise = undefined;
3784
+ }
3785
+ });
3786
+ registration.loadingPromise = loadPromise;
3787
+ return loadPromise;
3788
+ }
3789
+ async performLoadWithRetry(registration, type) {
3694
3790
  const attempts = registration.loadAttempts || 0;
3695
3791
  if (attempts >= MAX_LOAD_ATTEMPTS) {
3696
3792
  this.logger.error(`[ComponentRegistry] Máximo de tentativas atingido para '${type}'. Último erro:`, this.buildLogOptions({ controlType: type, lastError: registration.lastError }, { context: { actionId: 'component.load-with-retry' } }));
@@ -3715,6 +3811,7 @@ class ComponentRegistryService {
3715
3811
  registration.cached = component;
3716
3812
  registration.cachedAt = Date.now();
3717
3813
  registration.loadAttempts = 0;
3814
+ registration.loadingPromise = undefined;
3718
3815
  registration.lastError = undefined;
3719
3816
  // Log apenas na primeira vez que carrega (não em cache hits subsequentes)
3720
3817
  if (attempts === 0) {
@@ -3726,11 +3823,12 @@ class ComponentRegistryService {
3726
3823
  return component;
3727
3824
  }
3728
3825
  catch (error) {
3826
+ registration.loadingPromise = undefined;
3729
3827
  registration.lastError = error;
3730
3828
  this.logger.error(`[ComponentRegistry] Erro na tentativa ${attempts + 1} para '${type}':`, this.buildLogOptions({ controlType: type, attempt: attempts + 1, error }, { context: { actionId: 'component.load-with-retry' } }));
3731
3829
  // Se não é a última tentativa, tentar novamente
3732
3830
  if (attempts + 1 < MAX_LOAD_ATTEMPTS) {
3733
- return this.loadComponentWithRetry(registration, type);
3831
+ return this.performLoadWithRetry(registration, type);
3734
3832
  }
3735
3833
  return null;
3736
3834
  }
@@ -5167,17 +5265,62 @@ class DynamicFieldLoaderDirective {
5167
5265
  this.lastFieldsSnapshot = this.buildFieldSnapshot(fieldsSnapshot);
5168
5266
  this.dbg('[DFL] executeRendering: complete', { totalCreated: createdFieldNames.length, hadErrors });
5169
5267
  }
5170
- /** Builds a minimal snapshot capturing changes that matter for re-rendering. */
5268
+ /** Builds a semantic snapshot capturing metadata changes that affect runtime rendering. */
5171
5269
  buildFieldSnapshot(fields) {
5172
5270
  return (fields || []).map((f) => {
5173
- const readonly = f.readonly ?? f.readOnly ?? false;
5174
- const disabled = !!f.disabled;
5175
- const hidden = !!(f.hidden || f.formHidden);
5176
- const required = !!(f.required || f?.validators?.required);
5177
- const sig = JSON.stringify({ r: required, ro: !!readonly, d: disabled, h: hidden });
5178
- return { name: f.name, controlType: f.controlType, sig };
5271
+ return {
5272
+ name: f.name,
5273
+ controlType: f.controlType,
5274
+ sig: this.buildFieldSemanticSignature(f),
5275
+ };
5179
5276
  });
5180
5277
  }
5278
+ buildFieldSemanticSignature(field) {
5279
+ const seen = new WeakSet();
5280
+ const normalize = (value) => {
5281
+ if (value === null || value === undefined)
5282
+ return value;
5283
+ if (typeof value === 'string' ||
5284
+ typeof value === 'number' ||
5285
+ typeof value === 'boolean') {
5286
+ return value;
5287
+ }
5288
+ if (value instanceof Date) {
5289
+ return value.toISOString();
5290
+ }
5291
+ if (Array.isArray(value)) {
5292
+ return value.map((item) => normalize(item));
5293
+ }
5294
+ if (typeof value === 'function' || typeof value === 'symbol') {
5295
+ return undefined;
5296
+ }
5297
+ if (typeof value !== 'object') {
5298
+ return String(value);
5299
+ }
5300
+ if (seen.has(value)) {
5301
+ return '[Circular]';
5302
+ }
5303
+ seen.add(value);
5304
+ const source = value;
5305
+ const normalized = {};
5306
+ Object.keys(source)
5307
+ .sort()
5308
+ .forEach((key) => {
5309
+ if (key === 'control' ||
5310
+ key === 'formControl' ||
5311
+ key === 'formGroup' ||
5312
+ key === 'componentRef') {
5313
+ return;
5314
+ }
5315
+ const next = normalize(source[key]);
5316
+ if (next !== undefined) {
5317
+ normalized[key] = next;
5318
+ }
5319
+ });
5320
+ return normalized;
5321
+ };
5322
+ return JSON.stringify(normalize(field));
5323
+ }
5181
5324
  /**
5182
5325
  * Reatribui apenas os FormControls existentes aos componentes/shells sem refazer a renderização.
5183
5326
  */
@@ -7725,6 +7868,7 @@ class TextInputComponent extends SimpleBaseInputComponent {
7725
7868
  [minlength]="metadata()?.minLength || null"
7726
7869
  [attr.aria-label]="!label && placeholder ? placeholder : null"
7727
7870
  [attr.aria-required]="metadata()?.required ? 'true' : 'false'"
7871
+ [attr.aria-invalid]="ariaInvalidAttribute()"
7728
7872
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
7729
7873
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
7730
7874
  [matTooltipPosition]="tooltipPosition()"
@@ -7816,6 +7960,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
7816
7960
  [minlength]="metadata()?.minLength || null"
7817
7961
  [attr.aria-label]="!label && placeholder ? placeholder : null"
7818
7962
  [attr.aria-required]="metadata()?.required ? 'true' : 'false'"
7963
+ [attr.aria-invalid]="ariaInvalidAttribute()"
7819
7964
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
7820
7965
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
7821
7966
  [matTooltipPosition]="tooltipPosition()"
@@ -14038,7 +14183,10 @@ class InlineSelectComponent extends SimpleBaseSelectComponent {
14038
14183
  }
14039
14184
  placeholderText() {
14040
14185
  const fromMeta = this.resolveFieldLabelFromMetadata(this.currentMetadata());
14041
- return fromMeta || this.fieldLabelText || this.tDynamicFields('inlineSelect.placeholder', 'Filtro');
14186
+ return (fromMeta ||
14187
+ this.fieldLabelText ||
14188
+ this.resolveHumanizedFieldName(this.currentMetadata().name) ||
14189
+ this.tDynamicFields('inlineSelect.placeholder', 'Selecionar'));
14042
14190
  }
14043
14191
  searchPlaceholderText() {
14044
14192
  const custom = String(this.currentMetadata().searchPlaceholder || '').trim();
@@ -14061,7 +14209,20 @@ class InlineSelectComponent extends SimpleBaseSelectComponent {
14061
14209
  return text;
14062
14210
  }
14063
14211
  }
14064
- return this.tDynamicFields('inlineSelect.placeholder', 'Filtro');
14212
+ return '';
14213
+ }
14214
+ resolveHumanizedFieldName(value) {
14215
+ const raw = String(value ?? '').trim();
14216
+ if (!raw)
14217
+ return '';
14218
+ const spaced = raw
14219
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
14220
+ .replace(/[_\-.]+/g, ' ')
14221
+ .replace(/\s+/g, ' ')
14222
+ .trim();
14223
+ if (!spaced)
14224
+ return '';
14225
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
14065
14226
  }
14066
14227
  ariaLabel() {
14067
14228
  const custom = String(this.currentMetadata().ariaLabel || '').trim();
@@ -16127,7 +16288,10 @@ class InlineAsyncSelectComponent extends MaterialAsyncSelectComponent {
16127
16288
  }
16128
16289
  placeholderText() {
16129
16290
  const fromMeta = this.resolveFieldLabelFromMetadata(this.metadata() || {});
16130
- return fromMeta || this.fieldLabelText || this.tDynamicFields('inlineSelect.placeholder', 'Filtro');
16291
+ return (fromMeta ||
16292
+ this.fieldLabelText ||
16293
+ this.resolveHumanizedFieldName(this.currentMetadata().name) ||
16294
+ this.tDynamicFields('inlineSelect.placeholder', 'Selecionar'));
16131
16295
  }
16132
16296
  searchPlaceholderText() {
16133
16297
  const custom = String(this.currentMetadata().searchPlaceholder || '').trim();
@@ -16136,8 +16300,21 @@ class InlineAsyncSelectComponent extends MaterialAsyncSelectComponent {
16136
16300
  ariaLabel() {
16137
16301
  return (this.currentMetadata().ariaLabel ||
16138
16302
  this.label ||
16139
- this.metadata()?.name ||
16140
- 'Filtro');
16303
+ this.resolveHumanizedFieldName(this.metadata()?.name) ||
16304
+ this.placeholderText());
16305
+ }
16306
+ resolveHumanizedFieldName(value) {
16307
+ const raw = String(value ?? '').trim();
16308
+ if (!raw)
16309
+ return '';
16310
+ const spaced = raw
16311
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
16312
+ .replace(/[_\-.]+/g, ' ')
16313
+ .replace(/\s+/g, ' ')
16314
+ .trim();
16315
+ if (!spaced)
16316
+ return '';
16317
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
16141
16318
  }
16142
16319
  resolveOptionLabel(value) {
16143
16320
  const option = this.options().find((item) => this.equalsOptionValue(item.value, value));
@@ -17856,6 +18033,9 @@ class InlineInputComponent extends SimpleBaseInputComponent {
17856
18033
  }
17857
18034
  ngAfterViewInit() {
17858
18035
  super.ngAfterViewInit();
18036
+ if (this.inputEl?.nativeElement) {
18037
+ this.registerInputElement(this.inputEl.nativeElement);
18038
+ }
17859
18039
  this.scheduleInlineResize();
17860
18040
  }
17861
18041
  onComponentDestroy() {
@@ -18082,6 +18262,7 @@ class InlineInputComponent extends SimpleBaseInputComponent {
18082
18262
  [placeholder]="placeholderText()"
18083
18263
  [required]="metadata()?.required || false"
18084
18264
  [readonly]="isReadonlyEffective()"
18265
+ [disabled]="disabledMode || control().disabled"
18085
18266
  [autocomplete]="metadata()?.autocomplete || 'off'"
18086
18267
  [spellcheck]="metadata()?.spellcheck ?? false"
18087
18268
  [maxlength]="metadata()?.maxLength || null"
@@ -18161,6 +18342,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
18161
18342
  [placeholder]="placeholderText()"
18162
18343
  [required]="metadata()?.required || false"
18163
18344
  [readonly]="isReadonlyEffective()"
18345
+ [disabled]="disabledMode || control().disabled"
18164
18346
  [autocomplete]="metadata()?.autocomplete || 'off'"
18165
18347
  [spellcheck]="metadata()?.spellcheck ?? false"
18166
18348
  [maxlength]="metadata()?.maxLength || null"
@@ -19351,6 +19533,9 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19351
19533
  }
19352
19534
  ngAfterViewInit() {
19353
19535
  super.ngAfterViewInit();
19536
+ if (this.inputEl?.nativeElement) {
19537
+ this.registerInputElement(this.inputEl.nativeElement);
19538
+ }
19354
19539
  this.scheduleInlineResize();
19355
19540
  }
19356
19541
  onComponentDestroy() {
@@ -19779,6 +19964,7 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19779
19964
  [placeholder]="placeholderText()"
19780
19965
  [required]="metadata()?.required || false"
19781
19966
  [readonly]="isReadonlyEffective()"
19967
+ [disabled]="disabledMode || control().disabled"
19782
19968
  [autocomplete]="metadata()?.autocomplete || 'off'"
19783
19969
  [spellcheck]="metadata()?.spellcheck ?? false"
19784
19970
  [min]="effectiveMinValue()"
@@ -19891,6 +20077,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19891
20077
  [placeholder]="placeholderText()"
19892
20078
  [required]="metadata()?.required || false"
19893
20079
  [readonly]="isReadonlyEffective()"
20080
+ [disabled]="disabledMode || control().disabled"
19894
20081
  [autocomplete]="metadata()?.autocomplete || 'off'"
19895
20082
  [spellcheck]="metadata()?.spellcheck ?? false"
19896
20083
  [min]="effectiveMinValue()"
@@ -20963,7 +21150,7 @@ class InlineCurrencyRangeComponent extends SimpleBaseInputComponent {
20963
21150
  return this.distributionVisual().opacity;
20964
21151
  }
20965
21152
  isInteractionBlocked() {
20966
- return this.disabledMode || this.isReadonlyEffective();
21153
+ return this.isInteractionBlockedByState();
20967
21154
  }
20968
21155
  hasSelection() {
20969
21156
  return this.currentRangeValue() !== null;
@@ -22283,7 +22470,7 @@ class InlineRangeSliderComponent extends SimpleBaseInputComponent {
22283
22470
  return String(this.currentMetadata().mode || 'single').toLowerCase() === 'range';
22284
22471
  }
22285
22472
  isInteractionBlocked() {
22286
- return this.disabledMode || this.isReadonlyEffective();
22473
+ return this.isInteractionBlockedByState();
22287
22474
  }
22288
22475
  hasSelection() {
22289
22476
  if (this.isRangeMode()) {
@@ -25316,10 +25503,7 @@ class InlineDateRangeComponent extends MaterialDateRangeComponent {
25316
25503
  this.scheduleInlineResize();
25317
25504
  }
25318
25505
  isInteractionBlocked() {
25319
- return (this.disabledMode ||
25320
- this.presentationMode ||
25321
- this.isReadonlyEffective() ||
25322
- this.control().disabled);
25506
+ return this.isInteractionBlockedByState();
25323
25507
  }
25324
25508
  showQuickClear() {
25325
25509
  const clearCfg = this.currentMetadata().clearButton;
@@ -26666,7 +26850,7 @@ class InlineTimeComponent extends MaterialTimepickerComponent {
26666
26850
  return getErrorStateMatcherForField(this.metadata());
26667
26851
  }
26668
26852
  isInteractionBlocked() {
26669
- return this.disabledMode || this.isReadonlyEffective() || this.presentationMode;
26853
+ return this.isInteractionBlockedByState();
26670
26854
  }
26671
26855
  showQuickClear() {
26672
26856
  const clearCfg = this.currentMetadata().clearButton;
@@ -28651,10 +28835,7 @@ class InlineTimeRangeComponent extends PdxMaterialTimeRangeComponent {
28651
28835
  return ticks === true || ticks === 'auto';
28652
28836
  }
28653
28837
  isInteractionBlocked() {
28654
- return (this.disabledMode ||
28655
- this.presentationMode ||
28656
- this.isReadonlyEffective() ||
28657
- this.control().disabled);
28838
+ return this.isInteractionBlockedByState();
28658
28839
  }
28659
28840
  hasValue() {
28660
28841
  const value = this.timeRangeForm.value;
@@ -30304,7 +30485,7 @@ class InlineTreeSelectComponent extends SimpleBaseSelectComponent {
30304
30485
  <div
30305
30486
  class="pdx-chip-trigger"
30306
30487
  [class.is-active]="hasSelection()"
30307
- [class.is-disabled]="disabledMode || isReadonlyEffective() || presentationMode"
30488
+ [class.is-disabled]="disabledMode || control().disabled || isReadonlyEffective() || presentationMode"
30308
30489
  >
30309
30490
  <button
30310
30491
  #triggerEl
@@ -30312,7 +30493,7 @@ class InlineTreeSelectComponent extends SimpleBaseSelectComponent {
30312
30493
  class="pdx-chip-main"
30313
30494
  [matMenuTriggerFor]="treeMenu"
30314
30495
  [matMenuTriggerRestoreFocus]="false"
30315
- [disabled]="disabledMode || isReadonlyEffective() || presentationMode"
30496
+ [disabled]="disabledMode || control().disabled || isReadonlyEffective() || presentationMode"
30316
30497
  [attr.aria-label]="ariaLabel()"
30317
30498
  [matTooltip]="inlineTooltipText()"
30318
30499
  [matTooltipDisabled]="inlineTooltipDisabled()"
@@ -30492,7 +30673,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
30492
30673
  <div
30493
30674
  class="pdx-chip-trigger"
30494
30675
  [class.is-active]="hasSelection()"
30495
- [class.is-disabled]="disabledMode || isReadonlyEffective() || presentationMode"
30676
+ [class.is-disabled]="disabledMode || control().disabled || isReadonlyEffective() || presentationMode"
30496
30677
  >
30497
30678
  <button
30498
30679
  #triggerEl
@@ -30500,7 +30681,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
30500
30681
  class="pdx-chip-main"
30501
30682
  [matMenuTriggerFor]="treeMenu"
30502
30683
  [matMenuTriggerRestoreFocus]="false"
30503
- [disabled]="disabledMode || isReadonlyEffective() || presentationMode"
30684
+ [disabled]="disabledMode || control().disabled || isReadonlyEffective() || presentationMode"
30504
30685
  [attr.aria-label]="ariaLabel()"
30505
30686
  [matTooltip]="inlineTooltipText()"
30506
30687
  [matTooltipDisabled]="inlineTooltipDisabled()"
@@ -32998,10 +33179,10 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
32998
33179
  return this.placeholderText();
32999
33180
  }
33000
33181
  panelSubtitleText() {
33001
- return this.resolvePipelineText('panelSubtitle', this.tDynamicFields('inlinePipeline.panelSubtitle', ''), 'pipelineSubtitle', 'inlinePanelSubtitle', 'hint');
33182
+ return this.resolvePipelineText('panelSubtitle', this.tDynamicFields('inlinePipelineStatus.panelSubtitle', ''), 'pipelineSubtitle', 'inlinePanelSubtitle', 'hint');
33002
33183
  }
33003
33184
  searchPlaceholderText() {
33004
- return this.resolvePipelineText('searchPlaceholder', this.tDynamicFields('inlinePipeline.searchPlaceholder', ''), 'pipelineSearchPlaceholder', 'searchPlaceholder');
33185
+ return this.resolvePipelineText('searchPlaceholder', this.tDynamicFields('inlinePipelineStatus.searchPlaceholder', ''), 'pipelineSearchPlaceholder', 'searchPlaceholder');
33005
33186
  }
33006
33187
  panelSearchIconName(fallback = 'search') {
33007
33188
  return this.metadataIconName(['pipelineSearchIcon', 'panelSearchIcon', 'searchIcon', 'inlineSearchIcon'], fallback);
@@ -33033,16 +33214,16 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33033
33214
  return this.showSelectAllAction() || this.showClearSelectionAction();
33034
33215
  }
33035
33216
  selectionActionsAriaLabel() {
33036
- return this.resolvePipelineText('selectionActionsAriaLabel', this.tDynamicFields('inlinePipeline.selectionActionsAriaLabel', ''), 'pipelineSelectionActionsAriaLabel');
33217
+ return this.resolvePipelineText('selectionActionsAriaLabel', this.tDynamicFields('inlinePipelineStatus.selectionActionsAriaLabel', ''), 'pipelineSelectionActionsAriaLabel');
33037
33218
  }
33038
33219
  selectAllActionText() {
33039
33220
  return this.resolvePipelineText('selectAllActionLabel', this.tDynamicFields('multiSelect.selectAllLabel', 'Select all'), 'pipelineSelectAllText');
33040
33221
  }
33041
33222
  clearSelectionActionText() {
33042
- return this.resolvePipelineText('clearActionLabel', this.tDynamicFields('inlinePipeline.clearActionLabel', ''), 'pipelineClearActionText');
33223
+ return this.resolvePipelineText('clearActionLabel', this.tDynamicFields('inlinePipelineStatus.clearActionLabel', ''), 'pipelineClearActionText');
33043
33224
  }
33044
33225
  selectionPillsAriaLabel() {
33045
- return this.resolvePipelineText('selectionPillsAriaLabel', this.tDynamicFields('inlinePipeline.selectionPillsAriaLabel', ''), 'pipelineSelectionPillsAriaLabel');
33226
+ return this.resolvePipelineText('selectionPillsAriaLabel', this.tDynamicFields('inlinePipelineStatus.selectionPillsAriaLabel', ''), 'pipelineSelectionPillsAriaLabel');
33046
33227
  }
33047
33228
  showSelectAllAction() {
33048
33229
  const md = this.currentMetadata();
@@ -33172,9 +33353,9 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33172
33353
  }
33173
33354
  optionsGroupAriaLabel() {
33174
33355
  if (this.multipleMode()) {
33175
- return this.resolvePipelineText('optionsGroupAriaLabelMultiple', this.tDynamicFields('inlinePipeline.optionsGroupAriaLabelMultiple', ''), 'pipelineOptionsGroupAriaLabelMultiple');
33356
+ return this.resolvePipelineText('optionsGroupAriaLabelMultiple', this.tDynamicFields('inlinePipelineStatus.optionsGroupAriaLabelMultiple', ''), 'pipelineOptionsGroupAriaLabelMultiple');
33176
33357
  }
33177
- return this.resolvePipelineText('optionsGroupAriaLabelSingle', this.tDynamicFields('inlinePipeline.optionsGroupAriaLabelSingle', ''), 'pipelineOptionsGroupAriaLabelSingle');
33358
+ return this.resolvePipelineText('optionsGroupAriaLabelSingle', this.tDynamicFields('inlinePipelineStatus.optionsGroupAriaLabelSingle', ''), 'pipelineOptionsGroupAriaLabelSingle');
33178
33359
  }
33179
33360
  optionAriaLabel(option) {
33180
33361
  if (!option.subtitle) {
@@ -33228,7 +33409,7 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33228
33409
  }
33229
33410
  placeholderText() {
33230
33411
  const fromMeta = this.resolveFieldLabelFromMetadata(this.currentMetadata());
33231
- return fromMeta || this.fieldLabelText || this.tDynamicFields('inlinePipeline.placeholder', '');
33412
+ return fromMeta || this.fieldLabelText || this.tDynamicFields('inlinePipelineStatus.placeholder', '');
33232
33413
  }
33233
33414
  ariaLabel() {
33234
33415
  const metadata = this.currentMetadata();
@@ -33238,7 +33419,7 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33238
33419
  return `${this.nonEmptyText(metadata.ariaLabel) || this.placeholderText()}: ${this.displayText()}`;
33239
33420
  }
33240
33421
  emptyStateText() {
33241
- return this.resolvePipelineText('emptyStateText', this.tDynamicFields('inlinePipeline.emptyStateText', ''), 'pipelineEmptyStateText', 'emptyStateText');
33422
+ return this.resolvePipelineText('emptyStateText', this.tDynamicFields('inlinePipelineStatus.emptyStateText', ''), 'pipelineEmptyStateText', 'emptyStateText');
33242
33423
  }
33243
33424
  resolveMultipleMode(metadata) {
33244
33425
  if (typeof metadata.multiple === 'boolean')
@@ -33261,7 +33442,7 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33261
33442
  return [value];
33262
33443
  }
33263
33444
  isInteractionBlocked() {
33264
- return this.disabledMode || this.isReadonlyEffective() || this.presentationMode;
33445
+ return this.isInteractionBlockedByState();
33265
33446
  }
33266
33447
  toVisualOption(option, index, totalOptions = 0) {
33267
33448
  const raw = option;
@@ -33489,7 +33670,7 @@ class InlinePipelineStatusComponent extends SimpleBaseSelectComponent {
33489
33670
  return text;
33490
33671
  }
33491
33672
  }
33492
- return this.tDynamicFields('inlinePipeline.placeholder', '');
33673
+ return this.tDynamicFields('inlinePipelineStatus.placeholder', '');
33493
33674
  }
33494
33675
  recalculateInlineSizeBounds() {
33495
33676
  const viewportWidth = typeof window !== 'undefined' ? window.innerWidth : 1280;
@@ -35477,7 +35658,7 @@ class InlineRelativePeriodComponent extends SimpleBaseSelectComponent {
35477
35658
  return this.resolveText('emptyStateText', this.tDynamicFields('inlineRelativePeriod.emptyStateText', ''), 'relativePeriodEmptyStateText', 'emptyStateText');
35478
35659
  }
35479
35660
  isInteractionBlocked() {
35480
- return this.disabledMode || this.isReadonlyEffective() || this.presentationMode;
35661
+ return this.isInteractionBlockedByState();
35481
35662
  }
35482
35663
  parseOptionsSource(source) {
35483
35664
  if (Array.isArray(source)) {
@@ -36389,7 +36570,7 @@ class InlineSentimentComponent extends SimpleBaseSelectComponent {
36389
36570
  return this.resolveText('emptyStateText', this.tDynamicFields('inlineSentiment.emptyStateText', ''), 'sentimentEmptyStateText', 'emptyStateText');
36390
36571
  }
36391
36572
  isInteractionBlocked() {
36392
- return this.disabledMode || this.isReadonlyEffective() || this.presentationMode;
36573
+ return this.isInteractionBlockedByState();
36393
36574
  }
36394
36575
  parseOptionsSource(source) {
36395
36576
  if (Array.isArray(source)) {
@@ -37398,7 +37579,7 @@ class InlineColorLabelComponent extends SimpleBaseSelectComponent {
37398
37579
  return this.resolveText('emptyStateText', this.tDynamicFields('inlineColorLabel.emptyStateText', ''), 'colorLabelEmptyStateText', 'emptyStateText');
37399
37580
  }
37400
37581
  isInteractionBlocked() {
37401
- return this.disabledMode || this.isReadonlyEffective() || this.presentationMode;
37582
+ return this.isInteractionBlockedByState();
37402
37583
  }
37403
37584
  parseOptionsSource(source) {
37404
37585
  if (Array.isArray(source)) {
@@ -39383,6 +39564,7 @@ class MaterialChipsComponent extends SimpleBaseSelectComponent {
39383
39564
  presentationMode = false;
39384
39565
  removable = signal(true, ...(ngDevMode ? [{ debugName: "removable" }] : []));
39385
39566
  addOnBlur = signal(false, ...(ngDevMode ? [{ debugName: "addOnBlur" }] : []));
39567
+ chipPlaceholder = signal(null, ...(ngDevMode ? [{ debugName: "chipPlaceholder" }] : []));
39386
39568
  separatorKeys = [ENTER, COMMA];
39387
39569
  asRecord(value) {
39388
39570
  if (value && typeof value === 'object' && !Array.isArray(value)) {
@@ -39425,6 +39607,9 @@ class MaterialChipsComponent extends SimpleBaseSelectComponent {
39425
39607
  const target = event.target;
39426
39608
  this.onSearch(target instanceof HTMLInputElement ? target.value : '');
39427
39609
  }
39610
+ setInputMetadata(metadata) {
39611
+ this.setSelectMetadata(metadata);
39612
+ }
39428
39613
  setSelectMetadata(metadata) {
39429
39614
  const matMetadata = metadata;
39430
39615
  this.devWarnSelectAliases(matMetadata, 'MaterialChipsComponent');
@@ -39446,6 +39631,9 @@ class MaterialChipsComponent extends SimpleBaseSelectComponent {
39446
39631
  });
39447
39632
  this.removable.set(matMetadata.removable ?? true);
39448
39633
  this.addOnBlur.set(matMetadata.addOnBlur ?? false);
39634
+ this.chipPlaceholder.set(typeof matMetadata.placeholder === 'string' && matMetadata.placeholder.trim().length
39635
+ ? matMetadata.placeholder
39636
+ : null);
39449
39637
  }
39450
39638
  errorStateMatcher() {
39451
39639
  return getErrorStateMatcherForField(this.metadata());
@@ -39486,6 +39674,7 @@ class MaterialChipsComponent extends SimpleBaseSelectComponent {
39486
39674
  [matChipInputSeparatorKeyCodes]="separatorKeys"
39487
39675
  [matAutocomplete]="auto"
39488
39676
  [required]="metadata()?.required || false"
39677
+ [attr.placeholder]="chipPlaceholder()"
39489
39678
  (input)="onSearchInputEvent($event)"
39490
39679
  (matChipInputTokenEnd)="onInputTokenEnd($event)"
39491
39680
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
@@ -39593,6 +39782,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
39593
39782
  [matChipInputSeparatorKeyCodes]="separatorKeys"
39594
39783
  [matAutocomplete]="auto"
39595
39784
  [required]="metadata()?.required || false"
39785
+ [attr.placeholder]="chipPlaceholder()"
39596
39786
  (input)="onSearchInputEvent($event)"
39597
39787
  (matChipInputTokenEnd)="onInputTokenEnd($event)"
39598
39788
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
@@ -40284,6 +40474,12 @@ class MaterialAvatarComponent {
40284
40474
  return `Avatar icon ${icon}`;
40285
40475
  return 'Avatar';
40286
40476
  }, ...(ngDevMode ? [{ debugName: "computedAriaLabel" }] : []));
40477
+ resolvedHint = computed(() => {
40478
+ const meta = this.metadata();
40479
+ const hint = meta?.hint;
40480
+ return typeof hint === 'string' && hint.trim().length ? hint.trim() : '';
40481
+ }, ...(ngDevMode ? [{ debugName: "resolvedHint" }] : []));
40482
+ hintId = computed(() => (this.resolvedHint() ? `${this.componentId()}-hint` : null), ...(ngDevMode ? [{ debugName: "hintId" }] : []));
40287
40483
  // Helpers for icon resolution
40288
40484
  resolveIconKind(i) {
40289
40485
  if (!i)
@@ -40520,7 +40716,7 @@ class MaterialAvatarComponent {
40520
40716
  }
40521
40717
  }
40522
40718
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: MaterialAvatarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
40523
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: MaterialAvatarComponent, isStandalone: true, selector: "pdx-material-avatar", inputs: { imageSrc: "imageSrc", imageAlt: "imageAlt", initials: "initials", name: "name", icon: "icon", defaultIcon: "defaultIcon", themeColor: "themeColor", rounded: "rounded", size: "size", fillMode: "fillMode", border: "border", sizePx: "sizePx", sizeCss: "sizeCss", tooltip: "tooltip", ariaLabel: "ariaLabel", readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode", class: "class", style: "style" }, outputs: { imageError: "imageError" }, host: { properties: { "class": "componentCssClasses()", "style.display": "visible === false ? \"none\" : null", "attr.aria-hidden": "visible ? null : \"true\"", "attr.role": "\"img\"", "attr.aria-label": "computedAriaLabel() || null", "attr.data-field-type": "\"avatar\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()", "class.praxis-disabled": "disabledMode === true", "class.praxis-readonly": "readonlyMode === true", "class.presentation-mode": "presentationMode === true" } }, ngImport: i0, template: `
40719
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: MaterialAvatarComponent, isStandalone: true, selector: "pdx-material-avatar", inputs: { imageSrc: "imageSrc", imageAlt: "imageAlt", initials: "initials", name: "name", icon: "icon", defaultIcon: "defaultIcon", themeColor: "themeColor", rounded: "rounded", size: "size", fillMode: "fillMode", border: "border", sizePx: "sizePx", sizeCss: "sizeCss", tooltip: "tooltip", ariaLabel: "ariaLabel", readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode", class: "class", style: "style" }, outputs: { imageError: "imageError" }, host: { properties: { "class": "componentCssClasses()", "style.display": "visible === false ? \"none\" : null", "attr.aria-hidden": "visible ? null : \"true\"", "attr.role": "\"img\"", "attr.aria-label": "computedAriaLabel() || null", "attr.aria-describedby": "hintId()", "attr.data-field-type": "\"avatar\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()", "class.praxis-disabled": "disabledMode === true", "class.praxis-readonly": "readonlyMode === true", "class.presentation-mode": "presentationMode === true" } }, ngImport: i0, template: `
40524
40720
  <span class="pfx-avatar__inner"
40525
40721
  [attr.aria-hidden]="presentationMode ? 'true' : null"
40526
40722
  [ngStyle]="resolvedStyle()"
@@ -40557,7 +40753,10 @@ class MaterialAvatarComponent {
40557
40753
  <span class="pfx-avatar__custom"><ng-content></ng-content></span>
40558
40754
  }
40559
40755
  </span>
40560
- `, isInline: true, styles: [":host{--pfx-avatar-size: 40px;--pfx-avatar-radius-full: 9999px;--pfx-avatar-radius-lg: 16px;--pfx-avatar-radius-md: 12px;--pfx-avatar-radius-sm: 8px;--pfx-avatar-border-w: 1px;--pfx-avatar-border-color: var(--md-sys-color-outline-variant);--pfx-avatar-bg: var(--md-sys-color-primary);--pfx-avatar-fg: var(--md-sys-color-on-primary);display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.pfx-avatar__inner{position:relative;box-sizing:border-box;width:var(--pfx-avatar-size);height:var(--pfx-avatar-size);border-radius:var(--_pfx-avatar-radius, var(--pfx-avatar-radius-full));display:inline-flex;align-items:center;justify-content:center;overflow:hidden;-webkit-user-select:none;user-select:none;line-height:1;background:var(--_pfx-avatar-bg, var(--pfx-avatar-bg));color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--_pfx-avatar-border, 0)}:host(.fill-outline) .pfx-avatar__inner{background:transparent;color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.has-border) .pfx-avatar__inner{border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.size-xsmall){--pfx-avatar-size: 20px}:host(.size-small){--pfx-avatar-size: 24px}:host(.size-medium){--pfx-avatar-size: 40px}:host(.size-large){--pfx-avatar-size: 56px}:host(.size-xlarge){--pfx-avatar-size: 72px}:host(.size-xxlarge){--pfx-avatar-size: 96px}:host(.size-none){--pfx-avatar-size: auto}:host(.rounded-full){--_pfx-avatar-radius: var(--pfx-avatar-radius-full)}:host(.rounded-large){--_pfx-avatar-radius: var(--pfx-avatar-radius-lg)}:host(.rounded-medium){--_pfx-avatar-radius: var(--pfx-avatar-radius-md)}:host(.rounded-small){--_pfx-avatar-radius: var(--pfx-avatar-radius-sm)}:host(.rounded-none){--_pfx-avatar-radius: 0}.pfx-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__icon,.pfx-avatar__icon-svg,.pfx-avatar__icon-font{font-size:calc(var(--pfx-avatar-size) * .6);width:calc(var(--pfx-avatar-size) * .6);height:calc(var(--pfx-avatar-size) * .6);display:inline-flex;align-items:center;justify-content:center}.pfx-avatar__initials{font-weight:600;letter-spacing:.02em;font-size:calc(var(--pfx-avatar-size) * .4);line-height:1}.pfx-avatar__custom{display:inline-flex;align-items:center;justify-content:center;font-size:calc(var(--pfx-avatar-size) * .6);line-height:1;width:100%;height:100%}.pfx-avatar__custom img{width:100%;height:100%;object-fit:cover;display:block}:host-context(.pfx-field-shell){display:flex;width:100%;align-items:center;justify-content:flex-start;padding:6px 0;min-height:var( --pfx-field-shell-min-height, calc(var(--pfx-field-min-height, 56px) + var(--pfx-subscript-min-h, 22px)) )}:host-context(.pfx-field-shell) .pfx-avatar__inner{flex-shrink:0}:host(.theme-primary){--_pfx-avatar-bg: var(--md-sys-color-primary);--_pfx-avatar-fg: var(--md-sys-color-on-primary)}:host(.theme-secondary){--_pfx-avatar-bg: var(--md-sys-color-secondary);--_pfx-avatar-fg: var(--md-sys-color-on-secondary)}:host(.theme-tertiary){--_pfx-avatar-bg: var(--md-sys-color-tertiary);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary)}:host(.theme-base){--_pfx-avatar-bg: var(--md-sys-color-surface-variant);--_pfx-avatar-fg: var(--md-sys-color-on-surface-variant)}:host(.theme-info){--_pfx-avatar-bg: var(--md-sys-color-primary-container);--_pfx-avatar-fg: var(--md-sys-color-on-primary-container)}:host(.theme-success){--_pfx-avatar-bg: var(--md-sys-color-secondary-container);--_pfx-avatar-fg: var(--md-sys-color-on-secondary-container)}:host(.theme-warning){--_pfx-avatar-bg: var(--md-sys-color-tertiary-container);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary-container)}:host(.theme-error){--_pfx-avatar-bg: var(--md-sys-color-error-container);--_pfx-avatar-fg: var(--md-sys-color-on-error-container)}:host(.theme-dark){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-light){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-inverse){--_pfx-avatar-bg: var(--md-sys-color-on-surface);--_pfx-avatar-fg: var(--md-sys-color-surface)}:host(.theme-none){--_pfx-avatar-bg: transparent;--_pfx-avatar-fg: inherit}:host(.fill-none) .pfx-avatar__inner{background:none;color:inherit;border:0}:host(.size-none) .pfx-avatar__inner{width:auto;height:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
40756
+ @if (resolvedHint()) {
40757
+ <span class="pfx-avatar__hint" [attr.id]="hintId()">{{ resolvedHint() }}</span>
40758
+ }
40759
+ `, isInline: true, styles: [":host{--pfx-avatar-size: 40px;--pfx-avatar-radius-full: 9999px;--pfx-avatar-radius-lg: 16px;--pfx-avatar-radius-md: 12px;--pfx-avatar-radius-sm: 8px;--pfx-avatar-border-w: 1px;--pfx-avatar-border-color: var(--md-sys-color-outline-variant);--pfx-avatar-bg: var(--md-sys-color-primary);--pfx-avatar-fg: var(--md-sys-color-on-primary);display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.pfx-avatar__inner{position:relative;box-sizing:border-box;width:var(--pfx-avatar-size);height:var(--pfx-avatar-size);border-radius:var(--_pfx-avatar-radius, var(--pfx-avatar-radius-full));display:inline-flex;align-items:center;justify-content:center;overflow:hidden;-webkit-user-select:none;user-select:none;line-height:1;background:var(--_pfx-avatar-bg, var(--pfx-avatar-bg));color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--_pfx-avatar-border, 0)}:host(.fill-outline) .pfx-avatar__inner{background:transparent;color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.has-border) .pfx-avatar__inner{border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.size-xsmall){--pfx-avatar-size: 20px}:host(.size-small){--pfx-avatar-size: 24px}:host(.size-medium){--pfx-avatar-size: 40px}:host(.size-large){--pfx-avatar-size: 56px}:host(.size-xlarge){--pfx-avatar-size: 72px}:host(.size-xxlarge){--pfx-avatar-size: 96px}:host(.size-none){--pfx-avatar-size: auto}:host(.rounded-full){--_pfx-avatar-radius: var(--pfx-avatar-radius-full)}:host(.rounded-large){--_pfx-avatar-radius: var(--pfx-avatar-radius-lg)}:host(.rounded-medium){--_pfx-avatar-radius: var(--pfx-avatar-radius-md)}:host(.rounded-small){--_pfx-avatar-radius: var(--pfx-avatar-radius-sm)}:host(.rounded-none){--_pfx-avatar-radius: 0}.pfx-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__icon,.pfx-avatar__icon-svg,.pfx-avatar__icon-font{font-size:calc(var(--pfx-avatar-size) * .6);width:calc(var(--pfx-avatar-size) * .6);height:calc(var(--pfx-avatar-size) * .6);display:inline-flex;align-items:center;justify-content:center}.pfx-avatar__initials{font-weight:600;letter-spacing:.02em;font-size:calc(var(--pfx-avatar-size) * .4);line-height:1}.pfx-avatar__custom{display:inline-flex;align-items:center;justify-content:center;font-size:calc(var(--pfx-avatar-size) * .6);line-height:1;width:100%;height:100%}.pfx-avatar__custom img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__hint{display:block;margin-top:6px;color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .6));font-size:12px;line-height:1.4}:host-context(.pfx-field-shell){display:flex;flex-direction:column;width:100%;align-items:flex-start;justify-content:flex-start;padding:6px 0;min-height:var( --pfx-field-shell-min-height, calc(var(--pfx-field-min-height, 56px) + var(--pfx-subscript-min-h, 22px)) )}:host-context(.pfx-field-shell) .pfx-avatar__inner{flex-shrink:0}:host(.theme-primary){--_pfx-avatar-bg: var(--md-sys-color-primary);--_pfx-avatar-fg: var(--md-sys-color-on-primary)}:host(.theme-secondary){--_pfx-avatar-bg: var(--md-sys-color-secondary);--_pfx-avatar-fg: var(--md-sys-color-on-secondary)}:host(.theme-tertiary){--_pfx-avatar-bg: var(--md-sys-color-tertiary);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary)}:host(.theme-base){--_pfx-avatar-bg: var(--md-sys-color-surface-variant);--_pfx-avatar-fg: var(--md-sys-color-on-surface-variant)}:host(.theme-info){--_pfx-avatar-bg: var(--md-sys-color-primary-container);--_pfx-avatar-fg: var(--md-sys-color-on-primary-container)}:host(.theme-success){--_pfx-avatar-bg: var(--md-sys-color-secondary-container);--_pfx-avatar-fg: var(--md-sys-color-on-secondary-container)}:host(.theme-warning){--_pfx-avatar-bg: var(--md-sys-color-tertiary-container);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary-container)}:host(.theme-error){--_pfx-avatar-bg: var(--md-sys-color-error-container);--_pfx-avatar-fg: var(--md-sys-color-on-error-container)}:host(.theme-dark){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-light){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-inverse){--_pfx-avatar-bg: var(--md-sys-color-on-surface);--_pfx-avatar-fg: var(--md-sys-color-surface)}:host(.theme-none){--_pfx-avatar-bg: transparent;--_pfx-avatar-fg: inherit}:host(.fill-none) .pfx-avatar__inner{background:none;color:inherit;border:0}:host(.size-none) .pfx-avatar__inner{width:auto;height:auto}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }] });
40561
40760
  }
40562
40761
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: MaterialAvatarComponent, decorators: [{
40563
40762
  type: Component,
@@ -40567,6 +40766,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
40567
40766
  '[attr.aria-hidden]': 'visible ? null : "true"',
40568
40767
  '[attr.role]': '"img"',
40569
40768
  '[attr.aria-label]': 'computedAriaLabel() || null',
40769
+ '[attr.aria-describedby]': 'hintId()',
40570
40770
  '[attr.data-field-type]': '"avatar"',
40571
40771
  '[attr.data-field-name]': 'metadata()?.name',
40572
40772
  '[attr.data-component-id]': 'componentId()',
@@ -40610,7 +40810,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
40610
40810
  <span class="pfx-avatar__custom"><ng-content></ng-content></span>
40611
40811
  }
40612
40812
  </span>
40613
- `, styles: [":host{--pfx-avatar-size: 40px;--pfx-avatar-radius-full: 9999px;--pfx-avatar-radius-lg: 16px;--pfx-avatar-radius-md: 12px;--pfx-avatar-radius-sm: 8px;--pfx-avatar-border-w: 1px;--pfx-avatar-border-color: var(--md-sys-color-outline-variant);--pfx-avatar-bg: var(--md-sys-color-primary);--pfx-avatar-fg: var(--md-sys-color-on-primary);display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.pfx-avatar__inner{position:relative;box-sizing:border-box;width:var(--pfx-avatar-size);height:var(--pfx-avatar-size);border-radius:var(--_pfx-avatar-radius, var(--pfx-avatar-radius-full));display:inline-flex;align-items:center;justify-content:center;overflow:hidden;-webkit-user-select:none;user-select:none;line-height:1;background:var(--_pfx-avatar-bg, var(--pfx-avatar-bg));color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--_pfx-avatar-border, 0)}:host(.fill-outline) .pfx-avatar__inner{background:transparent;color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.has-border) .pfx-avatar__inner{border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.size-xsmall){--pfx-avatar-size: 20px}:host(.size-small){--pfx-avatar-size: 24px}:host(.size-medium){--pfx-avatar-size: 40px}:host(.size-large){--pfx-avatar-size: 56px}:host(.size-xlarge){--pfx-avatar-size: 72px}:host(.size-xxlarge){--pfx-avatar-size: 96px}:host(.size-none){--pfx-avatar-size: auto}:host(.rounded-full){--_pfx-avatar-radius: var(--pfx-avatar-radius-full)}:host(.rounded-large){--_pfx-avatar-radius: var(--pfx-avatar-radius-lg)}:host(.rounded-medium){--_pfx-avatar-radius: var(--pfx-avatar-radius-md)}:host(.rounded-small){--_pfx-avatar-radius: var(--pfx-avatar-radius-sm)}:host(.rounded-none){--_pfx-avatar-radius: 0}.pfx-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__icon,.pfx-avatar__icon-svg,.pfx-avatar__icon-font{font-size:calc(var(--pfx-avatar-size) * .6);width:calc(var(--pfx-avatar-size) * .6);height:calc(var(--pfx-avatar-size) * .6);display:inline-flex;align-items:center;justify-content:center}.pfx-avatar__initials{font-weight:600;letter-spacing:.02em;font-size:calc(var(--pfx-avatar-size) * .4);line-height:1}.pfx-avatar__custom{display:inline-flex;align-items:center;justify-content:center;font-size:calc(var(--pfx-avatar-size) * .6);line-height:1;width:100%;height:100%}.pfx-avatar__custom img{width:100%;height:100%;object-fit:cover;display:block}:host-context(.pfx-field-shell){display:flex;width:100%;align-items:center;justify-content:flex-start;padding:6px 0;min-height:var( --pfx-field-shell-min-height, calc(var(--pfx-field-min-height, 56px) + var(--pfx-subscript-min-h, 22px)) )}:host-context(.pfx-field-shell) .pfx-avatar__inner{flex-shrink:0}:host(.theme-primary){--_pfx-avatar-bg: var(--md-sys-color-primary);--_pfx-avatar-fg: var(--md-sys-color-on-primary)}:host(.theme-secondary){--_pfx-avatar-bg: var(--md-sys-color-secondary);--_pfx-avatar-fg: var(--md-sys-color-on-secondary)}:host(.theme-tertiary){--_pfx-avatar-bg: var(--md-sys-color-tertiary);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary)}:host(.theme-base){--_pfx-avatar-bg: var(--md-sys-color-surface-variant);--_pfx-avatar-fg: var(--md-sys-color-on-surface-variant)}:host(.theme-info){--_pfx-avatar-bg: var(--md-sys-color-primary-container);--_pfx-avatar-fg: var(--md-sys-color-on-primary-container)}:host(.theme-success){--_pfx-avatar-bg: var(--md-sys-color-secondary-container);--_pfx-avatar-fg: var(--md-sys-color-on-secondary-container)}:host(.theme-warning){--_pfx-avatar-bg: var(--md-sys-color-tertiary-container);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary-container)}:host(.theme-error){--_pfx-avatar-bg: var(--md-sys-color-error-container);--_pfx-avatar-fg: var(--md-sys-color-on-error-container)}:host(.theme-dark){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-light){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-inverse){--_pfx-avatar-bg: var(--md-sys-color-on-surface);--_pfx-avatar-fg: var(--md-sys-color-surface)}:host(.theme-none){--_pfx-avatar-bg: transparent;--_pfx-avatar-fg: inherit}:host(.fill-none) .pfx-avatar__inner{background:none;color:inherit;border:0}:host(.size-none) .pfx-avatar__inner{width:auto;height:auto}\n"] }]
40813
+ @if (resolvedHint()) {
40814
+ <span class="pfx-avatar__hint" [attr.id]="hintId()">{{ resolvedHint() }}</span>
40815
+ }
40816
+ `, styles: [":host{--pfx-avatar-size: 40px;--pfx-avatar-radius-full: 9999px;--pfx-avatar-radius-lg: 16px;--pfx-avatar-radius-md: 12px;--pfx-avatar-radius-sm: 8px;--pfx-avatar-border-w: 1px;--pfx-avatar-border-color: var(--md-sys-color-outline-variant);--pfx-avatar-bg: var(--md-sys-color-primary);--pfx-avatar-fg: var(--md-sys-color-on-primary);display:inline-flex;align-items:center;justify-content:center;vertical-align:middle}.pfx-avatar__inner{position:relative;box-sizing:border-box;width:var(--pfx-avatar-size);height:var(--pfx-avatar-size);border-radius:var(--_pfx-avatar-radius, var(--pfx-avatar-radius-full));display:inline-flex;align-items:center;justify-content:center;overflow:hidden;-webkit-user-select:none;user-select:none;line-height:1;background:var(--_pfx-avatar-bg, var(--pfx-avatar-bg));color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--_pfx-avatar-border, 0)}:host(.fill-outline) .pfx-avatar__inner{background:transparent;color:var(--_pfx-avatar-fg, var(--pfx-avatar-fg));border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.has-border) .pfx-avatar__inner{border:var(--pfx-avatar-border-w) solid var(--pfx-avatar-border-color)}:host(.size-xsmall){--pfx-avatar-size: 20px}:host(.size-small){--pfx-avatar-size: 24px}:host(.size-medium){--pfx-avatar-size: 40px}:host(.size-large){--pfx-avatar-size: 56px}:host(.size-xlarge){--pfx-avatar-size: 72px}:host(.size-xxlarge){--pfx-avatar-size: 96px}:host(.size-none){--pfx-avatar-size: auto}:host(.rounded-full){--_pfx-avatar-radius: var(--pfx-avatar-radius-full)}:host(.rounded-large){--_pfx-avatar-radius: var(--pfx-avatar-radius-lg)}:host(.rounded-medium){--_pfx-avatar-radius: var(--pfx-avatar-radius-md)}:host(.rounded-small){--_pfx-avatar-radius: var(--pfx-avatar-radius-sm)}:host(.rounded-none){--_pfx-avatar-radius: 0}.pfx-avatar__img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__icon,.pfx-avatar__icon-svg,.pfx-avatar__icon-font{font-size:calc(var(--pfx-avatar-size) * .6);width:calc(var(--pfx-avatar-size) * .6);height:calc(var(--pfx-avatar-size) * .6);display:inline-flex;align-items:center;justify-content:center}.pfx-avatar__initials{font-weight:600;letter-spacing:.02em;font-size:calc(var(--pfx-avatar-size) * .4);line-height:1}.pfx-avatar__custom{display:inline-flex;align-items:center;justify-content:center;font-size:calc(var(--pfx-avatar-size) * .6);line-height:1;width:100%;height:100%}.pfx-avatar__custom img{width:100%;height:100%;object-fit:cover;display:block}.pfx-avatar__hint{display:block;margin-top:6px;color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .6));font-size:12px;line-height:1.4}:host-context(.pfx-field-shell){display:flex;flex-direction:column;width:100%;align-items:flex-start;justify-content:flex-start;padding:6px 0;min-height:var( --pfx-field-shell-min-height, calc(var(--pfx-field-min-height, 56px) + var(--pfx-subscript-min-h, 22px)) )}:host-context(.pfx-field-shell) .pfx-avatar__inner{flex-shrink:0}:host(.theme-primary){--_pfx-avatar-bg: var(--md-sys-color-primary);--_pfx-avatar-fg: var(--md-sys-color-on-primary)}:host(.theme-secondary){--_pfx-avatar-bg: var(--md-sys-color-secondary);--_pfx-avatar-fg: var(--md-sys-color-on-secondary)}:host(.theme-tertiary){--_pfx-avatar-bg: var(--md-sys-color-tertiary);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary)}:host(.theme-base){--_pfx-avatar-bg: var(--md-sys-color-surface-variant);--_pfx-avatar-fg: var(--md-sys-color-on-surface-variant)}:host(.theme-info){--_pfx-avatar-bg: var(--md-sys-color-primary-container);--_pfx-avatar-fg: var(--md-sys-color-on-primary-container)}:host(.theme-success){--_pfx-avatar-bg: var(--md-sys-color-secondary-container);--_pfx-avatar-fg: var(--md-sys-color-on-secondary-container)}:host(.theme-warning){--_pfx-avatar-bg: var(--md-sys-color-tertiary-container);--_pfx-avatar-fg: var(--md-sys-color-on-tertiary-container)}:host(.theme-error){--_pfx-avatar-bg: var(--md-sys-color-error-container);--_pfx-avatar-fg: var(--md-sys-color-on-error-container)}:host(.theme-dark){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-light){--_pfx-avatar-bg: var(--md-sys-color-surface);--_pfx-avatar-fg: var(--md-sys-color-on-surface)}:host(.theme-inverse){--_pfx-avatar-bg: var(--md-sys-color-on-surface);--_pfx-avatar-fg: var(--md-sys-color-surface)}:host(.theme-none){--_pfx-avatar-bg: transparent;--_pfx-avatar-fg: inherit}:host(.fill-none) .pfx-avatar__inner{background:none;color:inherit;border:0}:host(.size-none) .pfx-avatar__inner{width:auto;height:auto}\n"] }]
40614
40817
  }], propDecorators: { imageSrc: [{
40615
40818
  type: Input
40616
40819
  }], imageAlt: [{
@@ -41658,12 +41861,28 @@ class MaterialFileUploadComponent extends SimpleBaseInputComponent {
41658
41861
  const { placeholder: _placeholder, ...rest } = metadata;
41659
41862
  this.setMetadata(rest);
41660
41863
  }
41864
+ fileAccept() {
41865
+ const accept = this.metadataRecord()?.['accept'];
41866
+ return typeof accept === 'string' && accept.trim().length ? accept.trim() : null;
41867
+ }
41868
+ allowsMultiple() {
41869
+ return this.metadataRecord()?.['multiple'] === true;
41870
+ }
41871
+ isInteractionDisabled() {
41872
+ return this.disabledMode || this.readonlyMode || this.presentationMode;
41873
+ }
41661
41874
  /**
41662
41875
  * CSS classes specific to the file upload wrapper.
41663
41876
  */
41664
41877
  getSpecificCssClasses() {
41665
41878
  return ['pdx-material-file-upload'];
41666
41879
  }
41880
+ metadataRecord() {
41881
+ const metadata = this.metadata();
41882
+ return metadata && typeof metadata === 'object'
41883
+ ? metadata
41884
+ : null;
41885
+ }
41667
41886
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: MaterialFileUploadComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
41668
41887
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.17", type: MaterialFileUploadComponent, isStandalone: true, selector: "pdx-material-file-upload", inputs: { readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode" }, host: { properties: { "class": "componentCssClasses()", "class.praxis-disabled": "disabledMode", "style.display": "visible ? null : \"none\"", "attr.aria-hidden": "visible ? null : \"true\"", "attr.data-field-type": "\"file-upload\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()" } }, providers: [
41669
41888
  {
@@ -41683,6 +41902,9 @@ class MaterialFileUploadComponent extends SimpleBaseInputComponent {
41683
41902
  [attr.id]="componentId()"
41684
41903
  type="file"
41685
41904
  (change)="onFileSelected($event)"
41905
+ [attr.accept]="fileAccept()"
41906
+ [attr.multiple]="allowsMultiple() ? '' : null"
41907
+ [disabled]="isInteractionDisabled()"
41686
41908
  [attr.aria-disabled]="disabledMode ? 'true' : null"
41687
41909
  />
41688
41910
  @if (hasValidationError()) {
@@ -41712,6 +41934,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
41712
41934
  [attr.id]="componentId()"
41713
41935
  type="file"
41714
41936
  (change)="onFileSelected($event)"
41937
+ [attr.accept]="fileAccept()"
41938
+ [attr.multiple]="allowsMultiple() ? '' : null"
41939
+ [disabled]="isInteractionDisabled()"
41715
41940
  [attr.aria-disabled]="disabledMode ? 'true' : null"
41716
41941
  />
41717
41942
  @if (hasValidationError()) {
@@ -45567,6 +45792,9 @@ class MaterialTransferListComponent extends SimpleBaseSelectComponent {
45567
45792
  this.updateListsFromValue();
45568
45793
  });
45569
45794
  }
45795
+ setInputMetadata(metadata) {
45796
+ this.setSelectMetadata(metadata);
45797
+ }
45570
45798
  setSelectMetadata(metadata) {
45571
45799
  const source = metadata.transferOptions ?? metadata.options;
45572
45800
  const mapped = source?.map((o) => ({
@@ -45829,7 +46057,11 @@ class MaterialTransferListComponent extends SimpleBaseSelectComponent {
45829
46057
  </mat-selection-list>
45830
46058
  </div>
45831
46059
  </div>
45832
- `, isInline: true, styles: [":host{display:block;width:100%}.pdx-transfer-list{width:100%;min-height:56px;padding:4px 0}.pdx-transfer-column{width:100%}.pdx-transfer-column mat-form-field{width:100%}.pdx-transfer-actions{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center;padding:0 8px}@media(min-width:640px){.pdx-transfer-list{display:grid;grid-template-columns:1fr auto 1fr;gap:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i3$6.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
46060
+
46061
+ @if (metadata()?.hint) {
46062
+ <div class="pdx-transfer-hint">{{ metadata()!.hint }}</div>
46063
+ }
46064
+ `, isInline: true, styles: [":host{display:block;width:100%}.pdx-transfer-list{width:100%;min-height:56px;padding:4px 0}.pdx-transfer-column{width:100%}.pdx-transfer-column mat-form-field{width:100%}.pdx-transfer-actions{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center;padding:0 8px}.pdx-transfer-hint{margin-top:4px;color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .6));font-size:12px;line-height:1.4}@media(min-width:640px){.pdx-transfer-list{display:grid;grid-template-columns:1fr auto 1fr;gap:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$5.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$5.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i2.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i2.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i2.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1$1.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i3.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: PraxisIconDirective, selector: "mat-icon[praxisIcon]", inputs: ["praxisIcon"] }, { kind: "ngmodule", type: MatListModule }, { kind: "component", type: i3$6.MatSelectionList, selector: "mat-selection-list", inputs: ["color", "compareWith", "multiple", "hideSingleSelectionIndicator", "disabled"], outputs: ["selectionChange"], exportAs: ["matSelectionList"] }, { kind: "component", type: i3$6.MatListOption, selector: "mat-list-option", inputs: ["togglePosition", "checkboxPosition", "color", "value", "selected"], outputs: ["selectedChange"], exportAs: ["matListOption"] }, { kind: "ngmodule", type: MatTooltipModule }, { kind: "directive", type: i4.MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
45833
46065
  }
45834
46066
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: MaterialTransferListComponent, decorators: [{
45835
46067
  type: Component,
@@ -45961,6 +46193,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
45961
46193
  </mat-selection-list>
45962
46194
  </div>
45963
46195
  </div>
46196
+
46197
+ @if (metadata()?.hint) {
46198
+ <div class="pdx-transfer-hint">{{ metadata()!.hint }}</div>
46199
+ }
45964
46200
  `, providers: [
45965
46201
  {
45966
46202
  provide: NG_VALUE_ACCESSOR,
@@ -45975,7 +46211,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
45975
46211
  '[attr.data-field-type]': '"transfer-list"',
45976
46212
  '[attr.data-field-name]': 'metadata()?.name',
45977
46213
  '[attr.data-component-id]': 'componentId()',
45978
- }, styles: [":host{display:block;width:100%}.pdx-transfer-list{width:100%;min-height:56px;padding:4px 0}.pdx-transfer-column{width:100%}.pdx-transfer-column mat-form-field{width:100%}.pdx-transfer-actions{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center;padding:0 8px}@media(min-width:640px){.pdx-transfer-list{display:grid;grid-template-columns:1fr auto 1fr;gap:12px}}\n"] }]
46214
+ }, styles: [":host{display:block;width:100%}.pdx-transfer-list{width:100%;min-height:56px;padding:4px 0}.pdx-transfer-column{width:100%}.pdx-transfer-column mat-form-field{width:100%}.pdx-transfer-actions{display:flex;flex-direction:column;gap:4px;align-items:center;justify-content:center;padding:0 8px}.pdx-transfer-hint{margin-top:4px;color:var(--md-sys-color-on-surface-variant, rgba(0, 0, 0, .6));font-size:12px;line-height:1.4}@media(min-width:640px){.pdx-transfer-list{display:grid;grid-template-columns:1fr auto 1fr;gap:12px}}\n"] }]
45979
46215
  }], ctorParameters: () => [], propDecorators: { readonlyMode: [{
45980
46216
  type: Input
45981
46217
  }], disabledMode: [{
@@ -47977,11 +48213,24 @@ const DYNAMIC_FIELD_READONLY_STATE_RECIPE = {
47977
48213
  supported: true,
47978
48214
  metadataPatch: { readonly: true },
47979
48215
  };
48216
+ const DYNAMIC_FIELD_PRESENTATION_STATE_RECIPE = {
48217
+ state: 'presentation',
48218
+ label: 'Presentation',
48219
+ supported: true,
48220
+ metadataPatch: { presentationMode: true },
48221
+ note: 'Uses the canonical presentation pipeline instead of a disabled or readonly input shell.',
48222
+ };
47980
48223
  const DYNAMIC_FIELD_ERROR_STATE_RECIPE = {
47981
48224
  state: 'error',
47982
48225
  label: 'Error',
47983
48226
  supported: true,
47984
- metadataPatch: { required: true },
48227
+ metadataPatch: {
48228
+ required: true,
48229
+ validators: {
48230
+ requiredMessage: 'Governed sample error state for playground preview.',
48231
+ validationTrigger: 'immediate',
48232
+ },
48233
+ },
47985
48234
  errorMessage: 'Governed sample error state for playground preview.',
47986
48235
  };
47987
48236
  const DYNAMIC_FIELD_BASE_STATE_RECIPES = [
@@ -47989,9 +48238,21 @@ const DYNAMIC_FIELD_BASE_STATE_RECIPES = [
47989
48238
  DYNAMIC_FIELD_FILLED_STATE_RECIPE,
47990
48239
  DYNAMIC_FIELD_DISABLED_STATE_RECIPE,
47991
48240
  DYNAMIC_FIELD_READONLY_STATE_RECIPE,
48241
+ DYNAMIC_FIELD_PRESENTATION_STATE_RECIPE,
47992
48242
  DYNAMIC_FIELD_ERROR_STATE_RECIPE,
47993
48243
  ];
48244
+ function mergeStateRecipes(overrides, supportedStates) {
48245
+ const overrideMap = new Map((overrides ?? []).map((state) => [state.state, state]));
48246
+ return DYNAMIC_FIELD_BASE_STATE_RECIPES
48247
+ .filter((state) => supportedStates.has(state.state))
48248
+ .map((state) => ({
48249
+ ...state,
48250
+ ...(overrideMap.get(state.state) ?? {}),
48251
+ }));
48252
+ }
47994
48253
  function createDynamicFieldPreviewRecipe(input) {
48254
+ const supportedStates = new Set(input.supportedStates ?? DYNAMIC_FIELD_BASE_STATE_RECIPES.map((state) => state.state));
48255
+ const states = mergeStateRecipes(input.states, supportedStates);
47995
48256
  return {
47996
48257
  recipeId: input.recipeId,
47997
48258
  fieldName: input.fieldName,
@@ -48003,7 +48264,7 @@ function createDynamicFieldPreviewRecipe(input) {
48003
48264
  controlType: input.controlType,
48004
48265
  ...(input.metadata ?? {}),
48005
48266
  },
48006
- states: input.states ? [...input.states] : [...DYNAMIC_FIELD_BASE_STATE_RECIPES],
48267
+ states,
48007
48268
  };
48008
48269
  }
48009
48270
 
@@ -48026,7 +48287,7 @@ function jsonApiPath(relativePath) {
48026
48287
  return `projects/praxis-dynamic-fields/src/lib/components/${relativePath}`;
48027
48288
  }
48028
48289
  function createEntry(input) {
48029
- const states = input.states ?? ['default', 'filled', 'disabled', 'readonly', 'error'];
48290
+ const states = input.states ?? ['default', 'filled', 'disabled', 'readonly', 'presentation', 'error'];
48030
48291
  return {
48031
48292
  id: input.id,
48032
48293
  controlType: input.controlType,
@@ -48057,6 +48318,7 @@ function createEntry(input) {
48057
48318
  description: input.description,
48058
48319
  metadata: input.metadata,
48059
48320
  states: input.stateRecipes,
48321
+ supportedStates: states,
48060
48322
  }),
48061
48323
  snippetRecipe: {
48062
48324
  language: input.snippetLanguage ?? 'json',
@@ -48068,6 +48330,15 @@ function createEntry(input) {
48068
48330
  themingNotes: input.themingNotes ?? DEFAULT_THEMING_NOTES,
48069
48331
  };
48070
48332
  }
48333
+ function createDefaultSeedRecipe(initialValue, note) {
48334
+ return {
48335
+ state: 'default',
48336
+ label: 'Default',
48337
+ supported: true,
48338
+ initialValue,
48339
+ note,
48340
+ };
48341
+ }
48071
48342
  const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48072
48343
  createEntry({
48073
48344
  id: 'text-input',
@@ -48083,6 +48354,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48083
48354
  dataSourceKind: 'local',
48084
48355
  apiPath: jsonApiPath('text-input/pdx-text-input.json-api.md'),
48085
48356
  metadata: { placeholder: 'Type here' },
48357
+ stateRecipes: [
48358
+ createDefaultSeedRecipe('Ana Souza', 'Seeded default preview to show immediate field affordance in the catalog.'),
48359
+ ],
48086
48360
  }),
48087
48361
  createEntry({
48088
48362
  id: 'email-input',
@@ -48217,6 +48491,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48217
48491
  dataSourceKind: 'local',
48218
48492
  apiPath: jsonApiPath('material-currency/pdx-material-currency.json-api.md'),
48219
48493
  metadata: { currency: 'BRL', locale: 'pt-BR' },
48494
+ stateRecipes: [
48495
+ createDefaultSeedRecipe(18450.75, 'Seeded default preview to expose formatted monetary rendering at first glance.'),
48496
+ ],
48220
48497
  }),
48221
48498
  createEntry({
48222
48499
  id: 'slider',
@@ -48321,6 +48598,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48321
48598
  avoidWhen: ['data unica'],
48322
48599
  dataSourceKind: 'local',
48323
48600
  apiPath: jsonApiPath('material-date-range/pdx-material-date-range.json-api.md'),
48601
+ stateRecipes: [
48602
+ createDefaultSeedRecipe({ startDate: '2026-03-01', endDate: '2026-03-23' }, 'Seeded default preview to demonstrate a complete temporal range without switching states.'),
48603
+ ],
48324
48604
  }),
48325
48605
  createEntry({
48326
48606
  id: 'datetime-local',
@@ -48444,6 +48724,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48444
48724
  { label: 'Paused', value: 'PAUSED' },
48445
48725
  ],
48446
48726
  },
48727
+ stateRecipes: [
48728
+ createDefaultSeedRecipe('ACTIVE', 'Seeded default preview to reveal selected-label rendering in the base card.'),
48729
+ ],
48447
48730
  }),
48448
48731
  createEntry({
48449
48732
  id: 'searchable-select',
@@ -48636,6 +48919,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48636
48919
  avoidWhen: ['mais de dois estados'],
48637
48920
  dataSourceKind: 'local',
48638
48921
  apiPath: jsonApiPath('material-slide-toggle/pdx-material-slide-toggle.json-api.md'),
48922
+ stateRecipes: [
48923
+ createDefaultSeedRecipe(true, 'Seeded default preview to show the canonical boolean-on state at a glance.'),
48924
+ ],
48639
48925
  }),
48640
48926
  createEntry({
48641
48927
  id: 'button-toggle',
@@ -48751,6 +49037,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48751
49037
  avoidWhen: ['texto longo', 'validacao complexa'],
48752
49038
  dataSourceKind: 'local',
48753
49039
  apiPath: jsonApiPath('inline-input/pdx-inline-input.json-api.md'),
49040
+ stateRecipes: [
49041
+ createDefaultSeedRecipe('Praxis', 'Seeded default preview to keep inline text examples informative from the first render.'),
49042
+ ],
48754
49043
  }),
48755
49044
  createEntry({
48756
49045
  id: 'inline-select',
@@ -48765,6 +49054,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48765
49054
  avoidWhen: ['lookup remoto grande'],
48766
49055
  dataSourceKind: 'mixed',
48767
49056
  apiPath: jsonApiPath('inline-select/pdx-inline-select.json-api.md'),
49057
+ stateRecipes: [
49058
+ createDefaultSeedRecipe('ALPHA', 'Seeded default preview to expose compact selected-pill rendering.'),
49059
+ ],
48768
49060
  }),
48769
49061
  createEntry({
48770
49062
  id: 'inline-searchable-select',
@@ -48962,6 +49254,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48962
49254
  avoidWhen: ['toolbar saturada ou data unica'],
48963
49255
  dataSourceKind: 'specialized',
48964
49256
  apiPath: jsonApiPath('inline-date-range/pdx-inline-date-range.json-api.md'),
49257
+ stateRecipes: [
49258
+ createDefaultSeedRecipe({ startDate: '2026-03-01', endDate: '2026-03-23' }, 'Seeded default preview to show a resolved inline range immediately.'),
49259
+ ],
48965
49260
  }),
48966
49261
  createEntry({
48967
49262
  id: 'inline-time',
@@ -49078,6 +49373,9 @@ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
49078
49373
  avoidWhen: ['false e null nao estao bem documentados no fluxo'],
49079
49374
  dataSourceKind: 'local',
49080
49375
  apiPath: jsonApiPath('inline-toggle/pdx-inline-toggle.json-api.md'),
49376
+ stateRecipes: [
49377
+ createDefaultSeedRecipe(true, 'Seeded default preview to show the compact boolean state in toolbar scenarios.'),
49378
+ ],
49081
49379
  }),
49082
49380
  ];
49083
49381
 
@@ -50914,5 +51212,5 @@ function supportsClearButtonControlType(controlType) {
50914
51212
  * Generated bundle index. Do not edit.
50915
51213
  */
50916
51214
 
50917
- export { ActionResolverService, BRAZIL_INPUTS_AI_CAPABILITIES, CACHE_TTL, CHIPS_CONTROLS_AI_CAPABILITIES, CLEAR_BUTTON_CONTROL_TYPES, COLOR_CONTROLS_AI_CAPABILITIES, CONTROL_TYPE_AI_CATALOGS, ColorInputComponent, ComponentPreloaderService, ComponentRegistryService, ConfirmDialogComponent, DATE_CONTROLS_AI_CAPABILITIES, DISPLAY_ACTION_AI_CAPABILITIES, DYNAMIC_FIELDS_PLAYGROUND_CATALOG, DYNAMIC_FIELD_BASE_STATE_RECIPES, DYNAMIC_FIELD_DEFAULT_STATE_RECIPE, DYNAMIC_FIELD_DISABLED_STATE_RECIPE, DYNAMIC_FIELD_ERROR_STATE_RECIPE, DYNAMIC_FIELD_FILLED_STATE_RECIPE, DYNAMIC_FIELD_READONLY_STATE_RECIPE, DateInputComponent, DateUtilsService, DatetimeLocalInputComponent, DynamicFieldLoaderDirective, EmailInputComponent, FILE_UPLOAD_AI_CAPABILITIES, InlineAsyncSelectComponent, InlineAutocompleteComponent, InlineColorLabelComponent, InlineCurrencyComponent, InlineCurrencyRangeComponent, InlineDateComponent, InlineDateRangeComponent, InlineDistanceRadiusComponent, InlineEntityLookupComponent, InlineInputComponent, InlineMonthRangeComponent, InlineMultiSelectComponent, InlineNumberComponent, InlinePeriodRangeComponent, InlinePipelineStatusComponent, InlineRangeSliderComponent, InlineRatingComponent, InlineRelativePeriodComponent, InlineScorePriorityComponent, InlineSearchableSelectComponent, InlineSelectComponent, InlineSentimentComponent, InlineTimeComponent, InlineTimeRangeComponent, InlineToggleComponent, InlineTreeSelectComponent, InlineYearRangeComponent, KeyboardShortcutService, LIST_CONTROLS_AI_CAPABILITIES, LoggerPresets, MAX_LOAD_ATTEMPTS, MaterialAsyncSelectComponent, MaterialAutocompleteComponent, MaterialAvatarComponent, MaterialButtonComponent, MaterialButtonToggleComponent, MaterialCheckboxGroupComponent, MaterialChipsComponent, MaterialColorPickerComponent, MaterialCpfCnpjInputComponent, MaterialCurrencyComponent, MaterialDateRangeComponent, MaterialDatepickerComponent, MaterialFileUploadComponent, MaterialMultiSelectComponent, MaterialMultiSelectTreeComponent, MaterialPriceRangeComponent, MaterialRadioGroupComponent, MaterialRatingComponent, MaterialSearchableSelectComponent, MaterialSelectComponent, MaterialSelectionListComponent, MaterialSlideToggleComponent, MaterialSliderComponent, MaterialTextareaComponent, MaterialTimepickerComponent, MaterialTransferListComponent, MaterialTreeSelectComponent, MonthInputComponent, NUMERIC_INPUTS_AI_CAPABILITIES, NumberInputComponent, OptionStore, PDX_COLOR_INPUT_COMPONENT_METADATA, PDX_COLOR_PICKER_COMPONENT_METADATA, PDX_DATETIME_LOCAL_INPUT_COMPONENT_METADATA, PDX_DATE_INPUT_COMPONENT_METADATA, PDX_EMAIL_INPUT_COMPONENT_METADATA, PDX_FIELD_SHELL_COMPONENT_METADATA, PDX_INLINE_ASYNC_SELECT_COMPONENT_METADATA, PDX_INLINE_AUTOCOMPLETE_COMPONENT_METADATA, PDX_INLINE_COLOR_LABEL_COMPONENT_METADATA, PDX_INLINE_CURRENCY_COMPONENT_METADATA, PDX_INLINE_CURRENCY_RANGE_COMPONENT_METADATA, PDX_INLINE_DATE_COMPONENT_METADATA, PDX_INLINE_DATE_RANGE_COMPONENT_METADATA, PDX_INLINE_DISTANCE_RADIUS_COMPONENT_METADATA, PDX_INLINE_ENTITY_LOOKUP_COMPONENT_METADATA, PDX_INLINE_INPUT_COMPONENT_METADATA, PDX_INLINE_MONTH_RANGE_COMPONENT_METADATA, PDX_INLINE_MULTI_SELECT_COMPONENT_METADATA, PDX_INLINE_NUMBER_COMPONENT_METADATA, PDX_INLINE_PERIOD_RANGE_COMPONENT_METADATA, PDX_INLINE_PIPELINE_STATUS_COMPONENT_METADATA, PDX_INLINE_RANGE_SLIDER_COMPONENT_METADATA, PDX_INLINE_RATING_COMPONENT_METADATA, PDX_INLINE_RELATIVE_PERIOD_COMPONENT_METADATA, PDX_INLINE_SCORE_PRIORITY_COMPONENT_METADATA, PDX_INLINE_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_INLINE_SELECT_COMPONENT_METADATA, PDX_INLINE_SENTIMENT_COMPONENT_METADATA, PDX_INLINE_TIME_COMPONENT_METADATA, PDX_INLINE_TIME_RANGE_COMPONENT_METADATA, PDX_INLINE_TOGGLE_COMPONENT_METADATA, PDX_INLINE_TREE_SELECT_COMPONENT_METADATA, PDX_INLINE_YEAR_RANGE_COMPONENT_METADATA, PDX_MATERIAL_AVATAR_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_TOGGLE_COMPONENT_METADATA, PDX_MATERIAL_CHECKBOX_GROUP_COMPONENT_METADATA, PDX_MATERIAL_CHIPS_COMPONENT_METADATA, PDX_MATERIAL_COLORPICKER_COMPONENT_METADATA, PDX_MATERIAL_CPF_CNPJ_INPUT_COMPONENT_METADATA, PDX_MATERIAL_CURRENCY_COMPONENT_METADATA, PDX_MATERIAL_DATEPICKER_COMPONENT_METADATA, PDX_MATERIAL_DATE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_FILE_UPLOAD_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_TREE_COMPONENT_METADATA, PDX_MATERIAL_PRICE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_RADIO_GROUP_COMPONENT_METADATA, PDX_MATERIAL_RANGE_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_RATING_COMPONENT_METADATA, PDX_MATERIAL_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SELECTION_LIST_COMPONENT_METADATA, PDX_MATERIAL_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_TEXTAREA_COMPONENT_METADATA, PDX_MATERIAL_TIMEPICKER_COMPONENT_METADATA, PDX_MATERIAL_TIME_RANGE_COMPONENT_METADATA, PDX_MATERIAL_TRANSFER_LIST_COMPONENT_METADATA, PDX_MATERIAL_TREE_SELECT_COMPONENT_METADATA, PDX_MONTH_INPUT_COMPONENT_METADATA, PDX_NUMBER_INPUT_COMPONENT_METADATA, PDX_PASSWORD_INPUT_COMPONENT_METADATA, PDX_PHONE_INPUT_COMPONENT_METADATA, PDX_PRELOAD_STATUS_COMPONENT_METADATA, PDX_SEARCH_INPUT_COMPONENT_METADATA, PDX_TEXT_INPUT_COMPONENT_METADATA, PDX_TIME_INPUT_COMPONENT_METADATA, PDX_URL_INPUT_COMPONENT_METADATA, PDX_WEEK_INPUT_COMPONENT_METADATA, PDX_YEAR_INPUT_COMPONENT_METADATA, PRAXIS_DYNAMIC_FIELDS_EN_US, PRAXIS_DYNAMIC_FIELDS_I18N, PRAXIS_DYNAMIC_FIELDS_LOGGER_BACKEND, PRAXIS_DYNAMIC_FIELDS_PT_BR, PRICE_RANGE_AI_CAPABILITIES, PasswordInputComponent, PdxColorPickerComponent, PdxMaterialRangeSliderComponent, PdxMaterialTimeRangeComponent, PdxYearInputComponent, PhoneInputComponent, PraxisErrorStateMatcher, PreloadStatusComponent, RETRY_DELAY, SELECT_CONTROLS_AI_CAPABILITIES, SearchInputComponent, SimpleBaseButtonComponent, SimpleBaseInputComponent, SimpleBaseSelectComponent, TEXT_INPUTS_AI_CAPABILITIES, TIME_RANGE_AI_CAPABILITIES, TOGGLE_CONTROLS_AI_CAPABILITIES, TREE_CONTROLS_AI_CAPABILITIES, TextInputComponent, TimeInputComponent, UrlInputComponent, WeekInputComponent, YEAR_INPUT_AI_CAPABILITIES, bindDynamicFieldsLoggerBackendFromInjector, clearDynamicFieldsLoggerBackend, configureDynamicFieldsLogger, createDynamicFieldPreviewRecipe, createErrorStateMatcher, createPraxisDynamicFieldsI18nConfig, emitToDynamicFieldsLoggerBackend, enableDebugForComponent, getControlTypeCatalog, getErrorStateMatcherForField, inferErrorStateStrategy, initializeComponentSystem, initializeComponentSystemSync, isBaseDynamicFieldComponent, isLoadingCapableComponent, isValidJsonSchema, isValueBasedComponent, logger, mapJsonSchemaToFields, mapPropertyToFieldMetadata, normalizeFormMetadata, provideMaterialAvatarMetadata, providePraxisDynamicFields, providePraxisDynamicFieldsCore, providePraxisDynamicFieldsCoreNoDefaults, providePraxisDynamicFieldsI18n, providePraxisDynamicFieldsNoDefaults, resolvePraxisDynamicFieldsText, setDynamicFieldsLoggerBackend, silenceComponent, supportsClearButtonControlType };
51215
+ export { ActionResolverService, BRAZIL_INPUTS_AI_CAPABILITIES, CACHE_TTL, CHIPS_CONTROLS_AI_CAPABILITIES, CLEAR_BUTTON_CONTROL_TYPES, COLOR_CONTROLS_AI_CAPABILITIES, CONTROL_TYPE_AI_CATALOGS, ColorInputComponent, ComponentPreloaderService, ComponentRegistryService, ConfirmDialogComponent, DATE_CONTROLS_AI_CAPABILITIES, DISPLAY_ACTION_AI_CAPABILITIES, DYNAMIC_FIELDS_PLAYGROUND_CATALOG, DYNAMIC_FIELD_BASE_STATE_RECIPES, DYNAMIC_FIELD_DEFAULT_STATE_RECIPE, DYNAMIC_FIELD_DISABLED_STATE_RECIPE, DYNAMIC_FIELD_ERROR_STATE_RECIPE, DYNAMIC_FIELD_FILLED_STATE_RECIPE, DYNAMIC_FIELD_PRESENTATION_STATE_RECIPE, DYNAMIC_FIELD_READONLY_STATE_RECIPE, DateInputComponent, DateUtilsService, DatetimeLocalInputComponent, DynamicFieldLoaderDirective, EmailInputComponent, FILE_UPLOAD_AI_CAPABILITIES, InlineAsyncSelectComponent, InlineAutocompleteComponent, InlineColorLabelComponent, InlineCurrencyComponent, InlineCurrencyRangeComponent, InlineDateComponent, InlineDateRangeComponent, InlineDistanceRadiusComponent, InlineEntityLookupComponent, InlineInputComponent, InlineMonthRangeComponent, InlineMultiSelectComponent, InlineNumberComponent, InlinePeriodRangeComponent, InlinePipelineStatusComponent, InlineRangeSliderComponent, InlineRatingComponent, InlineRelativePeriodComponent, InlineScorePriorityComponent, InlineSearchableSelectComponent, InlineSelectComponent, InlineSentimentComponent, InlineTimeComponent, InlineTimeRangeComponent, InlineToggleComponent, InlineTreeSelectComponent, InlineYearRangeComponent, KeyboardShortcutService, LIST_CONTROLS_AI_CAPABILITIES, LoggerPresets, MAX_LOAD_ATTEMPTS, MaterialAsyncSelectComponent, MaterialAutocompleteComponent, MaterialAvatarComponent, MaterialButtonComponent, MaterialButtonToggleComponent, MaterialCheckboxGroupComponent, MaterialChipsComponent, MaterialColorPickerComponent, MaterialCpfCnpjInputComponent, MaterialCurrencyComponent, MaterialDateRangeComponent, MaterialDatepickerComponent, MaterialFileUploadComponent, MaterialMultiSelectComponent, MaterialMultiSelectTreeComponent, MaterialPriceRangeComponent, MaterialRadioGroupComponent, MaterialRatingComponent, MaterialSearchableSelectComponent, MaterialSelectComponent, MaterialSelectionListComponent, MaterialSlideToggleComponent, MaterialSliderComponent, MaterialTextareaComponent, MaterialTimepickerComponent, MaterialTransferListComponent, MaterialTreeSelectComponent, MonthInputComponent, NUMERIC_INPUTS_AI_CAPABILITIES, NumberInputComponent, OptionStore, PDX_COLOR_INPUT_COMPONENT_METADATA, PDX_COLOR_PICKER_COMPONENT_METADATA, PDX_DATETIME_LOCAL_INPUT_COMPONENT_METADATA, PDX_DATE_INPUT_COMPONENT_METADATA, PDX_EMAIL_INPUT_COMPONENT_METADATA, PDX_FIELD_SHELL_COMPONENT_METADATA, PDX_INLINE_ASYNC_SELECT_COMPONENT_METADATA, PDX_INLINE_AUTOCOMPLETE_COMPONENT_METADATA, PDX_INLINE_COLOR_LABEL_COMPONENT_METADATA, PDX_INLINE_CURRENCY_COMPONENT_METADATA, PDX_INLINE_CURRENCY_RANGE_COMPONENT_METADATA, PDX_INLINE_DATE_COMPONENT_METADATA, PDX_INLINE_DATE_RANGE_COMPONENT_METADATA, PDX_INLINE_DISTANCE_RADIUS_COMPONENT_METADATA, PDX_INLINE_ENTITY_LOOKUP_COMPONENT_METADATA, PDX_INLINE_INPUT_COMPONENT_METADATA, PDX_INLINE_MONTH_RANGE_COMPONENT_METADATA, PDX_INLINE_MULTI_SELECT_COMPONENT_METADATA, PDX_INLINE_NUMBER_COMPONENT_METADATA, PDX_INLINE_PERIOD_RANGE_COMPONENT_METADATA, PDX_INLINE_PIPELINE_STATUS_COMPONENT_METADATA, PDX_INLINE_RANGE_SLIDER_COMPONENT_METADATA, PDX_INLINE_RATING_COMPONENT_METADATA, PDX_INLINE_RELATIVE_PERIOD_COMPONENT_METADATA, PDX_INLINE_SCORE_PRIORITY_COMPONENT_METADATA, PDX_INLINE_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_INLINE_SELECT_COMPONENT_METADATA, PDX_INLINE_SENTIMENT_COMPONENT_METADATA, PDX_INLINE_TIME_COMPONENT_METADATA, PDX_INLINE_TIME_RANGE_COMPONENT_METADATA, PDX_INLINE_TOGGLE_COMPONENT_METADATA, PDX_INLINE_TREE_SELECT_COMPONENT_METADATA, PDX_INLINE_YEAR_RANGE_COMPONENT_METADATA, PDX_MATERIAL_AVATAR_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_TOGGLE_COMPONENT_METADATA, PDX_MATERIAL_CHECKBOX_GROUP_COMPONENT_METADATA, PDX_MATERIAL_CHIPS_COMPONENT_METADATA, PDX_MATERIAL_COLORPICKER_COMPONENT_METADATA, PDX_MATERIAL_CPF_CNPJ_INPUT_COMPONENT_METADATA, PDX_MATERIAL_CURRENCY_COMPONENT_METADATA, PDX_MATERIAL_DATEPICKER_COMPONENT_METADATA, PDX_MATERIAL_DATE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_FILE_UPLOAD_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_TREE_COMPONENT_METADATA, PDX_MATERIAL_PRICE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_RADIO_GROUP_COMPONENT_METADATA, PDX_MATERIAL_RANGE_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_RATING_COMPONENT_METADATA, PDX_MATERIAL_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SELECTION_LIST_COMPONENT_METADATA, PDX_MATERIAL_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_TEXTAREA_COMPONENT_METADATA, PDX_MATERIAL_TIMEPICKER_COMPONENT_METADATA, PDX_MATERIAL_TIME_RANGE_COMPONENT_METADATA, PDX_MATERIAL_TRANSFER_LIST_COMPONENT_METADATA, PDX_MATERIAL_TREE_SELECT_COMPONENT_METADATA, PDX_MONTH_INPUT_COMPONENT_METADATA, PDX_NUMBER_INPUT_COMPONENT_METADATA, PDX_PASSWORD_INPUT_COMPONENT_METADATA, PDX_PHONE_INPUT_COMPONENT_METADATA, PDX_PRELOAD_STATUS_COMPONENT_METADATA, PDX_SEARCH_INPUT_COMPONENT_METADATA, PDX_TEXT_INPUT_COMPONENT_METADATA, PDX_TIME_INPUT_COMPONENT_METADATA, PDX_URL_INPUT_COMPONENT_METADATA, PDX_WEEK_INPUT_COMPONENT_METADATA, PDX_YEAR_INPUT_COMPONENT_METADATA, PRAXIS_DYNAMIC_FIELDS_EN_US, PRAXIS_DYNAMIC_FIELDS_I18N, PRAXIS_DYNAMIC_FIELDS_LOGGER_BACKEND, PRAXIS_DYNAMIC_FIELDS_PT_BR, PRICE_RANGE_AI_CAPABILITIES, PasswordInputComponent, PdxColorPickerComponent, PdxMaterialRangeSliderComponent, PdxMaterialTimeRangeComponent, PdxYearInputComponent, PhoneInputComponent, PraxisErrorStateMatcher, PreloadStatusComponent, RETRY_DELAY, SELECT_CONTROLS_AI_CAPABILITIES, SearchInputComponent, SimpleBaseButtonComponent, SimpleBaseInputComponent, SimpleBaseSelectComponent, TEXT_INPUTS_AI_CAPABILITIES, TIME_RANGE_AI_CAPABILITIES, TOGGLE_CONTROLS_AI_CAPABILITIES, TREE_CONTROLS_AI_CAPABILITIES, TextInputComponent, TimeInputComponent, UrlInputComponent, WeekInputComponent, YEAR_INPUT_AI_CAPABILITIES, bindDynamicFieldsLoggerBackendFromInjector, clearDynamicFieldsLoggerBackend, configureDynamicFieldsLogger, createDynamicFieldPreviewRecipe, createErrorStateMatcher, createPraxisDynamicFieldsI18nConfig, emitToDynamicFieldsLoggerBackend, enableDebugForComponent, getControlTypeCatalog, getErrorStateMatcherForField, inferErrorStateStrategy, initializeComponentSystem, initializeComponentSystemSync, isBaseDynamicFieldComponent, isLoadingCapableComponent, isValidJsonSchema, isValueBasedComponent, logger, mapJsonSchemaToFields, mapPropertyToFieldMetadata, normalizeFormMetadata, provideMaterialAvatarMetadata, providePraxisDynamicFields, providePraxisDynamicFieldsCore, providePraxisDynamicFieldsCoreNoDefaults, providePraxisDynamicFieldsI18n, providePraxisDynamicFieldsNoDefaults, resolvePraxisDynamicFieldsText, setDynamicFieldsLoggerBackend, silenceComponent, supportsClearButtonControlType };
50918
51216
  //# sourceMappingURL=praxisui-dynamic-fields.mjs.map