@praxisui/dynamic-fields 3.0.0-beta.1 → 3.0.0-beta.3

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.
@@ -3,7 +3,7 @@ import { NgControl, FormControl, Validators, ReactiveFormsModule, NG_VALUE_ACCES
3
3
  import * as i0 from '@angular/core';
4
4
  import { InjectionToken, inject, DestroyRef, ElementRef, ChangeDetectorRef, Injector, signal, output, computed, Input, Directive, viewChild, effect, Injectable, EventEmitter, ViewContainerRef, ViewChild, HostListener, HostBinding, Output, ViewEncapsulation, ChangeDetectionStrategy, Component, Inject, forwardRef, LOCALE_ID, ViewChildren, TemplateRef, ContentChild, ENVIRONMENT_INITIALIZER, APP_INITIALIZER, Optional } from '@angular/core';
5
5
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
6
- import { providePraxisI18n, PraxisI18nService, isCssTextTransform, getTextTransformer, GenericCrudService, GlobalConfigService, INLINE_FILTER_CONTROL_TYPES, FieldSelectorRegistry, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, LoggerService, FieldControlType, resolveInlineFilterControlType, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, PraxisIconDirective, resolveBuiltinPresets, createCpfCnpjValidator, NumericFormat, interpolatePraxisTranslation, ComponentMetadataRegistry, FIELD_METADATA_CAPABILITIES } from '@praxisui/core';
6
+ import { providePraxisI18n, PraxisI18nService, isCssTextTransform, getTextTransformer, GenericCrudService, GlobalConfigService, INLINE_FILTER_CONTROL_TYPES, FieldControlType, FieldSelectorRegistry, FIELD_SELECTOR_REGISTRY_BASE, FIELD_SELECTOR_REGISTRY_DISABLE_DEFAULTS, LoggerService, resolveInlineFilterControlType, DEFAULT_FIELD_SELECTOR_CONTROL_TYPE_MAP, PraxisIconDirective, resolveBuiltinPresets, createCpfCnpjValidator, NumericFormat, interpolatePraxisTranslation, ComponentMetadataRegistry, FIELD_METADATA_CAPABILITIES } from '@praxisui/core';
7
7
  import { BehaviorSubject, combineLatest, Subscription, firstValueFrom, fromEvent, take as take$1, of, EMPTY } from 'rxjs';
8
8
  import { Router } from '@angular/router';
9
9
  import * as i1$2 from '@angular/material/dialog';
@@ -869,6 +869,11 @@ class SimpleBaseInputComponent {
869
869
  const componentState = this.componentState();
870
870
  const ngControl = this.getNgControl();
871
871
  const parentInvalid = !!ngControl?.invalid;
872
+ const parentTouched = !!ngControl?.touched;
873
+ const parentDirty = !!ngControl?.dirty;
874
+ const controlState = this.control();
875
+ const controlTouched = !!controlState.touched;
876
+ const controlDirty = !!controlState.dirty;
872
877
  const errors = ngControl?.errors ?? this.control().errors;
873
878
  const meta = this.metadata();
874
879
  const trig = meta?.validators?.validationTrigger;
@@ -883,13 +888,19 @@ class SimpleBaseInputComponent {
883
888
  case 'immediate':
884
889
  return true;
885
890
  case 'blur':
886
- return componentState.touched;
891
+ return componentState.touched || parentTouched || controlTouched;
887
892
  case 'submit':
888
893
  // Praxis onSubmit marca todos como touched; usamos esse sinal
889
- return componentState.touched;
894
+ return componentState.touched || parentTouched || controlTouched;
890
895
  case 'change':
891
896
  default:
892
- return (componentState.dirty || componentState.touched) && this.errorDisplayReady();
897
+ return (componentState.dirty
898
+ || componentState.touched
899
+ || parentDirty
900
+ || parentTouched
901
+ || controlDirty
902
+ || controlTouched)
903
+ && this.errorDisplayReady();
893
904
  }
894
905
  }, ...(ngDevMode ? [{ debugName: "hasValidationError" }] : []));
895
906
  /** CSS classes básicas do componente */
@@ -1492,10 +1503,12 @@ class SimpleBaseInputComponent {
1492
1503
  // =============================================================================
1493
1504
  setupFormControlIntegration() {
1494
1505
  const control = this.control();
1506
+ this.syncComponentStateFromControl(control);
1495
1507
  control.valueChanges
1496
1508
  .pipe(takeUntilDestroyed(this.destroyRef))
1497
1509
  .subscribe((value) => {
1498
1510
  this.fieldState.update((state) => ({ ...state, value }));
1511
+ this.syncComponentStateFromControl(control);
1499
1512
  });
1500
1513
  control.statusChanges
1501
1514
  .pipe(takeUntilDestroyed(this.destroyRef))
@@ -1505,6 +1518,7 @@ class SimpleBaseInputComponent {
1505
1518
  valid: status === 'VALID',
1506
1519
  errors: control.errors,
1507
1520
  }));
1521
+ this.syncComponentStateFromControl(control);
1508
1522
  this.refreshErrorTooltip();
1509
1523
  });
1510
1524
  // Sincronizar erros/estado do controle pai apenas quando usando controle interno
@@ -1520,35 +1534,51 @@ class SimpleBaseInputComponent {
1520
1534
  errors: errs,
1521
1535
  valid: !errs,
1522
1536
  }));
1537
+ this.syncComponentStateFromControl(control);
1523
1538
  this.refreshErrorTooltip();
1524
1539
  this.cdr.markForCheck();
1525
1540
  });
1526
1541
  }
1527
1542
  }
1543
+ syncComponentStateFromControl(control) {
1544
+ this.componentState.update((state) => ({
1545
+ ...state,
1546
+ touched: !!control.touched,
1547
+ dirty: !!control.dirty,
1548
+ disabled: !!control.disabled,
1549
+ }));
1550
+ }
1528
1551
  // Atualiza tooltip/atributos de erro quando erros mudam e quando inline errors estiverem desabilitados
1529
1552
  refreshErrorTooltip() {
1530
1553
  if (!this.nativeElement)
1531
1554
  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
1555
  const hasErrors = !!(this.getNgControl()?.errors ?? this.control().errors);
1541
1556
  if (hasErrors) {
1542
- const msg = this.errorMessage();
1543
- if (msg)
1544
- this.nativeElement.setAttribute('title', msg);
1545
1557
  this.nativeElement.setAttribute('aria-invalid', 'true');
1558
+ if (this.tooltipEnabled()) {
1559
+ // Força avaliação de tooltipPosition para evitar aviso de membro não utilizado
1560
+ void this.tooltipPosition();
1561
+ const msg = this.errorMessage();
1562
+ if (msg) {
1563
+ this.nativeElement.setAttribute('title', msg);
1564
+ }
1565
+ else {
1566
+ this.nativeElement.removeAttribute('title');
1567
+ }
1568
+ }
1569
+ else {
1570
+ this.nativeElement.removeAttribute('title');
1571
+ }
1546
1572
  }
1547
1573
  else {
1548
1574
  this.nativeElement.removeAttribute('title');
1549
1575
  this.nativeElement.removeAttribute('aria-invalid');
1550
1576
  }
1551
1577
  }
1578
+ ariaInvalidAttribute() {
1579
+ const hasErrors = !!(this.getNgControl()?.errors ?? this.control().errors);
1580
+ return hasErrors ? 'true' : null;
1581
+ }
1552
1582
  tDynamicFields(keySuffix, fallback, params) {
1553
1583
  return this.i18n.t(`praxis.dynamicFields.${keySuffix}`, params, fallback, 'dynamicFields');
1554
1584
  }
@@ -2404,6 +2434,8 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2404
2434
  maxSelections = signal(null, ...(ngDevMode ? [{ debugName: "maxSelections" }] : []));
2405
2435
  /** Backend resource path for dynamic option loading */
2406
2436
  resourcePath = signal(null, ...(ngDevMode ? [{ debugName: "resourcePath" }] : []));
2437
+ /** Canonical source for derived options */
2438
+ optionSource = signal(null, ...(ngDevMode ? [{ debugName: "optionSource" }] : []));
2407
2439
  /** Criteria applied to backend filtering */
2408
2440
  filterCriteria = signal({}, ...(ngDevMode ? [{ debugName: "filterCriteria" }] : []));
2409
2441
  /** Field used for option labels when loading from backend */
@@ -2472,18 +2504,26 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2472
2504
  ? null
2473
2505
  : this.resolveDynamicFieldsMessage(this.dynamicFieldsI18n?.select?.emptyOptionText, 'select.emptyOptionText', '').trim() || null;
2474
2506
  this.emptyOptionText.set(isMultiple ? null : (metadata.emptyOptionText ?? fallbackEmptyOption));
