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

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';
@@ -2404,6 +2404,8 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2404
2404
  maxSelections = signal(null, ...(ngDevMode ? [{ debugName: "maxSelections" }] : []));
2405
2405
  /** Backend resource path for dynamic option loading */
2406
2406
  resourcePath = signal(null, ...(ngDevMode ? [{ debugName: "resourcePath" }] : []));
2407
+ /** Canonical source for derived options */
2408
+ optionSource = signal(null, ...(ngDevMode ? [{ debugName: "optionSource" }] : []));
2407
2409
  /** Criteria applied to backend filtering */
2408
2410
  filterCriteria = signal({}, ...(ngDevMode ? [{ debugName: "filterCriteria" }] : []));
2409
2411
  /** Field used for option labels when loading from backend */
@@ -2472,18 +2474,26 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2472
2474
  ? null
2473
2475
  : this.resolveDynamicFieldsMessage(this.dynamicFieldsI18n?.select?.emptyOptionText, 'select.emptyOptionText', '').trim() || null;
2474
2476
  this.emptyOptionText.set(isMultiple ? null : (metadata.emptyOptionText ?? fallbackEmptyOption));
2475
- const path = metadata.resourcePath;
2477
+ const optionSource = metadata.optionSource ?? null;
2478
+ this.optionSource.set(optionSource);
2479
+ const path = optionSource?.resourcePath ?? metadata.resourcePath ?? metadata.endpoint;
2476
2480
  if (path) {
2477
2481
  this.resourcePath.set(path);
2478
2482
  this.filterCriteria.set(metadata.filterCriteria ?? {});
2479
- const needLabel = !metadata.optionLabelKey;
2480
- const needValue = !metadata.optionValueKey;
2483
+ const needLabel = !metadata.optionLabelKey && !optionSource;
2484
+ const needValue = !metadata.optionValueKey && !optionSource;
2481
2485
  if (metadata.optionLabelKey) {
2482
2486
  this.optionLabelKey.set(metadata.optionLabelKey);
2483
2487
  }
2488
+ else if (optionSource) {
2489
+ this.optionLabelKey.set('label');
2490
+ }
2484
2491
  if (metadata.optionValueKey) {
2485
2492
  this.optionValueKey.set(metadata.optionValueKey);
2486
2493
  }
2494
+ else if (optionSource) {
2495
+ this.optionValueKey.set('id');
2496
+ }
2487
2497
  this.configureCrudService(path);
2488
2498
  if (needLabel || needValue) {
2489
2499
  this.loadSchema(needLabel, needValue);
@@ -2919,12 +2929,22 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2919
2929
  return;
2920
2930
  }
2921
2931
  const filter = { ...criteria };
2922
- if (searchTerm) {
2932
+ if (searchTerm && !this.optionSource()) {
2923
2933
  filter[this.optionLabelKey()] = searchTerm;
2924
2934
  }
2925
2935
  this.loading.set(true);
2926
- this.crudService
2927
- .filter(filter, { pageNumber: page, pageSize: this.pageSize() })
2936
+ const request$ = this.optionSource()
2937
+ ? this.crudService.filterOptionSourceOptions(this.optionSource().key, filter, { pageNumber: page, pageSize: this.pageSize() }, {
2938
+ search: searchTerm || undefined,
2939
+ includeIds: this.optionSource().includeIds
2940
+ ? this.currentIncludeIds()
2941
+ : undefined,
2942
+ })
2943
+ : this.crudService.filter(filter, {
2944
+ pageNumber: page,
2945
+ pageSize: this.pageSize(),
2946
+ });
2947
+ request$
2928
2948
  .pipe(takeUntilDestroyed(this.destroyRef), take(1))
2929
2949
  .subscribe({
2930
2950
  next: (resp) => {
@@ -2950,6 +2970,16 @@ class SimpleBaseSelectComponent extends SimpleBaseInputComponent {
2950
2970
  },
2951
2971
  });
2952
2972
  }
2973
+ currentIncludeIds() {
2974
+ const currentValue = this.control().value;
2975
+ if (Array.isArray(currentValue)) {
2976
+ return currentValue.filter((value) => value !== null && value !== undefined && value !== '');
2977
+ }
2978
+ if (currentValue === null || currentValue === undefined || currentValue === '') {
2979
+ return [];
2980
+ }
2981
+ return [currentValue];
2982
+ }
2953
2983
  /** Dev-only warning when legacy alias keys are used instead of canonical ones */
2954
2984
  devWarnSelectAliases(meta, component) {
2955
2985
  const isDev = () => typeof globalThis.ngDevMode !== 'undefined'
@@ -3300,6 +3330,9 @@ const RETRY_DELAY = 1000; // 1 segundo
3300
3330
  * Focado no essencial: registro, carregamento e cache básico
3301
3331
  */
3302
3332
  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;
3333
+ const INLINE_PERIOD_RANGE_CONTROL_TYPE = FieldControlType.INLINE_PERIOD_RANGE;
3334
+ const INLINE_YEAR_RANGE_CONTROL_TYPE = FieldControlType.INLINE_YEAR_RANGE;
3335
+ const INLINE_MONTH_RANGE_CONTROL_TYPE = FieldControlType.INLINE_MONTH_RANGE;
3303
3336
  function lazyComponent(loader, exportName) {
3304
3337
  return async () => loader().then((module) => module[exportName]);
3305
3338
  }
@@ -3558,6 +3591,9 @@ class ComponentRegistryService {
3558
3591
  this.register(INLINE_INPUT_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-iIeaA6ko.mjs'), 'InlineInputComponent'));
3559
3592
  this.register(INLINE_TOGGLE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-BMHfcV1t.mjs'), 'InlineToggleComponent'));
3560
3593
  this.register(INLINE_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DYV54GUZ.mjs'), 'InlineRangeSliderComponent'));
3594
+ this.register(INLINE_PERIOD_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CsBUpYPm.mjs'), 'InlinePeriodRangeComponent'));
3595
+ this.register(INLINE_YEAR_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CY-plw8X.mjs'), 'InlineYearRangeComponent'));
3596
+ this.register(INLINE_MONTH_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DlL36zZl.mjs'), 'InlineMonthRangeComponent'));
3561
3597
  this.register(INLINE_DATE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-CfZxkljy.mjs'), 'InlineDateComponent'));
3562
3598
  this.register(INLINE_DATE_RANGE_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-7NLgtZV4.mjs'), 'InlineDateRangeComponent'));
3563
3599
  this.register(INLINE_TIME_CONTROL_TYPE, lazyComponent(() => import('./praxisui-dynamic-fields-index-DD5h8DRG.mjs'), 'InlineTimeComponent'));
@@ -15432,6 +15468,9 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15432
15468
  dataVersion;
15433
15469
  useCursor = false;
15434
15470
  // Uses protected `global` from base class
15471
+ isCategoricalBucketOptionSource(optionSource) {
15472
+ return String(optionSource?.type || '').trim().toUpperCase() === 'CATEGORICAL_BUCKET';
15473
+ }
15435
15474
  setSelectMetadata(metadata) {
15436
15475
  // Normalize and store metadata without triggering the base's remote load
15437
15476
  this.devWarnSelectAliases(metadata, 'MaterialAsyncSelectComponent');
@@ -15450,28 +15489,40 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15450
15489
  }
15451
15490
  // Apply base input metadata (placeholder, validators, a11y, etc.)
15452
15491
  super.setMetadata({ ...metadata });
15492
+ const optionSource = metadata.optionSource ?? null;
15493
+ const isCategoricalBucket = this.isCategoricalBucketOptionSource(optionSource);
15453
15494
  // Local select configuration
15454
15495
  if (mappedOptions)
15455
15496
  this.options.set(mappedOptions);
15456
15497
  this.multiple.set(!!metadata.multiple);
15457
- this.searchable.set(true);
15498
+ this.searchable.set(metadata.searchable ?? !isCategoricalBucket);
15458
15499
  this.selectAll.set(!!metadata.selectAll);
15459
15500
  this.maxSelections.set(metadata.maxSelections ?? null);
15460
15501
  this.emptyOptionText.set(this.multiple() ? null : (metadata.emptyOptionText ?? null));
15461
15502
  // Load strategy: default 'open' to avoid unnecessary requests
15462
15503
  const loadOn = metadata.loadOn ??
15504
+ (isCategoricalBucket ? 'init' : undefined) ??
15463
15505
  this.global.getDynamicFields()?.asyncSelect?.loadOn ??
15464
15506
  'open';
15465
15507
  this.initialLoadStrategy = loadOn;
15466
15508
  // Remote config without auto-loading here (avoid duplicate /filter on init)
15467
- const path = metadata.resourcePath;
15509
+ this.optionSource.set(optionSource);
15510
+ const path = optionSource?.resourcePath ?? metadata.resourcePath;
15468
15511
  if (path) {
15469
15512
  this.resourcePath.set(path);
15470
15513
  this.filterCriteria.set(metadata.filterCriteria ?? {});
15471
- if (metadata.optionLabelKey)
15514
+ if (metadata.optionLabelKey) {
15472
15515
  this.optionLabelKey.set(metadata.optionLabelKey);
15473
- if (metadata.optionValueKey)
15516
+ }
15517
+ else if (optionSource) {
15518
+ this.optionLabelKey.set('label');
15519
+ }
15520
+ if (metadata.optionValueKey) {
15474
15521
  this.optionValueKey.set(metadata.optionValueKey);
15522
+ }
15523
+ else if (optionSource) {
15524
+ this.optionValueKey.set('id');
15525
+ }
15475
15526
  if (this.lastConfiguredPath !== path) {
15476
15527
  this.configureCrudService(path);
15477
15528
  this.lastConfiguredPath = path;
@@ -15548,8 +15599,11 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15548
15599
  const ids = this.getSelectedIds();
15549
15600
  if (!ids.length)
15550
15601
  return;
15551
- this.crudService
15552
- .getOptionsByIds(ids)
15602
+ const optionSource = this.optionSource();
15603
+ const request$ = optionSource
15604
+ ? this.crudService.getOptionSourceOptionsByIds(optionSource.key, ids)
15605
+ : this.crudService.getOptionsByIds(ids);
15606
+ request$
15553
15607
  .pipe(takeUntilDestroyed(this.destroyRef))
15554
15608
  .subscribe((opts) => {
15555
15609
  const returned = new Set(opts.map((o) => o.id));
@@ -15571,7 +15625,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15571
15625
  }
15572
15626
  const term = this.termControl.value || '';
15573
15627
  const filter = { ...this.filterCriteria() };
15574
- if (term) {
15628
+ if (term && !this.optionSource()) {
15575
15629
  filter[this.optionLabelKey()] = term;
15576
15630
  }
15577
15631
  const selected = this.getSelectedIds();
@@ -15597,11 +15651,18 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15597
15651
  }));
15598
15652
  }
15599
15653
  const page = this.pageIndex();
15600
- return this.crudService
15601
- .filterOptions(filter, { pageNumber: page, pageSize: this.pageSize() }, {
15602
- ...(include || {}),
15603
- observeVersionHeader: observeVersion,
15604
- })
15654
+ const optionSource = this.optionSource();
15655
+ const request$ = optionSource
15656
+ ? this.crudService.filterOptionSourceOptions(optionSource.key, filter, { pageNumber: page, pageSize: this.pageSize() }, {
15657
+ ...(include || {}),
15658
+ observeVersionHeader: observeVersion,
15659
+ search: term || undefined,
15660
+ })
15661
+ : this.crudService.filterOptions(filter, { pageNumber: page, pageSize: this.pageSize() }, {
15662
+ ...(include || {}),
15663
+ observeVersionHeader: observeVersion,
15664
+ });
15665
+ return request$
15605
15666
  .pipe(tap((resp) => {
15606
15667
  if (resp.dataVersion)
15607
15668
  this.dataVersion = resp.dataVersion;
@@ -15719,7 +15780,7 @@ class MaterialAsyncSelectComponent extends SimpleBaseSelectComponent {
15719
15780
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
15720
15781
  [matTooltipPosition]="tooltipPosition()"
15721
15782
  >
15722
- <mat-option disabled>
15783
+ <mat-option *ngIf="searchable()" disabled>
15723
15784
  <input
15724
15785
  #searchInput
15725
15786
  matInput
@@ -15833,7 +15894,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
15833
15894
  [matTooltipDisabled]="!(tooltipEnabled() && !!errorMessage())"
15834
15895
  [matTooltipPosition]="tooltipPosition()"
15835
15896
  >
15836
- <mat-option disabled>
15897
+ <mat-option *ngIf="searchable()" disabled>
15837
15898
  <input
15838
15899
  #searchInput
15839
15900
  matInput
@@ -19310,9 +19371,35 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19310
19371
  return custom;
19311
19372
  return this.showPercentSuffix() ? 'percent' : 'tag';
19312
19373
  }
19374
+ showPercentGraphicMode() {
19375
+ return this.showPercentSuffix() && this.currentMetadata().inlineVisualStyle === 'graphic';
19376
+ }
19313
19377
  showPercentSuffix() {
19314
19378
  return this.isPercentFormat();
19315
19379
  }
19380
+ percentDisplayText() {
19381
+ const value = this.currentNumericValue();
19382
+ if (value === null) {
19383
+ return '--%';
19384
+ }
19385
+ return `${this.formatCompactNumber(value)}%`;
19386
+ }
19387
+ percentRangeText() {
19388
+ const min = this.effectiveMinValue();
19389
+ const max = this.effectiveMaxValue();
19390
+ if (min === null && max === null) {
19391
+ return '';
19392
+ }
19393
+ const start = min === null ? '—' : this.formatCompactNumber(min);
19394
+ const end = max === null ? '—' : this.formatCompactNumber(max);
19395
+ return `${start}-${end}%`;
19396
+ }
19397
+ percentAngle() {
19398
+ return this.percentRatio() * 360;
19399
+ }
19400
+ percentFillWidth() {
19401
+ return this.percentRatio() * 100;
19402
+ }
19316
19403
  effectiveMinValue() {
19317
19404
  return this.resolveEffectiveMin(this.currentMetadata());
19318
19405
  }
@@ -19362,8 +19449,14 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19362
19449
  widthProbeText() {
19363
19450
  const value = this.control().value;
19364
19451
  if (value !== null && value !== undefined && String(value).trim().length) {
19452
+ if (this.showPercentGraphicMode()) {
19453
+ return this.longestMeasureCandidate(String(value), this.placeholderText(), this.percentRangeText());
19454
+ }
19365
19455
  return String(value);
19366
19456
  }
19457
+ if (this.showPercentGraphicMode()) {
19458
+ return this.longestMeasureCandidate(this.placeholderText(), this.percentRangeText(), this.defaultFieldLabel());
19459
+ }
19367
19460
  return this.placeholderText() || this.defaultFieldLabel();
19368
19461
  }
19369
19462
  placeholderText() {
@@ -19466,6 +19559,12 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19466
19559
  baseMinMobile = 84;
19467
19560
  baseMaxMobile = 188;
19468
19561
  }
19562
+ if (this.showPercentGraphicMode()) {
19563
+ baseMinDesktop = Math.max(baseMinDesktop, 192);
19564
+ baseMaxDesktop = Math.max(baseMaxDesktop, 288);
19565
+ baseMinMobile = Math.max(baseMinMobile, 184);
19566
+ baseMaxMobile = Math.max(baseMaxMobile, 260);
19567
+ }
19469
19568
  const min = Math.max(84, Math.round(isMobile
19470
19569
  ? (cfg.minWidthMobile ?? baseMinMobile)
19471
19570
  : (cfg.minWidth ?? baseMinDesktop)));
@@ -19543,6 +19642,39 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19543
19642
  ? InlineNumberComponent.PERCENT_PLACEHOLDER_DEFAULT
19544
19643
  : 'Número';
19545
19644
  }
19645
+ currentNumericValue() {
19646
+ return this.resolveFiniteNumber(this.control().value);
19647
+ }
19648
+ percentRatio() {
19649
+ const value = this.currentNumericValue();
19650
+ if (value === null) {
19651
+ return 0;
19652
+ }
19653
+ const min = this.effectiveMinValue() ?? InlineNumberComponent.PERCENT_MIN_DEFAULT;
19654
+ const max = this.effectiveMaxValue() ?? InlineNumberComponent.PERCENT_MAX_DEFAULT;
19655
+ if (max <= min) {
19656
+ return 0;
19657
+ }
19658
+ return Math.max(0, Math.min(1, (value - min) / (max - min)));
19659
+ }
19660
+ formatCompactNumber(value) {
19661
+ if (!Number.isFinite(value)) {
19662
+ return '';
19663
+ }
19664
+ if (Number.isInteger(value)) {
19665
+ return `${value}`;
19666
+ }
19667
+ return value.toFixed(2).replace(/\.?0+$/, '');
19668
+ }
19669
+ longestMeasureCandidate(...values) {
19670
+ const candidates = values
19671
+ .map((value) => String(value ?? '').trim())
19672
+ .filter((value) => value.length);
19673
+ if (!candidates.length) {
19674
+ return '';
19675
+ }
19676
+ return candidates.reduce((longest, current) => current.length > longest.length ? current : longest);
19677
+ }
19546
19678
  isPercentFormat(meta) {
19547
19679
  const metadataRecord = this.asRecord(meta) ?? this.metadataRecord();
19548
19680
  const numberFormat = this.asRecord(metadataRecord.numberFormat);
@@ -19603,80 +19735,107 @@ class InlineNumberComponent extends SimpleBaseInputComponent {
19603
19735
  multi: true,
19604
19736
  },
19605
19737
  ], 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>
19738
+ <div class="pdx-inline-number-shell" [class.pdx-inline-number-shell-percent]="showPercentGraphicMode()">
19739
+ @if (showPercentGraphicMode()) {
19740
+ <div class="pdx-inline-percent-insight" aria-hidden="true">
19741
+ <div
19742
+ class="pdx-inline-percent-gauge"
19743
+ [style.--pdx-inline-percent-angle]="percentAngle() + 'deg'"
19744
+ >
19745
+ <div class="pdx-inline-percent-gauge__core">
19746
+ <span class="pdx-inline-percent-gauge__value">{{ percentDisplayText() }}</span>
19747
+ </div>
19748
+ </div>
19749
+ <div class="pdx-inline-percent-copy">
19750
+ <span class="pdx-inline-percent-copy__label">{{ placeholderText() }}</span>
19751
+ <span class="pdx-inline-percent-copy__range">{{ percentRangeText() }}</span>
19752
+ </div>
19753
+ </div>
19646
19754
  }
19647
- <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19648
- @if (suffixIconName()) {
19755
+
19756
+ <mat-form-field
19757
+ [appearance]="'outline'"
19758
+ [color]="materialColor()"
19759
+ [class]="componentCssClasses()"
19760
+ [floatLabel]="'auto'"
19761
+ [subscriptSizing]="'dynamic'"
19762
+ [hideRequiredMarker]="true"
19763
+ [style.width.px]="inlineWidthPx || null"
19764
+ [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19765
+ >
19649
19766
  <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"
19767
+ matPrefix
19768
+ [color]="iconPalette(prefixIconColor())"
19769
+ [style.color]="iconResolvedColor(prefixIconColor())"
19656
19770
  >
19657
- {{ suffixIconName() }}
19771
+ {{ leadingIconName() }}
19658
19772
  </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
- >
19773
+ <input
19774
+ #inputEl
19775
+ matInput
19776
+ type="number"
19777
+ [formControl]="control()"
19778
+ [errorStateMatcher]="errorStateMatcher()"
19779
+ [placeholder]="placeholderText()"
19780
+ [required]="metadata()?.required || false"
19781
+ [readonly]="isReadonlyEffective()"
19782
+ [autocomplete]="metadata()?.autocomplete || 'off'"
19783
+ [spellcheck]="metadata()?.spellcheck ?? false"
19784
+ [min]="effectiveMinValue()"
19785
+ [max]="effectiveMaxValue()"
19786
+ [step]="effectiveStepValue()"
19787
+ [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19788
+ [attr.aria-label]="ariaLabel()"
19789
+ [matTooltip]="inlineTooltipText()"
19790
+ [matTooltipDisabled]="inlineTooltipDisabled()"
19791
+ [matTooltipPosition]="tooltipPosition()"
19792
+ (input)="onInlineInput()"
19793
+ />
19794
+ @if (showInlinePlaceholder()) {
19795
+ <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19796
+ }
19797
+ <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19798
+ @if (suffixIconName()) {
19672
19799
  <mat-icon
19673
- [color]="iconPalette(clearIconColor())"
19674
- [style.color]="iconResolvedColor(clearIconColor())"
19675
- >{{ clearIconName() }}</mat-icon>
19676
- </button>
19800
+ matSuffix
19801
+ class="pdx-inline-static-suffix"
19802
+ [color]="iconPalette(suffixIconColor())"
19803
+ [style.color]="iconResolvedColor(suffixIconColor())"
19804
+ [matTooltip]="metadata()?.suffixIconTooltip || null"
19805
+ [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19806
+ >
19807
+ {{ suffixIconName() }}
19808
+ </mat-icon>
19809
+ }
19810
+ @if (showPercentSuffix()) {
19811
+ <span matSuffix class="pdx-inline-number-suffix">%</span>
19812
+ }
19813
+ @if (showQuickClear()) {
19814
+ <button
19815
+ matSuffix
19816
+ type="button"
19817
+ class="pdx-inline-clear"
19818
+ (mousedown)="onTriggerIconMouseDown($event)"
19819
+ (click)="onQuickClear($event)"
19820
+ [attr.aria-label]="clearActionAriaLabel()"
19821
+ >
19822
+ <mat-icon
19823
+ [color]="iconPalette(clearIconColor())"
19824
+ [style.color]="iconResolvedColor(clearIconColor())"
19825
+ >{{ clearIconName() }}</mat-icon>
19826
+ </button>
19827
+ }
19828
+ </mat-form-field>
19829
+
19830
+ @if (showPercentGraphicMode()) {
19831
+ <div class="pdx-inline-percent-rail" aria-hidden="true">
19832
+ <div class="pdx-inline-percent-rail__track"></div>
19833
+ <div class="pdx-inline-percent-rail__fill" [style.width.%]="percentFillWidth()"></div>
19834
+ <div class="pdx-inline-percent-rail__marker" [style.left.%]="percentFillWidth()"></div>
19835
+ </div>
19677
19836
  }
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"] }] });
19837
+ </div>
19838
+ `, 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
19839
  }
19681
19840
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineNumberComponent, decorators: [{
19682
19841
  type: Component,
@@ -19688,79 +19847,106 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19688
19847
  MatIconModule,
19689
19848
  MatTooltipModule,
19690
19849
  ], 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>
19850
+ <div class="pdx-inline-number-shell" [class.pdx-inline-number-shell-percent]="showPercentGraphicMode()">
19851
+ @if (showPercentGraphicMode()) {
19852
+ <div class="pdx-inline-percent-insight" aria-hidden="true">
19853
+ <div
19854
+ class="pdx-inline-percent-gauge"
19855
+ [style.--pdx-inline-percent-angle]="percentAngle() + 'deg'"
19856
+ >
19857
+ <div class="pdx-inline-percent-gauge__core">
19858
+ <span class="pdx-inline-percent-gauge__value">{{ percentDisplayText() }}</span>
19859
+ </div>
19860
+ </div>
19861
+ <div class="pdx-inline-percent-copy">
19862
+ <span class="pdx-inline-percent-copy__label">{{ placeholderText() }}</span>
19863
+ <span class="pdx-inline-percent-copy__range">{{ percentRangeText() }}</span>
19864
+ </div>
19865
+ </div>
19731
19866
  }
19732
- <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19733
- @if (suffixIconName()) {
19867
+
19868
+ <mat-form-field
19869
+ [appearance]="'outline'"
19870
+ [color]="materialColor()"
19871
+ [class]="componentCssClasses()"
19872
+ [floatLabel]="'auto'"
19873
+ [subscriptSizing]="'dynamic'"
19874
+ [hideRequiredMarker]="true"
19875
+ [style.width.px]="inlineWidthPx || null"
19876
+ [style.--pdx-inline-number-max-w.px]="inlineMaxWidthPx || null"
19877
+ >
19734
19878
  <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"
19879
+ matPrefix
19880
+ [color]="iconPalette(prefixIconColor())"
19881
+ [style.color]="iconResolvedColor(prefixIconColor())"
19741
19882
  >
19742
- {{ suffixIconName() }}
19883
+ {{ leadingIconName() }}
19743
19884
  </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
- >
19885
+ <input
19886
+ #inputEl
19887
+ matInput
19888
+ type="number"
19889
+ [formControl]="control()"
19890
+ [errorStateMatcher]="errorStateMatcher()"
19891
+ [placeholder]="placeholderText()"
19892
+ [required]="metadata()?.required || false"
19893
+ [readonly]="isReadonlyEffective()"
19894
+ [autocomplete]="metadata()?.autocomplete || 'off'"
19895
+ [spellcheck]="metadata()?.spellcheck ?? false"
19896
+ [min]="effectiveMinValue()"
19897
+ [max]="effectiveMaxValue()"
19898
+ [step]="effectiveStepValue()"
19899
+ [attr.inputmode]="metadata()?.inputMode || 'decimal'"
19900
+ [attr.aria-label]="ariaLabel()"
19901
+ [matTooltip]="inlineTooltipText()"
19902
+ [matTooltipDisabled]="inlineTooltipDisabled()"
19903
+ [matTooltipPosition]="tooltipPosition()"
19904
+ (input)="onInlineInput()"
19905
+ />
19906
+ @if (showInlinePlaceholder()) {
19907
+ <span class="pdx-inline-placeholder" aria-hidden="true">{{ placeholderText() }}</span>
19908
+ }
19909
+ <span #measureEl aria-hidden="true" class="pdx-inline-measure">{{ widthProbeText() }}</span>
19910
+ @if (suffixIconName()) {
19757
19911
  <mat-icon
19758
- [color]="iconPalette(clearIconColor())"
19759
- [style.color]="iconResolvedColor(clearIconColor())"
19760
- >{{ clearIconName() }}</mat-icon>
19761
- </button>
19912
+ matSuffix
19913
+ class="pdx-inline-static-suffix"
19914
+ [color]="iconPalette(suffixIconColor())"
19915
+ [style.color]="iconResolvedColor(suffixIconColor())"
19916
+ [matTooltip]="metadata()?.suffixIconTooltip || null"
19917
+ [attr.aria-label]="metadata()?.suffixIconAriaLabel || null"
19918
+ >
19919
+ {{ suffixIconName() }}
19920
+ </mat-icon>
19921
+ }
19922
+ @if (showPercentSuffix()) {
19923
+ <span matSuffix class="pdx-inline-number-suffix">%</span>
19924
+ }
19925
+ @if (showQuickClear()) {
19926
+ <button
19927
+ matSuffix
19928
+ type="button"
19929
+ class="pdx-inline-clear"
19930
+ (mousedown)="onTriggerIconMouseDown($event)"
19931
+ (click)="onQuickClear($event)"
19932
+ [attr.aria-label]="clearActionAriaLabel()"
19933
+ >
19934
+ <mat-icon
19935
+ [color]="iconPalette(clearIconColor())"
19936
+ [style.color]="iconResolvedColor(clearIconColor())"
19937
+ >{{ clearIconName() }}</mat-icon>
19938
+ </button>
19939
+ }
19940
+ </mat-form-field>
19941
+
19942
+ @if (showPercentGraphicMode()) {
19943
+ <div class="pdx-inline-percent-rail" aria-hidden="true">
19944
+ <div class="pdx-inline-percent-rail__track"></div>
19945
+ <div class="pdx-inline-percent-rail__fill" [style.width.%]="percentFillWidth()"></div>
19946
+ <div class="pdx-inline-percent-rail__marker" [style.left.%]="percentFillWidth()"></div>
19947
+ </div>
19762
19948
  }
19763
- </mat-form-field>
19949
+ </div>
19764
19950
  `, providers: [
19765
19951
  {
19766
19952
  provide: NG_VALUE_ACCESSOR,
@@ -19777,7 +19963,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
19777
19963
  '[attr.data-field-type]': '"inlineNumber"',
19778
19964
  '[attr.data-field-name]': 'metadata()?.name',
19779
19965
  '[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"] }]
19966
+ }, 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
19967
  }], propDecorators: { inputEl: [{
19782
19968
  type: ViewChild,
19783
19969
  args: ['inputEl', { read: ElementRef }]
@@ -23673,6 +23859,673 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImpo
23673
23859
  args: ['document:keydown.escape']
23674
23860
  }] } });
23675
23861
 
23862
+ class InlinePeriodRangeComponent extends SimpleBaseInputComponent {
23863
+ innerComponent;
23864
+ readonlyMode = false;
23865
+ disabledMode = false;
23866
+ visible = true;
23867
+ presentationMode = false;
23868
+ sliderControl = new FormControl(null);
23869
+ syncingFromOuter = false;
23870
+ syncingFromInner = false;
23871
+ periodState = computed(() => {
23872
+ const metadata = this.metadata();
23873
+ if (!metadata)
23874
+ return null;
23875
+ const values = this.buildPeriods(metadata);
23876
+ if (!values.length)
23877
+ return null;
23878
+ return {
23879
+ values,
23880
+ indexByValue: new Map(values.map((value, index) => [value, index])),
23881
+ };
23882
+ }, ...(ngDevMode ? [{ debugName: "periodState" }] : []));
23883
+ resolvedMetadata = computed(() => {
23884
+ const metadata = this.metadata();
23885
+ const periodState = this.periodState();
23886
+ if (!metadata || !periodState)
23887
+ return null;
23888
+ const maxIndex = Math.max(periodState.values.length - 1, 0);
23889
+ const defaultInlineTexts = metadata.granularity === 'year'
23890
+ ? {
23891
+ minLabel: 'Período inicial',
23892
+ maxLabel: 'Período final',
23893
+ quickPresetsLabel: 'Períodos rápidos',
23894
+ }
23895
+ : {
23896
+ quickPresetsLabel: 'Períodos rápidos',
23897
+ };
23898
+ return {
23899
+ ...metadata,
23900
+ controlType: FieldControlType.RANGE_SLIDER,
23901
+ mode: 'range',
23902
+ min: 0,
23903
+ max: maxIndex,
23904
+ step: 1,
23905
+ discrete: metadata.discrete ?? true,
23906
+ showTicks: metadata.showTicks ?? true,
23907
+ showInputs: metadata.showInputs ??
23908
+ (metadata.granularity === 'year' &&
23909
+ periodState.values.every((value) => /^\d{4}$/.test(value))),
23910
+ prefixIcon: metadata.prefixIcon || this.defaultIcon(metadata.granularity),
23911
+ inlineTexts: metadata.inlineTexts ?? defaultInlineTexts,
23912
+ displayWith: metadata.displayWith ??
23913
+ ((value) => this.formatPeriodLabel(periodState.values[this.boundIndex(value, maxIndex)] || '', metadata)),
23914
+ quickPresets: this.adaptQuickPresets(metadata.quickPresets, periodState),
23915
+ quickPresetsAuto: false,
23916
+ };
23917
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
23918
+ ngOnInit() {
23919
+ super.ngOnInit();
23920
+ this.control().valueChanges
23921
+ .pipe(takeUntilDestroyed(this.destroyRef))
23922
+ .subscribe((value) => {
23923
+ if (this.syncingFromInner)
23924
+ return;
23925
+ this.syncFromOuterValue(value);
23926
+ });
23927
+ this.sliderControl.valueChanges
23928
+ .pipe(takeUntilDestroyed(this.destroyRef))
23929
+ .subscribe((value) => {
23930
+ if (this.syncingFromOuter)
23931
+ return;
23932
+ this.syncFromInnerValue(value);
23933
+ });
23934
+ }
23935
+ ngAfterViewInit() {
23936
+ super.ngAfterViewInit();
23937
+ this.syncInnerMetadata();
23938
+ this.syncFromOuterValue(this.control().value);
23939
+ }
23940
+ writeValue(value) {
23941
+ super.writeValue(value);
23942
+ this.syncFromOuterValue(value);
23943
+ }
23944
+ setInputMetadata(metadata) {
23945
+ this.setMetadata(metadata);
23946
+ this.syncInnerMetadata();
23947
+ this.syncFromOuterValue(this.control().value);
23948
+ }
23949
+ setMetadata(metadata) {
23950
+ super.setMetadata(metadata);
23951
+ this.syncInnerMetadata();
23952
+ this.syncFromOuterValue(this.control().value);
23953
+ }
23954
+ getSpecificCssClasses() {
23955
+ return ['pdx-inline-period-range'];
23956
+ }
23957
+ syncFromOuterValue(value) {
23958
+ const periodState = this.periodState();
23959
+ if (!periodState)
23960
+ return;
23961
+ const nextValue = this.toSliderValue(value, periodState);
23962
+ this.syncingFromOuter = true;
23963
+ try {
23964
+ this.sliderControl.setValue(nextValue, { emitEvent: false });
23965
+ }
23966
+ finally {
23967
+ this.syncingFromOuter = false;
23968
+ }
23969
+ }
23970
+ syncFromInnerValue(value) {
23971
+ const periodState = this.periodState();
23972
+ if (!periodState)
23973
+ return;
23974
+ const nextOuter = this.toOuterValue(value, periodState);
23975
+ this.syncingFromInner = true;
23976
+ try {
23977
+ this.setValue(nextOuter, { emitEvent: true });
23978
+ }
23979
+ finally {
23980
+ this.syncingFromInner = false;
23981
+ }
23982
+ }
23983
+ toSliderValue(value, periodState) {
23984
+ if (!Array.isArray(value) || value.length < 2)
23985
+ return null;
23986
+ const start = periodState.indexByValue.get(String(value[0]));
23987
+ const end = periodState.indexByValue.get(String(value[1]));
23988
+ if (start === undefined || end === undefined)
23989
+ return null;
23990
+ return {
23991
+ start: Math.min(start, end),
23992
+ end: Math.max(start, end),
23993
+ };
23994
+ }
23995
+ toOuterValue(value, periodState) {
23996
+ if (!value)
23997
+ return null;
23998
+ const start = this.boundIndex(value.start ?? 0, periodState.values.length - 1);
23999
+ const end = this.boundIndex(value.end ?? 0, periodState.values.length - 1);
24000
+ return [periodState.values[Math.min(start, end)], periodState.values[Math.max(start, end)]];
24001
+ }
24002
+ adaptQuickPresets(presets, periodState) {
24003
+ if (!Array.isArray(presets) || !presets.length)
24004
+ return [];
24005
+ return presets
24006
+ .map((preset) => {
24007
+ const start = periodState.indexByValue.get(String(preset.start));
24008
+ const end = periodState.indexByValue.get(String(preset.end));
24009
+ if (start === undefined || end === undefined)
24010
+ return null;
24011
+ return {
24012
+ id: preset.id,
24013
+ label: preset.label,
24014
+ start: Math.min(start, end),
24015
+ end: Math.max(start, end),
24016
+ };
24017
+ })
24018
+ .filter((preset) => Boolean(preset));
24019
+ }
24020
+ formatPeriodLabel(value, metadata) {
24021
+ if (!value)
24022
+ return '';
24023
+ switch (metadata.granularity) {
24024
+ case 'month':
24025
+ return this.formatMonthValue(value, metadata);
24026
+ case 'quarter':
24027
+ case 'fiscal-quarter':
24028
+ return value.replace('-', '/');
24029
+ case 'fiscal-year':
24030
+ return value;
24031
+ case 'year':
24032
+ return value;
24033
+ default:
24034
+ return value;
24035
+ }
24036
+ }
24037
+ formatMonthValue(value, metadata) {
24038
+ const match = /^(\d{4})-(\d{2})$/.exec(value);
24039
+ if (!match)
24040
+ return value;
24041
+ const [, year, month] = match;
24042
+ const monthIndex = Number(month) - 1;
24043
+ const customLabels = Array.isArray(metadata.monthLabels) ? metadata.monthLabels : [];
24044
+ const labelFromConfig = customLabels[monthIndex];
24045
+ if (labelFromConfig)
24046
+ return `${labelFromConfig}/${year}`;
24047
+ const formatter = new Intl.DateTimeFormat(metadata.locale || 'pt-BR', {
24048
+ month: 'short',
24049
+ });
24050
+ const raw = formatter.format(new Date(Number(year), monthIndex, 1)).replace('.', '');
24051
+ return `${raw.charAt(0).toUpperCase()}${raw.slice(1)}/${year}`;
24052
+ }
24053
+ defaultIcon(granularity) {
24054
+ switch (granularity) {
24055
+ case 'month':
24056
+ return 'calendar_view_month';
24057
+ case 'quarter':
24058
+ case 'fiscal-quarter':
24059
+ return 'date_range';
24060
+ case 'year':
24061
+ case 'fiscal-year':
24062
+ return 'calendar_today';
24063
+ default:
24064
+ return 'date_range';
24065
+ }
24066
+ }
24067
+ buildPeriods(metadata) {
24068
+ switch (metadata.granularity) {
24069
+ case 'month':
24070
+ return this.buildMonthPeriods(metadata.min, metadata.max);
24071
+ case 'quarter':
24072
+ case 'fiscal-quarter':
24073
+ return this.buildQuarterPeriods(metadata.min, metadata.max);
24074
+ case 'year':
24075
+ case 'fiscal-year':
24076
+ return this.buildYearPeriods(metadata.min, metadata.max);
24077
+ default:
24078
+ return [];
24079
+ }
24080
+ }
24081
+ buildMonthPeriods(min, max) {
24082
+ const start = this.parseYearMonth(min);
24083
+ const end = this.parseYearMonth(max);
24084
+ if (!start || !end)
24085
+ return [];
24086
+ const periods = [];
24087
+ let current = start.year * 12 + (start.month - 1);
24088
+ const last = end.year * 12 + (end.month - 1);
24089
+ while (current <= last) {
24090
+ const year = Math.floor(current / 12);
24091
+ const month = (current % 12) + 1;
24092
+ periods.push(`${year}-${String(month).padStart(2, '0')}`);
24093
+ current += 1;
24094
+ }
24095
+ return periods;
24096
+ }
24097
+ buildQuarterPeriods(min, max) {
24098
+ const start = this.parseQuarter(min);
24099
+ const end = this.parseQuarter(max);
24100
+ if (!start || !end)
24101
+ return [];
24102
+ const periods = [];
24103
+ let currentYear = start.year;
24104
+ let currentQuarter = start.quarter;
24105
+ while (currentYear < end.year ||
24106
+ (currentYear === end.year && currentQuarter <= end.quarter)) {
24107
+ periods.push(`${currentYear}-Q${currentQuarter}`);
24108
+ currentQuarter += 1;
24109
+ if (currentQuarter > 4) {
24110
+ currentQuarter = 1;
24111
+ currentYear += 1;
24112
+ }
24113
+ }
24114
+ return periods;
24115
+ }
24116
+ buildYearPeriods(min, max) {
24117
+ const start = this.parseYear(min);
24118
+ const end = this.parseYear(max);
24119
+ if (start === null || end === null)
24120
+ return [];
24121
+ const periods = [];
24122
+ for (let year = Math.min(start, end); year <= Math.max(start, end); year += 1) {
24123
+ periods.push(String(year));
24124
+ }
24125
+ return periods;
24126
+ }
24127
+ parseYearMonth(value) {
24128
+ if (!value)
24129
+ return null;
24130
+ const match = /^(\d{4})-(\d{2})$/.exec(String(value).trim());
24131
+ if (!match)
24132
+ return null;
24133
+ const year = Number(match[1]);
24134
+ const month = Number(match[2]);
24135
+ if (!Number.isFinite(year) || !Number.isFinite(month) || month < 1 || month > 12) {
24136
+ return null;
24137
+ }
24138
+ return { year, month };
24139
+ }
24140
+ parseQuarter(value) {
24141
+ if (!value)
24142
+ return null;
24143
+ const match = /^(\d{4})-Q([1-4])$/i.exec(String(value).trim());
24144
+ if (!match)
24145
+ return null;
24146
+ return { year: Number(match[1]), quarter: Number(match[2]) };
24147
+ }
24148
+ parseYear(value) {
24149
+ if (!value)
24150
+ return null;
24151
+ const normalized = String(value).trim().replace(/^FY/i, '');
24152
+ const year = Number(normalized);
24153
+ return Number.isFinite(year) ? year : null;
24154
+ }
24155
+ boundIndex(value, max) {
24156
+ const numeric = Number.isFinite(Number(value)) ? Number(value) : 0;
24157
+ return Math.min(max, Math.max(0, Math.round(numeric)));
24158
+ }
24159
+ syncInnerMetadata() {
24160
+ const metadata = this.resolvedMetadata();
24161
+ if (!metadata || !this.innerComponent)
24162
+ return;
24163
+ this.innerComponent.setMetadata(metadata);
24164
+ }
24165
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlinePeriodRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24166
+ 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: [
24167
+ {
24168
+ provide: NG_VALUE_ACCESSOR,
24169
+ useExisting: forwardRef(() => InlinePeriodRangeComponent),
24170
+ multi: true,
24171
+ },
24172
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24173
+ <pdx-inline-range-slider
24174
+ [formControl]="sliderControl"
24175
+ [readonlyMode]="readonlyMode"
24176
+ [disabledMode]="disabledMode"
24177
+ [visible]="visible"
24178
+ [presentationMode]="presentationMode"
24179
+ />
24180
+ `, 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"] }] });
24181
+ }
24182
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlinePeriodRangeComponent, decorators: [{
24183
+ type: Component,
24184
+ args: [{
24185
+ selector: 'pdx-inline-period-range',
24186
+ standalone: true,
24187
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24188
+ template: `
24189
+ <pdx-inline-range-slider
24190
+ [formControl]="sliderControl"
24191
+ [readonlyMode]="readonlyMode"
24192
+ [disabledMode]="disabledMode"
24193
+ [visible]="visible"
24194
+ [presentationMode]="presentationMode"
24195
+ />
24196
+ `,
24197
+ providers: [
24198
+ {
24199
+ provide: NG_VALUE_ACCESSOR,
24200
+ useExisting: forwardRef(() => InlinePeriodRangeComponent),
24201
+ multi: true,
24202
+ },
24203
+ ],
24204
+ host: {
24205
+ '[style.display]': 'visible ? null : "none"',
24206
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24207
+ '[attr.data-field-type]': '"inlinePeriodRange"',
24208
+ '[attr.data-field-name]': 'metadata()?.name',
24209
+ '[attr.data-component-id]': 'componentId()',
24210
+ },
24211
+ }]
24212
+ }], propDecorators: { innerComponent: [{
24213
+ type: ViewChild,
24214
+ args: [InlineRangeSliderComponent]
24215
+ }], readonlyMode: [{
24216
+ type: Input
24217
+ }], disabledMode: [{
24218
+ type: Input
24219
+ }], visible: [{
24220
+ type: Input
24221
+ }], presentationMode: [{
24222
+ type: Input
24223
+ }] } });
24224
+
24225
+ class InlineYearRangeComponent extends SimpleBaseInputComponent {
24226
+ innerComponent;
24227
+ readonlyMode = false;
24228
+ disabledMode = false;
24229
+ visible = true;
24230
+ presentationMode = false;
24231
+ resolvedMetadata = computed(() => {
24232
+ const metadata = this.metadata();
24233
+ if (!metadata)
24234
+ return null;
24235
+ const maxYear = Number.isFinite(Number(metadata.max))
24236
+ ? Number(metadata.max)
24237
+ : new Date().getFullYear();
24238
+ const minYear = Number.isFinite(Number(metadata.min))
24239
+ ? Number(metadata.min)
24240
+ : Math.max(2000, maxYear - 10);
24241
+ const boundedMin = Math.min(minYear, maxYear);
24242
+ const boundedMax = Math.max(maxYear, minYear);
24243
+ const fullLabel = metadata.quickPresetsLabels?.full ||
24244
+ (boundedMin === boundedMax ? String(boundedMax) : 'Todo o período');
24245
+ const currentLabel = metadata.quickPresetsLabels?.current || String(boundedMax);
24246
+ const previousYear = Math.max(boundedMin, boundedMax - 1);
24247
+ const previousLabel = metadata.quickPresetsLabels?.previous || String(previousYear);
24248
+ const recentStart = Math.max(boundedMin, boundedMax - 2);
24249
+ const recentLabel = metadata.quickPresetsLabels?.recent ||
24250
+ (recentStart === boundedMax ? String(boundedMax) : `${recentStart}-${boundedMax}`);
24251
+ const quickPresets = metadata.quickPresets ??
24252
+ [
24253
+ {
24254
+ id: 'full',
24255
+ label: fullLabel,
24256
+ start: boundedMin,
24257
+ end: boundedMax,
24258
+ },
24259
+ {
24260
+ id: 'current',
24261
+ label: currentLabel,
24262
+ start: boundedMax,
24263
+ end: boundedMax,
24264
+ },
24265
+ ...(previousYear < boundedMax
24266
+ ? [
24267
+ {
24268
+ id: 'previous',
24269
+ label: previousLabel,
24270
+ start: previousYear,
24271
+ end: previousYear,
24272
+ },
24273
+ ]
24274
+ : []),
24275
+ ...(recentStart < boundedMax
24276
+ ? [
24277
+ {
24278
+ id: 'recent',
24279
+ label: recentLabel,
24280
+ start: recentStart,
24281
+ end: boundedMax,
24282
+ },
24283
+ ]
24284
+ : []),
24285
+ ];
24286
+ return {
24287
+ ...metadata,
24288
+ controlType: FieldControlType.RANGE_SLIDER,
24289
+ mode: 'range',
24290
+ min: boundedMin,
24291
+ max: boundedMax,
24292
+ step: Number.isFinite(Number(metadata.step)) ? Number(metadata.step) : 1,
24293
+ discrete: metadata.discrete ?? true,
24294
+ showTicks: metadata.showTicks ?? true,
24295
+ showInputs: metadata.showInputs ?? true,
24296
+ prefixIcon: metadata.prefixIcon || 'calendar_today',
24297
+ inlineTexts: metadata.inlineTexts ?? {
24298
+ minLabel: 'Ano inicial',
24299
+ maxLabel: 'Ano final',
24300
+ quickPresetsLabel: 'Anos rápidos',
24301
+ },
24302
+ displayWith: metadata.displayWith ??
24303
+ ((value) => {
24304
+ const year = Math.round(value);
24305
+ return Number.isFinite(year) ? String(year) : '';
24306
+ }),
24307
+ quickPresets,
24308
+ quickPresetsAuto: false,
24309
+ };
24310
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
24311
+ getSpecificCssClasses() {
24312
+ return ['pdx-inline-year-range'];
24313
+ }
24314
+ ngAfterViewInit() {
24315
+ super.ngAfterViewInit();
24316
+ this.syncInnerMetadata();
24317
+ }
24318
+ setInputMetadata(metadata) {
24319
+ this.setMetadata(metadata);
24320
+ this.syncInnerMetadata();
24321
+ }
24322
+ setMetadata(metadata) {
24323
+ super.setMetadata(metadata);
24324
+ this.syncInnerMetadata();
24325
+ }
24326
+ syncInnerMetadata() {
24327
+ const metadata = this.resolvedMetadata();
24328
+ if (!metadata || !this.innerComponent)
24329
+ return;
24330
+ this.innerComponent.setMetadata(metadata);
24331
+ }
24332
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineYearRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24333
+ 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: [
24334
+ {
24335
+ provide: NG_VALUE_ACCESSOR,
24336
+ useExisting: forwardRef(() => InlineYearRangeComponent),
24337
+ multi: true,
24338
+ },
24339
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24340
+ <pdx-inline-range-slider
24341
+ [formControl]="control()"
24342
+ [readonlyMode]="readonlyMode"
24343
+ [disabledMode]="disabledMode"
24344
+ [visible]="visible"
24345
+ [presentationMode]="presentationMode"
24346
+ />
24347
+ `, 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"] }] });
24348
+ }
24349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineYearRangeComponent, decorators: [{
24350
+ type: Component,
24351
+ args: [{
24352
+ selector: 'pdx-inline-year-range',
24353
+ standalone: true,
24354
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24355
+ template: `
24356
+ <pdx-inline-range-slider
24357
+ [formControl]="control()"
24358
+ [readonlyMode]="readonlyMode"
24359
+ [disabledMode]="disabledMode"
24360
+ [visible]="visible"
24361
+ [presentationMode]="presentationMode"
24362
+ />
24363
+ `,
24364
+ providers: [
24365
+ {
24366
+ provide: NG_VALUE_ACCESSOR,
24367
+ useExisting: forwardRef(() => InlineYearRangeComponent),
24368
+ multi: true,
24369
+ },
24370
+ ],
24371
+ host: {
24372
+ '[style.display]': 'visible ? null : "none"',
24373
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24374
+ '[attr.data-field-type]': '"inlineYearRange"',
24375
+ '[attr.data-field-name]': 'metadata()?.name',
24376
+ '[attr.data-component-id]': 'componentId()',
24377
+ },
24378
+ }]
24379
+ }], propDecorators: { innerComponent: [{
24380
+ type: ViewChild,
24381
+ args: [InlineRangeSliderComponent]
24382
+ }], readonlyMode: [{
24383
+ type: Input
24384
+ }], disabledMode: [{
24385
+ type: Input
24386
+ }], visible: [{
24387
+ type: Input
24388
+ }], presentationMode: [{
24389
+ type: Input
24390
+ }] } });
24391
+
24392
+ class InlineMonthRangeComponent extends SimpleBaseInputComponent {
24393
+ innerComponent;
24394
+ readonlyMode = false;
24395
+ disabledMode = false;
24396
+ visible = true;
24397
+ presentationMode = false;
24398
+ resolvedMetadata = computed(() => {
24399
+ const metadata = this.metadata();
24400
+ if (!metadata)
24401
+ return null;
24402
+ const labels = this.resolveMonthLabels(metadata);
24403
+ const fullLabel = metadata.quickPresetsLabels?.full || 'Ano todo';
24404
+ const firstHalfLabel = metadata.quickPresetsLabels?.firstHalf || 'Jan-Jun';
24405
+ const secondHalfLabel = metadata.quickPresetsLabels?.secondHalf || 'Jul-Dez';
24406
+ return {
24407
+ ...metadata,
24408
+ controlType: FieldControlType.RANGE_SLIDER,
24409
+ mode: 'range',
24410
+ min: 1,
24411
+ max: 12,
24412
+ step: 1,
24413
+ discrete: metadata.discrete ?? true,
24414
+ showTicks: metadata.showTicks ?? true,
24415
+ showInputs: metadata.showInputs ?? false,
24416
+ prefixIcon: metadata.prefixIcon || 'calendar_view_month',
24417
+ inlineTexts: metadata.inlineTexts ?? {
24418
+ quickPresetsLabel: 'Períodos rápidos',
24419
+ },
24420
+ displayWith: metadata.displayWith ??
24421
+ ((value) => {
24422
+ const monthNumber = Math.min(12, Math.max(1, Math.round(value)));
24423
+ return labels[monthNumber - 1] || String(monthNumber);
24424
+ }),
24425
+ quickPresets: metadata.quickPresets ??
24426
+ [
24427
+ { id: 'full', label: fullLabel, start: 1, end: 12 },
24428
+ { id: 'q1', label: metadata.quickPresetsLabels?.q1 || 'Q1', start: 1, end: 3 },
24429
+ { id: 'q2', label: metadata.quickPresetsLabels?.q2 || 'Q2', start: 4, end: 6 },
24430
+ { id: 'q3', label: metadata.quickPresetsLabels?.q3 || 'Q3', start: 7, end: 9 },
24431
+ { id: 'q4', label: metadata.quickPresetsLabels?.q4 || 'Q4', start: 10, end: 12 },
24432
+ { id: 'first-half', label: firstHalfLabel, start: 1, end: 6 },
24433
+ { id: 'second-half', label: secondHalfLabel, start: 7, end: 12 },
24434
+ ],
24435
+ quickPresetsAuto: false,
24436
+ };
24437
+ }, ...(ngDevMode ? [{ debugName: "resolvedMetadata" }] : []));
24438
+ getSpecificCssClasses() {
24439
+ return ['pdx-inline-month-range'];
24440
+ }
24441
+ ngAfterViewInit() {
24442
+ super.ngAfterViewInit();
24443
+ this.syncInnerMetadata();
24444
+ }
24445
+ setInputMetadata(metadata) {
24446
+ this.setMetadata(metadata);
24447
+ this.syncInnerMetadata();
24448
+ }
24449
+ setMetadata(metadata) {
24450
+ super.setMetadata(metadata);
24451
+ this.syncInnerMetadata();
24452
+ }
24453
+ resolveMonthLabels(metadata) {
24454
+ if (Array.isArray(metadata.monthLabels) && metadata.monthLabels.length >= 12) {
24455
+ return metadata.monthLabels.slice(0, 12);
24456
+ }
24457
+ const formatter = new Intl.DateTimeFormat('pt-BR', { month: 'short' });
24458
+ return Array.from({ length: 12 }, (_, index) => {
24459
+ const raw = formatter.format(new Date(2020, index, 1)).replace('.', '');
24460
+ return raw.charAt(0).toUpperCase() + raw.slice(1);
24461
+ });
24462
+ }
24463
+ syncInnerMetadata() {
24464
+ const metadata = this.resolvedMetadata();
24465
+ if (!metadata || !this.innerComponent)
24466
+ return;
24467
+ this.innerComponent.setMetadata(metadata);
24468
+ }
24469
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineMonthRangeComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
24470
+ 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: [
24471
+ {
24472
+ provide: NG_VALUE_ACCESSOR,
24473
+ useExisting: forwardRef(() => InlineMonthRangeComponent),
24474
+ multi: true,
24475
+ },
24476
+ ], viewQueries: [{ propertyName: "innerComponent", first: true, predicate: InlineRangeSliderComponent, descendants: true }], usesInheritance: true, ngImport: i0, template: `
24477
+ <pdx-inline-range-slider
24478
+ [formControl]="control()"
24479
+ [readonlyMode]="readonlyMode"
24480
+ [disabledMode]="disabledMode"
24481
+ [visible]="visible"
24482
+ [presentationMode]="presentationMode"
24483
+ />
24484
+ `, 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"] }] });
24485
+ }
24486
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.17", ngImport: i0, type: InlineMonthRangeComponent, decorators: [{
24487
+ type: Component,
24488
+ args: [{
24489
+ selector: 'pdx-inline-month-range',
24490
+ standalone: true,
24491
+ imports: [CommonModule, ReactiveFormsModule, InlineRangeSliderComponent],
24492
+ template: `
24493
+ <pdx-inline-range-slider
24494
+ [formControl]="control()"
24495
+ [readonlyMode]="readonlyMode"
24496
+ [disabledMode]="disabledMode"
24497
+ [visible]="visible"
24498
+ [presentationMode]="presentationMode"
24499
+ />
24500
+ `,
24501
+ providers: [
24502
+ {
24503
+ provide: NG_VALUE_ACCESSOR,
24504
+ useExisting: forwardRef(() => InlineMonthRangeComponent),
24505
+ multi: true,
24506
+ },
24507
+ ],
24508
+ host: {
24509
+ '[style.display]': 'visible ? null : "none"',
24510
+ '[attr.aria-hidden]': 'visible ? null : "true"',
24511
+ '[attr.data-field-type]': '"inlineMonthRange"',
24512
+ '[attr.data-field-name]': 'metadata()?.name',
24513
+ '[attr.data-component-id]': 'componentId()',
24514
+ },
24515
+ }]
24516
+ }], propDecorators: { innerComponent: [{
24517
+ type: ViewChild,
24518
+ args: [InlineRangeSliderComponent]
24519
+ }], readonlyMode: [{
24520
+ type: Input
24521
+ }], disabledMode: [{
24522
+ type: Input
24523
+ }], visible: [{
24524
+ type: Input
24525
+ }], presentationMode: [{
24526
+ type: Input
24527
+ }] } });
24528
+
23676
24529
  class InlineDateComponent extends MaterialDatepickerComponent {
23677
24530
  inputEl;
23678
24531
  measureEl;
@@ -45619,6 +46472,60 @@ const PDX_INLINE_RANGE_SLIDER_COMPONENT_METADATA = {
45619
46472
  lib: '@praxisui/dynamic-fields',
45620
46473
  };
45621
46474
 
46475
+ const PDX_INLINE_PERIOD_RANGE_COMPONENT_METADATA = {
46476
+ id: 'pdx-inline-period-range',
46477
+ selector: 'pdx-inline-period-range',
46478
+ component: InlinePeriodRangeComponent,
46479
+ friendlyName: 'Inline Period Range',
46480
+ description: 'Faixa temporal corporativa por granularidade, cobrindo meses, trimestres, anos e períodos fiscais em um contrato inline canônico.',
46481
+ icon: 'date_range',
46482
+ inputs: [
46483
+ { name: 'metadata', type: 'InlinePeriodRangeMetadata', description: 'Configuração do campo' },
46484
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46485
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46486
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46487
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46488
+ ],
46489
+ tags: ['widget', 'field', 'period', 'range', 'filter', 'inline', 'temporal'],
46490
+ lib: '@praxisui/dynamic-fields',
46491
+ };
46492
+
46493
+ const PDX_INLINE_YEAR_RANGE_COMPONENT_METADATA = {
46494
+ id: 'pdx-inline-year-range',
46495
+ selector: 'pdx-inline-year-range',
46496
+ component: InlineYearRangeComponent,
46497
+ friendlyName: 'Inline Year Range',
46498
+ description: 'Faixa anual compacta para filtros inline corporativos, com slider dedicado, presets por período recente e leitura semântica orientada a analytics.',
46499
+ icon: 'calendar_today',
46500
+ inputs: [
46501
+ { name: 'metadata', type: 'InlineYearRangeMetadata', description: 'Configuração do campo' },
46502
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46503
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46504
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46505
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46506
+ ],
46507
+ tags: ['widget', 'field', 'year', 'range', 'filter', 'inline'],
46508
+ lib: '@praxisui/dynamic-fields',
46509
+ };
46510
+
46511
+ const PDX_INLINE_MONTH_RANGE_COMPONENT_METADATA = {
46512
+ id: 'pdx-inline-month-range',
46513
+ selector: 'pdx-inline-month-range',
46514
+ component: InlineMonthRangeComponent,
46515
+ friendlyName: 'Inline Month Range',
46516
+ description: 'Faixa mensal compacta para filtros inline, com leitura por nomes de mês e atalhos de trimestre/semestre para dashboards analíticos.',
46517
+ icon: 'calendar_view_month',
46518
+ inputs: [
46519
+ { name: 'metadata', type: 'InlineMonthRangeMetadata', description: 'Configuração do campo' },
46520
+ { name: 'readonlyMode', type: 'boolean', default: false, description: 'Define modo somente leitura' },
46521
+ { name: 'disabledMode', type: 'boolean', default: false, description: 'Desabilita o campo' },
46522
+ { name: 'visible', type: 'boolean', default: true, description: 'Controla a visibilidade' },
46523
+ { name: 'presentationMode', type: 'boolean', default: false, description: 'Modo de apresentação' },
46524
+ ],
46525
+ tags: ['widget', 'field', 'month', 'range', 'filter', 'inline'],
46526
+ lib: '@praxisui/dynamic-fields',
46527
+ };
46528
+
45622
46529
  const PDX_INLINE_DATE_COMPONENT_METADATA = {
45623
46530
  id: 'pdx-inline-date',
45624
46531
  selector: 'pdx-inline-date',
@@ -47047,6 +47954,1133 @@ function providePraxisDynamicFieldsCoreNoDefaults() {
47047
47954
  ];
47048
47955
  }
47049
47956
 
47957
+ const DYNAMIC_FIELD_DEFAULT_STATE_RECIPE = {
47958
+ state: 'default',
47959
+ label: 'Default',
47960
+ supported: true,
47961
+ };
47962
+ const DYNAMIC_FIELD_FILLED_STATE_RECIPE = {
47963
+ state: 'filled',
47964
+ label: 'Filled',
47965
+ supported: true,
47966
+ note: 'Consumer or playground should provide a representative value for the field.',
47967
+ };
47968
+ const DYNAMIC_FIELD_DISABLED_STATE_RECIPE = {
47969
+ state: 'disabled',
47970
+ label: 'Disabled',
47971
+ supported: true,
47972
+ metadataPatch: { disabled: true },
47973
+ };
47974
+ const DYNAMIC_FIELD_READONLY_STATE_RECIPE = {
47975
+ state: 'readonly',
47976
+ label: 'Readonly',
47977
+ supported: true,
47978
+ metadataPatch: { readonly: true },
47979
+ };
47980
+ const DYNAMIC_FIELD_ERROR_STATE_RECIPE = {
47981
+ state: 'error',
47982
+ label: 'Error',
47983
+ supported: true,
47984
+ metadataPatch: { required: true },
47985
+ errorMessage: 'Governed sample error state for playground preview.',
47986
+ };
47987
+ const DYNAMIC_FIELD_BASE_STATE_RECIPES = [
47988
+ DYNAMIC_FIELD_DEFAULT_STATE_RECIPE,
47989
+ DYNAMIC_FIELD_FILLED_STATE_RECIPE,
47990
+ DYNAMIC_FIELD_DISABLED_STATE_RECIPE,
47991
+ DYNAMIC_FIELD_READONLY_STATE_RECIPE,
47992
+ DYNAMIC_FIELD_ERROR_STATE_RECIPE,
47993
+ ];
47994
+ function createDynamicFieldPreviewRecipe(input) {
47995
+ return {
47996
+ recipeId: input.recipeId,
47997
+ fieldName: input.fieldName,
47998
+ label: input.label,
47999
+ description: input.description,
48000
+ baseMetadata: {
48001
+ name: input.fieldName,
48002
+ label: input.label,
48003
+ controlType: input.controlType,
48004
+ ...(input.metadata ?? {}),
48005
+ },
48006
+ states: input.states ? [...input.states] : [...DYNAMIC_FIELD_BASE_STATE_RECIPES],
48007
+ };
48008
+ }
48009
+
48010
+ const PRIMARY_CATALOG_SLUG = 'dynamic-fields-field-catalog';
48011
+ const INLINE_CATALOG_SLUG = 'dynamic-fields-inline-filter-catalog';
48012
+ const OVERVIEW_SLUG = 'dynamic-fields-overview';
48013
+ const SELECTION_GUIDE_SLUG = 'dynamic-fields-field-selection-guide';
48014
+ const INLINE_SELECTION_GUIDE_SLUG = 'dynamic-fields-inline-filter-selection-guide';
48015
+ const DEFAULT_A11Y_NOTES = [
48016
+ 'Use labels claros e nao dependa apenas de placeholder.',
48017
+ 'Garanta foco visivel, contraste AA e mensagens de erro textuais.',
48018
+ ];
48019
+ const DEFAULT_THEMING_NOTES = [
48020
+ 'O preview deve respeitar tokens do host e nao introduzir skin isolada da landing.',
48021
+ ];
48022
+ function detailFragment(controlType) {
48023
+ return controlType.toLowerCase().replace(/[^a-z0-9-]+/g, '-');
48024
+ }
48025
+ function jsonApiPath(relativePath) {
48026
+ return `projects/praxis-dynamic-fields/src/lib/components/${relativePath}`;
48027
+ }
48028
+ function createEntry(input) {
48029
+ const states = input.states ?? ['default', 'filled', 'disabled', 'readonly', 'error'];
48030
+ return {
48031
+ id: input.id,
48032
+ controlType: input.controlType,
48033
+ track: input.track,
48034
+ family: input.family,
48035
+ status: input.status ?? 'stable',
48036
+ friendlyName: input.friendlyName,
48037
+ description: input.description,
48038
+ tags: input.tags,
48039
+ keywords: input.keywords ?? input.tags,
48040
+ valueShape: input.valueShape,
48041
+ recommendedWhen: input.recommendedWhen,
48042
+ avoidWhen: input.avoidWhen,
48043
+ dataSourceKind: input.dataSourceKind,
48044
+ supportsStates: states,
48045
+ docs: {
48046
+ catalogSlug: input.catalogSlug ?? (input.track === 'inline-filter' ? INLINE_CATALOG_SLUG : PRIMARY_CATALOG_SLUG),
48047
+ detailFragment: input.detailFragment ?? detailFragment(input.controlType),
48048
+ selectionGuideSlug: input.selectionGuideSlug ?? (input.track === 'inline-filter' ? INLINE_SELECTION_GUIDE_SLUG : SELECTION_GUIDE_SLUG),
48049
+ overviewSlug: input.overviewSlug ?? OVERVIEW_SLUG,
48050
+ jsonApiPath: input.apiPath,
48051
+ },
48052
+ previewRecipe: createDynamicFieldPreviewRecipe({
48053
+ recipeId: input.id,
48054
+ fieldName: `${input.id}Field`,
48055
+ label: input.friendlyName,
48056
+ controlType: input.controlType,
48057
+ description: input.description,
48058
+ metadata: input.metadata,
48059
+ states: input.stateRecipes,
48060
+ }),
48061
+ snippetRecipe: {
48062
+ language: input.snippetLanguage ?? 'json',
48063
+ snippet: input.snippet ??
48064
+ `{ "name": "${input.id}", "label": "${input.friendlyName}", "controlType": "${input.controlType}" }`,
48065
+ note: input.snippetNote,
48066
+ },
48067
+ a11yNotes: input.a11yNotes ?? DEFAULT_A11Y_NOTES,
48068
+ themingNotes: input.themingNotes ?? DEFAULT_THEMING_NOTES,
48069
+ };
48070
+ }
48071
+ const DYNAMIC_FIELDS_PLAYGROUND_CATALOG = [
48072
+ createEntry({
48073
+ id: 'text-input',
48074
+ controlType: FieldControlType.INPUT,
48075
+ track: 'primary-form',
48076
+ family: 'text',
48077
+ friendlyName: 'Text input',
48078
+ description: 'Entrada textual curta e canonica para formularios metadata-driven.',
48079
+ tags: ['text', 'input', 'form'],
48080
+ valueShape: 'string',
48081
+ recommendedWhen: ['texto livre curto', 'nome', 'descricao curta'],
48082
+ avoidWhen: ['lista governada de opcoes', 'texto longo multi-linha'],
48083
+ dataSourceKind: 'local',
48084
+ apiPath: jsonApiPath('text-input/pdx-text-input.json-api.md'),
48085
+ metadata: { placeholder: 'Type here' },
48086
+ }),
48087
+ createEntry({
48088
+ id: 'email-input',
48089
+ controlType: FieldControlType.EMAIL_INPUT,
48090
+ track: 'primary-form',
48091
+ family: 'text',
48092
+ friendlyName: 'Email input',
48093
+ description: 'Campo textual especializado para emails.',
48094
+ tags: ['text', 'email', 'validation'],
48095
+ valueShape: 'string',
48096
+ recommendedWhen: ['email validado', 'contato institucional'],
48097
+ avoidWhen: ['texto livre generico'],
48098
+ dataSourceKind: 'local',
48099
+ apiPath: jsonApiPath('email-input/pdx-email-input.json-api.md'),
48100
+ metadata: { placeholder: 'name@company.com' },
48101
+ }),
48102
+ createEntry({
48103
+ id: 'password-input',
48104
+ controlType: FieldControlType.PASSWORD,
48105
+ track: 'primary-form',
48106
+ family: 'text',
48107
+ friendlyName: 'Password input',
48108
+ description: 'Campo de segredo com mascaramento e interacao apropriada.',
48109
+ tags: ['text', 'password', 'security'],
48110
+ valueShape: 'string',
48111
+ recommendedWhen: ['segredos', 'credenciais'],
48112
+ avoidWhen: ['valor que precisa ficar legivel em tela'],
48113
+ dataSourceKind: 'local',
48114
+ apiPath: jsonApiPath('password-input/pdx-password-input.json-api.md'),
48115
+ }),
48116
+ createEntry({
48117
+ id: 'textarea',
48118
+ controlType: FieldControlType.TEXTAREA,
48119
+ track: 'primary-form',
48120
+ family: 'text',
48121
+ friendlyName: 'Textarea',
48122
+ description: 'Campo multi-linha para observacoes e conteudo textual maior.',
48123
+ tags: ['text', 'textarea', 'multiline'],
48124
+ valueShape: 'string',
48125
+ recommendedWhen: ['descricao longa', 'observacoes', 'justificativa'],
48126
+ avoidWhen: ['texto curto de uma linha'],
48127
+ dataSourceKind: 'local',
48128
+ apiPath: jsonApiPath('material-textarea/pdx-material-textarea.json-api.md'),
48129
+ metadata: { rows: 4, placeholder: 'Describe the situation' },
48130
+ }),
48131
+ createEntry({
48132
+ id: 'search-input',
48133
+ controlType: FieldControlType.SEARCH_INPUT,
48134
+ track: 'primary-form',
48135
+ family: 'text',
48136
+ friendlyName: 'Search input',
48137
+ description: 'Entrada textual dedicada a busca.',
48138
+ tags: ['text', 'search', 'query'],
48139
+ valueShape: 'string',
48140
+ recommendedWhen: ['busca textual', 'query curta'],
48141
+ avoidWhen: ['campo de negocio comum sem semantica de busca'],
48142
+ dataSourceKind: 'local',
48143
+ apiPath: jsonApiPath('search-input/pdx-search-input.json-api.md'),
48144
+ metadata: { placeholder: 'Search records' },
48145
+ }),
48146
+ createEntry({
48147
+ id: 'phone-input',
48148
+ controlType: FieldControlType.PHONE,
48149
+ track: 'primary-form',
48150
+ family: 'text',
48151
+ friendlyName: 'Phone input',
48152
+ description: 'Campo especializado para telefone.',
48153
+ tags: ['text', 'phone', 'formatted'],
48154
+ valueShape: 'string',
48155
+ recommendedWhen: ['telefone', 'contato'],
48156
+ avoidWhen: ['dominio sem telefone'],
48157
+ dataSourceKind: 'local',
48158
+ status: 'partial-docs',
48159
+ apiPath: jsonApiPath('phone-input/pdx-phone-input.json-api.md'),
48160
+ }),
48161
+ createEntry({
48162
+ id: 'url-input',
48163
+ controlType: FieldControlType.URL_INPUT,
48164
+ track: 'primary-form',
48165
+ family: 'text',
48166
+ friendlyName: 'URL input',
48167
+ description: 'Campo para links e URLs.',
48168
+ tags: ['text', 'url', 'link'],
48169
+ valueShape: 'string',
48170
+ recommendedWhen: ['website', 'link institucional'],
48171
+ avoidWhen: ['texto generico'],
48172
+ dataSourceKind: 'local',
48173
+ status: 'partial-docs',
48174
+ apiPath: jsonApiPath('url-input/pdx-url-input.json-api.md'),
48175
+ }),
48176
+ createEntry({
48177
+ id: 'cpf-cnpj-input',
48178
+ controlType: FieldControlType.CPF_CNPJ_INPUT,
48179
+ track: 'primary-form',
48180
+ family: 'text',
48181
+ friendlyName: 'CPF/CNPJ input',
48182
+ description: 'Campo regionalizado para documento brasileiro.',
48183
+ tags: ['text', 'brazil', 'document'],
48184
+ valueShape: 'string',
48185
+ recommendedWhen: ['CPF', 'CNPJ', 'documento BR'],
48186
+ avoidWhen: ['dominio internacional ou sem documento nacional'],
48187
+ dataSourceKind: 'local',
48188
+ status: 'partial-docs',
48189
+ apiPath: jsonApiPath('material-cpf-cnpj-input/pdx-material-cpf-cnpj-input.json-api.md'),
48190
+ }),
48191
+ createEntry({
48192
+ id: 'number-input',
48193
+ controlType: FieldControlType.NUMERIC_TEXT_BOX,
48194
+ track: 'primary-form',
48195
+ family: 'numbers-range',
48196
+ friendlyName: 'Number input',
48197
+ description: 'Campo numerico canonico para valores pontuais.',
48198
+ tags: ['number', 'numeric', 'form'],
48199
+ valueShape: 'number',
48200
+ recommendedWhen: ['idade', 'quantidade', 'score unico'],
48201
+ avoidWhen: ['range', 'moeda'],
48202
+ dataSourceKind: 'local',
48203
+ status: 'partial-docs',
48204
+ apiPath: jsonApiPath('number-input/pdx-number-input.json-api.md'),
48205
+ }),
48206
+ createEntry({
48207
+ id: 'currency-input',
48208
+ controlType: FieldControlType.CURRENCY_INPUT,
48209
+ track: 'primary-form',
48210
+ family: 'numbers-range',
48211
+ friendlyName: 'Currency input',
48212
+ description: 'Campo monetario para valor unico.',
48213
+ tags: ['number', 'currency', 'money'],
48214
+ valueShape: 'number',
48215
+ recommendedWhen: ['orcamento', 'ticket medio', 'valor monetario unico'],
48216
+ avoidWhen: ['faixa monetaria'],
48217
+ dataSourceKind: 'local',
48218
+ apiPath: jsonApiPath('material-currency/pdx-material-currency.json-api.md'),
48219
+ metadata: { currency: 'BRL', locale: 'pt-BR' },
48220
+ }),
48221
+ createEntry({
48222
+ id: 'slider',
48223
+ controlType: FieldControlType.SLIDER,
48224
+ track: 'primary-form',
48225
+ family: 'numbers-range',
48226
+ friendlyName: 'Slider',
48227
+ description: 'Campo de faixa continua para valor unico.',
48228
+ tags: ['number', 'slider', 'range'],
48229
+ valueShape: 'number',
48230
+ recommendedWhen: ['nota', 'nivel', 'escala continua'],
48231
+ avoidWhen: ['valor financeiro complexo', 'range duplo'],
48232
+ dataSourceKind: 'local',
48233
+ apiPath: jsonApiPath('material-slider/pdx-material-slider.json-api.md'),
48234
+ metadata: { min: 0, max: 10 },
48235
+ }),
48236
+ createEntry({
48237
+ id: 'range-slider',
48238
+ controlType: FieldControlType.RANGE_SLIDER,
48239
+ track: 'primary-form',
48240
+ family: 'numbers-range',
48241
+ friendlyName: 'Range slider',
48242
+ description: 'Campo para faixa numerica com um ou dois bounds.',
48243
+ tags: ['number', 'range', 'slider'],
48244
+ valueShape: 'number | { start, end }',
48245
+ recommendedWhen: ['faixa numerica', 'limite minimo e maximo'],
48246
+ avoidWhen: ['datas ou horarios'],
48247
+ dataSourceKind: 'local',
48248
+ status: 'partial-docs',
48249
+ apiPath: jsonApiPath('material-range-slider/pdx-material-range-slider.json-api.md'),
48250
+ }),
48251
+ createEntry({
48252
+ id: 'price-range',
48253
+ controlType: FieldControlType.PRICE_RANGE,
48254
+ track: 'primary-form',
48255
+ family: 'numbers-range',
48256
+ friendlyName: 'Price range',
48257
+ description: 'Faixa monetaria com semantica propria.',
48258
+ tags: ['number', 'currency', 'range'],
48259
+ valueShape: '{ min, max }',
48260
+ recommendedWhen: ['faixa de preco', 'banda salarial', 'orcamento minimo/maximo'],
48261
+ avoidWhen: ['valor monetario unico'],
48262
+ dataSourceKind: 'local',
48263
+ status: 'partial-docs',
48264
+ apiPath: jsonApiPath('material-price-range/pdx-material-price-range.json-api.md'),
48265
+ metadata: { currency: 'BRL', locale: 'pt-BR' },
48266
+ }),
48267
+ createEntry({
48268
+ id: 'rating',
48269
+ controlType: FieldControlType.RATING,
48270
+ track: 'primary-form',
48271
+ family: 'numbers-range',
48272
+ friendlyName: 'Rating',
48273
+ description: 'Controle visual de nota.',
48274
+ tags: ['number', 'rating', 'visual'],
48275
+ valueShape: 'number',
48276
+ recommendedWhen: ['avaliacao visual', 'satisfacao', 'score legivel'],
48277
+ avoidWhen: ['quando numero bruto ja basta'],
48278
+ dataSourceKind: 'local',
48279
+ apiPath: jsonApiPath('material-rating/pdx-material-rating.json-api.md'),
48280
+ metadata: { max: 5 },
48281
+ }),
48282
+ createEntry({
48283
+ id: 'date-input',
48284
+ controlType: FieldControlType.DATE_INPUT,
48285
+ track: 'primary-form',
48286
+ family: 'date-time',
48287
+ friendlyName: 'Date input',
48288
+ description: 'Input nativo de data.',
48289
+ tags: ['date', 'native', 'time'],
48290
+ valueShape: 'string | Date',
48291
+ recommendedWhen: ['integracao simples com input nativo'],
48292
+ avoidWhen: ['quando a UX Material padronizada e obrigatoria'],
48293
+ dataSourceKind: 'local',
48294
+ status: 'partial-docs',
48295
+ apiPath: jsonApiPath('date-input/pdx-date-input.json-api.md'),
48296
+ }),
48297
+ createEntry({
48298
+ id: 'date-picker',
48299
+ controlType: FieldControlType.DATE_PICKER,
48300
+ track: 'primary-form',
48301
+ family: 'date-time',
48302
+ friendlyName: 'Date picker',
48303
+ description: 'Datepicker Material canonico.',
48304
+ tags: ['date', 'picker', 'material'],
48305
+ valueShape: 'Date | string',
48306
+ recommendedWhen: ['data unica', 'consistencia de design system'],
48307
+ avoidWhen: ['range temporal'],
48308
+ dataSourceKind: 'local',
48309
+ apiPath: jsonApiPath('material-datepicker/pdx-material-datepicker.json-api.md'),
48310
+ }),
48311
+ createEntry({
48312
+ id: 'date-range',
48313
+ controlType: FieldControlType.DATE_RANGE,
48314
+ track: 'primary-form',
48315
+ family: 'date-time',
48316
+ friendlyName: 'Date range',
48317
+ description: 'Intervalo de datas.',
48318
+ tags: ['date', 'range', 'time'],
48319
+ valueShape: '{ startDate, endDate }',
48320
+ recommendedWhen: ['periodo', 'janela temporal'],
48321
+ avoidWhen: ['data unica'],
48322
+ dataSourceKind: 'local',
48323
+ apiPath: jsonApiPath('material-date-range/pdx-material-date-range.json-api.md'),
48324
+ }),
48325
+ createEntry({
48326
+ id: 'datetime-local',
48327
+ controlType: FieldControlType.DATETIME_LOCAL_INPUT,
48328
+ track: 'primary-form',
48329
+ family: 'date-time',
48330
+ friendlyName: 'Datetime local',
48331
+ description: 'Campo unificado para data e hora local.',
48332
+ tags: ['date', 'time', 'datetime'],
48333
+ valueShape: 'string',
48334
+ recommendedWhen: ['agendamento local', 'data + hora no mesmo campo'],
48335
+ avoidWhen: ['quando data e hora precisam de UX separada'],
48336
+ dataSourceKind: 'local',
48337
+ status: 'partial-docs',
48338
+ apiPath: jsonApiPath('datetime-local-input/pdx-datetime-local-input.json-api.md'),
48339
+ }),
48340
+ createEntry({
48341
+ id: 'month-input',
48342
+ controlType: FieldControlType.MONTH_INPUT,
48343
+ track: 'primary-form',
48344
+ family: 'date-time',
48345
+ friendlyName: 'Month input',
48346
+ description: 'Campo especializado para mes e ano.',
48347
+ tags: ['date', 'month', 'competence'],
48348
+ valueShape: 'string',
48349
+ recommendedWhen: ['competencia', 'mes/ano'],
48350
+ avoidWhen: ['data completa'],
48351
+ dataSourceKind: 'local',
48352
+ status: 'partial-docs',
48353
+ apiPath: jsonApiPath('month-input/pdx-month-input.json-api.md'),
48354
+ }),
48355
+ createEntry({
48356
+ id: 'time-input',
48357
+ controlType: FieldControlType.TIME_INPUT,
48358
+ track: 'primary-form',
48359
+ family: 'date-time',
48360
+ friendlyName: 'Time input',
48361
+ description: 'Campo simples para horario.',
48362
+ tags: ['time', 'input', 'hour'],
48363
+ valueShape: 'string',
48364
+ recommendedWhen: ['hora simples', 'slot horario'],
48365
+ avoidWhen: ['range horario'],
48366
+ dataSourceKind: 'local',
48367
+ apiPath: jsonApiPath('time-input/pdx-time-input.json-api.md'),
48368
+ }),
48369
+ createEntry({
48370
+ id: 'time-picker',
48371
+ controlType: FieldControlType.TIME_PICKER,
48372
+ track: 'primary-form',
48373
+ family: 'date-time',
48374
+ friendlyName: 'Time picker',
48375
+ description: 'Seletor Material de horario.',
48376
+ tags: ['time', 'picker', 'hour'],
48377
+ valueShape: 'string',
48378
+ recommendedWhen: ['escolha guiada de horario'],
48379
+ avoidWhen: ['texto/mascara simples e suficiente'],
48380
+ dataSourceKind: 'local',
48381
+ apiPath: jsonApiPath('material-timepicker/pdx-material-timepicker.json-api.md'),
48382
+ }),
48383
+ createEntry({
48384
+ id: 'time-range',
48385
+ controlType: FieldControlType.TIME_RANGE,
48386
+ track: 'primary-form',
48387
+ family: 'date-time',
48388
+ friendlyName: 'Time range',
48389
+ description: 'Intervalo de horario.',
48390
+ tags: ['time', 'range', 'hour'],
48391
+ valueShape: '{ start, end }',
48392
+ recommendedWhen: ['janela de atendimento', 'turno'],
48393
+ avoidWhen: ['horario unico'],
48394
+ dataSourceKind: 'local',
48395
+ status: 'partial-docs',
48396
+ apiPath: jsonApiPath('pdx-material-time-range/pdx-material-time-range.json-api.md'),
48397
+ }),
48398
+ createEntry({
48399
+ id: 'week-input',
48400
+ controlType: FieldControlType.WEEK_INPUT,
48401
+ track: 'primary-form',
48402
+ family: 'date-time',
48403
+ friendlyName: 'Week input',
48404
+ description: 'Campo de semana ISO.',
48405
+ tags: ['date', 'week', 'iso'],
48406
+ valueShape: 'string',
48407
+ recommendedWhen: ['semana de referencia'],
48408
+ avoidWhen: ['negocio centrado em datas convencionais'],
48409
+ dataSourceKind: 'local',
48410
+ status: 'partial-docs',
48411
+ apiPath: jsonApiPath('week-input/pdx-week-input.json-api.md'),
48412
+ }),
48413
+ createEntry({
48414
+ id: 'year-input',
48415
+ controlType: FieldControlType.YEAR_INPUT,
48416
+ track: 'primary-form',
48417
+ family: 'date-time',
48418
+ friendlyName: 'Year input',
48419
+ description: 'Campo para ano isolado.',
48420
+ tags: ['date', 'year', 'fiscal'],
48421
+ valueShape: 'number | string',
48422
+ recommendedWhen: ['ano fiscal', 'ano civil isolado'],
48423
+ avoidWhen: ['mes/ano ou data completa'],
48424
+ dataSourceKind: 'local',
48425
+ status: 'partial-docs',
48426
+ apiPath: jsonApiPath('pdx-year-input/pdx-year-input.json-api.md'),
48427
+ }),
48428
+ createEntry({
48429
+ id: 'select',
48430
+ controlType: FieldControlType.SELECT,
48431
+ track: 'primary-form',
48432
+ family: 'selection',
48433
+ friendlyName: 'Select',
48434
+ description: 'Lista fechada simples para escolha unica.',
48435
+ tags: ['selection', 'select', 'options'],
48436
+ valueShape: 'string | number | object',
48437
+ recommendedWhen: ['lista pequena estavel', 'escolha unica'],
48438
+ avoidWhen: ['lista grande ou remota'],
48439
+ dataSourceKind: 'mixed',
48440
+ apiPath: jsonApiPath('material-select/pdx-material-select.json-api.md'),
48441
+ metadata: {
48442
+ options: [
48443
+ { label: 'Active', value: 'ACTIVE' },
48444
+ { label: 'Paused', value: 'PAUSED' },
48445
+ ],
48446
+ },
48447
+ }),
48448
+ createEntry({
48449
+ id: 'searchable-select',
48450
+ controlType: FieldControlType.SEARCHABLE_SELECT,
48451
+ track: 'primary-form',
48452
+ family: 'selection',
48453
+ friendlyName: 'Searchable select',
48454
+ description: 'Select com busca local para listas medias ou grandes.',
48455
+ tags: ['selection', 'select', 'search'],
48456
+ valueShape: 'string | number | object',
48457
+ recommendedWhen: ['lista maior com busca', 'descoberta de opcao'],
48458
+ avoidWhen: ['lista remota sob demanda'],
48459
+ dataSourceKind: 'mixed',
48460
+ status: 'partial-docs',
48461
+ apiPath: jsonApiPath('material-searchable-select/pdx-material-searchable-select.json-api.md'),
48462
+ }),
48463
+ createEntry({
48464
+ id: 'async-select',
48465
+ controlType: FieldControlType.ASYNC_SELECT,
48466
+ track: 'primary-form',
48467
+ family: 'selection',
48468
+ friendlyName: 'Async select',
48469
+ description: 'Select remoto para opcoes sob demanda.',
48470
+ tags: ['selection', 'remote', 'async'],
48471
+ valueShape: 'string | number | object',
48472
+ recommendedWhen: ['lookup remoto', 'lista paginada', 'catalogo grande'],
48473
+ avoidWhen: ['opcoes locais pequenas'],
48474
+ dataSourceKind: 'remote',
48475
+ status: 'partial-docs',
48476
+ apiPath: jsonApiPath('material-async-select/pdx-material-async-select.json-api.md'),
48477
+ metadata: { resourcePath: 'cities', optionLabelKey: 'name', optionValueKey: 'id' },
48478
+ }),
48479
+ createEntry({
48480
+ id: 'autocomplete',
48481
+ controlType: FieldControlType.AUTO_COMPLETE,
48482
+ track: 'primary-form',
48483
+ family: 'selection',
48484
+ friendlyName: 'Autocomplete',
48485
+ description: 'Busca incremental com sugestoes.',
48486
+ tags: ['selection', 'autocomplete', 'search'],
48487
+ valueShape: 'string | number | object',
48488
+ recommendedWhen: ['sugestoes incrementais', 'descoberta textual'],
48489
+ avoidWhen: ['lista pequena e fechada'],
48490
+ dataSourceKind: 'mixed',
48491
+ apiPath: jsonApiPath('material-autocomplete/pdx-material-autocomplete.json-api.md'),
48492
+ }),
48493
+ createEntry({
48494
+ id: 'multi-select',
48495
+ controlType: FieldControlType.MULTI_SELECT,
48496
+ track: 'primary-form',
48497
+ family: 'selection',
48498
+ friendlyName: 'Multi select',
48499
+ description: 'Selecao multipla de opcoes.',
48500
+ tags: ['selection', 'multiple', 'options'],
48501
+ valueShape: 'unknown[]',
48502
+ recommendedWhen: ['multiplas escolhas discretas'],
48503
+ avoidWhen: ['escolha unica'],
48504
+ dataSourceKind: 'mixed',
48505
+ status: 'partial-docs',
48506
+ apiPath: jsonApiPath('material-multi-select/pdx-material-multi-select.json-api.md'),
48507
+ }),
48508
+ createEntry({
48509
+ id: 'multi-select-tree',
48510
+ controlType: FieldControlType.MULTI_SELECT_TREE,
48511
+ track: 'primary-form',
48512
+ family: 'trees-lists',
48513
+ friendlyName: 'Multi select tree',
48514
+ description: 'Arvore hierarquica com selecao multipla.',
48515
+ tags: ['tree', 'selection', 'hierarchy'],
48516
+ valueShape: 'unknown[]',
48517
+ recommendedWhen: ['taxonomia hierarquica com multiplas escolhas'],
48518
+ avoidWhen: ['lista plana pequena'],
48519
+ dataSourceKind: 'mixed',
48520
+ status: 'partial-docs',
48521
+ apiPath: jsonApiPath('material-multi-select-tree/pdx-material-multi-select-tree.json-api.md'),
48522
+ }),
48523
+ createEntry({
48524
+ id: 'tree-select',
48525
+ controlType: FieldControlType.TREE_SELECT,
48526
+ track: 'primary-form',
48527
+ family: 'trees-lists',
48528
+ friendlyName: 'Tree select',
48529
+ description: 'Arvore hierarquica com selecao simples.',
48530
+ tags: ['tree', 'selection', 'hierarchy'],
48531
+ valueShape: 'string | number | object',
48532
+ recommendedWhen: ['estrutura hierarquica com escolha unica'],
48533
+ avoidWhen: ['multiplas escolhas'],
48534
+ dataSourceKind: 'mixed',
48535
+ status: 'partial-docs',
48536
+ apiPath: jsonApiPath('material-tree-select/pdx-material-tree-select.json-api.md'),
48537
+ }),
48538
+ createEntry({
48539
+ id: 'selection-list',
48540
+ controlType: FieldControlType.SELECTION_LIST,
48541
+ track: 'primary-form',
48542
+ family: 'trees-lists',
48543
+ friendlyName: 'Selection list',
48544
+ description: 'Lista explicita de opcoes selecionaveis.',
48545
+ tags: ['list', 'selection', 'explicit'],
48546
+ valueShape: 'unknown[]',
48547
+ recommendedWhen: ['lista visivel de opcoes', 'affordance forte de lista'],
48548
+ avoidWhen: ['dropdown compacto resolve melhor'],
48549
+ dataSourceKind: 'mixed',
48550
+ status: 'partial-docs',
48551
+ apiPath: jsonApiPath('material-selection-list/pdx-material-selection-list.json-api.md'),
48552
+ }),
48553
+ createEntry({
48554
+ id: 'transfer-list',
48555
+ controlType: FieldControlType.TRANSFER_LIST,
48556
+ track: 'primary-form',
48557
+ family: 'trees-lists',
48558
+ friendlyName: 'Transfer list',
48559
+ description: 'Move itens entre listas disponivel e selecionado.',
48560
+ tags: ['list', 'transfer', 'selection'],
48561
+ valueShape: 'unknown[]',
48562
+ recommendedWhen: ['alocacao entre disponiveis e selecionados'],
48563
+ avoidWhen: ['selecao simples ou pequena'],
48564
+ dataSourceKind: 'mixed',
48565
+ status: 'partial-docs',
48566
+ apiPath: jsonApiPath('material-transfer-list/pdx-material-transfer-list.json-api.md'),
48567
+ }),
48568
+ createEntry({
48569
+ id: 'chip-input',
48570
+ controlType: FieldControlType.CHIP_INPUT,
48571
+ track: 'primary-form',
48572
+ family: 'trees-lists',
48573
+ friendlyName: 'Chip input',
48574
+ description: 'Entrada de itens textuais em formato de chips.',
48575
+ tags: ['chips', 'list', 'text'],
48576
+ valueShape: 'string[]',
48577
+ recommendedWhen: ['emails', 'labels editaveis', 'lista textual'],
48578
+ avoidWhen: ['valor unico'],
48579
+ dataSourceKind: 'local',
48580
+ status: 'partial-docs',
48581
+ apiPath: jsonApiPath('material-chips/pdx-material-chips.json-api.md'),
48582
+ }),
48583
+ createEntry({
48584
+ id: 'chip-list',
48585
+ controlType: FieldControlType.CHIP_LIST,
48586
+ track: 'primary-form',
48587
+ family: 'trees-lists',
48588
+ friendlyName: 'Chip list',
48589
+ description: 'Lista textual em chips.',
48590
+ tags: ['chips', 'list', 'display'],
48591
+ valueShape: 'string[]',
48592
+ recommendedWhen: ['lista curta em chips', 'edicao leve'],
48593
+ avoidWhen: ['valor unico'],
48594
+ dataSourceKind: 'local',
48595
+ status: 'partial-docs',
48596
+ apiPath: jsonApiPath('material-chips/pdx-material-chips.json-api.md'),
48597
+ }),
48598
+ createEntry({
48599
+ id: 'checkbox-group',
48600
+ controlType: FieldControlType.CHECKBOX,
48601
+ track: 'primary-form',
48602
+ family: 'toggle-choice',
48603
+ friendlyName: 'Checkbox group',
48604
+ description: 'Escolhas discretas booleanas ou multiplas.',
48605
+ tags: ['choice', 'checkbox', 'boolean'],
48606
+ valueShape: 'boolean | unknown[]',
48607
+ recommendedWhen: ['multiplas escolhas discretas', 'booleano com selectionMode apropriado'],
48608
+ avoidWhen: ['escolha unica'],
48609
+ dataSourceKind: 'mixed',
48610
+ apiPath: jsonApiPath('material-checkbox-group/pdx-material-checkbox-group.json-api.md'),
48611
+ }),
48612
+ createEntry({
48613
+ id: 'radio-group',
48614
+ controlType: FieldControlType.RADIO,
48615
+ track: 'primary-form',
48616
+ family: 'toggle-choice',
48617
+ friendlyName: 'Radio group',
48618
+ description: 'Escolha unica explicita.',
48619
+ tags: ['choice', 'radio', 'single'],
48620
+ valueShape: 'string | number | boolean',
48621
+ recommendedWhen: ['escolha unica com poucas opcoes e alta legibilidade'],
48622
+ avoidWhen: ['muitas opcoes'],
48623
+ dataSourceKind: 'mixed',
48624
+ apiPath: jsonApiPath('material-radio-group/pdx-material-radio-group.json-api.md'),
48625
+ }),
48626
+ createEntry({
48627
+ id: 'toggle',
48628
+ controlType: FieldControlType.TOGGLE,
48629
+ track: 'primary-form',
48630
+ family: 'toggle-choice',
48631
+ friendlyName: 'Toggle',
48632
+ description: 'Booleano binario on/off.',
48633
+ tags: ['choice', 'toggle', 'boolean'],
48634
+ valueShape: 'boolean',
48635
+ recommendedWhen: ['booleano simples'],
48636
+ avoidWhen: ['mais de dois estados'],
48637
+ dataSourceKind: 'local',
48638
+ apiPath: jsonApiPath('material-slide-toggle/pdx-material-slide-toggle.json-api.md'),
48639
+ }),
48640
+ createEntry({
48641
+ id: 'button-toggle',
48642
+ controlType: FieldControlType.BUTTON_TOGGLE,
48643
+ track: 'primary-form',
48644
+ family: 'toggle-choice',
48645
+ friendlyName: 'Button toggle',
48646
+ description: 'Grupo segmentado para poucas opcoes.',
48647
+ tags: ['choice', 'toggle', 'segmented'],
48648
+ valueShape: 'string | number',
48649
+ recommendedWhen: ['poucas opcoes curtas', 'segmentacao visivel'],
48650
+ avoidWhen: ['lista longa'],
48651
+ dataSourceKind: 'local',
48652
+ status: 'partial-docs',
48653
+ apiPath: jsonApiPath('material-button-toggle/pdx-material-button-toggle.json-api.md'),
48654
+ }),
48655
+ createEntry({
48656
+ id: 'file-upload',
48657
+ controlType: FieldControlType.FILE_UPLOAD,
48658
+ track: 'primary-form',
48659
+ family: 'upload-color-visual',
48660
+ friendlyName: 'File upload',
48661
+ description: 'Campo para anexos e documentos.',
48662
+ tags: ['upload', 'files', 'attachments'],
48663
+ valueShape: 'File | File[] | metadata',
48664
+ recommendedWhen: ['documentos', 'anexos', 'comprovantes'],
48665
+ avoidWhen: ['fluxo sem arquivos'],
48666
+ dataSourceKind: 'specialized',
48667
+ apiPath: jsonApiPath('material-file-upload/pdx-material-file-upload.json-api.md'),
48668
+ }),
48669
+ createEntry({
48670
+ id: 'color-input',
48671
+ controlType: FieldControlType.COLOR_INPUT,
48672
+ track: 'primary-form',
48673
+ family: 'upload-color-visual',
48674
+ friendlyName: 'Color input',
48675
+ description: 'Entrada simples de cor.',
48676
+ tags: ['color', 'input', 'visual'],
48677
+ valueShape: 'string',
48678
+ recommendedWhen: ['cor por valor simples'],
48679
+ avoidWhen: ['paleta rica ou presets'],
48680
+ dataSourceKind: 'local',
48681
+ apiPath: jsonApiPath('color-input/pdx-color-input.json-api.md'),
48682
+ }),
48683
+ createEntry({
48684
+ id: 'color-picker',
48685
+ controlType: FieldControlType.COLOR_PICKER,
48686
+ track: 'primary-form',
48687
+ family: 'upload-color-visual',
48688
+ friendlyName: 'Color picker',
48689
+ description: 'Picker avancado de cor com paleta.',
48690
+ tags: ['color', 'picker', 'visual'],
48691
+ valueShape: 'string',
48692
+ recommendedWhen: ['paleta rica', 'preset visual', 'tema'],
48693
+ avoidWhen: ['valor simples textual basta'],
48694
+ dataSourceKind: 'local',
48695
+ apiPath: jsonApiPath('color-picker/pdx-color-picker.json-api.md'),
48696
+ }),
48697
+ createEntry({
48698
+ id: 'avatar',
48699
+ controlType: FieldControlType.AVATAR,
48700
+ track: 'primary-form',
48701
+ family: 'upload-color-visual',
48702
+ friendlyName: 'Avatar',
48703
+ description: 'Representacao visual de entidade/usuario.',
48704
+ tags: ['visual', 'avatar', 'display'],
48705
+ valueShape: 'string | object',
48706
+ recommendedWhen: ['representacao visual de usuario ou entidade'],
48707
+ avoidWhen: ['captura de dado textual'],
48708
+ dataSourceKind: 'specialized',
48709
+ apiPath: jsonApiPath('material-avatar/pdx-material-avatar.json-api.md'),
48710
+ }),
48711
+ createEntry({
48712
+ id: 'button',
48713
+ controlType: FieldControlType.BUTTON,
48714
+ track: 'primary-form',
48715
+ family: 'upload-color-visual',
48716
+ friendlyName: 'Button',
48717
+ description: 'Acao auxiliar embutida no layout do formulario.',
48718
+ tags: ['action', 'button', 'visual'],
48719
+ valueShape: 'n/a',
48720
+ recommendedWhen: ['acao auxiliar no layout'],
48721
+ avoidWhen: ['submit/cancel padrao do form'],
48722
+ dataSourceKind: 'specialized',
48723
+ apiPath: jsonApiPath('material-button/pdx-material-button.json-api.md'),
48724
+ states: ['default', 'disabled', 'readonly'],
48725
+ }),
48726
+ createEntry({
48727
+ id: 'cron-builder',
48728
+ controlType: FieldControlType.CRON_BUILDER,
48729
+ track: 'primary-form',
48730
+ family: 'upload-color-visual',
48731
+ friendlyName: 'Cron builder',
48732
+ description: 'Controle especializado para expressoes CRON.',
48733
+ tags: ['cron', 'schedule', 'specialized'],
48734
+ valueShape: 'string',
48735
+ recommendedWhen: ['agenda cron', 'frequencia recorrente'],
48736
+ avoidWhen: ['datas ou ranges simples'],
48737
+ dataSourceKind: 'specialized',
48738
+ status: 'partial-docs',
48739
+ snippetNote: 'A documentacao detalhada continua vivendo na lib especializada @praxisui/cron-builder.',
48740
+ }),
48741
+ createEntry({
48742
+ id: 'inline-input',
48743
+ controlType: FieldControlType.INLINE_INPUT,
48744
+ track: 'inline-filter',
48745
+ family: 'text',
48746
+ friendlyName: 'Inline input',
48747
+ description: 'Filtro textual compacto para toolbar.',
48748
+ tags: ['inline', 'filter', 'text'],
48749
+ valueShape: 'string',
48750
+ recommendedWhen: ['busca curta em toolbar', 'identificador', 'nome'],
48751
+ avoidWhen: ['texto longo', 'validacao complexa'],
48752
+ dataSourceKind: 'local',
48753
+ apiPath: jsonApiPath('inline-input/pdx-inline-input.json-api.md'),
48754
+ }),
48755
+ createEntry({
48756
+ id: 'inline-select',
48757
+ controlType: FieldControlType.INLINE_SELECT,
48758
+ track: 'inline-filter',
48759
+ family: 'selection',
48760
+ friendlyName: 'Inline select',
48761
+ description: 'Selecao compacta em pill para filtros.',
48762
+ tags: ['inline', 'filter', 'selection'],
48763
+ valueShape: 'simple value',
48764
+ recommendedWhen: ['lista pequena ou media em toolbar'],
48765
+ avoidWhen: ['lookup remoto grande'],
48766
+ dataSourceKind: 'mixed',
48767
+ apiPath: jsonApiPath('inline-select/pdx-inline-select.json-api.md'),
48768
+ }),
48769
+ createEntry({
48770
+ id: 'inline-searchable-select',
48771
+ controlType: FieldControlType.INLINE_SEARCHABLE_SELECT,
48772
+ track: 'inline-filter',
48773
+ family: 'selection',
48774
+ friendlyName: 'Inline searchable select',
48775
+ description: 'Selecao compacta com busca.',
48776
+ tags: ['inline', 'filter', 'selection', 'search'],
48777
+ valueShape: 'simple value | option object',
48778
+ recommendedWhen: ['lista media/grande com busca em toolbar'],
48779
+ avoidWhen: ['select simples ja resolve'],
48780
+ dataSourceKind: 'mixed',
48781
+ apiPath: jsonApiPath('inline-searchable-select/pdx-inline-searchable-select.json-api.md'),
48782
+ }),
48783
+ createEntry({
48784
+ id: 'inline-async-select',
48785
+ controlType: FieldControlType.INLINE_ASYNC_SELECT,
48786
+ track: 'inline-filter',
48787
+ family: 'selection',
48788
+ friendlyName: 'Inline async select',
48789
+ description: 'Selecao remota compacta para toolbar.',
48790
+ tags: ['inline', 'filter', 'selection', 'remote'],
48791
+ valueShape: 'simple value | option object',
48792
+ recommendedWhen: ['lookup remoto em toolbar', 'lista sob demanda'],
48793
+ avoidWhen: ['lista local pequena'],
48794
+ dataSourceKind: 'remote',
48795
+ apiPath: jsonApiPath('inline-async-select/pdx-inline-async-select.json-api.md'),
48796
+ }),
48797
+ createEntry({
48798
+ id: 'inline-entity-lookup',
48799
+ controlType: FieldControlType.INLINE_ENTITY_LOOKUP,
48800
+ track: 'inline-filter',
48801
+ family: 'selection',
48802
+ friendlyName: 'Inline entity lookup',
48803
+ description: 'Lookup compacto de entidade com semantica corporativa.',
48804
+ tags: ['inline', 'filter', 'lookup', 'remote'],
48805
+ valueShape: 'object | id',
48806
+ recommendedWhen: ['id + descricao', 'identidade de entidade'],
48807
+ avoidWhen: ['select local simples'],
48808
+ dataSourceKind: 'remote',
48809
+ apiPath: jsonApiPath('inline-entity-lookup/pdx-inline-entity-lookup.json-api.md'),
48810
+ }),
48811
+ createEntry({
48812
+ id: 'inline-autocomplete',
48813
+ controlType: FieldControlType.INLINE_AUTOCOMPLETE,
48814
+ track: 'inline-filter',
48815
+ family: 'selection',
48816
+ friendlyName: 'Inline autocomplete',
48817
+ description: 'Autocomplete compacto para filtros.',
48818
+ tags: ['inline', 'filter', 'autocomplete'],
48819
+ valueShape: 'simple value | option object',
48820
+ recommendedWhen: ['sugestao incremental em toolbar'],
48821
+ avoidWhen: ['select simples basta'],
48822
+ dataSourceKind: 'mixed',
48823
+ apiPath: jsonApiPath('inline-autocomplete/pdx-inline-autocomplete.json-api.md'),
48824
+ }),
48825
+ createEntry({
48826
+ id: 'inline-multi-select',
48827
+ controlType: FieldControlType.INLINE_MULTISELECT,
48828
+ track: 'inline-filter',
48829
+ family: 'selection',
48830
+ friendlyName: 'Inline multi select',
48831
+ description: 'Selecao multipla compacta com resumo em pill.',
48832
+ tags: ['inline', 'filter', 'multiple'],
48833
+ valueShape: 'unknown[]',
48834
+ recommendedWhen: ['poucas selecoes simultaneas com resumo curto'],
48835
+ avoidWhen: ['necessidade de leitura integral de todos os itens'],
48836
+ dataSourceKind: 'mixed',
48837
+ apiPath: jsonApiPath('inline-multi-select/pdx-inline-multi-select.json-api.md'),
48838
+ }),
48839
+ createEntry({
48840
+ id: 'inline-number',
48841
+ controlType: FieldControlType.INLINE_NUMBER,
48842
+ track: 'inline-filter',
48843
+ family: 'numbers-range',
48844
+ friendlyName: 'Inline number',
48845
+ description: 'Filtro numerico compacto.',
48846
+ tags: ['inline', 'filter', 'number'],
48847
+ valueShape: 'number',
48848
+ recommendedWhen: ['valor numerico pontual em toolbar'],
48849
+ avoidWhen: ['range'],
48850
+ dataSourceKind: 'local',
48851
+ apiPath: jsonApiPath('inline-number/pdx-inline-number.json-api.md'),
48852
+ }),
48853
+ createEntry({
48854
+ id: 'inline-currency',
48855
+ controlType: FieldControlType.INLINE_CURRENCY,
48856
+ track: 'inline-filter',
48857
+ family: 'numbers-range',
48858
+ friendlyName: 'Inline currency',
48859
+ description: 'Filtro monetario compacto.',
48860
+ tags: ['inline', 'filter', 'currency'],
48861
+ valueShape: 'number',
48862
+ recommendedWhen: ['valor monetario unico em toolbar'],
48863
+ avoidWhen: ['faixa monetaria'],
48864
+ dataSourceKind: 'local',
48865
+ apiPath: jsonApiPath('inline-currency/pdx-inline-currency.json-api.md'),
48866
+ }),
48867
+ createEntry({
48868
+ id: 'inline-currency-range',
48869
+ controlType: FieldControlType.INLINE_CURRENCY_RANGE,
48870
+ track: 'inline-filter',
48871
+ family: 'numbers-range',
48872
+ friendlyName: 'Inline currency range',
48873
+ description: 'Faixa monetaria compacta para toolbar.',
48874
+ tags: ['inline', 'filter', 'currency', 'range'],
48875
+ valueShape: '{ minPrice?, maxPrice?, currency? }',
48876
+ recommendedWhen: ['faixa monetaria em toolbar'],
48877
+ avoidWhen: ['valor unico'],
48878
+ dataSourceKind: 'specialized',
48879
+ apiPath: jsonApiPath('inline-currency-range/pdx-inline-currency-range.json-api.md'),
48880
+ }),
48881
+ createEntry({
48882
+ id: 'inline-range',
48883
+ controlType: FieldControlType.INLINE_RANGE,
48884
+ track: 'inline-filter',
48885
+ family: 'numbers-range',
48886
+ friendlyName: 'Inline range',
48887
+ description: 'Range numerico compacto para toolbar.',
48888
+ tags: ['inline', 'filter', 'range', 'slider'],
48889
+ valueShape: 'number | { start?, end? }',
48890
+ recommendedWhen: ['faixa numerica compacta'],
48891
+ avoidWhen: ['datas ou horarios'],
48892
+ dataSourceKind: 'specialized',
48893
+ apiPath: jsonApiPath('inline-currency-range/pdx-inline-currency-range.json-api.md'),
48894
+ detailFragment: 'inline-range',
48895
+ }),
48896
+ createEntry({
48897
+ id: 'inline-rating',
48898
+ controlType: FieldControlType.INLINE_RATING,
48899
+ track: 'inline-filter',
48900
+ family: 'numbers-range',
48901
+ friendlyName: 'Inline rating',
48902
+ description: 'Filtro visual de rating para toolbar.',
48903
+ tags: ['inline', 'filter', 'rating'],
48904
+ valueShape: 'number | { start?, end? }',
48905
+ recommendedWhen: ['score visual', 'avaliacao em estrelas'],
48906
+ avoidWhen: ['quando numero bruto ja basta'],
48907
+ dataSourceKind: 'specialized',
48908
+ apiPath: jsonApiPath('inline-rating/pdx-inline-rating.json-api.md'),
48909
+ }),
48910
+ createEntry({
48911
+ id: 'inline-distance-radius',
48912
+ controlType: FieldControlType.INLINE_DISTANCE_RADIUS,
48913
+ track: 'inline-filter',
48914
+ family: 'numbers-range',
48915
+ friendlyName: 'Inline distance radius',
48916
+ description: 'Filtro semantico de distancia e raio.',
48917
+ tags: ['inline', 'filter', 'distance', 'radius'],
48918
+ valueShape: 'number | { start?, end? }',
48919
+ recommendedWhen: ['raio de busca', 'proximidade'],
48920
+ avoidWhen: ['range numerico generico'],
48921
+ dataSourceKind: 'specialized',
48922
+ apiPath: jsonApiPath('inline-distance-radius/pdx-inline-distance-radius.json-api.md'),
48923
+ }),
48924
+ createEntry({
48925
+ id: 'inline-score-priority',
48926
+ controlType: FieldControlType.INLINE_SCORE_PRIORITY,
48927
+ track: 'inline-filter',
48928
+ family: 'numbers-range',
48929
+ friendlyName: 'Inline score priority',
48930
+ description: 'Filtro semantico de score/prioridade.',
48931
+ tags: ['inline', 'filter', 'score', 'priority'],
48932
+ valueShape: 'number | { start?, end? }',
48933
+ recommendedWhen: ['prioridade', 'criticidade', 'banda de score'],
48934
+ avoidWhen: ['numero simples sem ganho semantico'],
48935
+ dataSourceKind: 'specialized',
48936
+ apiPath: jsonApiPath('inline-score-priority/pdx-inline-score-priority.json-api.md'),
48937
+ }),
48938
+ createEntry({
48939
+ id: 'inline-date',
48940
+ controlType: FieldControlType.INLINE_DATE,
48941
+ track: 'inline-filter',
48942
+ family: 'date-time',
48943
+ friendlyName: 'Inline date',
48944
+ description: 'Filtro de data compacta.',
48945
+ tags: ['inline', 'filter', 'date'],
48946
+ valueShape: 'Date',
48947
+ recommendedWhen: ['data unica em toolbar'],
48948
+ avoidWhen: ['periodo completo'],
48949
+ dataSourceKind: 'specialized',
48950
+ apiPath: jsonApiPath('inline-date/pdx-inline-date.json-api.md'),
48951
+ }),
48952
+ createEntry({
48953
+ id: 'inline-date-range',
48954
+ controlType: FieldControlType.INLINE_DATE_RANGE,
48955
+ track: 'inline-filter',
48956
+ family: 'date-time',
48957
+ friendlyName: 'Inline date range',
48958
+ description: 'Range de data compacta com semantica de toolbar.',
48959
+ tags: ['inline', 'filter', 'date', 'range'],
48960
+ valueShape: '{ startDate?, endDate? }',
48961
+ recommendedWhen: ['janela temporal em toolbar'],
48962
+ avoidWhen: ['toolbar saturada ou data unica'],
48963
+ dataSourceKind: 'specialized',
48964
+ apiPath: jsonApiPath('inline-date-range/pdx-inline-date-range.json-api.md'),
48965
+ }),
48966
+ createEntry({
48967
+ id: 'inline-time',
48968
+ controlType: FieldControlType.INLINE_TIME,
48969
+ track: 'inline-filter',
48970
+ family: 'date-time',
48971
+ friendlyName: 'Inline time',
48972
+ description: 'Filtro compacto de horario.',
48973
+ tags: ['inline', 'filter', 'time'],
48974
+ valueShape: 'string HH:mm',
48975
+ recommendedWhen: ['horario unico em toolbar'],
48976
+ avoidWhen: ['periodo relativo ou range'],
48977
+ dataSourceKind: 'specialized',
48978
+ apiPath: jsonApiPath('inline-time/pdx-inline-time.json-api.md'),
48979
+ }),
48980
+ createEntry({
48981
+ id: 'inline-time-range',
48982
+ controlType: FieldControlType.INLINE_TIME_RANGE,
48983
+ track: 'inline-filter',
48984
+ family: 'date-time',
48985
+ friendlyName: 'Inline time range',
48986
+ description: 'Faixa horaria compacta para toolbar.',
48987
+ tags: ['inline', 'filter', 'time', 'range'],
48988
+ valueShape: '{ start?, end? }',
48989
+ recommendedWhen: ['turno', 'janela operacional'],
48990
+ avoidWhen: ['horario unico'],
48991
+ dataSourceKind: 'specialized',
48992
+ apiPath: jsonApiPath('inline-time-range/pdx-inline-time-range.json-api.md'),
48993
+ }),
48994
+ createEntry({
48995
+ id: 'inline-tree-select',
48996
+ controlType: FieldControlType.INLINE_TREE_SELECT,
48997
+ track: 'inline-filter',
48998
+ family: 'trees-lists',
48999
+ friendlyName: 'Inline tree select',
49000
+ description: 'Arvore compacta para filtro em toolbar.',
49001
+ tags: ['inline', 'filter', 'tree', 'hierarchy'],
49002
+ valueShape: 'simple node value',
49003
+ recommendedWhen: ['taxonomia ou unidade organizacional em toolbar'],
49004
+ avoidWhen: ['arvore profunda demais'],
49005
+ dataSourceKind: 'mixed',
49006
+ apiPath: jsonApiPath('inline-tree-select/pdx-inline-tree-select.json-api.md'),
49007
+ }),
49008
+ createEntry({
49009
+ id: 'inline-pipeline-status',
49010
+ controlType: FieldControlType.INLINE_PIPELINE_STATUS,
49011
+ track: 'inline-filter',
49012
+ family: 'selection',
49013
+ friendlyName: 'Inline pipeline status',
49014
+ description: 'Filtro semantico de status de pipeline.',
49015
+ tags: ['inline', 'filter', 'pipeline', 'status'],
49016
+ valueShape: 'simple value | unknown[]',
49017
+ recommendedWhen: ['esteira operacional', 'pipeline comercial'],
49018
+ avoidWhen: ['status simples sem ganho visual'],
49019
+ dataSourceKind: 'specialized',
49020
+ apiPath: jsonApiPath('inline-pipeline-status/pdx-inline-pipeline-status.json-api.md'),
49021
+ }),
49022
+ createEntry({
49023
+ id: 'inline-relative-period',
49024
+ controlType: FieldControlType.INLINE_RELATIVE_PERIOD,
49025
+ track: 'inline-filter',
49026
+ family: 'date-time',
49027
+ friendlyName: 'Inline relative period',
49028
+ description: 'Preset semantico de periodo relativo.',
49029
+ tags: ['inline', 'filter', 'date', 'relative'],
49030
+ valueShape: 'string',
49031
+ recommendedWhen: ['hoje', 'ontem', 'ultimos 7 dias', 'este mes'],
49032
+ avoidWhen: ['API fora da trilha canonica que nao normaliza presets'],
49033
+ dataSourceKind: 'specialized',
49034
+ apiPath: jsonApiPath('inline-relative-period/pdx-inline-relative-period.json-api.md'),
49035
+ }),
49036
+ createEntry({
49037
+ id: 'inline-sentiment',
49038
+ controlType: FieldControlType.INLINE_SENTIMENT,
49039
+ track: 'inline-filter',
49040
+ family: 'selection',
49041
+ friendlyName: 'Inline sentiment',
49042
+ description: 'Filtro semantico de sentimento/polaridade.',
49043
+ tags: ['inline', 'filter', 'sentiment'],
49044
+ valueShape: 'string',
49045
+ recommendedWhen: ['sentimento', 'polaridade', 'humor'],
49046
+ avoidWhen: ['enum simples sem ganho visual'],
49047
+ dataSourceKind: 'specialized',
49048
+ apiPath: jsonApiPath('inline-sentiment/pdx-inline-sentiment.json-api.md'),
49049
+ }),
49050
+ createEntry({
49051
+ id: 'inline-color-label',
49052
+ controlType: FieldControlType.INLINE_COLOR_LABEL,
49053
+ track: 'inline-filter',
49054
+ family: 'selection',
49055
+ friendlyName: 'Inline color label',
49056
+ description: 'Filtro de labels coloridas semanticas.',
49057
+ tags: ['inline', 'filter', 'color', 'labels'],
49058
+ valueShape: 'simple value | unknown[]',
49059
+ recommendedWhen: ['tags coloridas', 'categorias visuais'],
49060
+ avoidWhen: ['quando cor e o unico canal de significado'],
49061
+ dataSourceKind: 'specialized',
49062
+ apiPath: jsonApiPath('inline-color-label/pdx-inline-color-label.json-api.md'),
49063
+ a11yNotes: [
49064
+ 'Nunca dependa apenas de cor para comunicar estado ou significado.',
49065
+ 'Garanta contraste AA e rotulagem textual no resumo da pill e no painel.',
49066
+ ],
49067
+ }),
49068
+ createEntry({
49069
+ id: 'inline-toggle',
49070
+ controlType: FieldControlType.INLINE_TOGGLE,
49071
+ track: 'inline-filter',
49072
+ family: 'toggle-choice',
49073
+ friendlyName: 'Inline toggle',
49074
+ description: 'Booleano compacto com estado neutro para toolbar.',
49075
+ tags: ['inline', 'filter', 'toggle', 'boolean'],
49076
+ valueShape: 'boolean | null',
49077
+ recommendedWhen: ['booleano simples em toolbar'],
49078
+ avoidWhen: ['false e null nao estao bem documentados no fluxo'],
49079
+ dataSourceKind: 'local',
49080
+ apiPath: jsonApiPath('inline-toggle/pdx-inline-toggle.json-api.md'),
49081
+ }),
49082
+ ];
49083
+
47050
49084
  const BRAZIL_INPUTS_AI_CAPABILITIES = {
47051
49085
  version: 'v2.0',
47052
49086
  enums: {
@@ -48856,6 +50890,14 @@ const CLEAR_BUTTON_CONTROL_TYPES = new Set([
48856
50890
  'inlinetime',
48857
50891
  'inlinetimerange',
48858
50892
  'inlinetreeselect',
50893
+ 'inlineperiodrange',
50894
+ 'inlinerating',
50895
+ 'inlinedistanceradius',
50896
+ 'inlinepipelinestatus',
50897
+ 'inlinescorepriority',
50898
+ 'inlinerelativeperiod',
50899
+ 'inlinesentiment',
50900
+ 'inlinecolorlabel',
48859
50901
  ]);
48860
50902
  function supportsClearButtonControlType(controlType) {
48861
50903
  if (!controlType)
@@ -48872,5 +50914,5 @@ function supportsClearButtonControlType(controlType) {
48872
50914
  * Generated bundle index. Do not edit.
48873
50915
  */
48874
50916
 
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 };
50917
+ export { ActionResolverService, BRAZIL_INPUTS_AI_CAPABILITIES, CACHE_TTL, CHIPS_CONTROLS_AI_CAPABILITIES, CLEAR_BUTTON_CONTROL_TYPES, COLOR_CONTROLS_AI_CAPABILITIES, CONTROL_TYPE_AI_CATALOGS, ColorInputComponent, ComponentPreloaderService, ComponentRegistryService, ConfirmDialogComponent, DATE_CONTROLS_AI_CAPABILITIES, DISPLAY_ACTION_AI_CAPABILITIES, DYNAMIC_FIELDS_PLAYGROUND_CATALOG, DYNAMIC_FIELD_BASE_STATE_RECIPES, DYNAMIC_FIELD_DEFAULT_STATE_RECIPE, DYNAMIC_FIELD_DISABLED_STATE_RECIPE, DYNAMIC_FIELD_ERROR_STATE_RECIPE, DYNAMIC_FIELD_FILLED_STATE_RECIPE, DYNAMIC_FIELD_READONLY_STATE_RECIPE, DateInputComponent, DateUtilsService, DatetimeLocalInputComponent, DynamicFieldLoaderDirective, EmailInputComponent, FILE_UPLOAD_AI_CAPABILITIES, InlineAsyncSelectComponent, InlineAutocompleteComponent, InlineColorLabelComponent, InlineCurrencyComponent, InlineCurrencyRangeComponent, InlineDateComponent, InlineDateRangeComponent, InlineDistanceRadiusComponent, InlineEntityLookupComponent, InlineInputComponent, InlineMonthRangeComponent, InlineMultiSelectComponent, InlineNumberComponent, InlinePeriodRangeComponent, InlinePipelineStatusComponent, InlineRangeSliderComponent, InlineRatingComponent, InlineRelativePeriodComponent, InlineScorePriorityComponent, InlineSearchableSelectComponent, InlineSelectComponent, InlineSentimentComponent, InlineTimeComponent, InlineTimeRangeComponent, InlineToggleComponent, InlineTreeSelectComponent, InlineYearRangeComponent, KeyboardShortcutService, LIST_CONTROLS_AI_CAPABILITIES, LoggerPresets, MAX_LOAD_ATTEMPTS, MaterialAsyncSelectComponent, MaterialAutocompleteComponent, MaterialAvatarComponent, MaterialButtonComponent, MaterialButtonToggleComponent, MaterialCheckboxGroupComponent, MaterialChipsComponent, MaterialColorPickerComponent, MaterialCpfCnpjInputComponent, MaterialCurrencyComponent, MaterialDateRangeComponent, MaterialDatepickerComponent, MaterialFileUploadComponent, MaterialMultiSelectComponent, MaterialMultiSelectTreeComponent, MaterialPriceRangeComponent, MaterialRadioGroupComponent, MaterialRatingComponent, MaterialSearchableSelectComponent, MaterialSelectComponent, MaterialSelectionListComponent, MaterialSlideToggleComponent, MaterialSliderComponent, MaterialTextareaComponent, MaterialTimepickerComponent, MaterialTransferListComponent, MaterialTreeSelectComponent, MonthInputComponent, NUMERIC_INPUTS_AI_CAPABILITIES, NumberInputComponent, OptionStore, PDX_COLOR_INPUT_COMPONENT_METADATA, PDX_COLOR_PICKER_COMPONENT_METADATA, PDX_DATETIME_LOCAL_INPUT_COMPONENT_METADATA, PDX_DATE_INPUT_COMPONENT_METADATA, PDX_EMAIL_INPUT_COMPONENT_METADATA, PDX_FIELD_SHELL_COMPONENT_METADATA, PDX_INLINE_ASYNC_SELECT_COMPONENT_METADATA, PDX_INLINE_AUTOCOMPLETE_COMPONENT_METADATA, PDX_INLINE_COLOR_LABEL_COMPONENT_METADATA, PDX_INLINE_CURRENCY_COMPONENT_METADATA, PDX_INLINE_CURRENCY_RANGE_COMPONENT_METADATA, PDX_INLINE_DATE_COMPONENT_METADATA, PDX_INLINE_DATE_RANGE_COMPONENT_METADATA, PDX_INLINE_DISTANCE_RADIUS_COMPONENT_METADATA, PDX_INLINE_ENTITY_LOOKUP_COMPONENT_METADATA, PDX_INLINE_INPUT_COMPONENT_METADATA, PDX_INLINE_MONTH_RANGE_COMPONENT_METADATA, PDX_INLINE_MULTI_SELECT_COMPONENT_METADATA, PDX_INLINE_NUMBER_COMPONENT_METADATA, PDX_INLINE_PERIOD_RANGE_COMPONENT_METADATA, PDX_INLINE_PIPELINE_STATUS_COMPONENT_METADATA, PDX_INLINE_RANGE_SLIDER_COMPONENT_METADATA, PDX_INLINE_RATING_COMPONENT_METADATA, PDX_INLINE_RELATIVE_PERIOD_COMPONENT_METADATA, PDX_INLINE_SCORE_PRIORITY_COMPONENT_METADATA, PDX_INLINE_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_INLINE_SELECT_COMPONENT_METADATA, PDX_INLINE_SENTIMENT_COMPONENT_METADATA, PDX_INLINE_TIME_COMPONENT_METADATA, PDX_INLINE_TIME_RANGE_COMPONENT_METADATA, PDX_INLINE_TOGGLE_COMPONENT_METADATA, PDX_INLINE_TREE_SELECT_COMPONENT_METADATA, PDX_INLINE_YEAR_RANGE_COMPONENT_METADATA, PDX_MATERIAL_AVATAR_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_COMPONENT_METADATA, PDX_MATERIAL_BUTTON_TOGGLE_COMPONENT_METADATA, PDX_MATERIAL_CHECKBOX_GROUP_COMPONENT_METADATA, PDX_MATERIAL_CHIPS_COMPONENT_METADATA, PDX_MATERIAL_COLORPICKER_COMPONENT_METADATA, PDX_MATERIAL_CPF_CNPJ_INPUT_COMPONENT_METADATA, PDX_MATERIAL_CURRENCY_COMPONENT_METADATA, PDX_MATERIAL_DATEPICKER_COMPONENT_METADATA, PDX_MATERIAL_DATE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_FILE_UPLOAD_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_COMPONENT_METADATA, PDX_MATERIAL_MULTI_SELECT_TREE_COMPONENT_METADATA, PDX_MATERIAL_PRICE_RANGE_COMPONENT_METADATA, PDX_MATERIAL_RADIO_GROUP_COMPONENT_METADATA, PDX_MATERIAL_RANGE_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_RATING_COMPONENT_METADATA, PDX_MATERIAL_SEARCHABLE_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SELECTION_LIST_COMPONENT_METADATA, PDX_MATERIAL_SELECT_COMPONENT_METADATA, PDX_MATERIAL_SLIDER_COMPONENT_METADATA, PDX_MATERIAL_TEXTAREA_COMPONENT_METADATA, PDX_MATERIAL_TIMEPICKER_COMPONENT_METADATA, PDX_MATERIAL_TIME_RANGE_COMPONENT_METADATA, PDX_MATERIAL_TRANSFER_LIST_COMPONENT_METADATA, PDX_MATERIAL_TREE_SELECT_COMPONENT_METADATA, PDX_MONTH_INPUT_COMPONENT_METADATA, PDX_NUMBER_INPUT_COMPONENT_METADATA, PDX_PASSWORD_INPUT_COMPONENT_METADATA, PDX_PHONE_INPUT_COMPONENT_METADATA, PDX_PRELOAD_STATUS_COMPONENT_METADATA, PDX_SEARCH_INPUT_COMPONENT_METADATA, PDX_TEXT_INPUT_COMPONENT_METADATA, PDX_TIME_INPUT_COMPONENT_METADATA, PDX_URL_INPUT_COMPONENT_METADATA, PDX_WEEK_INPUT_COMPONENT_METADATA, PDX_YEAR_INPUT_COMPONENT_METADATA, PRAXIS_DYNAMIC_FIELDS_EN_US, PRAXIS_DYNAMIC_FIELDS_I18N, PRAXIS_DYNAMIC_FIELDS_LOGGER_BACKEND, PRAXIS_DYNAMIC_FIELDS_PT_BR, PRICE_RANGE_AI_CAPABILITIES, PasswordInputComponent, PdxColorPickerComponent, PdxMaterialRangeSliderComponent, PdxMaterialTimeRangeComponent, PdxYearInputComponent, PhoneInputComponent, PraxisErrorStateMatcher, PreloadStatusComponent, RETRY_DELAY, SELECT_CONTROLS_AI_CAPABILITIES, SearchInputComponent, SimpleBaseButtonComponent, SimpleBaseInputComponent, SimpleBaseSelectComponent, TEXT_INPUTS_AI_CAPABILITIES, TIME_RANGE_AI_CAPABILITIES, TOGGLE_CONTROLS_AI_CAPABILITIES, TREE_CONTROLS_AI_CAPABILITIES, TextInputComponent, TimeInputComponent, UrlInputComponent, WeekInputComponent, YEAR_INPUT_AI_CAPABILITIES, bindDynamicFieldsLoggerBackendFromInjector, clearDynamicFieldsLoggerBackend, configureDynamicFieldsLogger, createDynamicFieldPreviewRecipe, createErrorStateMatcher, createPraxisDynamicFieldsI18nConfig, emitToDynamicFieldsLoggerBackend, enableDebugForComponent, getControlTypeCatalog, getErrorStateMatcherForField, inferErrorStateStrategy, initializeComponentSystem, initializeComponentSystemSync, isBaseDynamicFieldComponent, isLoadingCapableComponent, isValidJsonSchema, isValueBasedComponent, logger, mapJsonSchemaToFields, mapPropertyToFieldMetadata, normalizeFormMetadata, provideMaterialAvatarMetadata, providePraxisDynamicFields, providePraxisDynamicFieldsCore, providePraxisDynamicFieldsCoreNoDefaults, providePraxisDynamicFieldsI18n, providePraxisDynamicFieldsNoDefaults, resolvePraxisDynamicFieldsText, setDynamicFieldsLoggerBackend, silenceComponent, supportsClearButtonControlType };
48876
50918
  //# sourceMappingURL=praxisui-dynamic-fields.mjs.map