2475
- const path = metadata.resourcePath;
2507
+ const optionSource = metadata.optionSource ?? null;
2508
+ this.optionSource.set(optionSource);
2509
+ const path = optionSource?.resourcePath ?? metadata.resourcePath ?? metadata.endpoint;
2476
2510
  if (path) {
2477
2511
  this.resourcePath.set(path);
2478
2512
  this.filterCriteria.set(metadata.filterCriteria ?? {});
2479
- const needLabel = !metadata.optionLabelKey;
2480
- const needValue = !metadata.optionValueKey;
2513
+ const needLabel = !metadata.optionLabelKey && !optionSource;
2514
+ const needValue = !metadata.optionValueKey && !optionSource;
2481
2515
  if (metadata.optionLabelKey) {
2482
2516
  this.optionLabelKey.set(metadata.optionLabelKey);
2483
2517
  }
2518
+ else if (optionSource) {
2519
+ this.optionLabelKey.set('label');
2520
+ }
2484
2521
  if (metadata.optionValueKey) {
2485
2522
  this.optionValueKey.set(metadata.optionValueKey);
2486
2523
  }
2524
+ else if (optionSource) {
2525
+ this.optionValueKey.set('id');
2526
+ }
2487
2527
  this.configureCrudService(path);
2488
2528
  if (needLabel || needValue) {
2489
2529
  this.loadSchema(needLabel, needValue);
@@ -2919,12 +2959,22 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2919
2959
  return;
2920
2960
  }
2921
2961
  const filter = { ...criteria };
2922
- if (searchTerm) {
2962
+ if (searchTerm && !this.optionSource()) {
2923
2963
  filter[this.optionLabelKey()] = searchTerm;
2924
2964
  }
2925
2965
  this.loading.set(true);
2926
- this.crudService
2927
- .filter(filter, { pageNumber: page, pageSize: this.pageSize() })
2966
+ const request$ = this.optionSource()
2967
+ ? this.crudService.filterOptionSourceOptions(this.optionSource().key, filter, { pageNumber: page, pageSize: this.pageSize() }, {
2968
+ search: searchTerm || undefined,
2969
+ includeIds: this.optionSource().includeIds
2970
+ ? this.currentIncludeIds()
2971
+ : undefined,
2972
+ })
2973
+ : this.crudService.filter(filter, {
2974
+ pageNumber: page,
2975
+ pageSize: this.pageSize(),
2976
+ });
2977
+ request$
2928
2978
  .pipe(takeUntilDestroyed(this.destroyRef), take(1))
2929
2979
  .subscribe({
2930
2980
  next: (resp) => {
@@ -2950,6 +3000,16 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2950
3000
  },
2951
3001
  });
2952
3002
  }
3003
+ currentIncludeIds() {
3004
+ const currentValue = this.control().value;
3005
+ if (Array.isArray(currentValue)) {
3006
+ return currentValue.filter((value) => value !== null && value !== undefined && value !== '');
3007
+ }
3008
+ if (currentValue === null || currentValue === undefined || currentValue === '') {
3009
+ return [];
3010
+ }
3011
+ return [currentValue];
3012
+ }
2953
3013
  /** Dev-only warning when legacy alias keys are used instead of canonical ones */
2954
3014
  devWarnSelectAliases(meta, component) {
2955
3015
  const isDev = () => typeof globalThis.ngDevMode !== 'undefined'
@@ -3300,6 +3360,9 @@ const RETRY_DELAY = 1000; // 1 segundo
3300
3360
  * Focado no essencial: registro, carregamento e cache básico
3301
3361
  */
3302
3362
  const { SELECT: INLINE_SELECT_CONTROL_TYPE, MULTI_SELECT: INLINE_MULTI_SELECT_CONTROL_TYPE, INPUT: INLINE_INPUT_CONTROL_TYPE, TOGGLE: INLINE_TOGGLE_CONTROL_TYPE, RANGE: INLINE_RANGE_CONTROL_TYPE, SEARCHABLE_SELECT: INLINE_SEARCHABLE_SELECT_CONTROL_TYPE, ASYNC_SELECT: INLINE_ASYNC_SELECT_CONTROL_TYPE, ENTITY_LOOKUP: INLINE_ENTITY_LOOKUP_CONTROL_TYPE, AUTOCOMPLETE: INLINE_AUTOCOMPLETE_CONTROL_TYPE, NUMBER: INLINE_NUMBER_CONTROL_TYPE, CURRENCY: INLINE_CURRENCY_CONTROL_TYPE, CURRENCY_RANGE: INLINE_CURRENCY_RANGE_CONTROL_TYPE, DATE: INLINE_DATE_CONTROL_TYPE, DATE_RANGE: INLINE_DATE_RANGE_CONTROL_TYPE, TIME: INLINE_TIME_CONTROL_TYPE, TIME_RANGE: INLINE_TIME_RANGE_CONTROL_TYPE, TREE_SELECT: INLINE_TREE_SELECT_CONTROL_TYPE, RATING: INLINE_RATING_CONTROL_TYPE, DISTANCE_RADIUS: INLINE_DISTANCE_RADIUS_CONTROL_TYPE, PIPELINE_STATUS: INLINE_PIPELINE_STATUS_CONTROL_TYPE, SCORE_PRIORITY: INLINE_SCORE_PRIORITY_CONTROL_TYPE, RELATIVE_PERIOD: INLINE_RELATIVE_PERIOD_CONTROL_TYPE, SENTIMENT: INLINE_SENTIMENT_CONTROL_TYPE, COLOR_LABEL: INLINE_COLOR_LABEL_CONTROL_TYPE, } = INLINE_FILTER_CONTROL_TYPES;
3363
+ const INLINE_PERIOD_RANGE_CONTROL_TYPE = FieldControlType.INLINE_PERIOD_RANGE;
3364
+ const INLINE_YEAR_RANGE_CONTROL_TYPE = FieldControlType.INLINE_YEAR_RANGE;
3365
+ const INLINE_MONTH_RANGE_CONTROL_TYPE = FieldControlType.INLINE_MONTH_RANGE;
3303
3366
  function lazyComponent(loader, exportName) {
3304
3367
  return async () => loader().then((module) => module[exportName]);
3305
3368
  }
@@ -3558,6 +3621,9 @@ class ComponentRegistryService {
3558
3621
  this.register(INLINE_INPUT_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-iIeaA6ko.mjs'), 'InlineInputComponent'));
3559
3622
  this.register(INLINE_TOGGLE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-BMHfcV1t.mjs'), 'InlineToggleComponent'));
3560
3623
  this.register(INLINE_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DYV54GUZ.mjs'), 'InlineRangeSliderComponent'));
3624
+ this.register(INLINE_PERIOD_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CsBUpYPm.mjs'), 'InlinePeriodRangeComponent'));
3625
+ this.register(INLINE_YEAR_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CY-plw8X.mjs'), 'InlineYearRangeComponent'));
3626
+ this.register(INLINE_MONTH_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DlL36zZl.mjs'), 'InlineMonthRangeComponent'));
3561
3627
  this.register(INLINE_DATE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CfZxkljy.mjs'), 'InlineDateComponent'));
3562
3628
  this.register(INLINE_DATE_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-7NLgtZV4.mjs'), 'InlineDateRangeComponent'));
3563
3629
  this.register(INLINE_TIME_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DD5h8DRG.mjs'), 'InlineTimeComponent'));
@@ -7689,6 +7755,7 @@ class TextInputComponent extends SimpleBaseInputComponent {
7689
7755
  [minlength]="metadata()?.minLength || null"
7690
7756
  [attr.aria-label]="!label && placeholder ? placeholder : null"
7691
7757
  [attr.aria-required]="metadata()?.required ? 'true' : 'false'"
7758
+ [attr.aria-invalid]="ariaInvalidAttribute()"
7692
7759
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
7693
7760
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
7694
7761
  [matTooltipPosition]="tooltipPosition()"
@@ -7780,6 +7847,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
7780
7847
  [minlength]="metadata()?.minLength || null"
7781
7848
  [attr.aria-label]="!label && placeholder ? placeholder : null"
7782
7849
  [attr.aria-required]="metadata()?.required ? 'true' : 'false'"
7850
+ [attr.aria-invalid]="ariaInvalidAttribute()"
7783
7851
  [matTooltip]="tooltipEnabled() ? errorMessage() : null"
7784
7852
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
7785
7853
  [matTooltipPosition]="tooltipPosition()"
@@ -15432,6 +15500,9 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15432
15500
  dataVersion;
15433
15501
  useCursor = false;
15434
15502
  // Uses protected `global` from base class
15503
+ isCategoricalBucketOptionSource(optionSource) {
15504
+ return String(optionSource?.type || '').trim().toUpperCase() === 'CATEGORICAL_BUCKET';
15505
+ }
15435
15506
  setSelectMetadata(metadata) {
15436
15507
  // Normalize and store metadata without triggering the base's remote load
15437
15508
  this.devWarnSelectAliases(metadata, 'MaterialAsyncSelectComponent');
@@ -15450,28 +15521,40 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15450
15521
  }
15451
15522
  // Apply base input metadata (placeholder, validators, a11y, etc.)
15452
15523
  super.setMetadata({ ...metadata });
15524
+ const optionSource = metadata.optionSource ?? null;
15525
+ const isCategoricalBucket = this.isCategoricalBucketOptionSource(optionSource);
15453
15526
  // Local select configuration
15454
15527
  if (mappedOptions)
15455
15528
  this.options.set(mappedOptions);
15456
15529
  this.multiple.set(!!metadata.multiple);
15457
- this.searchable.set(true);
15530
+ this.searchable.set(metadata.searchable ?? !isCategoricalBucket);
15458
15531
  this.selectAll.set(!!metadata.selectAll);
15459
15532
  this.maxSelections.set(metadata.maxSelections ?? null);
15460
15533
  this.emptyOptionText.set(this.multiple() ? null : (metadata.emptyOptionText ?? null));
15461
15534
  // Load strategy: default 'open' to avoid unnecessary requests
15462
15535
  const loadOn = metadata.loadOn ??
15536
+ (isCategoricalBucket ? 'init' : undefined) ??
15463
15537
  this.global.getDynamicFields()?.asyncSelect?.loadOn ??
15464
15538
  'open';
15465
15539
  this.initialLoadStrategy = loadOn;
15466
15540
  // Remote config without auto-loading here (avoid duplicate /filter on init)
15467
- const path = metadata.resourcePath;
15541
+ this.optionSource.set(optionSource);
15542
+ const path = optionSource?.resourcePath ?? metadata.resourcePath;
15468
15543
  if (path) {
15469
15544
  this.resourcePath.set(path);
15470
15545
  this.filterCriteria.set(metadata.filterCriteria ?? {});
15471
- if (metadata.optionLabelKey)
15546
+ if (metadata.optionLabelKey) {
15472
15547
  this.optionLabelKey.set(metadata.optionLabelKey);
15473
- if (metadata.optionValueKey)
15548
+ }
15549
+ else if (optionSource) {
15550
+ this.optionLabelKey.set('label');
15551
+ }
15552
+ if (metadata.optionValueKey) {
15474
15553
  this.optionValueKey.set(metadata.optionValueKey);
15554
+ }
15555
+ else if (optionSource) {
15556
+ this.optionValueKey.set('id');
15557
+ }
15475
15558
  if (this.lastConfiguredPath !== path) {
15476
15559
  this.configureCrudService(path);
15477
15560
  this.lastConfiguredPath = path;
@@ -15548,8 +15631,11 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15548
15631
  const ids = this.getSelectedIds();
15549
15632
  if (!ids.length)
15550
15633
  return;
15551
- this.crudService
15552
- .getOptionsByIds(ids)
15634
+ const optionSource = this.optionSource();
15635
+ const request$ = optionSource
15636
+ ? this.crudService.getOptionSourceOptionsByIds(optionSource.key, ids)
15637
+ : this.crudService.getOptionsByIds(ids);
15638
+ request$
15553
15639
  .pipe(takeUntilDestroyed(this.destroyRef))
15554
15640
  .subscribe((opts) => {
15555
15641
  const returned = new Set(opts.map((o) => o.id));
@@ -15571,7 +15657,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15571
15657
  }
15572
15658
  const term = this.termControl.value || '';
15573
15659
  const filter = { ...this.filterCriteria() };
15574
- if (term) {
15660
+ if (term && !this.optionSource()) {
15575
15661
  filter[this.optionLabelKey()] = term;
15576
15662
  }
15577
15663
  const selected = this.getSelectedIds();
@@ -15597,11 +15683,18 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15597
15683
  }));
15598
15684
  }
15599
15685
  const page = this.pageIndex();
15600
- return this.crudService
15601
- .filterOptions(filter, { pageNumber: page, pageSize: this.pageSize() }, {
15602
- ...(include || {}),
15603
- observeVersionHeader: observeVersion,
15604
- })
15686
+ const optionSource = this.optionSource();
15687
+ const request$ = optionSource
15688
+ ? this.crudService.filterOptionSourceOptions(optionSource.key, filter, { pageNumber: page, pageSize: this.pageSize() }, {
15689
+ ...(include || {}),
15690
+ observeVersionHeader: observeVersion,
15691
+ search: term || undefined,
15692
+ })
15693
+ : this.crudService.filterOptions(filter, { pageNumber: page, pageSize: this.pageSize() }, {
15694
+ ...(include || {}),
15695
+ observeVersionHeader: observeVersion,
15696
+ });
15697
+ return request$
15605
15698
  .pipe(tap((resp) => {
15606
15699
  if (resp.dataVersion)
15607
15700
  this.dataVersion = resp.dataVersion;
@@ -15719,7 +15812,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15719
15812
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
15720
15813
  [matTooltipPosition]="tooltipPosition()"
15721
15814
  >
15722
- <mat-option disabled>
15815
+ <mat-option *ngIf="searchable()" disabled>
15723
15816
  <input
15724
15817
  #searchInput
15725
15818
  matInput
@@ -15833,7 +15926,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
15833
15926
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
15834
15927
  [matTooltipPosition]="tooltipPosition()"
15835
15928
  >
15836
- <mat-option disabled>
15929
+ <mat-option *ngIf="searchable()" disabled>
15837
15930
  <input
15838
15931
  #searchInput
15839
15932
  matInput
@@ -19310,9 +19403,35 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19310
19403
  return custom;
19311
19404
  return this.showPercentSuffix() ? 'percent' : 'tag';
19312
19405
  }
19406
+ showPercentGraphicMode() {
19407
+ return this.showPercentSuffix() && this.currentMetadata().inlineVisualStyle === 'graphic';
19408
+ }
19313
19409
  showPercentSuffix() {
19314
19410
  return this.isPercentFormat();
19315
19411
  }
19412
+ percentDisplayText() {
19413
+ const value = this.currentNumericValue();
19414
+ if (value === null) {
19415
+ return '--%';
19416
+ }
19417
+ return `${this.formatCompactNumber(value)}%`;
19418
+ }
19419
+ percentRangeText() {
19420
+ const min = this.effectiveMinValue();
19421
+ const max = this.effectiveMaxValue();
19422
+ if (min === null && max === null) {
19423
+ return '';
19424
+ }
19425
+ const start = min === null ? '—' : this.formatCompactNumber(min);
19426
+ const end = max === null ? '—' : this.formatCompactNumber(max);
19427
+ return `${start}-${end}%`;
19428
+ }
19429
+ percentAngle() {
19430
+ return this.percentRatio() * 360;
19431
+ }
19432
+ percentFillWidth() {
19433
+ return this.percentRatio() * 100;
19434
+ }
19316
19435
  effectiveMinValue() {
19317
19436
  return this.resolveEffectiveMin(this.currentMetadata());
19318
19437
  }
@@ -19362,8 +19481,14 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19362
19481
  widthProbeText() {
19363
19482
  const value = this.control().value;
19364
19483
  if (value !== null && value !== undefined && String(value).trim().length) {
19484
+ if (this.showPercentGraphicMode()) {
19485
+ return this.longestMeasureCandidate(String(value), this.placeholderText(), this.percentRangeText());
19486
+ }
19365
19487
  return String(value);
19366
19488
  }
19489
+ if (this.showPercentGraphicMode()) {
19490
+ return this.longestMeasureCandidate(this.placeholderText(), this.percentRangeText(), this.defaultFieldLabel());
19491
+ }
19367
19492
  return this.placeholderText() || this.defaultFieldLabel();
19368
19493
  }
19369
19494
  placeholderText() {
@@ -19466,6 +19591,12 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19466
19591
  baseMinMobile = 84;
19467
19592
  baseMaxMobile = 188;
19468
19593
  }
19594
+ if (this.showPercentGraphicMode()) {
19595
+ baseMinDesktop = Math.max(baseMinDesktop, 192);
19596
+ baseMaxDesktop = Math.max(baseMaxDesktop, 288);
19597
+ baseMinMobile = Math.max(baseMinMobile, 184);
19598
+ baseMaxMobile = Math.max(baseMaxMobile, 260);
19599
+ }
19469
19600
  const min = Math.max(84, Math.round(isMobile
19470
19601
  ? (cfg.minWidthMobile ?? baseMinMobile)
19471
19602
  : (cfg.minWidth ?? baseMinDesktop)));
@@ -19543,6 +19674,39 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19543
19674
  ? InlineNumberComponent.PERCENT_PLACEHOLDER_DEFAULT
19544
19675
  : 'Número';
19545
19676
  }
19677
+ currentNumericValue() {
19678
+ return this.resolveFiniteNumber(this.control().value);
19679
+ }
19680
+ percentRatio() {
19681
+ const value = this.currentNumericValue();
19682
+ if (value === null) {
19683
+ return 0;
19684
+ }
19685
+ const min = this.effectiveMinValue() ?? InlineNumberComponent.PERCENT_MIN_DEFAULT;
19686
+ const max = this.effectiveMaxValue() ?? InlineNumberComponent.PERCENT_MAX_DEFAULT;
19687
+ if (max <= min) {
19688
+ return 0;
19689
+ }
19690
+ return Math.max(0, Math.min(1, (value - min) / (max - min)));
19691
+ }
19692
+ formatCompactNumber(value) {
19693
+ if (!Number.isFinite(value)) {
19694
+ return '';
19695
+ }
19696
+ if (Number.isInteger(value)) {
19697
+ return `${value}`;
19698
+ }
19699
+ return value.toFixed(2).replace(/\.?0+$/, '');
19700
+ }
19701
+ longestMeasureCandidate(...values) {
19702
+ const candidates = values
19703
+ .map((value) => String(value ?? '').trim())
19704
+ .filter((value) => value.length);
19705
+ if (!candidates.length) {
19706
+ return '';
19707
+ }
19708
+ return candidates.reduce((longest, current) => current.length > longest.length ? current : longest);
19709
+ }
19546
19710
  isPercentFormat(meta) {
19547
19711
  const metadataRecord = this.asRecord(meta) ?? this.metadataRecord();
19548
19712
  const numberFormat = this.asRecord(metadataRecord.numberFormat);
@@ -19603,80 +19767,107 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19603
19767
  multi: true,
19604
19768
  },
19605
19769
  ], viewQueries: [{ propertyName: "inputEl", first: true, predicate: ["inputEl"], descendants: true, read: ElementRef }, { propertyName: "measureEl", first: true, predicate: ["measureEl"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: `
19606
- <mat-form-field
19607
- [appearance]="'outline'"
19608
- [color]="materialColor()"
19609
- [class]="componentCssClasses()"
19610
- [floatLabel]="'auto'"
19611
- [subscriptSizing]="'dynamic'"
19612
- [hideRequiredMarker]="true"
19613
- [style.width.px]="inlineWidthPx || null"
19614
- [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19615
- >
19616
- <mat-icon
19617
- matPrefix
19618
- [color]="iconPalette(prefixIconColor())"
19619
- [style.color]="iconResolvedColor(prefixIconColor())"
19620
- >
19621
- {{ leadingIconName() }}
19622
- </mat-icon>
19623
- <input
19624
- #inputEl
19625
- matInput
19626
- type="number"
19627
- [formControl]="control()"
19628
- [errorStateMatcher]="errorStateMatcher()"
19629
- [placeholder]="placeholderText()"
19630
- [required]="metadata()?.required || false"
19631
- [readonly]="isReadonlyEffective()"
19632
- [autocomplete]="metadata()?.autocomplete || 'off'"
19633
- [spellcheck]="metadata()?.spellcheck ?? false"
19634
- [min]="effectiveMinValue()"
19635
- [max]="effectiveMaxValue()"
19636
- [step]="effectiveStepValue()"
19637
- [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19638
- [attr.aria-label]="ariaLabel()"
19639
- [matTooltip]="inlineTooltipText()"
19640
- [matTooltipDisabled]="inlineTooltipDisabled()"
19641
- [matTooltipPosition]="tooltipPosition()"
19642
- (input)="onInlineInput()"
19643
- />
19644
- @if (showInlinePlaceholder()) {
19645
- <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19770
+ <div class="pdx-inline-number-shell" [class.pdx-inline-number-shell-percent]="showPercentGraphicMode()">
19771
+ @if (showPercentGraphicMode()) {
19772
+ <div class="pdx-inline-percent-insight" aria-hidden="true">
19773
+ <div
19774
+ class="pdx-inline-percent-gauge"
19775
+ [style.--pdx-inline-percent-angle]="percentAngle() + 'deg'"
19776
+ >
19777
+ <div class="pdx-inline-percent-gauge__core">
19778
+ <span class="pdx-inline-percent-gauge__value">{{ percentDisplayText() }}</span>
19779
+ </div>
19780
+ </div>
19781
+ <div class="pdx-inline-percent-copy">
19782
+ <span class="pdx-inline-percent-copy__label">{{ placeholderText() }}</span>
19783
+ <span class="pdx-inline-percent-copy__range">{{ percentRangeText() }}</span>
19784
+ </div>
19785
+ </div>
19646
19786
  }
19647
- <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19648
- @if (suffixIconName()) {
19787
+
19788
+ <mat-form-field
19789
+ [appearance]="'outline'"
19790
+ [color]="materialColor()"
19791
+ [class]="componentCssClasses()"
19792
+ [floatLabel]="'auto'"
19793
+ [subscriptSizing]="'dynamic'"
19794
+ [hideRequiredMarker]="true"
19795
+ [style.width.px]="inlineWidthPx || null"
19796
+ [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19797
+ >
19649
19798
  <mat-icon
19650
- matSuffix
19651
- class="pdx-inline-static-suffix"
19652
- [color]="iconPalette(suffixIconColor())"
19653
- [style.color]="iconResolvedColor(suffixIconColor())"
19654
- [matTooltip]="metadata()?.suffixIconTooltip || null"
19655
- [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19799
+ matPrefix
19800
+ [color]="iconPalette(prefixIconColor())"
19801
+ [style.color]="iconResolvedColor(prefixIconColor())"
19656
19802
  >
19657
- {{ suffixIconName() }}
19803
+ {{ leadingIconName() }}
19658
19804
  </mat-icon>
19659
- }
19660
- @if (showPercentSuffix()) {
19661
- <span matSuffix class="pdx-inline-number-suffix">%</span>
19662
- }
19663
- @if (showQuickClear()) {
19664
- <button
19665
- matSuffix
19666
- type="button"
19667
- class="pdx-inline-clear"
19668
- (mousedown)="onTriggerIconMouseDown($event)"
19669
- (click)="onQuickClear($event)"
19670
- [attr.aria-label]="clearActionAriaLabel()"
19671
- >
19805
+ <input
19806
+ #inputEl
19807
+ matInput
19808
+ type="number"
19809
+ [formControl]="control()"
19810
+ [errorStateMatcher]="errorStateMatcher()"
19811
+ [placeholder]="placeholderText()"
19812
+ [required]="metadata()?.required || false"
19813
+ [readonly]="isReadonlyEffective()"
19814
+ [autocomplete]="metadata()?.autocomplete || 'off'"
19815
+ [spellcheck]="metadata()?.spellcheck ?? false"
19816
+ [min]="effectiveMinValue()"
19817
+ [max]="effectiveMaxValue()"
19818
+ [step]="effectiveStepValue()"
19819
+ [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19820
+ [attr.aria-label]="ariaLabel()"
19821
+ [matTooltip]="inlineTooltipText()"
19822
+ [matTooltipDisabled]="inlineTooltipDisabled()"
19823
+ [matTooltipPosition]="tooltipPosition()"
19824
+ (input)="onInlineInput()"
19825
+ />
19826
+ @if (showInlinePlaceholder()) {
19827
+ <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19828
+ }
19829
+ <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19830
+ @if (suffixIconName()) {
19672
19831
  <mat-icon
19673
- [color]="iconPalette(clearIconColor())"
19674
- [style.color]="iconResolvedColor(clearIconColor())"
19675
- >{{ clearIconName() }}</mat-icon>
19676
- </button>
19832
+ matSuffix
19833
+ class="pdx-inline-static-suffix"
19834
+ [color]="iconPalette(suffixIconColor())"
19835
+ [style.color]="iconResolvedColor(suffixIconColor())"
19836
+ [matTooltip]="metadata()?.suffixIconTooltip || null"
19837
+ [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19838
+ >
19839
+ {{ suffixIconName() }}
19840
+ </mat-icon>
19841
+ }
19842
+ @if (showPercentSuffix()) {
19843
+ <span matSuffix class="pdx-inline-number-suffix">%</span>
19844
+ }
19845
+ @if (showQuickClear()) {
19846
+ <button
19847
+ matSuffix
19848
+ type="button"
19849
+ class="pdx-inline-clear"
19850
+ (mousedown)="onTriggerIconMouseDown($event)"
19851
+ (click)="onQuickClear($event)"
19852
+ [attr.aria-label]="clearActionAriaLabel()"
19853
+ >
19854
+ <mat-icon
19855
+ [color]="iconPalette(clearIconColor())"
19856
+ [style.color]="iconResolvedColor(clearIconColor())"
19857
+ >{{ clearIconName() }}</mat-icon>
19858
+ </button>
19859
+ }
19860
+ </mat-form-field>
19861
+
19862
+ @if (showPercentGraphicMode()) {
19863
+ <div class="pdx-inline-percent-rail" aria-hidden="true">
19864
+ <div class="pdx-inline-percent-rail__track"></div>
19865
+ <div class="pdx-inline-percent-rail__fill" [style.width.%]="percentFillWidth()"></div>
19866
+ <div class="pdx-inline-percent-rail__marker" [style.left.%]="percentFillWidth()"></div>
19867
+ </div>
19677
19868
  }
19678
- </mat-form-field>
19679
- `, isInline: true, styles: [":host{display:inline-flex;width:auto;min-width:0;max-width:100%}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field{width:auto;min-width:0;margin-bottom:0;transition:width .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .pdx-inline-number .mdc-notched-outline{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-flex,:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper{padding:0;background:transparent}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-focus-overlay{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-infix{min-height:0;width:auto;flex:0 1 auto;min-width:0;padding:0;position:relative}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{display:flex;align-items:center;min-height:44px;min-width:0;max-width:min(var(--pdx-inline-number-max-w, 280px),calc(100vw - 48px));padding-inline:14px;border-radius:999px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high);box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined:after{display:none!important;content:none!important}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--focused{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element{color:var(--md-sys-color-on-surface);font-size:1.05rem;line-height:1.2;width:auto!important;min-width:2ch}:host ::ng-deep .pdx-inline-number .mdc-text-field__input::placeholder,:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element::placeholder{color:var(--md-sys-color-on-surface-variant)!important;opacity:0!important}:host ::ng-deep .pdx-inline-number .pdx-inline-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;color:var(--md-sys-color-on-surface-variant);font-size:1.05rem;line-height:1.2}:host ::ng-deep .pdx-inline-number .pdx-inline-measure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:1.05rem;line-height:1.2;font-weight:400;left:-9999px;top:-9999px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix{padding:0;margin-right:10px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix mat-icon{width:22px;height:22px;font-size:22px;color:var(--md-sys-color-primary)}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-suffix{display:inline-flex;align-items:center;justify-content:center;align-self:center;margin-left:10px;gap:8px;padding:0}:host ::ng-deep .pdx-inline-number .pdx-inline-static-suffix{width:18px;height:18px;font-size:18px}:host ::ng-deep .pdx-inline-number .pdx-inline-number-suffix{color:var(--md-sys-color-on-surface-variant);font-size:.95rem;line-height:1;font-weight:600}:host ::ng-deep .pdx-inline-number .pdx-inline-clear{--clear-ring-color: var(--md-sys-color-primary);width:24px;height:24px;min-width:24px;border:0;border-radius:50%;appearance:none;-webkit-appearance:none;outline:none;padding:0;display:grid;place-items:center;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent);color:var(--md-sys-color-on-surface-variant);cursor:pointer;line-height:0;font-size:0;transition:background-color .12s ease,box-shadow .12s ease,color .12s ease}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface) 18%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:focus-visible{background:color-mix(in srgb,var(--md-sys-color-on-surface) 20%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--clear-ring-color) 34%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear mat-icon{display:block;width:16px;height:16px;font-size:16px;line-height:1;margin:0}@media(max-width:768px){:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{min-height:40px;padding-inline:12px}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$3.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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"] }] });
19869
+ </div>
19870
+ `, isInline: true, styles: [":host{display:inline-flex;width:auto;min-width:0;max-width:100%}.pdx-inline-number-shell{display:inline-flex;flex-direction:column;gap:8px;width:auto;min-width:0;max-width:100%}.pdx-inline-number-shell-percent{--pdx-inline-percent-accent-start: color-mix(in srgb, var(--md-sys-color-tertiary) 72%, var(--md-sys-color-primary));--pdx-inline-percent-accent-mid: color-mix(in srgb, var(--md-sys-color-secondary) 82%, var(--md-sys-color-primary));--pdx-inline-percent-accent-end: color-mix(in srgb, var(--md-sys-color-primary) 88%, var(--md-sys-color-tertiary));padding:10px 12px 12px;border-radius:20px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 16%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface-container-highest)) 0%,var(--md-sys-color-surface-container) 100%);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 5%,transparent),0 8px 24px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.pdx-inline-percent-insight{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:center}.pdx-inline-percent-gauge{--pdx-inline-percent-angle: 0deg;position:relative;width:52px;height:52px;border-radius:50%;background:radial-gradient(circle at center,var(--md-sys-color-surface-container) 56%,transparent 57%),conic-gradient(from -90deg,var(--pdx-inline-percent-accent-start) 0deg,var(--pdx-inline-percent-accent-mid) 150deg,var(--pdx-inline-percent-accent-end) var(--pdx-inline-percent-angle),color-mix(in srgb,var(--md-sys-color-outline-variant) 54%,transparent) var(--pdx-inline-percent-angle),color-mix(in srgb,var(--md-sys-color-outline-variant) 54%,transparent) 360deg);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent),0 10px 22px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.pdx-inline-percent-gauge__core{position:absolute;inset:7px;display:grid;place-items:center;border-radius:50%;background:radial-gradient(circle at 30% 30%,color-mix(in srgb,white 54%,transparent),transparent 42%),var(--md-sys-color-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,var(--md-sys-color-outline-variant))}.pdx-inline-percent-gauge__value{font-size:.85rem;font-weight:700;line-height:1;letter-spacing:-.02em;color:var(--md-sys-color-primary)}.pdx-inline-percent-copy{min-width:0;display:flex;flex-direction:column;gap:4px}.pdx-inline-percent-copy__label{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--md-sys-color-primary) 84%,var(--md-sys-color-on-surface))}.pdx-inline-percent-copy__range{font-size:.82rem;font-weight:500;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field{width:auto;min-width:0;margin-bottom:0;transition:width .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .pdx-inline-number .mdc-notched-outline{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-flex,:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper{padding:0;background:transparent}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-focus-overlay{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-infix{min-height:0;width:auto;flex:0 1 auto;min-width:0;padding:0;position:relative}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{display:flex;align-items:center;min-height:44px;min-width:0;max-width:min(var(--pdx-inline-number-max-w, 280px),calc(100vw - 48px));padding-inline:14px;border-radius:999px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high);box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease}:host ::ng-deep .pdx-inline-number-shell-percent .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{background:linear-gradient(180deg,color-mix(in srgb,white 68%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,white));border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined:after{display:none!important;content:none!important}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--focused{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element{color:var(--md-sys-color-on-surface);font-size:1.05rem;line-height:1.2;width:auto!important;min-width:2ch}:host ::ng-deep .pdx-inline-number .mdc-text-field__input::placeholder,:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element::placeholder{color:var(--md-sys-color-on-surface-variant)!important;opacity:0!important}:host ::ng-deep .pdx-inline-number .pdx-inline-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;color:var(--md-sys-color-on-surface-variant);font-size:1.05rem;line-height:1.2}:host ::ng-deep .pdx-inline-number .pdx-inline-measure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:1.05rem;line-height:1.2;font-weight:400;left:-9999px;top:-9999px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix{padding:0;margin-right:10px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix mat-icon{width:22px;height:22px;font-size:22px;color:var(--md-sys-color-primary)}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-suffix{display:inline-flex;align-items:center;justify-content:center;align-self:center;margin-left:10px;gap:8px;padding:0}:host ::ng-deep .pdx-inline-number .pdx-inline-static-suffix{width:18px;height:18px;font-size:18px}:host ::ng-deep .pdx-inline-number .pdx-inline-number-suffix{color:var(--md-sys-color-on-surface-variant);font-size:.95rem;line-height:1;font-weight:600}:host ::ng-deep .pdx-inline-number .pdx-inline-clear{--clear-ring-color: var(--md-sys-color-primary);width:24px;height:24px;min-width:24px;border:0;border-radius:50%;appearance:none;-webkit-appearance:none;outline:none;padding:0;display:grid;place-items:center;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent);color:var(--md-sys-color-on-surface-variant);cursor:pointer;line-height:0;font-size:0;transition:background-color .12s ease,box-shadow .12s ease,color .12s ease}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface) 18%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:focus-visible{background:color-mix(in srgb,var(--md-sys-color-on-surface) 20%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--clear-ring-color) 34%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear mat-icon{display:block;width:16px;height:16px;font-size:16px;line-height:1;margin:0}.pdx-inline-percent-rail{position:relative;height:10px;margin-top:2px}.pdx-inline-percent-rail__track,.pdx-inline-percent-rail__fill{position:absolute;inset-block:1px;left:0;border-radius:999px}.pdx-inline-percent-rail__track{right:0;background:linear-gradient(90deg,color-mix(in srgb,var(--pdx-inline-percent-accent-start) 70%,var(--md-sys-color-surface-container-high)),color-mix(in srgb,var(--pdx-inline-percent-accent-mid) 78%,var(--md-sys-color-surface-container-high)) 52%,color-mix(in srgb,var(--pdx-inline-percent-accent-end) 82%,var(--md-sys-color-surface-container-high)));opacity:.2}.pdx-inline-percent-rail__fill{width:0;background:linear-gradient(90deg,var(--pdx-inline-percent-accent-start) 0%,var(--pdx-inline-percent-accent-mid) 52%,var(--pdx-inline-percent-accent-end) 100%);box-shadow:0 0 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.pdx-inline-percent-rail__marker{position:absolute;top:50%;width:14px;height:14px;border-radius:50%;transform:translate(-50%,-50%);background:var(--md-sys-color-surface);border:2px solid var(--md-sys-color-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent),0 4px 14px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}@media(max-width:768px){.pdx-inline-number-shell-percent{padding:9px 10px 10px;gap:6px}.pdx-inline-percent-insight{gap:10px}.pdx-inline-percent-gauge{width:46px;height:46px}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{min-height:40px;padding-inline:12px}}@media(forced-colors:active){.pdx-inline-number-shell-percent{border-color:CanvasText;background:Canvas;box-shadow:none}.pdx-inline-percent-gauge,.pdx-inline-percent-rail__track,.pdx-inline-percent-rail__fill,.pdx-inline-percent-rail__marker{forced-color-adjust:none}.pdx-inline-percent-gauge{background:radial-gradient(circle at center,Canvas 56%,transparent 57%),conic-gradient(from -90deg,Highlight 0deg,Highlight var(--pdx-inline-percent-angle),GrayText var(--pdx-inline-percent-angle),GrayText 360deg);box-shadow:none}.pdx-inline-percent-gauge__core,.pdx-inline-percent-rail__marker{background:Canvas;border-color:CanvasText}.pdx-inline-percent-rail__track{background:GrayText;opacity:1}.pdx-inline-percent-rail__fill{background:Highlight;box-shadow:none}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1$3.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i1$3.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { 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.MatPrefix, selector: "[matPrefix], [matIconPrefix], [matTextPrefix]", inputs: ["matTextPrefix"] }, { kind: "directive", type: i2.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { 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: 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"] }] });
19680
19871
  }
19681
19872
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineNumberComponent, decorators: [{
19682
19873
  type: Component,
@@ -19688,79 +19879,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19688
19879
  MatIconModule,
19689
19880
  MatTooltipModule,
19690
19881
  ], template: `
19691
- <mat-form-field
19692
- [appearance]="'outline'"
19693
- [color]="materialColor()"
19694
- [class]="componentCssClasses()"
19695
- [floatLabel]="'auto'"
19696
- [subscriptSizing]="'dynamic'"
19697
- [hideRequiredMarker]="true"
19698
- [style.width.px]="inlineWidthPx || null"
19699
- [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19700
- >
19701
- <mat-icon
19702
- matPrefix
19703
- [color]="iconPalette(prefixIconColor())"
19704
- [style.color]="iconResolvedColor(prefixIconColor())"
19705
- >
19706
- {{ leadingIconName() }}
19707
- </mat-icon>
19708
- <input
19709
- #inputEl
19710
- matInput
19711
- type="number"
19712
- [formControl]="control()"
19713
- [errorStateMatcher]="errorStateMatcher()"
19714
- [placeholder]="placeholderText()"
19715
- [required]="metadata()?.required || false"
19716
- [readonly]="isReadonlyEffective()"
19717
- [autocomplete]="metadata()?.autocomplete || 'off'"
19718
- [spellcheck]="metadata()?.spellcheck ?? false"
19719
- [min]="effectiveMinValue()"
19720
- [max]="effectiveMaxValue()"
19721
- [step]="effectiveStepValue()"
19722
- [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19723
- [attr.aria-label]="ariaLabel()"
19724
- [matTooltip]="inlineTooltipText()"
19725
- [matTooltipDisabled]="inlineTooltipDisabled()"
19726
- [matTooltipPosition]="tooltipPosition()"
19727
- (input)="onInlineInput()"
19728
- />
19729
- @if (showInlinePlaceholder()) {
19730
- <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19882
+ <div class="pdx-inline-number-shell" [class.pdx-inline-number-shell-percent]="showPercentGraphicMode()">
19883
+ @if (showPercentGraphicMode()) {
19884
+ <div class="pdx-inline-percent-insight" aria-hidden="true">
19885
+ <div
19886
+ class="pdx-inline-percent-gauge"
19887
+ [style.--pdx-inline-percent-angle]="percentAngle() + 'deg'"
19888
+ >
19889
+ <div class="pdx-inline-percent-gauge__core">
19890
+ <span class="pdx-inline-percent-gauge__value">{{ percentDisplayText() }}</span>
19891
+ </div>
19892
+ </div>
19893
+ <div class="pdx-inline-percent-copy">
19894
+ <span class="pdx-inline-percent-copy__label">{{ placeholderText() }}</span>
19895
+ <span class="pdx-inline-percent-copy__range">{{ percentRangeText() }}</span>
19896
+ </div>
19897
+ </div>
19731
19898
  }
19732
- <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19733
- @if (suffixIconName()) {
19899
+
19900
+ <mat-form-field
19901
+ [appearance]="'outline'"
19902
+ [color]="materialColor()"
19903
+ [class]="componentCssClasses()"
19904
+ [floatLabel]="'auto'"
19905
+ [subscriptSizing]="'dynamic'"
19906
+ [hideRequiredMarker]="true"
19907
+ [style.width.px]="inlineWidthPx || null"
19908
+ [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19909
+ >
19734
19910
  <mat-icon
19735
- matSuffix
19736
- class="pdx-inline-static-suffix"
19737
- [color]="iconPalette(suffixIconColor())"
19738
- [style.color]="iconResolvedColor(suffixIconColor())"
19739
- [matTooltip]="metadata()?.suffixIconTooltip || null"
19740
- [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19911
+ matPrefix
19912
+ [color]="iconPalette(prefixIconColor())"
19913
+ [style.color]="iconResolvedColor(prefixIconColor())"
19741
19914
  >
19742
- {{ suffixIconName() }}
19915
+ {{ leadingIconName() }}
19743
19916
  </mat-icon>
19744
- }
19745
- @if (showPercentSuffix()) {
19746
- <span matSuffix class="pdx-inline-number-suffix">%</span>
19747
- }
19748
- @if (showQuickClear()) {
19749
- <button
19750
- matSuffix
19751
- type="button"
19752
- class="pdx-inline-clear"
19753
- (mousedown)="onTriggerIconMouseDown($event)"
19754
- (click)="onQuickClear($event)"
19755
- [attr.aria-label]="clearActionAriaLabel()"
19756
- >
19917
+ <input
19918
+ #inputEl
19919
+ matInput
19920
+ type="number"
19921
+ [formControl]="control()"
19922
+ [errorStateMatcher]="errorStateMatcher()"
19923
+ [placeholder]="placeholderText()"
19924
+ [required]="metadata()?.required || false"
19925
+ [readonly]="isReadonlyEffective()"
19926
+ [autocomplete]="metadata()?.autocomplete || 'off'"
19927
+ [spellcheck]="metadata()?.spellcheck ?? false"
19928
+ [min]="effectiveMinValue()"
19929
+ [max]="effectiveMaxValue()"
19930
+ [step]="effectiveStepValue()"
19931
+ [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19932
+ [attr.aria-label]="ariaLabel()"
19933
+ [matTooltip]="inlineTooltipText()"
19934
+ [matTooltipDisabled]="inlineTooltipDisabled()"
19935
+ [matTooltipPosition]="tooltipPosition()"
19936
+ (input)="onInlineInput()"
19937
+ />
19938
+ @if (showInlinePlaceholder()) {
19939
+ <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19940
+ }
19941
+ <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19942
+ @if (suffixIconName()) {
19757
19943
  <mat-icon
19758
- [color]="iconPalette(clearIconColor())"
19759
- [style.color]="iconResolvedColor(clearIconColor())"
19760
- >{{ clearIconName() }}</mat-icon>
19761
- </button>
19944
+ matSuffix
19945
+ class="pdx-inline-static-suffix"
19946
+ [color]="iconPalette(suffixIconColor())"
19947
+ [style.color]="iconResolvedColor(suffixIconColor())"
19948
+ [matTooltip]="metadata()?.suffixIconTooltip || null"
19949
+ [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19950
+ >
19951
+ {{ suffixIconName() }}
19952
+ </mat-icon>
19953
+ }
19954
+ @if (showPercentSuffix()) {
19955
+ <span matSuffix class="pdx-inline-number-suffix">%</span>
19956
+ }
19957
+ @if (showQuickClear()) {
19958
+ <button
19959
+ matSuffix
19960
+ type="button"
19961
+ class="pdx-inline-clear"
19962
+ (mousedown)="onTriggerIconMouseDown($event)"
19963
+ (click)="onQuickClear($event)"
19964
+ [attr.aria-label]="clearActionAriaLabel()"
19965
+ >
19966
+ <mat-icon
19967
+ [color]="iconPalette(clearIconColor())"
19968
+ [style.color]="iconResolvedColor(clearIconColor())"
19969
+ >{{ clearIconName() }}</mat-icon>
19970
+ </button>
19971
+ }
19972
+ </mat-form-field>
19973
+
19974
+ @if (showPercentGraphicMode()) {
19975
+ <div class="pdx-inline-percent-rail" aria-hidden="true">
19976
+ <div class="pdx-inline-percent-rail__track"></div>
19977
+ <div class="pdx-inline-percent-rail__fill" [style.width.%]="percentFillWidth()"></div>
19978
+ <div class="pdx-inline-percent-rail__marker" [style.left.%]="percentFillWidth()"></div>
19979
+ </div>
19762
19980
  }
19763
- </mat-form-field>
19981
+ </div>
19764
19982
  `, providers: [
19765
19983
  {
19766
19984
  provide: NG_VALUE_ACCESSOR,
@@ -19777,7 +19995,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19777
19995
  '[attr.data-field-type]': '"inlineNumber"',
19778
19996
  '[attr.data-field-name]': 'metadata()?.name',
19779
19997
  '[attr.data-component-id]': 'componentId()',
19780
- }, styles: [":host{display:inline-flex;width:auto;min-width:0;max-width:100%}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field{width:auto;min-width:0;margin-bottom:0;transition:width .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .pdx-inline-number .mdc-notched-outline{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-flex,:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper{padding:0;background:transparent}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-focus-overlay{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-infix{min-height:0;width:auto;flex:0 1 auto;min-width:0;padding:0;position:relative}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{display:flex;align-items:center;min-height:44px;min-width:0;max-width:min(var(--pdx-inline-number-max-w, 280px),calc(100vw - 48px));padding-inline:14px;border-radius:999px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high);box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined:after{display:none!important;content:none!important}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--focused{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element{color:var(--md-sys-color-on-surface);font-size:1.05rem;line-height:1.2;width:auto!important;min-width:2ch}:host ::ng-deep .pdx-inline-number .mdc-text-field__input::placeholder,:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element::placeholder{color:var(--md-sys-color-on-surface-variant)!important;opacity:0!important}:host ::ng-deep .pdx-inline-number .pdx-inline-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;color:var(--md-sys-color-on-surface-variant);font-size:1.05rem;line-height:1.2}:host ::ng-deep .pdx-inline-number .pdx-inline-measure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:1.05rem;line-height:1.2;font-weight:400;left:-9999px;top:-9999px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix{padding:0;margin-right:10px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix mat-icon{width:22px;height:22px;font-size:22px;color:var(--md-sys-color-primary)}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-suffix{display:inline-flex;align-items:center;justify-content:center;align-self:center;margin-left:10px;gap:8px;padding:0}:host ::ng-deep .pdx-inline-number .pdx-inline-static-suffix{width:18px;height:18px;font-size:18px}:host ::ng-deep .pdx-inline-number .pdx-inline-number-suffix{color:var(--md-sys-color-on-surface-variant);font-size:.95rem;line-height:1;font-weight:600}:host ::ng-deep .pdx-inline-number .pdx-inline-clear{--clear-ring-color: var(--md-sys-color-primary);width:24px;height:24px;min-width:24px;border:0;border-radius:50%;appearance:none;-webkit-appearance:none;outline:none;padding:0;display:grid;place-items:center;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent);color:var(--md-sys-color-on-surface-variant);cursor:pointer;line-height:0;font-size:0;transition:background-color .12s ease,box-shadow .12s ease,color .12s ease}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface) 18%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:focus-visible{background:color-mix(in srgb,var(--md-sys-color-on-surface) 20%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--clear-ring-color) 34%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear mat-icon{display:block;width:16px;height:16px;font-size:16px;line-height:1;margin:0}@media(max-width:768px){:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{min-height:40px;padding-inline:12px}}\n"] }]
19998
+ }, styles: [":host{display:inline-flex;width:auto;min-width:0;max-width:100%}.pdx-inline-number-shell{display:inline-flex;flex-direction:column;gap:8px;width:auto;min-width:0;max-width:100%}.pdx-inline-number-shell-percent{--pdx-inline-percent-accent-start: color-mix(in srgb, var(--md-sys-color-tertiary) 72%, var(--md-sys-color-primary));--pdx-inline-percent-accent-mid: color-mix(in srgb, var(--md-sys-color-secondary) 82%, var(--md-sys-color-primary));--pdx-inline-percent-accent-end: color-mix(in srgb, var(--md-sys-color-primary) 88%, var(--md-sys-color-tertiary));padding:10px 12px 12px;border-radius:20px;border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 16%,var(--md-sys-color-outline-variant));background:linear-gradient(180deg,color-mix(in srgb,var(--md-sys-color-primary) 8%,var(--md-sys-color-surface-container-highest)) 0%,var(--md-sys-color-surface-container) 100%);box-shadow:inset 0 1px color-mix(in srgb,var(--md-sys-color-on-surface) 5%,transparent),0 8px 24px color-mix(in srgb,var(--md-sys-color-primary) 10%,transparent)}.pdx-inline-percent-insight{display:grid;grid-template-columns:auto minmax(0,1fr);gap:12px;align-items:center}.pdx-inline-percent-gauge{--pdx-inline-percent-angle: 0deg;position:relative;width:52px;height:52px;border-radius:50%;background:radial-gradient(circle at center,var(--md-sys-color-surface-container) 56%,transparent 57%),conic-gradient(from -90deg,var(--pdx-inline-percent-accent-start) 0deg,var(--pdx-inline-percent-accent-mid) 150deg,var(--pdx-inline-percent-accent-end) var(--pdx-inline-percent-angle),color-mix(in srgb,var(--md-sys-color-outline-variant) 54%,transparent) var(--pdx-inline-percent-angle),color-mix(in srgb,var(--md-sys-color-outline-variant) 54%,transparent) 360deg);box-shadow:0 0 0 1px color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent),0 10px 22px color-mix(in srgb,var(--md-sys-color-primary) 16%,transparent)}.pdx-inline-percent-gauge__core{position:absolute;inset:7px;display:grid;place-items:center;border-radius:50%;background:radial-gradient(circle at 30% 30%,color-mix(in srgb,white 54%,transparent),transparent 42%),var(--md-sys-color-surface);border:1px solid color-mix(in srgb,var(--md-sys-color-primary) 14%,var(--md-sys-color-outline-variant))}.pdx-inline-percent-gauge__value{font-size:.85rem;font-weight:700;line-height:1;letter-spacing:-.02em;color:var(--md-sys-color-primary)}.pdx-inline-percent-copy{min-width:0;display:flex;flex-direction:column;gap:4px}.pdx-inline-percent-copy__label{font-size:.72rem;font-weight:700;text-transform:uppercase;letter-spacing:.08em;color:color-mix(in srgb,var(--md-sys-color-primary) 84%,var(--md-sys-color-on-surface))}.pdx-inline-percent-copy__range{font-size:.82rem;font-weight:500;color:var(--md-sys-color-on-surface-variant);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field{width:auto;min-width:0;margin-bottom:0;transition:width .12s ease}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-subscript-wrapper{display:none}:host ::ng-deep .pdx-inline-number .mdc-notched-outline{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-flex,:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper{padding:0;background:transparent}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-focus-overlay{display:none}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-infix{min-height:0;width:auto;flex:0 1 auto;min-width:0;padding:0;position:relative}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{display:flex;align-items:center;min-height:44px;min-width:0;max-width:min(var(--pdx-inline-number-max-w, 280px),calc(100vw - 48px));padding-inline:14px;border-radius:999px;border:1px solid var(--md-sys-color-outline-variant);background:var(--md-sys-color-surface-container-high);box-sizing:border-box;transition:border-color .12s ease,box-shadow .12s ease}:host ::ng-deep .pdx-inline-number-shell-percent .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{background:linear-gradient(180deg,color-mix(in srgb,white 68%,transparent),color-mix(in srgb,var(--md-sys-color-surface-container-high) 88%,white));border-color:color-mix(in srgb,var(--md-sys-color-primary) 20%,var(--md-sys-color-outline-variant))}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined:after{display:none!important;content:none!important}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--focused{border-color:var(--md-sys-color-primary);box-shadow:0 0 0 2px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element{color:var(--md-sys-color-on-surface);font-size:1.05rem;line-height:1.2;width:auto!important;min-width:2ch}:host ::ng-deep .pdx-inline-number .mdc-text-field__input::placeholder,:host ::ng-deep .pdx-inline-number input.mat-mdc-input-element::placeholder{color:var(--md-sys-color-on-surface-variant)!important;opacity:0!important}:host ::ng-deep .pdx-inline-number .pdx-inline-placeholder{position:absolute;left:0;top:50%;transform:translateY(-50%);max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;color:var(--md-sys-color-on-surface-variant);font-size:1.05rem;line-height:1.2}:host ::ng-deep .pdx-inline-number .pdx-inline-measure{position:absolute;visibility:hidden;pointer-events:none;white-space:pre;font-size:1.05rem;line-height:1.2;font-weight:400;left:-9999px;top:-9999px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix{padding:0;margin-right:10px}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-prefix mat-icon{width:22px;height:22px;font-size:22px;color:var(--md-sys-color-primary)}:host ::ng-deep .pdx-inline-number .mat-mdc-form-field-icon-suffix{display:inline-flex;align-items:center;justify-content:center;align-self:center;margin-left:10px;gap:8px;padding:0}:host ::ng-deep .pdx-inline-number .pdx-inline-static-suffix{width:18px;height:18px;font-size:18px}:host ::ng-deep .pdx-inline-number .pdx-inline-number-suffix{color:var(--md-sys-color-on-surface-variant);font-size:.95rem;line-height:1;font-weight:600}:host ::ng-deep .pdx-inline-number .pdx-inline-clear{--clear-ring-color: var(--md-sys-color-primary);width:24px;height:24px;min-width:24px;border:0;border-radius:50%;appearance:none;-webkit-appearance:none;outline:none;padding:0;display:grid;place-items:center;background:color-mix(in srgb,var(--md-sys-color-on-surface) 12%,transparent);color:var(--md-sys-color-on-surface-variant);cursor:pointer;line-height:0;font-size:0;transition:background-color .12s ease,box-shadow .12s ease,color .12s ease}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:hover{background:color-mix(in srgb,var(--md-sys-color-on-surface) 18%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear:focus-visible{background:color-mix(in srgb,var(--md-sys-color-on-surface) 20%,transparent);box-shadow:0 0 0 2px color-mix(in srgb,var(--clear-ring-color) 34%,transparent)}:host ::ng-deep .pdx-inline-number .pdx-inline-clear mat-icon{display:block;width:16px;height:16px;font-size:16px;line-height:1;margin:0}.pdx-inline-percent-rail{position:relative;height:10px;margin-top:2px}.pdx-inline-percent-rail__track,.pdx-inline-percent-rail__fill{position:absolute;inset-block:1px;left:0;border-radius:999px}.pdx-inline-percent-rail__track{right:0;background:linear-gradient(90deg,color-mix(in srgb,var(--pdx-inline-percent-accent-start) 70%,var(--md-sys-color-surface-container-high)),color-mix(in srgb,var(--pdx-inline-percent-accent-mid) 78%,var(--md-sys-color-surface-container-high)) 52%,color-mix(in srgb,var(--pdx-inline-percent-accent-end) 82%,var(--md-sys-color-surface-container-high)));opacity:.2}.pdx-inline-percent-rail__fill{width:0;background:linear-gradient(90deg,var(--pdx-inline-percent-accent-start) 0%,var(--pdx-inline-percent-accent-mid) 52%,var(--pdx-inline-percent-accent-end) 100%);box-shadow:0 0 18px color-mix(in srgb,var(--md-sys-color-primary) 22%,transparent)}.pdx-inline-percent-rail__marker{position:absolute;top:50%;width:14px;height:14px;border-radius:50%;transform:translate(-50%,-50%);background:var(--md-sys-color-surface);border:2px solid var(--md-sys-color-primary);box-shadow:0 0 0 3px color-mix(in srgb,var(--md-sys-color-primary) 12%,transparent),0 4px 14px color-mix(in srgb,var(--md-sys-color-primary) 18%,transparent)}@media(max-width:768px){.pdx-inline-number-shell-percent{padding:9px 10px 10px;gap:6px}.pdx-inline-percent-insight{gap:10px}.pdx-inline-percent-gauge{width:46px;height:46px}:host ::ng-deep .pdx-inline-number .mat-mdc-text-field-wrapper.mdc-text-field--outlined{min-height:40px;padding-inline:12px}}@media(forced-colors:active){.pdx-inline-number-shell-percent{border-color:CanvasText;background:Canvas;box-shadow:none}.pdx-inline-percent-gauge,.pdx-inline-percent-rail__track,.pdx-inline-percent-rail__fill,.pdx-inline-percent-rail__marker{forced-color-adjust:none}.pdx-inline-percent-gauge{background:radial-gradient(circle at center,Canvas 56%,transparent 57%),conic-gradient(from -90deg,Highlight 0deg,Highlight var(--pdx-inline-percent-angle),GrayText var(--pdx-inline-percent-angle),GrayText 360deg);box-shadow:none}.pdx-inline-percent-gauge__core,.pdx-inline-percent-rail__marker{background:Canvas;border-color:CanvasText}.pdx-inline-percent-rail__track{background:GrayText;opacity:1}.pdx-inline-percent-rail__fill{background:Highlight;box-shadow:none}}\n"] }]
19781
19999
  }], propDecorators: { inputEl: [{
19782
20000
  type: ViewChild,
19783
20001
  args: ['inputEl', { read: ElementRef }]
@@ -23673,6 +23891,673 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
23673
23891
  args: ['document:keydown.escape']
23674
23892
  }] } });
23675
23893
 
23894
+ class InlinePeriodRangeComponent extends SimpleBaseInputComponent {
23895
+ innerComponent;
23896
+ readonlyMode = false;
23897
+ disabledMode = false;
23898
+ visible = true;
23899
+ presentationMode = false;
23900
+ sliderControl = new FormControl(null);
23901
+ syncingFromOuter = false;
23902
+ syncingFromInner = false;
23903
+ periodState = computed(() => {
23904
+ const metadata = this.metadata();
23905
+ if (!metadata)
23906
+ return null;
23907
+ const values = this.buildPeriods(metadata);
23908
+ if (!values.length)
23909
+ return null;
23910
+ return {
23911
+ values,
23912
+ indexByValue: new Map(values.map((value, index) => [value, index])),
23913
+ };
23914
+ }, ...(ngDevMode ? [{ debugName: "periodState" }] : []));
23915
+ resolvedMetadata = computed(() => {
23916
+ const metadata = this.metadata();
23917
+ const periodState = this.periodState();
23918
+ if (!metadata || !periodState)
23919
+ return null;
23920
+ const maxIndex = Math.max(periodState.values.length - 1, 0);
23921
+ const defaultInlineTexts = metadata.granularity === 'year'
23922
+ ? {
23923
+ minLabel: 'Período inicial',
23924
+ maxLabel: 'Período final',
23925
+ quickPresetsLabel: 'Períodos rápidos',
23926
+ }
23927
+ : {
23928
+ quickPresetsLabel: 'Períodos rápidos',
23929
+ };
23930
+ return {
23931
+ ...metadata,
23932
+ controlType: FieldControlType.RANGE_SLIDER,
23933
+ mode: 'range',
23934
+ min: 0,
23935
+ max: maxIndex,
23936
+ step: 1,
23937
+ discrete: metadata.discrete ?? true,
23938
+ showTicks: metadata.showTicks ?? true,
23939
+ showInputs: metadata.showInputs ??
23940
+ (metadata.granularity === 'year' &&
23941
+ periodState.values.every((value) => /^\d{4}$/.test(value))),
23942
+ prefixIcon: metadata.prefixIcon || this.defaultIcon(metadata.granularity),
23943
+ inlineTexts: metadata.inlineTexts ?? defaultInlineTexts,
23944
+ displayWith: metadata.displayWith ??
23945
+ ((value) => this.formatPeriodLabel(periodState.values[this.boundIndex(value, maxIndex)] || '', metadata)),
23946
+ quickPresets: this.adaptQuickPresets(metadata.quickPresets, periodState),
23947
+ quickPresetsAuto: false,
23948
+ };
23949
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
23950
+ ngOnInit() {
23951
+ super.ngOnInit();
23952
+ this.control().valueChanges
23953
+ .pipe(takeUntilDestroyed(this.destroyRef))
23954
+ .subscribe((value) => {
23955
+ if (this.syncingFromInner)
23956
+ return;
23957
+ this.syncFromOuterValue(value);
23958
+ });
23959
+ this.sliderControl.valueChanges
23960
+ .pipe(takeUntilDestroyed(this.destroyRef))
23961
+ .subscribe((value) => {
23962
+ if (this.syncingFromOuter)
23963
+ return;
23964
+ this.syncFromInnerValue(value);
23965
+ });
23966
+ }
23967
+ ngAfterViewInit() {
23968
+ super.ngAfterViewInit();
23969
+ this.syncInnerMetadata();
23970
+ this.syncFromOuterValue(this.control().value);
23971
+ }
23972
+ writeValue(value) {
23973
+ super.writeValue(value);
23974
+ this.syncFromOuterValue(value);
23975
+ }
23976
+ setInputMetadata(metadata) {
23977
+ this.setMetadata(metadata);
23978
+ this.syncInnerMetadata();
23979
+ this.syncFromOuterValue(this.control().value);
23980
+ }
23981
+ setMetadata(metadata) {
23982
+ super.setMetadata(metadata);
23983
+ this.syncInnerMetadata();
23984
+ this.syncFromOuterValue(this.control().value);
23985
+ }
23986
+ getSpecificCssClasses() {
23987
+ return ['pdx-inline-period-range'];
23988
+ }
23989
+ syncFromOuterValue(value) {
23990
+ const periodState = this.periodState();
23991
+ if (!periodState)
23992
+ return;
23993
+ const nextValue = this.toSliderValue(value, periodState);
23994
+ this.syncingFromOuter = true;
23995
+ try {
23996
+ this.sliderControl.setValue(nextValue, { emitEvent: false });
23997
+ }
23998
+ finally {
23999
+ this.syncingFromOuter = false;
24000
+ }
24001
+ }
24002
+ syncFromInnerValue(value) {
24003
+ const periodState = this.periodState();
24004
+ if (!periodState)
24005
+ return;
24006
+ const nextOuter = this.toOuterValue(value, periodState);
24007
+ this.syncingFromInner = true;
24008
+ try {
24009
+ this.setValue(nextOuter, { emitEvent: true });
24010
+ }
24011
+ finally {
24012
+ this.syncingFromInner = false;
24013
+ }
24014
+ }
24015
+ toSliderValue(value, periodState) {
24016
+ if (!Array.isArray(value) || value.length < 2)
24017
+ return null;
24018
+ const start = periodState.indexByValue.get(String(value[0]));
24019
+ const end = periodState.indexByValue.get(String(value[1]));
24020
+ if (start === undefined || end === undefined)
24021
+ return null;
24022
+ return {
24023
+ start: Math.min(start, end),
24024
+ end: Math.max(start, end),
24025
+ };
24026
+ }
24027
+ toOuterValue(value, periodState) {
24028
+ if (!value)
24029
+ return null;
24030
+ const start = this.boundIndex(value.start ?? 0, periodState.values.length - 1);
24031
+ const end = this.boundIndex(value.end ?? 0, periodState.values.length - 1);
24032
+ return [periodState.values[Math.min(start, end)], periodState.values[Math.max(start, end)]];
24033
+ }
24034
+ adaptQuickPresets(presets, periodState) {
24035
+ if (!Array.isArray(presets) || !presets.length)
24036
+ return [];
24037
+ return presets
24038
+ .map((preset) => {
24039
+ const start = periodState.indexByValue.get(String(preset.start));
24040
+ const end = periodState.indexByValue.get(String(preset.end));
24041
+ if (start === undefined || end === undefined)
24042
+ return null;
24043
+ return {
24044
+ id: preset.id,
24045
+ label: preset.label,
24046
+ start: Math.min(start, end),
24047
+ end: Math.max(start, end),
24048
+ };
24049
+ })
24050
+ .filter((preset) => Boolean(preset));
24051
+ }
24052
+ formatPeriodLabel(value, metadata) {
24053
+ if (!value)
24054
+ return '';
24055
+ switch (metadata.granularity) {
24056
+ case 'month':
24057
+ return this.formatMonthValue(value, metadata);
24058
+ case 'quarter':
24059
+ case 'fiscal-quarter':
24060
+ return value.replace('-', '/');
24061
+ case 'fiscal-year':
24062
+ return value;
24063
+ case 'year':
24064
+ return value;
24065
+ default:
24066
+ return value;
24067
+ }
24068
+ }
24069
+ formatMonthValue(value, metadata) {
24070
+ const match = /^(\d{4})-(\d{2})$/.exec(value);
24071
+ if (!match)
24072
+ return value;
24073
+ const [, year, month] = match;
24074
+ const monthIndex = Number(month) - 1;
24075
+ const customLabels = Array.isArray(metadata.monthLabels) ? metadata.monthLabels : [];
24076
+ const labelFromConfig = customLabels[monthIndex];
24077
+ if (labelFromConfig)
24078
+ return `${labelFromConfig}/${year}`;
24079
+ const formatter = new Intl.DateTimeFormat(metadata.locale || 'pt-BR', {
24080
+ month: 'short',
24081
+ });
24082
+ const raw = formatter.format(new Date(Number(year), monthIndex, 1)).replace('.', '');
24083
+ return `${raw.charAt(0).toUpperCase()}${raw.slice(1)}/${year}`;
24084
+ }
24085
+ defaultIcon(granularity) {
24086
+ switch (granularity) {
24087
+ case 'month':
24088
+ return 'calendar_view_month';
24089
+ case 'quarter':
24090
+ case 'fiscal-quarter':
24091
+ return 'date_range';
24092
+ case 'year':
24093
+ case 'fiscal-year':
24094
+ return 'calendar_today';
24095
+ default:
24096
+ return 'date_range';
24097
+ }
24098
+ }
24099
+ buildPeriods(metadata) {
24100
+ switch (metadata.granularity) {
24101
+ case 'month':
24102
+ return this.buildMonthPeriods(metadata.min, metadata.max);
24103
+ case 'quarter':
24104
+ case 'fiscal-quarter':
24105
+ return this.buildQuarterPeriods(metadata.min, metadata.max);
24106
+ case 'year':
24107
+ case 'fiscal-year':
24108
+ return this.buildYearPeriods(metadata.min, metadata.max);
24109
+ default:
24110
+ return [];
24111
+ }
24112
+ }
24113
+ buildMonthPeriods(min, max) {
24114
+ const start = this.parseYearMonth(min);
24115
+ const end = this.parseYearMonth(max);
24116
+ if (!start || !end)
24117
+ return [];
24118
+ const periods = [];
24119
+ let current = start.year * 12 + (start.month - 1);
24120
+ const last = end.year * 12 + (end.month - 1);
24121
+ while (current <= last) {
24122
+ const year = Math.floor(current / 12);
24123
+ const month = (current % 12) + 1;
24124
+ periods.push(`${year}-${String(month).padStart(2, '0')}`);
24125
+ current += 1;
24126
+ }
24127
+ return periods;
24128
+ }
24129
+ buildQuarterPeriods(min, max) {
24130
+ const start = this.parseQuarter(min);
24131
+ const end = this.parseQuarter(max);
24132
+ if (!start || !end)
24133
+ return [];
24134
+ const periods = [];
24135
+ let currentYear = start.year;
24136
+ let currentQuarter = start.quarter;
24137
+ while (currentYear < end.year ||
24138
+ (currentYear === end.year && currentQuarter <= end.quarter)) {
24139
+ periods.push(`${currentYear}-Q${currentQuarter}`);
24140
+ currentQuarter += 1;
24141
+ if (currentQuarter > 4) {
24142
+ currentQuarter = 1;
24143
+ currentYear += 1;
24144
+ }
24145
+ }
24146
+ return periods;
24147
+ }
24148
+ buildYearPeriods(min, max) {
24149
+ const start = this.parseYear(min);
24150
+ const end = this.parseYear(max);
24151
+ if (start === null || end === null)
24152
+ return [];
24153
+ const periods = [];
24154
+ for (let year = Math.min(start, end); year <= Math.max(start, end); year += 1) {
24155
+ periods.push(String(year));
24156
+ }
24157
+ return periods;
24158
+ }
24159
+ parseYearMonth(value) {
24160
+ if (!value)
24161
+ return null;
24162
+ const match = /^(\d{4})-(\d{2})$/.exec(String(value).trim());
24163
+ if (!match)
24164
+ return null;
24165
+ const year = Number(match[1]);
24166
+ const month = Number(match[2]);
24167
+ if (!Number.isFinite(year) || !Number.isFinite(month) || month < 1 || month > 12) {
24168
+ return null;
24169
+ }
24170
+ return { year, month };
24171
+ }
24172
+ parseQuarter(value) {
24173
+ if (!value)
24174
+ return null;
24175
+ const match = /^(\d{4})-Q([1-4])$/i.exec(String(value).trim());
24176
+ if (!match)
24177
+ return null;
24178
+ return { year: Number(match[1]), quarter: Number(match[2]) };
24179
+ }
24180
+ parseYear(value) {
24181
+ if (!value)
24182
+ return null;
24183
+ const normalized = String(value).trim().replace(/^FY/i, '');
24184
+ const year = Number(normalized);
24185
+ return Number.isFinite(year) ? year : null;
24186
+ }
24187
+ boundIndex(value, max) {
24188
+ const numeric = Number.isFinite(Number(value)) ? Number(value) : 0;
24189
+ return Math.min(max, Math.max(0, Math.round(numeric)));
24190
+ }
24191
+ syncInnerMetadata() {
24192
+ const metadata = this.resolvedMetadata();
24193
+ if (!metadata || !this.innerComponent)
24194
+ return;
24195
+ this.innerComponent.setMetadata(metadata);
24196
+ }
24197
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlinePeriodRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24198
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: InlinePeriodRangeComponent, isStandalone: true, selector: "pdx-inline-period-range", inputs: { readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode" }, host: { properties: { "style.display": "visible ? null : \"none\"", "attr.aria-hidden": "visible ? null : \"true\"", "attr.data-field-type": "\"inlinePeriodRange\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()" } }, providers: [
24199
+ {
24200
+ provide: NG_VALUE_ACCESSOR,
24201
+ useExisting: forwardRef(() => InlinePeriodRangeComponent),
24202
+ multi: true,
24203
+ },
24204
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24205
+ <pdx-inline-range-slider
24206
+ [formControl]="sliderControl"
24207
+ [readonlyMode]="readonlyMode"
24208
+ [disabledMode]="disabledMode"
24209
+ [visible]="visible"
24210
+ [presentationMode]="presentationMode"
24211
+ />
24212
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: InlineRangeSliderComponent, selector: "pdx-inline-range-slider", inputs: ["readonlyMode", "disabledMode", "visible", "presentationMode"] }] });
24213
+ }
24214
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlinePeriodRangeComponent, decorators: [{
24215
+ type: Component,
24216
+ args: [{
24217
+ selector: 'pdx-inline-period-range',
24218
+ standalone: true,
24219
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24220
+ template: `
24221
+ <pdx-inline-range-slider
24222
+ [formControl]="sliderControl"
24223
+ [readonlyMode]="readonlyMode"
24224
+ [disabledMode]="disabledMode"
24225
+ [visible]="visible"
24226
+ [presentationMode]="presentationMode"
24227
+ />
24228
+ `,
24229
+ providers: [
24230
+ {
24231
+ provide: NG_VALUE_ACCESSOR,
24232
+ useExisting: forwardRef(() => InlinePeriodRangeComponent),
24233
+ multi: true,
24234
+ },
24235
+ ],
24236
+ host: {
24237
+ '[style.display]': 'visible ? null : "none"',
24238
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24239
+ '[attr.data-field-type]': '"inlinePeriodRange"',
24240
+ '[attr.data-field-name]': 'metadata()?.name',
24241
+ '[attr.data-component-id]': 'componentId()',
24242
+ },
24243
+ }]
24244
+ }], propDecorators: { innerComponent: [{
24245
+ type: ViewChild,
24246
+ args: [InlineRangeSliderComponent]
24247
+ }], readonlyMode: [{
24248
+ type: Input
24249
+ }], disabledMode: [{
24250
+ type: Input
24251
+ }], visible: [{
24252
+ type: Input
24253
+ }], presentationMode: [{
24254
+ type: Input
24255
+ }] } });
24256
+
24257
+ class InlineYearRangeComponent extends SimpleBaseInputComponent {
24258
+ innerComponent;
24259
+ readonlyMode = false;
24260
+ disabledMode = false;
24261
+ visible = true;
24262
+ presentationMode = false;
24263
+ resolvedMetadata = computed(() => {
24264
+ const metadata = this.metadata();
24265
+ if (!metadata)
24266
+ return null;
24267
+ const maxYear = Number.isFinite(Number(metadata.max))
24268
+ ? Number(metadata.max)
24269
+ : new Date().getFullYear();
24270
+ const minYear = Number.isFinite(Number(metadata.min))
24271
+ ? Number(metadata.min)
24272
+ : Math.max(2000, maxYear - 10);
24273
+ const boundedMin = Math.min(minYear, maxYear);
24274
+ const boundedMax = Math.max(maxYear, minYear);
24275
+ const fullLabel = metadata.quickPresetsLabels?.full ||
24276
+ (boundedMin === boundedMax ? String(boundedMax) : 'Todo o período');
24277
+ const currentLabel = metadata.quickPresetsLabels?.current || String(boundedMax);
24278
+ const previousYear = Math.max(boundedMin, boundedMax - 1);
24279
+ const previousLabel = metadata.quickPresetsLabels?.previous || String(previousYear);
24280
+ const recentStart = Math.max(boundedMin, boundedMax - 2);
24281
+ const recentLabel = metadata.quickPresetsLabels?.recent ||
24282
+ (recentStart === boundedMax ? String(boundedMax) : `${recentStart}-${boundedMax}`);
24283
+ const quickPresets = metadata.quickPresets ??
24284
+ [
24285
+ {
24286
+ id: 'full',
24287
+ label: fullLabel,
24288
+ start: boundedMin,
24289
+ end: boundedMax,
24290
+ },
24291
+ {
24292
+ id: 'current',
24293
+ label: currentLabel,
24294
+ start: boundedMax,
24295
+ end: boundedMax,
24296
+ },
24297
+ ...(previousYear < boundedMax
24298
+ ? [
24299
+ {
24300
+ id: 'previous',
24301
+ label: previousLabel,
24302
+ start: previousYear,
24303
+ end: previousYear,
24304
+ },
24305
+ ]
24306
+ : []),
24307
+ ...(recentStart < boundedMax
24308
+ ? [
24309
+ {
24310
+ id: 'recent',
24311
+ label: recentLabel,
24312
+ start: recentStart,
24313
+ end: boundedMax,
24314
+ },
24315
+ ]
24316
+ : []),
24317
+ ];
24318
+ return {
24319
+ ...metadata,
24320
+ controlType: FieldControlType.RANGE_SLIDER,
24321
+ mode: 'range',
24322
+ min: boundedMin,
24323
+ max: boundedMax,
24324
+ step: Number.isFinite(Number(metadata.step)) ? Number(metadata.step) : 1,
24325
+ discrete: metadata.discrete ?? true,
24326
+ showTicks: metadata.showTicks ?? true,
24327
+ showInputs: metadata.showInputs ?? true,
24328
+ prefixIcon: metadata.prefixIcon || 'calendar_today',
24329
+ inlineTexts: metadata.inlineTexts ?? {
24330
+ minLabel: 'Ano inicial',
24331
+ maxLabel: 'Ano final',
24332
+ quickPresetsLabel: 'Anos rápidos',
24333
+ },
24334
+ displayWith: metadata.displayWith ??
24335
+ ((value) => {
24336
+ const year = Math.round(value);
24337
+ return Number.isFinite(year) ? String(year) : '';
24338
+ }),
24339
+ quickPresets,
24340
+ quickPresetsAuto: false,
24341
+ };
24342
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
24343
+ getSpecificCssClasses() {
24344
+ return ['pdx-inline-year-range'];
24345
+ }
24346
+ ngAfterViewInit() {
24347
+ super.ngAfterViewInit();
24348
+ this.syncInnerMetadata();
24349
+ }
24350
+ setInputMetadata(metadata) {
24351
+ this.setMetadata(metadata);
24352
+ this.syncInnerMetadata();
24353
+ }
24354
+ setMetadata(metadata) {
24355
+ super.setMetadata(metadata);
24356
+ this.syncInnerMetadata();
24357
+ }
24358
+ syncInnerMetadata() {
24359
+ const metadata = this.resolvedMetadata();
24360
+ if (!metadata || !this.innerComponent)
24361
+ return;
24362
+ this.innerComponent.setMetadata(metadata);
24363
+ }
24364
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineYearRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24365
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: InlineYearRangeComponent, isStandalone: true, selector: "pdx-inline-year-range", inputs: { readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode" }, host: { properties: { "style.display": "visible ? null : \"none\"", "attr.aria-hidden": "visible ? null : \"true\"", "attr.data-field-type": "\"inlineYearRange\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()" } }, providers: [
24366
+ {
24367
+ provide: NG_VALUE_ACCESSOR,
24368
+ useExisting: forwardRef(() => InlineYearRangeComponent),
24369
+ multi: true,
24370
+ },
24371
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24372
+ <pdx-inline-range-slider
24373
+ [formControl]="control()"
24374
+ [readonlyMode]="readonlyMode"
24375
+ [disabledMode]="disabledMode"
24376
+ [visible]="visible"
24377
+ [presentationMode]="presentationMode"
24378
+ />
24379
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: InlineRangeSliderComponent, selector: "pdx-inline-range-slider", inputs: ["readonlyMode", "disabledMode", "visible", "presentationMode"] }] });
24380
+ }
24381
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineYearRangeComponent, decorators: [{
24382
+ type: Component,
24383
+ args: [{
24384
+ selector: 'pdx-inline-year-range',
24385
+ standalone: true,
24386
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24387
+ template: `
24388
+ <pdx-inline-range-slider
24389
+ [formControl]="control()"
24390
+ [readonlyMode]="readonlyMode"
24391
+ [disabledMode]="disabledMode"
24392
+ [visible]="visible"
24393
+ [presentationMode]="presentationMode"
24394
+ />
24395
+ `,
24396
+ providers: [
24397
+ {
24398
+ provide: NG_VALUE_ACCESSOR,
24399
+ useExisting: forwardRef(() => InlineYearRangeComponent),
24400
+ multi: true,
24401
+ },
24402
+ ],
24403
+ host: {
24404
+ '[style.display]': 'visible ? null : "none"',
24405
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24406
+ '[attr.data-field-type]': '"inlineYearRange"',
24407
+ '[attr.data-field-name]': 'metadata()?.name',
24408
+ '[attr.data-component-id]': 'componentId()',
24409
+ },
24410
+ }]
24411
+ }], propDecorators: { innerComponent: [{
24412
+ type: ViewChild,
24413
+ args: [InlineRangeSliderComponent]
24414
+ }], readonlyMode: [{
24415
+ type: Input
24416
+ }], disabledMode: [{
24417
+ type: Input
24418
+ }], visible: [{
24419
+ type: Input
24420
+ }], presentationMode: [{
24421
+ type: Input
24422
+ }] } });
24423
+
24424
+ class InlineMonthRangeComponent extends SimpleBaseInputComponent {
24425
+ innerComponent;
24426
+ readonlyMode = false;
24427
+ disabledMode = false;
24428
+ visible = true;
24429
+ presentationMode = false;
24430
+ resolvedMetadata = computed(() => {
24431
+ const metadata = this.metadata();
24432
+ if (!metadata)
24433
+ return null;
24434
+ const labels = this.resolveMonthLabels(metadata);
24435
+ const fullLabel = metadata.quickPresetsLabels?.full || 'Ano todo';
24436
+ const firstHalfLabel = metadata.quickPresetsLabels?.firstHalf || 'Jan-Jun';
24437
+ const secondHalfLabel = metadata.quickPresetsLabels?.secondHalf || 'Jul-Dez';
24438
+ return {
24439
+ ...metadata,
24440
+ controlType: FieldControlType.RANGE_SLIDER,
24441
+ mode: 'range',
24442
+ min: 1,
24443
+ max: 12,
24444
+ step: 1,
24445
+ discrete: metadata.discrete ?? true,
24446
+ showTicks: metadata.showTicks ?? true,
24447
+ showInputs: metadata.showInputs ?? false,
24448
+ prefixIcon: metadata.prefixIcon || 'calendar_view_month',
24449
+ inlineTexts: metadata.inlineTexts ?? {
24450
+ quickPresetsLabel: 'Períodos rápidos',
24451
+ },
24452
+ displayWith: metadata.displayWith ??
24453
+ ((value) => {
24454
+ const monthNumber = Math.min(12, Math.max(1, Math.round(value)));
24455
+ return labels[monthNumber - 1] || String(monthNumber);
24456
+ }),
24457
+ quickPresets: metadata.quickPresets ??
24458
+ [
24459
+ { id: 'full', label: fullLabel, start: 1, end: 12 },
24460
+ { id: 'q1', label: metadata.quickPresetsLabels?.q1 || 'Q1', start: 1, end: 3 },
24461
+ { id: 'q2', label: metadata.quickPresetsLabels?.q2 || 'Q2', start: 4, end: 6 },
24462
+ { id: 'q3', label: metadata.quickPresetsLabels?.q3 || 'Q3', start: 7, end: 9 },
24463
+ { id: 'q4', label: metadata.quickPresetsLabels?.q4 || 'Q4', start: 10, end: 12 },
24464
+ { id: 'first-half', label: firstHalfLabel, start: 1, end: 6 },
24465
+ { id: 'second-half', label: secondHalfLabel, start: 7, end: 12 },
24466
+ ],
24467
+ quickPresetsAuto: false,
24468
+ };
24469
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
24470
+ getSpecificCssClasses() {
24471
+ return ['pdx-inline-month-range'];
24472
+ }
24473
+ ngAfterViewInit() {
24474
+ super.ngAfterViewInit();
24475
+ this.syncInnerMetadata();
24476
+ }
24477
+ setInputMetadata(metadata) {
24478
+ this.setMetadata(metadata);
24479
+ this.syncInnerMetadata();
24480
+ }
24481
+ setMetadata(metadata) {
24482
+ super.setMetadata(metadata);
24483
+ this.syncInnerMetadata();
24484
+ }
24485
+ resolveMonthLabels(metadata) {
24486
+ if (Array.isArray(metadata.monthLabels) && metadata.monthLabels.length >= 12) {
24487
+ return metadata.monthLabels.slice(0, 12);
24488
+ }
24489
+ const formatter = new Intl.DateTimeFormat('pt-BR', { month: 'short' });
24490
+ return Array.from({ length: 12 }, (_, index) => {
24491
+ const raw = formatter.format(new Date(2020, index, 1)).replace('.', '');
24492
+ return raw.charAt(0).toUpperCase() + raw.slice(1);
24493
+ });
24494
+ }
24495
+ syncInnerMetadata() {
24496
+ const metadata = this.resolvedMetadata();
24497
+ if (!metadata || !this.innerComponent)
24498
+ return;
24499
+ this.innerComponent.setMetadata(metadata);
24500
+ }
24501
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineMonthRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24502
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.17", type: InlineMonthRangeComponent, isStandalone: true, selector: "pdx-inline-month-range", inputs: { readonlyMode: "readonlyMode", disabledMode: "disabledMode", visible: "visible", presentationMode: "presentationMode" }, host: { properties: { "style.display": "visible ? null : \"none\"", "attr.aria-hidden": "visible ? null : \"true\"", "attr.data-field-type": "\"inlineMonthRange\"", "attr.data-field-name": "metadata()?.name", "attr.data-component-id": "componentId()" } }, providers: [
24503
+ {
24504
+ provide: NG_VALUE_ACCESSOR,
24505
+ useExisting: forwardRef(() => InlineMonthRangeComponent),
24506
+ multi: true,
24507
+ },
24508
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24509
+ <pdx-inline-range-slider
24510
+ [formControl]="control()"
24511
+ [readonlyMode]="readonlyMode"
24512
+ [disabledMode]="disabledMode"
24513
+ [visible]="visible"
24514
+ [presentationMode]="presentationMode"
24515
+ />
24516
+ `, isInline: true, dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: InlineRangeSliderComponent, selector: "pdx-inline-range-slider", inputs: ["readonlyMode", "disabledMode", "visible", "presentationMode"] }] });
24517
+ }
24518
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineMonthRangeComponent, decorators: [{
24519
+ type: Component,
24520
+ args: [{
24521
+ selector: 'pdx-inline-month-range',
24522
+ standalone: true,
24523
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24524
+ template: `
24525
+ <pdx-inline-range-slider
24526
+ [formControl]="control()"
24527
+ [readonlyMode]="readonlyMode"
24528
+ [disabledMode]="disabledMode"
24529
+ [visible]="visible"
24530
+ [presentationMode]="presentationMode"
24531
+ />
24532
+ `,
24533
+ providers: [
24534
+ {
24535
+ provide: NG_VALUE_ACCESSOR,
24536
+ useExisting: forwardRef(() => InlineMonthRangeComponent),
24537
+ multi: true,
24538
+ },
24539
+ ],
24540
+ host: {
24541
+ '[style.display]': 'visible ? null : "none"',
24542
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24543
+ '[attr.data-field-type]': '"inlineMonthRange"',
24544
+ '[attr.data-field-name]': 'metadata()?.name',
24545
+ '[attr.data-component-id]': 'componentId()',
24546
+ },
24547
+ }]
24548
+ }], propDecorators: { innerComponent: [{
24549
+ type: ViewChild,
24550
+ args: [InlineRangeSliderComponent]
24551
+ }], readonlyMode: [{
24552
+ type: Input
24553
+ }], disabledMode: [{
24554
+ type: Input
24555
+ }], visible: [{
24556
+ type: Input
24557
+ }], presentationMode: [{
24558
+ type: Input
24559
+ }] } });
24560
+
23676
24561
  class InlineDateComponent extends MaterialDatepickerComponent {
23677
24562
  inputEl;
23678
24563
  measureEl;
@@ -45619,6 +46504,60 @@ const PDX_INLINE_RANGE_SLIDER_COMPONENT_METADATA = {
45619
46504
  lib: '@praxisui/dynamic-fields',
45620
46505
  };
45621
46506
 
46507
+ const PDX_INLINE_PERIOD_RANGE_COMPONENT_METADATA = {
46508
+ id: 'pdx-inline-period-range',
46509
+ selector: 'pdx-inline-period-range',
46510
+ component: InlinePeriodRangeComponent,
46511
+ friendlyName: 'Inline Period Range',
46512
+ description: 'Faixa temporal corporativa por granularidade, cobrindo meses, trimestres, anos e períodos fiscais em um contrato inline canônico.',
46513
+ icon: 'date_range',
46514
+ inputs: [
46515
+ { name: 'metadata', type: 'InlinePeriodRangeMetadata', description: 'Configuração do campo' },
46516
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46517
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46518
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46519
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46520
+ ],
46521
+ tags: ['widget', 'field', 'period', 'range', 'filter', 'inline', 'temporal'],
46522
+ lib: '@praxisui/dynamic-fields',
46523
+ };
46524
+
46525
+ const PDX_INLINE_YEAR_RANGE_COMPONENT_METADATA = {
46526
+ id: 'pdx-inline-year-range',
46527
+ selector: 'pdx-inline-year-range',
46528
+ component: InlineYearRangeComponent,
46529
+ friendlyName: 'Inline Year Range',
46530
+ description: 'Faixa anual compacta para filtros inline corporativos, com slider dedicado, presets por período recente e leitura semântica orientada a analytics.',
46531
+ icon: 'calendar_today',
46532
+ inputs: [
46533
+ { name: 'metadata', type: 'InlineYearRangeMetadata', description: 'Configuração do campo' },
46534
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46535
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46536
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46537
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46538
+ ],
46539
+ tags: ['widget', 'field', 'year', 'range', 'filter', 'inline'],
46540
+ lib: '@praxisui/dynamic-fields',
46541
+ };
46542
+
46543
+ const PDX_INLINE_MONTH_RANGE_COMPONENT_METADATA = {
46544
+ id: 'pdx-inline-month-range',
46545
+ selector: 'pdx-inline-month-range',
46546
+ component: InlineMonthRangeComponent,
46547
+ friendlyName: 'Inline Month Range',
46548
+ description: 'Faixa mensal compacta para filtros inline, com leitura por nomes de mês e atalhos de trimestre/semestre para dashboards analíticos.',
46549
+ icon: 'calendar_view_month',
46550
+ inputs: [
46551
+ { name: 'metadata', type: 'InlineMonthRangeMetadata', description: 'Configuração do campo' },
46552
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46553
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46554
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46555
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46556
+ ],
46557
+ tags: ['widget', 'field', 'month', 'range', 'filter', 'inline'],
46558
+ lib: '@praxisui/dynamic-fields',
46559
+ };
46560
+
45622
46561
  const PDX_INLINE_DATE_COMPONENT_METADATA = {
45623
46562
  id: 'pdx-inline-date',
45624
46563
  selector: 'pdx-inline-date',
@@ -47047,6 +47986,1139 @@ function providePraxisDynamicFieldsCoreNoDefaults() {
47047
47986
  ];
47048
47987
  }
47049
47988
 
47989
+ const DYNAMIC_FIELD_DEFAULT_STATE_RECIPE = {
47990
+ state: 'default',
47991
+ label: 'Default',
47992
+ supported: true,
47993
+ };
47994
+ const DYNAMIC_FIELD_FILLED_STATE_RECIPE = {
47995
+ state: 'filled',
47996
+ label: 'Filled',
47997
+ supported: true,
47998
+ note: 'Consumer or playground should provide a representative value for the field.',
47999
+ };
48000
+ const DYNAMIC_FIELD_DISABLED_STATE_RECIPE = {
48001
+ state: 'disabled',
48002
+ label: 'Disabled',
48003
+ supported: true,
48004
+ metadataPatch: { disabled: true },
48005
+ };
48006
+ const DYNAMIC_FIELD_READONLY_STATE_RECIPE = {
48007
+ state: 'readonly',
48008
+ label: 'Readonly',
48009
+ supported: true,
48010
+ metadataPatch: { readonly: true },
48011
+ };
48012
+ const DYNAMIC_FIELD_ERROR_STATE_RECIPE = {
48013
+ state: 'error',
48014
+ label: 'Error',
48015
+ supported: true,
48016
+ metadataPatch: {
48017
+ required: true,
48018
+ validators: {
48019
+ requiredMessage: 'Governed sample error state for playground preview.',
48020
+ validationTrigger: 'immediate',
48021
+ },
48022
+ },
48023
+ errorMessage: 'Governed sample error state for playground preview.',
48024
+ };
48025
+ const DYNAMIC_FIELD_BASE_STATE_RECIPES = [
48026
+ DYNAMIC_FIELD_DEFAULT_STATE_RECIPE,
48027
+ DYNAMIC_FIELD_FILLED_STATE_RECIPE,
48028
+ DYNAMIC_FIELD_DISABLED_STATE_RECIPE,
48029
+ DYNAMIC_FIELD_READONLY_STATE_RECIPE,
48030
+ DYNAMIC_FIELD_ERROR_STATE_RECIPE,
48031
+ ];
48032
+ function createDynamicFieldPreviewRecipe(input) {
48033
+ return {
48034
+ recipeId: input.recipeId,
48035
+ fieldName: input.fieldName,
48036
+ label: input.label,
48037
+ description: input.description,
48038
+ baseMetadata: {
48039
+ name: input.fieldName,
48040
+ label: input.label,
48041
+ controlType: input.controlType,
48042
+ ...(input.metadata ?? {}),
48043
+ },
48044
+ states: input.states ? [...input.states] : [...DYNAMIC_FIELD_BASE_STATE_RECIPES],
48045
+ };
48046
+ }
48047
+
48048
+ const PRIMARY_CATALOG_SLUG = 'dynamic-fields-field-catalog';
48049
+ const INLINE_CATALOG_SLUG = 'dynamic-fields-inline-filter-catalog';
48050
+ const OVERVIEW_SLUG = 'dynamic-fields-overview';
48051
+ const SELECTION_GUIDE_SLUG = 'dynamic-fields-field-selection-guide';
48052
+ const INLINE_SELECTION_GUIDE_SLUG = 'dynamic-fields-inline-filter-selection-guide';
48053
+ const DEFAULT_A11Y_NOTES = [
48054
+ 'Use labels claros e nao dependa apenas de placeholder.',
48055
+ 'Garanta foco visivel, contraste AA e mensagens de erro textuais.',
48056
+ ];
48057
+ const DEFAULT_THEMING_NOTES = [
48058
+ 'O preview deve respeitar tokens do host e nao introduzir skin isolada da landing.',
48059
+ ];
48060
+ function detailFragment(controlType) {
48061
+ return controlType.toLowerCase().replace(/[^a-z0-9-]+/g, '-');
48062
+ }
48063
+ function jsonApiPath(relativePath) {
48064
+ return `projects/praxis-dynamic-fields/src/lib/components/${relativePath}`;
48065
+ }
48066
+ function createEntry(input) {
48067
+ const states = input.states ?? ['default', 'filled', 'disabled', 'readonly', 'error'];
48068
+ return {
48069
+ id: input.id,
48070
+ controlType: input.controlType,
48071
+ track: input.track,
48072
+ family: input.family,
48073
+ status: input.status ?? 'stable',
48074
+ friendlyName: input.friendlyName,
48075
+ description: input.description,
48076
+ tags: input.tags,
48077
+ keywords: input.keywords ?? input.tags,
48078
+ valueShape: input.valueShape,
48079
+ recommendedWhen: input.recommendedWhen,
48080
+ avoidWhen: input.avoidWhen,
48081
+ dataSourceKind: input.dataSourceKind,
48082
+ supportsStates: states,
48083
+ docs: {
48084
+ catalogSlug: input.catalogSlug ?? (input.track === 'inline-filter' ? INLINE_CATALOG_SLUG : PRIMARY_CATALOG_SLUG),
48085
+ detailFragment: input.detailFragment ?? detailFragment(input.controlType),
48086
+ selectionGuideSlug: input.selectionGuideSlug ?? (input.track === 'inline-filter' ? INLINE_SELECTION_GUIDE_SLUG : SELECTION_GUIDE_SLUG),
48087
+ overviewSlug: input.overviewSlug ?? OVERVIEW_SLUG,
48088
+ jsonApiPath: input.apiPath,
48089
+ },
48090
+ previewRecipe: createDynamicFieldPreviewRecipe({
48091
+ recipeId: input.id,
48092
+ fieldName: `${input.id}Field`,
48093
+ label: input.friendlyName,
48094
+ controlType: input.controlType,
48095
+ description: input.description,
48096
+ metadata: input.metadata,
48097
+ states: input.stateRecipes,
48098
+ }),
48099
+ snippetRecipe: {
48100
+ language: input.snippetLanguage ?? 'json',
48101
+ snippet: input.snippet ??
48102
+ `{ "name": "${input.id}", "label": "${input.friendlyName}", "controlType": "${input.controlType}" }`,
48103
+ note: input.snippetNote,
48104
+ },
48105
+ a11yNotes: input.a11yNotes ?? DEFAULT_A11Y_NOTES,
48106
+ themingNotes: input.themingNotes ?? DEFAULT_THEMING_NOTES,
48107
+ };
48108
+ }
48109
+ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48110
+ createEntry({
48111
+ id: 'text-input',
48112
+ controlType: FieldControlType.INPUT,
48113
+ track: 'primary-form',
48114
+ family: 'text',
48115
+ friendlyName: 'Text input',
48116
+ description: 'Entrada textual curta e canonica para formularios metadata-driven.',
48117
+ tags: ['text', 'input', 'form'],
48118
+ valueShape: 'string',
48119
+ recommendedWhen: ['texto livre curto', 'nome', 'descricao curta'],
48120
+ avoidWhen: ['lista governada de opcoes', 'texto longo multi-linha'],
48121
+ dataSourceKind: 'local',
48122
+ apiPath: jsonApiPath('text-input/pdx-text-input.json-api.md'),
48123
+ metadata: { placeholder: 'Type here' },
48124
+ }),
48125
+ createEntry({
48126
+ id: 'email-input',
48127
+ controlType: FieldControlType.EMAIL_INPUT,
48128
+ track: 'primary-form',
48129
+ family: 'text',
48130
+ friendlyName: 'Email input',
48131
+ description: 'Campo textual especializado para emails.',
48132
+ tags: ['text', 'email', 'validation'],
48133
+ valueShape: 'string',
48134
+ recommendedWhen: ['email validado', 'contato institucional'],
48135
+ avoidWhen: ['texto livre generico'],
48136
+ dataSourceKind: 'local',
48137
+ apiPath: jsonApiPath('email-input/pdx-email-input.json-api.md'),
48138
+ metadata: { placeholder: 'name@company.com' },
48139
+ }),
48140
+ createEntry({
48141
+ id: 'password-input',
48142
+ controlType: FieldControlType.PASSWORD,
48143
+ track: 'primary-form',
48144
+ family: 'text',
48145
+ friendlyName: 'Password input',
48146
+ description: 'Campo de segredo com mascaramento e interacao apropriada.',
48147
+ tags: ['text', 'password', 'security'],
48148
+ valueShape: 'string',
48149
+ recommendedWhen: ['segredos', 'credenciais'],
48150
+ avoidWhen: ['valor que precisa ficar legivel em tela'],
48151
+ dataSourceKind: 'local',
48152
+ apiPath: jsonApiPath('password-input/pdx-password-input.json-api.md'),
48153
+ }),
48154
+ createEntry({
48155
+ id: 'textarea',
48156
+ controlType: FieldControlType.TEXTAREA,
48157
+ track: 'primary-form',
48158
+ family: 'text',
48159
+ friendlyName: 'Textarea',
48160
+ description: 'Campo multi-linha para observacoes e conteudo textual maior.',
48161
+ tags: ['text', 'textarea', 'multiline'],
48162
+ valueShape: 'string',
48163
+ recommendedWhen: ['descricao longa', 'observacoes', 'justificativa'],
48164
+ avoidWhen: ['texto curto de uma linha'],
48165
+ dataSourceKind: 'local',
48166
+ apiPath: jsonApiPath('material-textarea/pdx-material-textarea.json-api.md'),
48167
+ metadata: { rows: 4, placeholder: 'Describe the situation' },
48168
+ }),
48169
+ createEntry({
48170
+ id: 'search-input',
48171
+ controlType: FieldControlType.SEARCH_INPUT,
48172
+ track: 'primary-form',
48173
+ family: 'text',
48174
+ friendlyName: 'Search input',
48175
+ description: 'Entrada textual dedicada a busca.',
48176
+ tags: ['text', 'search', 'query'],
48177
+ valueShape: 'string',
48178
+ recommendedWhen: ['busca textual', 'query curta'],
48179
+ avoidWhen: ['campo de negocio comum sem semantica de busca'],
48180
+ dataSourceKind: 'local',
48181
+ apiPath: jsonApiPath('search-input/pdx-search-input.json-api.md'),
48182
+ metadata: { placeholder: 'Search records' },
48183
+ }),
48184
+ createEntry({
48185
+ id: 'phone-input',
48186
+ controlType: FieldControlType.PHONE,
48187
+ track: 'primary-form',
48188
+ family: 'text',
48189
+ friendlyName: 'Phone input',
48190
+ description: 'Campo especializado para telefone.',
48191
+ tags: ['text', 'phone', 'formatted'],
48192
+ valueShape: 'string',
48193
+ recommendedWhen: ['telefone', 'contato'],
48194
+ avoidWhen: ['dominio sem telefone'],
48195
+ dataSourceKind: 'local',
48196
+ status: 'partial-docs',
48197
+ apiPath: jsonApiPath('phone-input/pdx-phone-input.json-api.md'),
48198
+ }),
48199
+ createEntry({
48200
+ id: 'url-input',
48201
+ controlType: FieldControlType.URL_INPUT,
48202
+ track: 'primary-form',
48203
+ family: 'text',
48204
+ friendlyName: 'URL input',
48205
+ description: 'Campo para links e URLs.',
48206
+ tags: ['text', 'url', 'link'],
48207
+ valueShape: 'string',
48208
+ recommendedWhen: ['website', 'link institucional'],
48209
+ avoidWhen: ['texto generico'],
48210
+ dataSourceKind: 'local',
48211
+ status: 'partial-docs',
48212
+ apiPath: jsonApiPath('url-input/pdx-url-input.json-api.md'),
48213
+ }),
48214
+ createEntry({
48215
+ id: 'cpf-cnpj-input',
48216
+ controlType: FieldControlType.CPF_CNPJ_INPUT,
48217
+ track: 'primary-form',
48218
+ family: 'text',
48219
+ friendlyName: 'CPF/CNPJ input',
48220
+ description: 'Campo regionalizado para documento brasileiro.',
48221
+ tags: ['text', 'brazil', 'document'],
48222
+ valueShape: 'string',
48223
+ recommendedWhen: ['CPF', 'CNPJ', 'documento BR'],
48224
+ avoidWhen: ['dominio internacional ou sem documento nacional'],
48225
+ dataSourceKind: 'local',
48226
+ status: 'partial-docs',
48227
+ apiPath: jsonApiPath('material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md'),
48228
+ }),
48229
+ createEntry({
48230
+ id: 'number-input',
48231
+ controlType: FieldControlType.NUMERIC_TEXT_BOX,
48232
+ track: 'primary-form',
48233
+ family: 'numbers-range',
48234
+ friendlyName: 'Number input',
48235
+ description: 'Campo numerico canonico para valores pontuais.',
48236
+ tags: ['number', 'numeric', 'form'],
48237
+ valueShape: 'number',
48238
+ recommendedWhen: ['idade', 'quantidade', 'score unico'],
48239
+ avoidWhen: ['range', 'moeda'],
48240
+ dataSourceKind: 'local',
48241
+ status: 'partial-docs',
48242
+ apiPath: jsonApiPath('number-input/pdx-number-input.json-api.md'),
48243
+ }),
48244
+ createEntry({
48245
+ id: 'currency-input',
48246
+ controlType: FieldControlType.CURRENCY_INPUT,
48247
+ track: 'primary-form',
48248
+ family: 'numbers-range',
48249
+ friendlyName: 'Currency input',
48250
+ description: 'Campo monetario para valor unico.',
48251
+ tags: ['number', 'currency', 'money'],
48252
+ valueShape: 'number',
48253
+ recommendedWhen: ['orcamento', 'ticket medio', 'valor monetario unico'],
48254
+ avoidWhen: ['faixa monetaria'],
48255
+ dataSourceKind: 'local',
48256
+ apiPath: jsonApiPath('material-currency/pdx-material-currency.json-api.md'),
48257
+ metadata: { currency: 'BRL', locale: 'pt-BR' },
48258
+ }),
48259
+ createEntry({
48260
+ id: 'slider',
48261
+ controlType: FieldControlType.SLIDER,
48262
+ track: 'primary-form',
48263
+ family: 'numbers-range',
48264
+ friendlyName: 'Slider',
48265
+ description: 'Campo de faixa continua para valor unico.',
48266
+ tags: ['number', 'slider', 'range'],
48267
+ valueShape: 'number',
48268
+ recommendedWhen: ['nota', 'nivel', 'escala continua'],
48269
+ avoidWhen: ['valor financeiro complexo', 'range duplo'],
48270
+ dataSourceKind: 'local',
48271
+ apiPath: jsonApiPath('material-slider/pdx-material-slider.json-api.md'),
48272
+ metadata: { min: 0, max: 10 },
48273
+ }),
48274
+ createEntry({
48275
+ id: 'range-slider',
48276
+ controlType: FieldControlType.RANGE_SLIDER,
48277
+ track: 'primary-form',
48278
+ family: 'numbers-range',
48279
+ friendlyName: 'Range slider',
48280
+ description: 'Campo para faixa numerica com um ou dois bounds.',
48281
+ tags: ['number', 'range', 'slider'],
48282
+ valueShape: 'number | { start, end }',
48283
+ recommendedWhen: ['faixa numerica', 'limite minimo e maximo'],
48284
+ avoidWhen: ['datas ou horarios'],
48285
+ dataSourceKind: 'local',
48286
+ status: 'partial-docs',
48287
+ apiPath: jsonApiPath('material-range-slider/pdx-material-range-slider.json-api.md'),
48288
+ }),
48289
+ createEntry({
48290
+ id: 'price-range',
48291
+ controlType: FieldControlType.PRICE_RANGE,
48292
+ track: 'primary-form',
48293
+ family: 'numbers-range',
48294
+ friendlyName: 'Price range',
48295
+ description: 'Faixa monetaria com semantica propria.',
48296
+ tags: ['number', 'currency', 'range'],
48297
+ valueShape: '{ min, max }',
48298
+ recommendedWhen: ['faixa de preco', 'banda salarial', 'orcamento minimo/maximo'],
48299
+ avoidWhen: ['valor monetario unico'],
48300
+ dataSourceKind: 'local',
48301
+ status: 'partial-docs',
48302
+ apiPath: jsonApiPath('material-price-range/pdx-material-price-range.json-api.md'),
48303
+ metadata: { currency: 'BRL', locale: 'pt-BR' },
48304
+ }),
48305
+ createEntry({
48306
+ id: 'rating',
48307
+ controlType: FieldControlType.RATING,
48308
+ track: 'primary-form',
48309
+ family: 'numbers-range',
48310
+ friendlyName: 'Rating',
48311
+ description: 'Controle visual de nota.',
48312
+ tags: ['number', 'rating', 'visual'],
48313
+ valueShape: 'number',
48314
+ recommendedWhen: ['avaliacao visual', 'satisfacao', 'score legivel'],
48315
+ avoidWhen: ['quando numero bruto ja basta'],
48316
+ dataSourceKind: 'local',
48317
+ apiPath: jsonApiPath('material-rating/pdx-material-rating.json-api.md'),
48318
+ metadata: { max: 5 },
48319
+ }),
48320
+ createEntry({
48321
+ id: 'date-input',
48322
+ controlType: FieldControlType.DATE_INPUT,
48323
+ track: 'primary-form',
48324
+ family: 'date-time',
48325
+ friendlyName: 'Date input',
48326
+ description: 'Input nativo de data.',
48327
+ tags: ['date', 'native', 'time'],
48328
+ valueShape: 'string | Date',
48329
+ recommendedWhen: ['integracao simples com input nativo'],
48330
+ avoidWhen: ['quando a UX Material padronizada e obrigatoria'],
48331
+ dataSourceKind: 'local',
48332
+ status: 'partial-docs',
48333
+ apiPath: jsonApiPath('date-input/pdx-date-input.json-api.md'),
48334
+ }),
48335
+ createEntry({
48336
+ id: 'date-picker',
48337
+ controlType: FieldControlType.DATE_PICKER,
48338
+ track: 'primary-form',
48339
+ family: 'date-time',
48340
+ friendlyName: 'Date picker',
48341
+ description: 'Datepicker Material canonico.',
48342
+ tags: ['date', 'picker', 'material'],
48343
+ valueShape: 'Date | string',
48344
+ recommendedWhen: ['data unica', 'consistencia de design system'],
48345
+ avoidWhen: ['range temporal'],
48346
+ dataSourceKind: 'local',
48347
+ apiPath: jsonApiPath('material-datepicker/pdx-material-datepicker.json-api.md'),
48348
+ }),
48349
+ createEntry({
48350
+ id: 'date-range',
48351
+ controlType: FieldControlType.DATE_RANGE,
48352
+ track: 'primary-form',
48353
+ family: 'date-time',
48354
+ friendlyName: 'Date range',
48355
+ description: 'Intervalo de datas.',
48356
+ tags: ['date', 'range', 'time'],
48357
+ valueShape: '{ startDate, endDate }',
48358
+ recommendedWhen: ['periodo', 'janela temporal'],
48359
+ avoidWhen: ['data unica'],
48360
+ dataSourceKind: 'local',
48361
+ apiPath: jsonApiPath('material-date-range/pdx-material-date-range.json-api.md'),
48362
+ }),
48363
+ createEntry({
48364
+ id: 'datetime-local',
48365
+ controlType: FieldControlType.DATETIME_LOCAL_INPUT,
48366
+ track: 'primary-form',
48367
+ family: 'date-time',
48368
+ friendlyName: 'Datetime local',
48369
+ description: 'Campo unificado para data e hora local.',
48370
+ tags: ['date', 'time', 'datetime'],
48371
+ valueShape: 'string',
48372
+ recommendedWhen: ['agendamento local', 'data + hora no mesmo campo'],
48373
+ avoidWhen: ['quando data e hora precisam de UX separada'],
48374
+ dataSourceKind: 'local',
48375
+ status: 'partial-docs',
48376
+ apiPath: jsonApiPath('datetime-local-input/pdx-datetime-local-input.json-api.md'),
48377
+ }),
48378
+ createEntry({
48379
+ id: 'month-input',
48380
+ controlType: FieldControlType.MONTH_INPUT,
48381
+ track: 'primary-form',
48382
+ family: 'date-time',
48383
+ friendlyName: 'Month input',
48384
+ description: 'Campo especializado para mes e ano.',
48385
+ tags: ['date', 'month', 'competence'],
48386
+ valueShape: 'string',
48387
+ recommendedWhen: ['competencia', 'mes/ano'],
48388
+ avoidWhen: ['data completa'],
48389
+ dataSourceKind: 'local',
48390
+ status: 'partial-docs',
48391
+ apiPath: jsonApiPath('month-input/pdx-month-input.json-api.md'),
48392
+ }),
48393
+ createEntry({
48394
+ id: 'time-input',
48395
+ controlType: FieldControlType.TIME_INPUT,
48396
+ track: 'primary-form',
48397
+ family: 'date-time',
48398
+ friendlyName: 'Time input',
48399
+ description: 'Campo simples para horario.',
48400
+ tags: ['time', 'input', 'hour'],
48401
+ valueShape: 'string',
48402
+ recommendedWhen: ['hora simples', 'slot horario'],
48403
+ avoidWhen: ['range horario'],
48404
+ dataSourceKind: 'local',
48405
+ apiPath: jsonApiPath('time-input/pdx-time-input.json-api.md'),
48406
+ }),
48407
+ createEntry({
48408
+ id: 'time-picker',
48409
+ controlType: FieldControlType.TIME_PICKER,
48410
+ track: 'primary-form',
48411
+ family: 'date-time',
48412
+ friendlyName: 'Time picker',
48413
+ description: 'Seletor Material de horario.',
48414
+ tags: ['time', 'picker', 'hour'],
48415
+ valueShape: 'string',
48416
+ recommendedWhen: ['escolha guiada de horario'],
48417
+ avoidWhen: ['texto/mascara simples e suficiente'],
48418
+ dataSourceKind: 'local',
48419
+ apiPath: jsonApiPath('material-timepicker/pdx-material-timepicker.json-api.md'),
48420
+ }),
48421
+ createEntry({
48422
+ id: 'time-range',
48423
+ controlType: FieldControlType.TIME_RANGE,
48424
+ track: 'primary-form',
48425
+ family: 'date-time',
48426
+ friendlyName: 'Time range',
48427
+ description: 'Intervalo de horario.',
48428
+ tags: ['time', 'range', 'hour'],
48429
+ valueShape: '{ start, end }',
48430
+ recommendedWhen: ['janela de atendimento', 'turno'],
48431
+ avoidWhen: ['horario unico'],
48432
+ dataSourceKind: 'local',
48433
+ status: 'partial-docs',
48434
+ apiPath: jsonApiPath('pdx-material-time-range/pdx-material-time-range.json-api.md'),
48435
+ }),
48436
+ createEntry({
48437
+ id: 'week-input',
48438
+ controlType: FieldControlType.WEEK_INPUT,
48439
+ track: 'primary-form',
48440
+ family: 'date-time',
48441
+ friendlyName: 'Week input',
48442
+ description: 'Campo de semana ISO.',
48443
+ tags: ['date', 'week', 'iso'],
48444
+ valueShape: 'string',
48445
+ recommendedWhen: ['semana de referencia'],
48446
+ avoidWhen: ['negocio centrado em datas convencionais'],
48447
+ dataSourceKind: 'local',
48448
+ status: 'partial-docs',
48449
+ apiPath: jsonApiPath('week-input/pdx-week-input.json-api.md'),
48450
+ }),
48451
+ createEntry({
48452
+ id: 'year-input',
48453
+ controlType: FieldControlType.YEAR_INPUT,
48454
+ track: 'primary-form',
48455
+ family: 'date-time',
48456
+ friendlyName: 'Year input',
48457
+ description: 'Campo para ano isolado.',
48458
+ tags: ['date', 'year', 'fiscal'],
48459
+ valueShape: 'number | string',
48460
+ recommendedWhen: ['ano fiscal', 'ano civil isolado'],
48461
+ avoidWhen: ['mes/ano ou data completa'],
48462
+ dataSourceKind: 'local',
48463
+ status: 'partial-docs',
48464
+ apiPath: jsonApiPath('pdx-year-input/pdx-year-input.json-api.md'),
48465
+ }),
48466
+ createEntry({
48467
+ id: 'select',
48468
+ controlType: FieldControlType.SELECT,
48469
+ track: 'primary-form',
48470
+ family: 'selection',
48471
+ friendlyName: 'Select',
48472
+ description: 'Lista fechada simples para escolha unica.',
48473
+ tags: ['selection', 'select', 'options'],
48474
+ valueShape: 'string | number | object',
48475
+ recommendedWhen: ['lista pequena estavel', 'escolha unica'],
48476
+ avoidWhen: ['lista grande ou remota'],
48477
+ dataSourceKind: 'mixed',
48478
+ apiPath: jsonApiPath('material-select/pdx-material-select.json-api.md'),
48479
+ metadata: {
48480
+ options: [
48481
+ { label: 'Active', value: 'ACTIVE' },
48482
+ { label: 'Paused', value: 'PAUSED' },
48483
+ ],
48484
+ },
48485
+ }),
48486
+ createEntry({
48487
+ id: 'searchable-select',
48488
+ controlType: FieldControlType.SEARCHABLE_SELECT,
48489
+ track: 'primary-form',
48490
+ family: 'selection',
48491
+ friendlyName: 'Searchable select',
48492
+ description: 'Select com busca local para listas medias ou grandes.',
48493
+ tags: ['selection', 'select', 'search'],
48494
+ valueShape: 'string | number | object',
48495
+ recommendedWhen: ['lista maior com busca', 'descoberta de opcao'],
48496
+ avoidWhen: ['lista remota sob demanda'],
48497
+ dataSourceKind: 'mixed',
48498
+ status: 'partial-docs',
48499
+ apiPath: jsonApiPath('material-searchable-select/pdx-material-searchable-select.json-api.md'),
48500
+ }),
48501
+ createEntry({
48502
+ id: 'async-select',
48503
+ controlType: FieldControlType.ASYNC_SELECT,
48504
+ track: 'primary-form',
48505
+ family: 'selection',
48506
+ friendlyName: 'Async select',
48507
+ description: 'Select remoto para opcoes sob demanda.',
48508
+ tags: ['selection', 'remote', 'async'],
48509
+ valueShape: 'string | number | object',
48510
+ recommendedWhen: ['lookup remoto', 'lista paginada', 'catalogo grande'],
48511
+ avoidWhen: ['opcoes locais pequenas'],
48512
+ dataSourceKind: 'remote',
48513
+ status: 'partial-docs',
48514
+ apiPath: jsonApiPath('material-async-select/pdx-material-async-select.json-api.md'),
48515
+ metadata: { resourcePath: 'cities', optionLabelKey: 'name', optionValueKey: 'id' },
48516
+ }),
48517
+ createEntry({
48518
+ id: 'autocomplete',
48519
+ controlType: FieldControlType.AUTO_COMPLETE,
48520
+ track: 'primary-form',
48521
+ family: 'selection',
48522
+ friendlyName: 'Autocomplete',
48523
+ description: 'Busca incremental com sugestoes.',
48524
+ tags: ['selection', 'autocomplete', 'search'],
48525
+ valueShape: 'string | number | object',
48526
+ recommendedWhen: ['sugestoes incrementais', 'descoberta textual'],
48527
+ avoidWhen: ['lista pequena e fechada'],
48528
+ dataSourceKind: 'mixed',
48529
+ apiPath: jsonApiPath('material-autocomplete/pdx-material-autocomplete.json-api.md'),
48530
+ }),
48531
+ createEntry({
48532
+ id: 'multi-select',
48533
+ controlType: FieldControlType.MULTI_SELECT,
48534
+ track: 'primary-form',
48535
+ family: 'selection',
48536
+ friendlyName: 'Multi select',
48537
+ description: 'Selecao multipla de opcoes.',
48538
+ tags: ['selection', 'multiple', 'options'],
48539
+ valueShape: 'unknown[]',
48540
+ recommendedWhen: ['multiplas escolhas discretas'],
48541
+ avoidWhen: ['escolha unica'],
48542
+ dataSourceKind: 'mixed',
48543
+ status: 'partial-docs',
48544
+ apiPath: jsonApiPath('material-multi-select/pdx-material-multi-select.json-api.md'),
48545
+ }),
48546
+ createEntry({
48547
+ id: 'multi-select-tree',
48548
+ controlType: FieldControlType.MULTI_SELECT_TREE,
48549
+ track: 'primary-form',
48550
+ family: 'trees-lists',
48551
+ friendlyName: 'Multi select tree',
48552
+ description: 'Arvore hierarquica com selecao multipla.',
48553
+ tags: ['tree', 'selection', 'hierarchy'],
48554
+ valueShape: 'unknown[]',
48555
+ recommendedWhen: ['taxonomia hierarquica com multiplas escolhas'],
48556
+ avoidWhen: ['lista plana pequena'],
48557
+ dataSourceKind: 'mixed',
48558
+ status: 'partial-docs',
48559
+ apiPath: jsonApiPath('material-multi-select-tree/pdx-material-multi-select-tree.json-api.md'),
48560
+ }),
48561
+ createEntry({
48562
+ id: 'tree-select',
48563
+ controlType: FieldControlType.TREE_SELECT,
48564
+ track: 'primary-form',
48565
+ family: 'trees-lists',
48566
+ friendlyName: 'Tree select',
48567
+ description: 'Arvore hierarquica com selecao simples.',
48568
+ tags: ['tree', 'selection', 'hierarchy'],
48569
+ valueShape: 'string | number | object',
48570
+ recommendedWhen: ['estrutura hierarquica com escolha unica'],
48571
+ avoidWhen: ['multiplas escolhas'],
48572
+ dataSourceKind: 'mixed',
48573
+ status: 'partial-docs',
48574
+ apiPath: jsonApiPath('material-tree-select/pdx-material-tree-select.json-api.md'),
48575
+ }),
48576
+ createEntry({
48577
+ id: 'selection-list',
48578
+ controlType: FieldControlType.SELECTION_LIST,
48579
+ track: 'primary-form',
48580
+ family: 'trees-lists',
48581
+ friendlyName: 'Selection list',
48582
+ description: 'Lista explicita de opcoes selecionaveis.',
48583
+ tags: ['list', 'selection', 'explicit'],
48584
+ valueShape: 'unknown[]',
48585
+ recommendedWhen: ['lista visivel de opcoes', 'affordance forte de lista'],
48586
+ avoidWhen: ['dropdown compacto resolve melhor'],
48587
+ dataSourceKind: 'mixed',
48588
+ status: 'partial-docs',
48589
+ apiPath: jsonApiPath('material-selection-list/pdx-material-selection-list.json-api.md'),
48590
+ }),
48591
+ createEntry({
48592
+ id: 'transfer-list',
48593
+ controlType: FieldControlType.TRANSFER_LIST,
48594
+ track: 'primary-form',
48595
+ family: 'trees-lists',
48596
+ friendlyName: 'Transfer list',
48597
+ description: 'Move itens entre listas disponivel e selecionado.',
48598
+ tags: ['list', 'transfer', 'selection'],
48599
+ valueShape: 'unknown[]',
48600
+ recommendedWhen: ['alocacao entre disponiveis e selecionados'],
48601
+ avoidWhen: ['selecao simples ou pequena'],
48602
+ dataSourceKind: 'mixed',
48603
+ status: 'partial-docs',
48604
+ apiPath: jsonApiPath('material-transfer-list/pdx-material-transfer-list.json-api.md'),
48605
+ }),
48606
+ createEntry({
48607
+ id: 'chip-input',
48608
+ controlType: FieldControlType.CHIP_INPUT,
48609
+ track: 'primary-form',
48610
+ family: 'trees-lists',
48611
+ friendlyName: 'Chip input',
48612
+ description: 'Entrada de itens textuais em formato de chips.',
48613
+ tags: ['chips', 'list', 'text'],
48614
+ valueShape: 'string[]',
48615
+ recommendedWhen: ['emails', 'labels editaveis', 'lista textual'],
48616
+ avoidWhen: ['valor unico'],
48617
+ dataSourceKind: 'local',
48618
+ status: 'partial-docs',
48619
+ apiPath: jsonApiPath('material-chips/pdx-material-chips.json-api.md'),
48620
+ }),
48621
+ createEntry({
48622
+ id: 'chip-list',
48623
+ controlType: FieldControlType.CHIP_LIST,
48624
+ track: 'primary-form',
48625
+ family: 'trees-lists',
48626
+ friendlyName: 'Chip list',
48627
+ description: 'Lista textual em chips.',
48628
+ tags: ['chips', 'list', 'display'],
48629
+ valueShape: 'string[]',
48630
+ recommendedWhen: ['lista curta em chips', 'edicao leve'],
48631
+ avoidWhen: ['valor unico'],
48632
+ dataSourceKind: 'local',
48633
+ status: 'partial-docs',
48634
+ apiPath: jsonApiPath('material-chips/pdx-material-chips.json-api.md'),
48635
+ }),
48636
+ createEntry({
48637
+ id: 'checkbox-group',
48638
+ controlType: FieldControlType.CHECKBOX,
48639
+ track: 'primary-form',
48640
+ family: 'toggle-choice',
48641
+ friendlyName: 'Checkbox group',
48642
+ description: 'Escolhas discretas booleanas ou multiplas.',
48643
+ tags: ['choice', 'checkbox', 'boolean'],
48644
+ valueShape: 'boolean | unknown[]',
48645
+ recommendedWhen: ['multiplas escolhas discretas', 'booleano com selectionMode apropriado'],
48646
+ avoidWhen: ['escolha unica'],
48647
+ dataSourceKind: 'mixed',
48648
+ apiPath: jsonApiPath('material-checkbox-group/pdx-material-checkbox-group.json-api.md'),
48649
+ }),
48650
+ createEntry({
48651
+ id: 'radio-group',
48652
+ controlType: FieldControlType.RADIO,
48653
+ track: 'primary-form',
48654
+ family: 'toggle-choice',
48655
+ friendlyName: 'Radio group',
48656
+ description: 'Escolha unica explicita.',
48657
+ tags: ['choice', 'radio', 'single'],
48658
+ valueShape: 'string | number | boolean',
48659
+ recommendedWhen: ['escolha unica com poucas opcoes e alta legibilidade'],
48660
+ avoidWhen: ['muitas opcoes'],
48661
+ dataSourceKind: 'mixed',
48662
+ apiPath: jsonApiPath('material-radio-group/pdx-material-radio-group.json-api.md'),
48663
+ }),
48664
+ createEntry({
48665
+ id: 'toggle',
48666
+ controlType: FieldControlType.TOGGLE,
48667
+ track: 'primary-form',
48668
+ family: 'toggle-choice',
48669
+ friendlyName: 'Toggle',
48670
+ description: 'Booleano binario on/off.',
48671
+ tags: ['choice', 'toggle', 'boolean'],
48672
+ valueShape: 'boolean',
48673
+ recommendedWhen: ['booleano simples'],
48674
+ avoidWhen: ['mais de dois estados'],
48675
+ dataSourceKind: 'local',
48676
+ apiPath: jsonApiPath('material-slide-toggle/pdx-material-slide-toggle.json-api.md'),
48677
+ }),
48678
+ createEntry({
48679
+ id: 'button-toggle',
48680
+ controlType: FieldControlType.BUTTON_TOGGLE,
48681
+ track: 'primary-form',
48682
+ family: 'toggle-choice',
48683
+ friendlyName: 'Button toggle',
48684
+ description: 'Grupo segmentado para poucas opcoes.',
48685
+ tags: ['choice', 'toggle', 'segmented'],
48686
+ valueShape: 'string | number',
48687
+ recommendedWhen: ['poucas opcoes curtas', 'segmentacao visivel'],
48688
+ avoidWhen: ['lista longa'],
48689
+ dataSourceKind: 'local',
48690
+ status: 'partial-docs',
48691
+ apiPath: jsonApiPath('material-button-toggle/pdx-material-button-toggle.json-api.md'),
48692
+ }),
48693
+ createEntry({
48694
+ id: 'file-upload',
48695
+ controlType: FieldControlType.FILE_UPLOAD,
48696
+ track: 'primary-form',
48697
+ family: 'upload-color-visual',
48698
+ friendlyName: 'File upload',
48699
+ description: 'Campo para anexos e documentos.',
48700
+ tags: ['upload', 'files', 'attachments'],
48701
+ valueShape: 'File | File[] | metadata',
48702
+ recommendedWhen: ['documentos', 'anexos', 'comprovantes'],
48703
+ avoidWhen: ['fluxo sem arquivos'],
48704
+ dataSourceKind: 'specialized',
48705
+ apiPath: jsonApiPath('material-file-upload/pdx-material-file-upload.json-api.md'),
48706
+ }),
48707
+ createEntry({
48708
+ id: 'color-input',
48709
+ controlType: FieldControlType.COLOR_INPUT,
48710
+ track: 'primary-form',
48711
+ family: 'upload-color-visual',
48712
+ friendlyName: 'Color input',
48713
+ description: 'Entrada simples de cor.',
48714
+ tags: ['color', 'input', 'visual'],
48715
+ valueShape: 'string',
48716
+ recommendedWhen: ['cor por valor simples'],
48717
+ avoidWhen: ['paleta rica ou presets'],
48718
+ dataSourceKind: 'local',
48719
+ apiPath: jsonApiPath('color-input/pdx-color-input.json-api.md'),
48720
+ }),
48721
+ createEntry({
48722
+ id: 'color-picker',
48723
+ controlType: FieldControlType.COLOR_PICKER,
48724
+ track: 'primary-form',
48725
+ family: 'upload-color-visual',
48726
+ friendlyName: 'Color picker',
48727
+ description: 'Picker avancado de cor com paleta.',
48728
+ tags: ['color', 'picker', 'visual'],
48729
+ valueShape: 'string',
48730
+ recommendedWhen: ['paleta rica', 'preset visual', 'tema'],
48731
+ avoidWhen: ['valor simples textual basta'],
48732
+ dataSourceKind: 'local',
48733
+ apiPath: jsonApiPath('color-picker/pdx-color-picker.json-api.md'),
48734
+ }),
48735
+ createEntry({
48736
+ id: 'avatar',
48737
+ controlType: FieldControlType.AVATAR,
48738
+ track: 'primary-form',
48739
+ family: 'upload-color-visual',
48740
+ friendlyName: 'Avatar',
48741
+ description: 'Representacao visual de entidade/usuario.',
48742
+ tags: ['visual', 'avatar', 'display'],
48743
+ valueShape: 'string | object',
48744
+ recommendedWhen: ['representacao visual de usuario ou entidade'],
48745
+ avoidWhen: ['captura de dado textual'],
48746
+ dataSourceKind: 'specialized',
48747
+ apiPath: jsonApiPath('material-avatar/pdx-material-avatar.json-api.md'),
48748
+ }),
48749
+ createEntry({
48750
+ id: 'button',
48751
+ controlType: FieldControlType.BUTTON,
48752
+ track: 'primary-form',
48753
+ family: 'upload-color-visual',
48754
+ friendlyName: 'Button',
48755
+ description: 'Acao auxiliar embutida no layout do formulario.',
48756
+ tags: ['action', 'button', 'visual'],
48757
+ valueShape: 'n/a',
48758
+ recommendedWhen: ['acao auxiliar no layout'],
48759
+ avoidWhen: ['submit/cancel padrao do form'],
48760
+ dataSourceKind: 'specialized',
48761
+ apiPath: jsonApiPath('material-button/pdx-material-button.json-api.md'),
48762
+ states: ['default', 'disabled', 'readonly'],
48763
+ }),
48764
+ createEntry({
48765
+ id: 'cron-builder',
48766
+ controlType: FieldControlType.CRON_BUILDER,
48767
+ track: 'primary-form',
48768
+ family: 'upload-color-visual',
48769
+ friendlyName: 'Cron builder',
48770
+ description: 'Controle especializado para expressoes CRON.',
48771
+ tags: ['cron', 'schedule', 'specialized'],
48772
+ valueShape: 'string',
48773
+ recommendedWhen: ['agenda cron', 'frequencia recorrente'],
48774
+ avoidWhen: ['datas ou ranges simples'],
48775
+ dataSourceKind: 'specialized',
48776
+ status: 'partial-docs',
48777
+ snippetNote: 'A documentacao detalhada continua vivendo na lib especializada @praxisui/cron-builder.',
48778
+ }),
48779
+ createEntry({
48780
+ id: 'inline-input',
48781
+ controlType: FieldControlType.INLINE_INPUT,
48782
+ track: 'inline-filter',
48783
+ family: 'text',
48784
+ friendlyName: 'Inline input',
48785
+ description: 'Filtro textual compacto para toolbar.',
48786
+ tags: ['inline', 'filter', 'text'],
48787
+ valueShape: 'string',
48788
+ recommendedWhen: ['busca curta em toolbar', 'identificador', 'nome'],
48789
+ avoidWhen: ['texto longo', 'validacao complexa'],
48790
+ dataSourceKind: 'local',
48791
+ apiPath: jsonApiPath('inline-input/pdx-inline-input.json-api.md'),
48792
+ }),
48793
+ createEntry({
48794
+ id: 'inline-select',
48795
+ controlType: FieldControlType.INLINE_SELECT,
48796
+ track: 'inline-filter',
48797
+ family: 'selection',
48798
+ friendlyName: 'Inline select',
48799
+ description: 'Selecao compacta em pill para filtros.',
48800
+ tags: ['inline', 'filter', 'selection'],
48801
+ valueShape: 'simple value',
48802
+ recommendedWhen: ['lista pequena ou media em toolbar'],
48803
+ avoidWhen: ['lookup remoto grande'],
48804
+ dataSourceKind: 'mixed',
48805
+ apiPath: jsonApiPath('inline-select/pdx-inline-select.json-api.md'),
48806
+ }),
48807
+ createEntry({
48808
+ id: 'inline-searchable-select',
48809
+ controlType: FieldControlType.INLINE_SEARCHABLE_SELECT,
48810
+ track: 'inline-filter',
48811
+ family: 'selection',
48812
+ friendlyName: 'Inline searchable select',
48813
+ description: 'Selecao compacta com busca.',
48814
+ tags: ['inline', 'filter', 'selection', 'search'],
48815
+ valueShape: 'simple value | option object',
48816
+ recommendedWhen: ['lista media/grande com busca em toolbar'],
48817
+ avoidWhen: ['select simples ja resolve'],
48818
+ dataSourceKind: 'mixed',
48819
+ apiPath: jsonApiPath('inline-searchable-select/pdx-inline-searchable-select.json-api.md'),
48820
+ }),
48821
+ createEntry({
48822
+ id: 'inline-async-select',
48823
+ controlType: FieldControlType.INLINE_ASYNC_SELECT,
48824
+ track: 'inline-filter',
48825
+ family: 'selection',
48826
+ friendlyName: 'Inline async select',
48827
+ description: 'Selecao remota compacta para toolbar.',
48828
+ tags: ['inline', 'filter', 'selection', 'remote'],
48829
+ valueShape: 'simple value | option object',
48830
+ recommendedWhen: ['lookup remoto em toolbar', 'lista sob demanda'],
48831
+ avoidWhen: ['lista local pequena'],
48832
+ dataSourceKind: 'remote',
48833
+ apiPath: jsonApiPath('inline-async-select/pdx-inline-async-select.json-api.md'),
48834
+ }),
48835
+ createEntry({
48836
+ id: 'inline-entity-lookup',
48837
+ controlType: FieldControlType.INLINE_ENTITY_LOOKUP,
48838
+ track: 'inline-filter',
48839
+ family: 'selection',
48840
+ friendlyName: 'Inline entity lookup',
48841
+ description: 'Lookup compacto de entidade com semantica corporativa.',
48842
+ tags: ['inline', 'filter', 'lookup', 'remote'],
48843
+ valueShape: 'object | id',
48844
+ recommendedWhen: ['id + descricao', 'identidade de entidade'],
48845
+ avoidWhen: ['select local simples'],
48846
+ dataSourceKind: 'remote',
48847
+ apiPath: jsonApiPath('inline-entity-lookup/pdx-inline-entity-lookup.json-api.md'),
48848
+ }),
48849
+ createEntry({
48850
+ id: 'inline-autocomplete',
48851
+ controlType: FieldControlType.INLINE_AUTOCOMPLETE,
48852
+ track: 'inline-filter',
48853
+ family: 'selection',
48854
+ friendlyName: 'Inline autocomplete',
48855
+ description: 'Autocomplete compacto para filtros.',
48856
+ tags: ['inline', 'filter', 'autocomplete'],
48857
+ valueShape: 'simple value | option object',
48858
+ recommendedWhen: ['sugestao incremental em toolbar'],
48859
+ avoidWhen: ['select simples basta'],
48860
+ dataSourceKind: 'mixed',
48861
+ apiPath: jsonApiPath('inline-autocomplete/pdx-inline-autocomplete.json-api.md'),
48862
+ }),
48863
+ createEntry({
48864
+ id: 'inline-multi-select',
48865
+ controlType: FieldControlType.INLINE_MULTISELECT,
48866
+ track: 'inline-filter',
48867
+ family: 'selection',
48868
+ friendlyName: 'Inline multi select',
48869
+ description: 'Selecao multipla compacta com resumo em pill.',
48870
+ tags: ['inline', 'filter', 'multiple'],
48871
+ valueShape: 'unknown[]',
48872
+ recommendedWhen: ['poucas selecoes simultaneas com resumo curto'],
48873
+ avoidWhen: ['necessidade de leitura integral de todos os itens'],
48874
+ dataSourceKind: 'mixed',
48875
+ apiPath: jsonApiPath('inline-multi-select/pdx-inline-multi-select.json-api.md'),
48876
+ }),
48877
+ createEntry({
48878
+ id: 'inline-number',
48879
+ controlType: FieldControlType.INLINE_NUMBER,
48880
+ track: 'inline-filter',
48881
+ family: 'numbers-range',
48882
+ friendlyName: 'Inline number',
48883
+ description: 'Filtro numerico compacto.',
48884
+ tags: ['inline', 'filter', 'number'],
48885
+ valueShape: 'number',
48886
+ recommendedWhen: ['valor numerico pontual em toolbar'],
48887
+ avoidWhen: ['range'],
48888
+ dataSourceKind: 'local',
48889
+ apiPath: jsonApiPath('inline-number/pdx-inline-number.json-api.md'),
48890
+ }),
48891
+ createEntry({
48892
+ id: 'inline-currency',
48893
+ controlType: FieldControlType.INLINE_CURRENCY,
48894
+ track: 'inline-filter',
48895
+ family: 'numbers-range',
48896
+ friendlyName: 'Inline currency',
48897
+ description: 'Filtro monetario compacto.',
48898
+ tags: ['inline', 'filter', 'currency'],
48899
+ valueShape: 'number',
48900
+ recommendedWhen: ['valor monetario unico em toolbar'],
48901
+ avoidWhen: ['faixa monetaria'],
48902
+ dataSourceKind: 'local',
48903
+ apiPath: jsonApiPath('inline-currency/pdx-inline-currency.json-api.md'),
48904
+ }),
48905
+ createEntry({
48906
+ id: 'inline-currency-range',
48907
+ controlType: FieldControlType.INLINE_CURRENCY_RANGE,
48908
+ track: 'inline-filter',
48909
+ family: 'numbers-range',
48910
+ friendlyName: 'Inline currency range',
48911
+ description: 'Faixa monetaria compacta para toolbar.',
48912
+ tags: ['inline', 'filter', 'currency', 'range'],
48913
+ valueShape: '{ minPrice?, maxPrice?, currency? }',
48914
+ recommendedWhen: ['faixa monetaria em toolbar'],
48915
+ avoidWhen: ['valor unico'],
48916
+ dataSourceKind: 'specialized',
48917
+ apiPath: jsonApiPath('inline-currency-range/pdx-inline-currency-range.json-api.md'),
48918
+ }),
48919
+ createEntry({
48920
+ id: 'inline-range',
48921
+ controlType: FieldControlType.INLINE_RANGE,
48922
+ track: 'inline-filter',
48923
+ family: 'numbers-range',
48924
+ friendlyName: 'Inline range',
48925
+ description: 'Range numerico compacto para toolbar.',
48926
+ tags: ['inline', 'filter', 'range', 'slider'],
48927
+ valueShape: 'number | { start?, end? }',
48928
+ recommendedWhen: ['faixa numerica compacta'],
48929
+ avoidWhen: ['datas ou horarios'],
48930
+ dataSourceKind: 'specialized',
48931
+ apiPath: jsonApiPath('inline-currency-range/pdx-inline-currency-range.json-api.md'),
48932
+ detailFragment: 'inline-range',
48933
+ }),
48934
+ createEntry({
48935
+ id: 'inline-rating',
48936
+ controlType: FieldControlType.INLINE_RATING,
48937
+ track: 'inline-filter',
48938
+ family: 'numbers-range',
48939
+ friendlyName: 'Inline rating',
48940
+ description: 'Filtro visual de rating para toolbar.',
48941
+ tags: ['inline', 'filter', 'rating'],
48942
+ valueShape: 'number | { start?, end? }',
48943
+ recommendedWhen: ['score visual', 'avaliacao em estrelas'],
48944
+ avoidWhen: ['quando numero bruto ja basta'],
48945
+ dataSourceKind: 'specialized',
48946
+ apiPath: jsonApiPath('inline-rating/pdx-inline-rating.json-api.md'),
48947
+ }),
48948
+ createEntry({
48949
+ id: 'inline-distance-radius',
48950
+ controlType: FieldControlType.INLINE_DISTANCE_RADIUS,
48951
+ track: 'inline-filter',
48952
+ family: 'numbers-range',
48953
+ friendlyName: 'Inline distance radius',
48954
+ description: 'Filtro semantico de distancia e raio.',
48955
+ tags: ['inline', 'filter', 'distance', 'radius'],
48956
+ valueShape: 'number | { start?, end? }',
48957
+ recommendedWhen: ['raio de busca', 'proximidade'],
48958
+ avoidWhen: ['range numerico generico'],
48959
+ dataSourceKind: 'specialized',
48960
+ apiPath: jsonApiPath('inline-distance-radius/pdx-inline-distance-radius.json-api.md'),
48961
+ }),
48962
+ createEntry({
48963
+ id: 'inline-score-priority',
48964
+ controlType: FieldControlType.INLINE_SCORE_PRIORITY,
48965
+ track: 'inline-filter',
48966
+ family: 'numbers-range',
48967
+ friendlyName: 'Inline score priority',
48968
+ description: 'Filtro semantico de score/prioridade.',
48969
+ tags: ['inline', 'filter', 'score', 'priority'],
48970
+ valueShape: 'number | { start?, end? }',
48971
+ recommendedWhen: ['prioridade', 'criticidade', 'banda de score'],
48972
+ avoidWhen: ['numero simples sem ganho semantico'],
48973
+ dataSourceKind: 'specialized',
48974
+ apiPath: jsonApiPath('inline-score-priority/pdx-inline-score-priority.json-api.md'),
48975
+ }),
48976
+ createEntry({
48977
+ id: 'inline-date',
48978
+ controlType: FieldControlType.INLINE_DATE,
48979
+ track: 'inline-filter',
48980
+ family: 'date-time',
48981
+ friendlyName: 'Inline date',
48982
+ description: 'Filtro de data compacta.',
48983
+ tags: ['inline', 'filter', 'date'],
48984
+ valueShape: 'Date',
48985
+ recommendedWhen: ['data unica em toolbar'],
48986
+ avoidWhen: ['periodo completo'],
48987
+ dataSourceKind: 'specialized',
48988
+ apiPath: jsonApiPath('inline-date/pdx-inline-date.json-api.md'),
48989
+ }),
48990
+ createEntry({
48991
+ id: 'inline-date-range',
48992
+ controlType: FieldControlType.INLINE_DATE_RANGE,
48993
+ track: 'inline-filter',
48994
+ family: 'date-time',
48995
+ friendlyName: 'Inline date range',
48996
+ description: 'Range de data compacta com semantica de toolbar.',
48997
+ tags: ['inline', 'filter', 'date', 'range'],
48998
+ valueShape: '{ startDate?, endDate? }',
48999
+ recommendedWhen: ['janela temporal em toolbar'],
49000
+ avoidWhen: ['toolbar saturada ou data unica'],
49001
+ dataSourceKind: 'specialized',
49002
+ apiPath: jsonApiPath('inline-date-range/pdx-inline-date-range.json-api.md'),
49003
+ }),
49004
+ createEntry({
49005
+ id: 'inline-time',
49006
+ controlType: FieldControlType.INLINE_TIME,
49007
+ track: 'inline-filter',
49008
+ family: 'date-time',
49009
+ friendlyName: 'Inline time',
49010
+ description: 'Filtro compacto de horario.',
49011
+ tags: ['inline', 'filter', 'time'],
49012
+ valueShape: 'string HH:mm',
49013
+ recommendedWhen: ['horario unico em toolbar'],
49014
+ avoidWhen: ['periodo relativo ou range'],
49015
+ dataSourceKind: 'specialized',
49016
+ apiPath: jsonApiPath('inline-time/pdx-inline-time.json-api.md'),
49017
+ }),
49018
+ createEntry({
49019
+ id: 'inline-time-range',
49020
+ controlType: FieldControlType.INLINE_TIME_RANGE,
49021
+ track: 'inline-filter',
49022
+ family: 'date-time',
49023
+ friendlyName: 'Inline time range',
49024
+ description: 'Faixa horaria compacta para toolbar.',
49025
+ tags: ['inline', 'filter', 'time', 'range'],
49026
+ valueShape: '{ start?, end? }',
49027
+ recommendedWhen: ['turno', 'janela operacional'],
49028
+ avoidWhen: ['horario unico'],
49029
+ dataSourceKind: 'specialized',
49030
+ apiPath: jsonApiPath('inline-time-range/pdx-inline-time-range.json-api.md'),
49031
+ }),
49032
+ createEntry({
49033
+ id: 'inline-tree-select',
49034
+ controlType: FieldControlType.INLINE_TREE_SELECT,
49035
+ track: 'inline-filter',
49036
+ family: 'trees-lists',
49037
+ friendlyName: 'Inline tree select',
49038
+ description: 'Arvore compacta para filtro em toolbar.',
49039
+ tags: ['inline', 'filter', 'tree', 'hierarchy'],
49040
+ valueShape: 'simple node value',
49041
+ recommendedWhen: ['taxonomia ou unidade organizacional em toolbar'],
49042
+ avoidWhen: ['arvore profunda demais'],
49043
+ dataSourceKind: 'mixed',
49044
+ apiPath: jsonApiPath('inline-tree-select/pdx-inline-tree-select.json-api.md'),
49045
+ }),
49046
+ createEntry({
49047
+ id: 'inline-pipeline-status',
49048
+ controlType: FieldControlType.INLINE_PIPELINE_STATUS,
49049
+ track: 'inline-filter',
49050
+ family: 'selection',
49051
+ friendlyName: 'Inline pipeline status',
49052
+ description: 'Filtro semantico de status de pipeline.',
49053
+ tags: ['inline', 'filter', 'pipeline', 'status'],
49054
+ valueShape: 'simple value | unknown[]',
49055
+ recommendedWhen: ['esteira operacional', 'pipeline comercial'],
49056
+ avoidWhen: ['status simples sem ganho visual'],
49057
+ dataSourceKind: 'specialized',
49058
+ apiPath: jsonApiPath('inline-pipeline-status/pdx-inline-pipeline-status.json-api.md'),
49059
+ }),
49060
+ createEntry({
49061
+ id: 'inline-relative-period',
49062
+ controlType: FieldControlType.INLINE_RELATIVE_PERIOD,
49063
+ track: 'inline-filter',
49064
+ family: 'date-time',
49065
+ friendlyName: 'Inline relative period',
49066
+ description: 'Preset semantico de periodo relativo.',
49067
+ tags: ['inline', 'filter', 'date', 'relative'],
49068
+ valueShape: 'string',
49069
+ recommendedWhen: ['hoje', 'ontem', 'ultimos 7 dias', 'este mes'],
49070
+ avoidWhen: ['API fora da trilha canonica que nao normaliza presets'],
49071
+ dataSourceKind: 'specialized',
49072
+ apiPath: jsonApiPath('inline-relative-period/pdx-inline-relative-period.json-api.md'),
49073
+ }),
49074
+ createEntry({
49075
+ id: 'inline-sentiment',
49076
+ controlType: FieldControlType.INLINE_SENTIMENT,
49077
+ track: 'inline-filter',
49078
+ family: 'selection',
49079
+ friendlyName: 'Inline sentiment',
49080
+ description: 'Filtro semantico de sentimento/polaridade.',
49081
+ tags: ['inline', 'filter', 'sentiment'],
49082
+ valueShape: 'string',
49083
+ recommendedWhen: ['sentimento', 'polaridade', 'humor'],
49084
+ avoidWhen: ['enum simples sem ganho visual'],
49085
+ dataSourceKind: 'specialized',
49086
+ apiPath: jsonApiPath('inline-sentiment/pdx-inline-sentiment.json-api.md'),
49087
+ }),
49088
+ createEntry({
49089
+ id: 'inline-color-label',
49090
+ controlType: FieldControlType.INLINE_COLOR_LABEL,
49091
+ track: 'inline-filter',
49092
+ family: 'selection',
49093
+ friendlyName: 'Inline color label',
49094
+ description: 'Filtro de labels coloridas semanticas.',
49095
+ tags: ['inline', 'filter', 'color', 'labels'],
49096
+ valueShape: 'simple value | unknown[]',
49097
+ recommendedWhen: ['tags coloridas', 'categorias visuais'],
49098
+ avoidWhen: ['quando cor e o unico canal de significado'],
49099
+ dataSourceKind: 'specialized',
49100
+ apiPath: jsonApiPath('inline-color-label/pdx-inline-color-label.json-api.md'),
49101
+ a11yNotes: [
49102
+ 'Nunca dependa apenas de cor para comunicar estado ou significado.',
49103
+ 'Garanta contraste AA e rotulagem textual no resumo da pill e no painel.',
49104
+ ],
49105
+ }),
49106
+ createEntry({
49107
+ id: 'inline-toggle',
49108
+ controlType: FieldControlType.INLINE_TOGGLE,
49109
+ track: 'inline-filter',
49110
+ family: 'toggle-choice',
49111
+ friendlyName: 'Inline toggle',
49112
+ description: 'Booleano compacto com estado neutro para toolbar.',
49113
+ tags: ['inline', 'filter', 'toggle', 'boolean'],
49114
+ valueShape: 'boolean | null',
49115
+ recommendedWhen: ['booleano simples em toolbar'],
49116
+ avoidWhen: ['false e null nao estao bem documentados no fluxo'],
49117
+ dataSourceKind: 'local',
49118
+ apiPath: jsonApiPath('inline-toggle/pdx-inline-toggle.json-api.md'),
49119
+ }),
49120
+ ];
49121
+
47050
49122
  const BRAZIL_INPUTS_AI_CAPABILITIES = {
47051
49123
  version: 'v2.0',
47052
49124
  enums: {
@@ -48856,6 +50928,14 @@ const CLEAR_BUTTON_CONTROL_TYPES = new Set([
48856
50928
  'inlinetime',
48857
50929
  'inlinetimerange',
48858
50930
  'inlinetreeselect',
50931
+ 'inlineperiodrange',
50932
+ 'inlinerating',
50933
+ 'inlinedistanceradius',
50934
+ 'inlinepipelinestatus',
50935
+ 'inlinescorepriority',
50936
+ 'inlinerelativeperiod',
50937
+ 'inlinesentiment',
50938
+ 'inlinecolorlabel',
48859
50939
  ]);
48860
50940
  function supportsClearButtonControlType(controlType) {
48861
50941
  if (!controlType)
@@ -48872,5 +50952,5 @@ function supportsClearButtonControlType(controlType) {
48872
50952
  * Generated bundle index. Do not edit.
48873
50953
  */
48874
50954
 
48875
- 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, DateInputComponent, DateUtilsService, DatetimeLocalInputComponent, DynamicFieldLoaderDirective, EmailInputComponent, FILE_UPLOAD_AI_CAPABILITIES, InlineAsyncSelectComponent, InlineAutocompleteComponent, InlineColorLabelComponent, InlineCurrencyComponent, InlineCurrencyRangeComponent, InlineDateComponent, InlineDateRangeComponent, InlineDistanceRadiusComponent, InlineEntityLookupComponent, InlineInputComponent, InlineMultiSelectComponent, InlineNumberComponent, InlinePipelineStatusComponent, InlineRangeSliderComponent, InlineRatingComponent, InlineRelativePeriodComponent, InlineScorePriorityComponent, InlineSearchableSelectComponent, InlineSelectComponent, InlineSentimentComponent, InlineTimeComponent, InlineTimeRangeComponent, InlineToggleComponent, InlineTreeSelectComponent, 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_MULTI_SELECT_COMPONENT_METADATA, PDX_INLINE_NUMBER_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_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, 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 };
50955
+ 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 };
48876
50956
  //# sourceMappingURL=praxisui-dynamic-fields.mjs.map